Você programa de forma idiomática?
Tags: programming, python, node, codenewbie
Published: 2020-12-01 16:33:04

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:

```python
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:

```js
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_](https://docs.python.org/pt-br/3/tutorial/datastructures.html#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:

```python
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:

```js
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"](https://www.amazon.com.br/gp/product/857522462X) do Luciano Ramalho, e [Javascript Eloquente](https://github.com/braziljs/eloquente-javascript) do Marijn Haverbecke, ou assistir a vídeos de especialistas como o [Codeshow](https://www.youtube.com/channel/UCMre98RDRijOX_fvG1gnsYg) 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](https://codewars.com). Conforme está descrito na [Wiki](https://github.com/codewars/codewars.com/wiki/About-Codewars) 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!




<sup><sub>[Fonte da foto de capa](https://www.megacurioso.com.br/copa-do-mundo-2014/44531-16-traducoes-hilarias-de-placas-e-avisos-em-ingles-feitos-para-a-copa.htm)</sup>