14 de setembro de 2025
-
Sem moda, por favor.
Ultimamente, tenho buscado entender melhor os fundamentos da programação funcional, assunto que, da minha perspectiva, eu achava ter certo entendimento, mas, na verdade, voltei aos primeiros anos de faculdade. Isso porque o livro traz uma verdadeira revisão sobre funções (a mesma que vemos no ensino médio e nas matérias introdutórias da faculdade). Imaginei ser um conceito já entendido por mim, mas era, na verdade, um verdadeiro desconhecimento.
Entretanto, um trecho em especial me fez refletir sobre como, muitas vezes, o simples pode ser o melhor caminho no nosso dia a dia como desenvolvedores de soluções. Esse trecho diz o seguinte:
Digamos que temos uma lista de inteiros positivos. Aqui estão alguns exemplos em Python. Suponha que queremos uma função que receba essa lista e, para cada inteiro n, exiba uma linha do caractere 'a', n vezes ao quadrado. Pode parecer artificial, mas imagine isso como parte de uma sub-rotina em um programa de gráficos. Em Python, poderíamos fazer assim: (Capítulo 5: Mais sobre imutabilidada, página 73)
Não escreva um código difícil.
def print_row_of_as(ints):
for k in map(lambda n: n*n, ints):
print('a' * k)
Confesso que demorei um pouco pra entender como essa função funcionava, mas aí me fiquei pensando: POR QUE DIABOS EU FARIA UMA FUNÇÃO DESSAS?
O que difere esse função dessa?
for n in ints:
print('a' * (n * n))
absolutamente nada.
➜ ~ python3
Python 3.13.7 (main, Aug 14 2025, 00:00:00) [GCC 15.2.1 20250808 (Red Hat 15.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def print_row_of_as(ints):
... for k in map(lambda n: n*n, ints):
... print('a' * k)
...
>>> print_row_of_as([1,2,3,4])
a
aaaa
aaaaaaaaa
aaaaaaaaaaaaaaaa
>>> def print_row_of_as(ints):
... for n in ints:
... print('a' * (n * n))
...
>>> print_row_of_as([1,2,3,4])
a
aaaa
aaaaaaaaa
aaaaaaaaaaaaaaaa
>>>
O ponto que quero chegar é: muitas vezes, como juniores ou plenos (aqui é o meu caso), queremos pensar na melhor solução possível, mas isso muitas vezes traz um peso que nem conseguimos mensurar. Imagina o custo para refatorar a primeira função? Não estou dizendo que é impossível, mas é custoso. A segunda função acaba sendo mais simples e mais didática de entender: não precisa de uma docstring, basta apenas um conhecimento prévio sobre as funcionalidades do print e pronto.
Penso que a senioridade de um dev se dá, muitas vezes, pela simplicidade com que ele trata as coisas. É claro, em algumas situações, o caminho mais simples não é o recomendável: existem trade-offs em cada abordagem, seja ela a mais simples ou a mais complexa.