Você já deve ter reparado que ler é mais fácil do que escrever ou falar uma língua estrangeira: enquanto a leitura é um processo passivo, a escrita e fala são processos ativos e que exigem maior domínio da língua. Além disso, para escrevermos de forma fluente precisamos não só termos uma boa noção do vocabulário e gramática dessa língua, mas também entendermos como esse vocabulário é usado por aqueles que dominam a língua, quais expressões são comuns, quais palavras eles evitam usar etc.
Esse pulo para o uso mais rico de uma língua é quando paramos de traduzir as frases palavra-por-palavra e passamos a nos expressar no nível mais conceitual. Por exemplo, para expressar que uma tarefa é muito fácil, passamos a usar expressões como "this was a piece of cake" ou "this was a walk in the park" ao invés de sempre usarmos "this was very easy". Uma pessoa que conhece esses detalhes do idioma, que envolve inclusive um entendimento básico da cultura e da forma de pensar dos falantes dessa língua, é uma pessoa que consideramos fluente nessa língua.
O que programação tem a ver com isso?
Em programação, também existe esse pulo entre o uso "instrumental" e "fluente" de uma linguagem. Muitos de nós aprendemos programação através de um estilo imperativo de programação, ou seja, aquele estilo de programação em que a gente comanda o que o programa precisa fazer, passo-a-passo. Aprendemos como declarar loops de repetição, como tomar decisões com if e else, como inicializar listas, e não é incomum declararmos em algum momento da nossa carreira: "pronto, agora que já sei usar essas estruturas para representar algoritmos e padrões de projeto, eu encaro qualquer linguagem. Pra usar Python, Javascript ou Go é só descobrir como se escreve for, if, como se declara arrays e tô safo".
Ao nos contentarmos em ficar nesse conhecimento instrumental de uma linguagem, estamos perdendo a oportunidade de realmente aprender o que a linguagem tem de bacana: como que alguém que sabe programar de forma fluente resolveria os mesmos problemas que estamos tentando resolver? Como, em contraste como um estilo imperativo de programação, podemos subir o nível para algo mais declarativo, ou seja em que a gente represente (em geral de forma mais sucinta) a ideia que queremos implementar?
Vamos ilustrar isso com um exemplo: digamos que você queira filtrar, em uma determinada lista de pessoas, as pessoas que tenham mais de 21 anos e que nunca tenham votado. Nossos dados originais poderiam ser algo assim:
name | age | has_voted |
---|---|---|
Renato | 24 | False |
Cecília | 18 | False |
Ana | 27 | False |
Marta | 32 | True |
Julio | 17 | True |
...e o resultado traria os nomes "Renato" e "Ana" em uma lista.
Uma forma não-idiomática (mas perfeitamente válida) de resolver esse problema, em Python, seria assim:
result = []
# supondo que a lista 'people' tem os dados da tabela acima
for i in range(0, len(people)):
person = people[i]
if person.age > 21 and not person.has_voted:
result.append(person.name)
# vai imprimir ["Renato", "Ana"]
print(result)
Para quem conhece Javascript, dá pra ver que é possível fazer uma tradução linha por linha dessa solução:
const result = [];
// supondo que a lista 'people' tem os dados da tabela acima
for (var i=0; i < people.length; i++){
const person = people[i];
if (person.age > 21 && !person.has_voted) {
result.push(person.name);
}
});
// vai imprimir ["Renato", "Ana"]
console.log(result);
Notou que as soluções são praticamente idênticas? aliás, você também acha que fica até meio difícil saber em qual linguagem de programação a solução foi implementada? Sem contar o console.log ao fim, o código acima poderia facilmente ser confundido com C# ou Java, não?
Escrever de forma idiomática nos abre as portas para programação fluente e limpa
Uma vez que resolvemos aprendemos a "nos virar" na linguagem, podemos simplesmente adicioná-la na lista de linguagens que conhecemos, ou podemos nos perguntar: como resolveríamos esse problema como um desenvolvedor "fluente" na linguagem, de forma idiomática?
Uma outra desenvolvedora que vá ler esse código vai ter que inferir, a partir desses comandos detalhados, qual era a nossa intenção; por exemplo, para que servem as variáveis i
e result
. A leitura não é tão prazerosa, e é um pouco mais difícil saber se tem algum bug nesse código.
Para subirmos para o nível idiomático, vale a pena dar uma olhada na documentação da linguagem, e procurar exemplos (vamos falar mais sobre isso daqui a pouco).
Por exemplo no Python nós temos list comprehensions (compreensão de lista, mas o nome em inglês é muito usado pela comunidade) que nos permite iterar listas e retornar novas listas de forma declarativa, o que deixaria nosso exemplo assim:
result = [person.name for person in people if person.age > 21
and not person.has_voted]
print(result)
Note que se você ler o código em voz alta, vai basicamente estar "explicando" o que ele faz.
O mesmo vale para uma solução idiomática em Javascript:
result = people
.filter(({ age }) => age > 21)
.filter(({ has_voted }) => has_voted)
.map(({ name }) => name);
console.log(result);
Um ganho imediato que vemos nesses códigos, nas duas linguagens, é que nos livramos daquela variável i
que servia para controlar a iteração no loop, e certamente é uma fonte em potencial de bugs. Nosso código ficou mais limpo.
Além disso, a pessoa que escreveu essa versão idiomática teve que digitar menos e ainda assim ser mais expressiva, e provavelmente se divertiu mais também.
Codewars: um jeito divertido de aprender programação mais idiomática
Naturalmente que um lugar fácil para encontrar bons exemplos de programação idiomática, em qualquer linguagem, é ver código existente em projetos open-source, ler livros/documentação da linguagem (por exemplo, os livros "Python Fluente" do Luciano Ramalho, e Javascript Eloquente do Marijn Haverbecke, ou assistir a vídeos de especialistas como o Codeshow do Bruno Rocha.
Mas eu também queria indicar um outro lugar legal para ver exemplos concisos e legais de programação idiomática, e poder praticar essas habiliades, que é o site Codewars. Conforme está descrito na Wiki deles:
Codewars é uma comunidade de desenvolvedores, que treinam para melhorar suas habilidades de desenvolvimento. Pense nisso como um dojo de programação - onde os desenvolvedores treinam uns com os outros e ajudam uns aos outros a melhorar através da prática.
Ao criar uma conta gratuita lá, você será apresentado a desafios mais ou menos como o desse artigo (porém bem mais interessantes) para resolver na linguagem que você escolher (eles suportam algumas dezenas de linguagens, inclusive umas bem obscuras), e o mais legal, ao terminar de resolver o problema você pode ver as soluções de outras pessoas, ordenadas das que receberam mais "votos", e que em geral são muito elegantes e idiomáticas. Mesmo programadores experientes vão ver formas de resolver problemas usando recursos da linguagem que vão expandir em muito a sua fluência.
E você, como tem feito para programar de forma mais idiomática?
P.S.: estou iniciando essa jornada voltando a escrever dicas de programação e desenvolvimento de software focado em iniciantes. Aceito dicas de futuros assuntos!
Top comments (0)