A melhor linha de código é aquela que você nunca escreve. Essa ideia parece uma desculpa para a preguiça até que você passe alguns anos mantendo o entusiasmo de outra pessoa. Escrever software parece construção, mas se comporta mais como jardinagem. Se deixado de lado, um jardim cresce quer você queira ou não. O código faz o mesmo. O verdadeiro ofício é saber quando parar de plantar.
Seu Código é um Passivo
Cada linha que você faz o commit cria um conjunto de obrigações contínuas. Você a lerá novamente durante um incidente tarde da noite. Você a testará após o seu framework lançar uma atualização de versão menor que altera o tratamento de strings. Você a depurará quando os logs de produção não fizerem sentido. Você a explicará para um colega que entrou na semana passada, ou para si mesmo daqui a doze meses, quando o contexto tiver evaporado.
Isso não é um argumento a favor da obscuridade. É geometria. Bugs precisam de espaço para se esconder. Quanto menor a sua superfície de exposição, menos lugares haverá para a falha se infiltrar. Uma função com oitenta linhas e seis condições aninhadas não é apenas mais difícil de ler; ela é estatisticamente mais propensa a surpreender você. A contenção não é a ausência de esforço. É o reconhecimento de que o código não escrito tem exatamente zero defeitos.
Quando a Esperteza se Torna um Imposto
Considere a tarefa de calcular o total de um pedido com algumas regras de negócio: aplicar um desconto, verificar itens tributáveis, pular qualquer coisa marcada como removida. Um desenvolvedor escreve uma única expressão. Ela processa a lista através de uma cadeia complexa de filtros, invoca uma biblioteca auxiliar, reduz o resultado com um reducer curried e retorna a soma. É compacto. Pode até ser elegante em um sentido acadêmico. Mas para lê-lo, você deve entender o casting implícito da biblioteca auxiliar, a ordem das operações dentro do stream e a lógica de negócio, tudo ao mesmo tempo. Você não pode definir um breakpoint no meio. Você não pode inserir um log sem quebrar a cadeia. O código é curto na página e longo na mente.
Outra desenvolvedora escreve um loop básico. Ela declara um total acumulado, itera pelos itens e usa um simples comando if para decidir se o imposto se aplica. O bloco é mais alto verticalmente, mas a intenção é óbvia. Você pode lê-lo de cima para baixo sem manter cinco abstrações na cabeça. Você pode percorrê-lo em um debugger. Você pode adicionar um log na linha quatro sem refatorar toda a expressão.
Código esperto parece inteligente em um pull request por cerca de dez minutos. Código simples parece entediante, e entediante é exatamente o que você quer quando está resolvendo problemas às duas da manhã. Seu objetivo é a clareza, não uma demonstração de inteligência.
Sistemas Precisam de Estrutura, Não de Heróis
Este princípio escala para a arquitetura. Um sistema esperto pode depender de lógica de consenso escrita à mão, scripts de orquestração personalizados e atalhos de cache não documentados que apenas um engenheiro realmente entende. Esse sistema não roda sozinho; ele roda através do brilho constante de quem o mantém unido. Quando essa pessoa tira férias ou consegue um novo emprego, o sistema começa a oscilar.
Sistemas bem projetados dependem de estrutura e restrições em vez disso. Eles utilizam esquemas de banco de dados que rejeitam dados inválidos, contratos de API que definem limites, sistemas de tipos que capturam erros de categoria antes da implantação e separações de módulos que tornam o caminho pretendido óbvio. Eles não exigem heroísmo para permanecer estáveis. Eles são projetados para sobreviver ao contato com humanos cansados, que é o único tipo de humano que opera software em produção.
O Problema da Amplificação por IA
Assistentes de codificação de inteligência artificial tornam esta lição urgente. Essas ferramentas geram texto rapidamente. Apresente a elas um problema simples e elas frequentemente retornarão uma solução grande e complexa que importa utilitários para os quais você já possui wrappers internos, lida com casos de borda que não existem no seu domínio e usa padrões de uma versão de framework da qual você migrou há dois anos. A IA olha para a tarefa imediata. Você deve olhar para o sistema como um todo.
Se você aceitar todas as sugestões sem gerenciar o custo a longo prazo, a geração de código levará à inflação. Seu repositório incha com códigos de aparência razoável que compilam, passam nos testes e, ainda assim, ninguém realmente entende. O perigo não é um erro de sintaxe gritante. Esses são pegos na revisão. O perigo é um espessamento gradual da base de código, onde cada arquivo individual parece plausível isoladamente, mas a totalidade se recusa a caber dentro de qualquer crânio humano. É assim que a velocidade de engenharia morre. Não com um estrondo, mas com um acúmulo silencioso de coisas que ninguém está disposto a deletar porque tem medo de tocar no que não compreende totalmente.
Deletar é uma Habilidade de Design
Grandes engenheiros não se provam digitando mais rápido que todos os outros. Eles vencem ao escolher a simplicidade e ao escolher a exclusão em vez do acúmulo. Remover código exige entendê-lo. Você precisa rastrear o fluxo de dados, confirmar que um recurso não possui chamadores ocultos e verificar se o negócio seguiu em frente. Deletar é mais difícil do que adicionar porque exige certeza.
Equipes costumam celebrar recursos lançados e multiplicadores que entregam pull requests massivos. Poucas equipes celebram o engenheiro que remove quatro mil linhas de lógica morta e deixa o sistema mais rápido e fácil de raciocinar. Mas essa contagem negativa de linhas é, muitas vezes, o maior serviço ao futuro da organização.
A Parte Cara
O código é barato agora. Qualquer um pode gerar páginas dele em segundos. O recurso caro é a clareza. É necessário tempo, julgamento e contenção para manter um sistema compreensível. A verdadeira engenharia acontece na edição, não no rascunho.
Escreva menos. Delete mais. Projete de forma simples.
