Metaprogramação - como ser preguiçoso e alcançar altos níveis de produtividade
Tags: programming, beginners, tutorial, productivity
Published: 2024-01-23 13:23:20

Recentemente recebi a tarefa de abstrair um banco de dados em uma API. Além disso, o banco de dados também trabalhava com algumas formatações de dados muito confusas, que deveriam ser abstraídas na API também. Por ser um sistema de mercado, a documentação era disponibilizada através de um XLS gigantesco explicando como os campos deveriam ser inseridos nas tabelas.


Inicialmente, eu contei com as ferramentas do meu editor de texto para ganhar o máximo de produtividade possível, mas aparentemente as tabelas não tinham fim. Cada uma das tabelas possuía cerca de 300 campos, e eu precisava criar arquivos de formatação, validação de payload e testes unitários. 


Passada uma semana, eu estava longe de terminar a primeira tarefa, desmotivado, e rendendo muito menos do que gostaria. Todo o meu trabalho era simplesmente bater teclado chamando funções de formatação para cada campo de uma tabela, e mesmo tendo descansado normalmente, os dias se tornaram uma eterna luta para não dar aquelas "pescadas" na frente do computador.


Foi exatamente numa segunda-feira que me surgiu o questionamento. 

> Por que _eu_ preciso digitar tudo isso?


No mesmo dia comecei minha "nova" tarefa: criar quem digitasse aquilo tudo por mim.


Utilizando um dia de serviço e um pouco mais que 300 linhas de código, fiz um simples script que lia o arquivo XLS, filtrava qual era a tabela que eu estava querendo abstrair e gerava o arquivo de validação de payload. Depois era só jogar dentro do projeto e ver tudo funcionando. O processo completo de geração do arquivo demorava cerca de 350~400ms.


Fiquei namorando o script, e uma semana depois, ele já estava gerando todos os arquivos que precisavam de digitação bruta. Com isso, todo mundo saiu ganhando. Eu tive a oportunidade de trabalhar em uma tarefa que me empolgasse, e a tarefa original foi concluída com muito mais velocidade do que eu imaginei que fosse possível. 


Eu sei que este é um exemplo de metaprogramação muito isolado, mas o meu real objetivo com este artigo é te fazer questionar se não cabe um pouco disso na sua tarefa atual. Você se sente entediado fazendo o que precisa ser feito? Cansou de bater teclado? Então crie alguém pra fazer isso pra você!


A melhor parte de ser um programador é ver a possibilidade de melhorar alguma situação, e ter o conhecimento suficiente para realmente melhorar a situação, então aproveite esta posição!

---

## Beleza, mas e a _metaprogramação_?

O prefixo "meta-" nesse caso tem o sentido de "reflexão sobre si". Metaprogramação é a programação que você faz para facilitar a programação final :)


Esta ideia veio de uma extrapolação da ideia do livro do Tim Ferriss [Trabalhe 4 horas por semana](https://www.amazon.com.br/Trabalhe-4-Horas-por-Semana/dp/8542211561/ref=sr_1_1?crid=2QW3U02C8X81R&keywords=trabalhe+4+horas+por+semana&qid=1704908002&sprefix=trabalhe+%252Caps%252C287&sr=8-1&_encoding=UTF8&tag=mahezer-20&linkCode=ur2&linkId=5ecbe5f891bf09891ea636747ac6869d&camp=1789&creative=9325). A recomendação é que nós possamos automatizar qualquer tarefa que nos tome tempo demais e existem muitos motivos para isso.


Em primeiro lugar, a velocidade. Uma máquina é muito mais rápida para executar tarefas repetitivas do que qualquer humano. Você pode deixar uma máquina funcionando por horas ou dias e a máquina não se sentirá cansada e não perderá rendimento.


Em segundo lugar, a precisão. Uma máquina não comete erros de digitação, nem lê o campo errado. A máquina sempre irá fazer o que foi programada pra fazer. Isso tem seus desafios, uma vez que você irá precisar saber o que quer fazer e como fazer isso, mas uma vez que sua programação está correta, você pode simplesmente executar a rotina e ir fazer outra coisa.


Por último, temos a diversão! Criar um robô que automatiza tarefas é desafiador, e é muito mais divertido do que ficar digitando coisas repetitivas por tempo indeterminado. Sem contar que também é super divertido ver ele sendo executado e resolvendo um problema para você (o tédio) e um problema para o seu empregador (o prazo).

---

Bill Gates uma vez disse que prefere contratar pessoas preguiçosas para resolver tarefas difíceis porque elas vão sempre procurar soluções simples para os problemas.

> Então, aqui vai um conselho controverso: Seja mais preguiçoso! 

Não no sentido de não querer trabalhar, ou no sentido de ficar procrastinando as coisas que você precisa fazer. Mas no sentido de evitar trabalhos repetitivos.


O maior valor agregado de um programador é exatamente a capacidade de abstração de tarefas complexas e automatização de tarefas repetitivas, **não nossa velocidade de digitação**. Faz parte do seu trabalho identificar estas tarefas e automatiza-las.


Sempre tenha olhos afiados para encontrar tarefas repetitivas e eliminar todas elas. Isso vai permitir que o seu time se concentre naquilo que realmente importa, e nos problemas realmente complexos.


Você tem algum relatório que leva horas para preparar? Automatize.
Você tem alguma burocracia que dificulta seu trabalho? Automatize.
Você tem alguma tarefa que aparece todo mês? Automatize!


Imagem de cover: Foto de <a href="https://unsplash.com/pt-br/@drewcoffman?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Drew Coffman</a> na <a href="https://unsplash.com/pt-br/fotografias/pessoa-na-rede-DzIt-fTYv4E?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a>
This article is also available in english [here](https://dev.to/mahezer/metaprogramming-how-to-be-lazy-and-reach-high-levels-of-productivity-1lhf)
Texto originalmente publicado no blog [Holyscript](https://www.holyscript.com.br/post/metaprograma%C3%A7%C3%A3o-como-ser-pregui%C3%A7oso-e-alcan%C3%A7ar-altos-n%C3%ADveis-de-produtividade)