Lembro-me de quando iniciei no Asaas e comecei a ter meus códigos revisados pelo Fernando Chagas, nosso CTO. Nessa época, meus códigos eram quase todos escritos numa classe só e tristemente levavam a criação de um Big Ball of Mud.
De vez em quando, durante essas revisões, o Fernando soltava algo como: “Isso não me parece ortodoxo”. Essa era uma maneira descontraída de passar a mensagem de que aquela solução não seguia os padrões de qualidade e solidez que todo o restante da aplicação seguia.
Isso reflete algo muito valioso a respeito do nosso time de engenharia. Desde o início do Asaas, temos a clara determinação de construir um software de altíssima qualidade mesmo que, às vezes, seja necessário entregar menos ou mais tarde. Mas sempre entregamos com qualidade, afinal, o dinheiro de milhares de empreendedores passa pelo nosso código diariamente, e ninguém quer ter problemas com seu próprio dinheiro.
Quando nos deparávamos com problemas, a visão clara do que significava uma boa solução e de qual era a melhor decisão a tomar sempre correu nas nossas veias e era disseminada em code sessions, revisões de código e feedbacks entre tech leads e engenheiros.
No entanto, com o crescimento do time de engenharia, precisávamos compartilhar essa visão para um número cada vez maior de engenheiros. Tínhamos a necessidade de garantir que todo novo engenheiro que entrasse para o time tivesse a bagagem necessária para tomar as melhores decisões técnicas, tal como vínhamos tomando até então, para mantermos a altíssima qualidade das entregas.
Naturalmente, nosso repertório de soluções foi melhorando ao longo do tempo, de modo que algumas decisões técnicas tomadas lá atrás hoje já não são consideradas as melhores. No entanto, apesar de algumas tecnologias e práticas terem mudado, sempre existiram algumas bases comuns que nos guiaram. Com isso em mente, decidimos escrever os nossos princípios da engenharia.
Princípios são as verdades fundamentais de alguma área do conhecimento
São as bases que guiam todo o desenvolvimento e raciocínio posterior da área. Religiões, governos, empresas e ciências possuem seus princípios.
Vou lhes dar um exemplo da religião: na Bíblia, Jesus brilhantemente sintetizou os mandamentos em 2: amar a Deus sobre todas as coisas e amar ao teu próximo como a ti mesmo. Desses 2 princípios derivam os demais mandamentos.
Portanto, se amo a Deus, não pronunciarei o nome dEle em vão, e se amo o meu próximo, não o difamarei. Esse é o poder dos princípios: a partir de uma base comum, uma mesma visão é propagada. Na engenharia de software, também devemos ter nossos princípios.
Peter Campbell, na palestra “Architecture as belief”, conseguiu capturar bem essa ideia. Tecnologias surgem e desaparecem, práticas são estabelecidas e também substituídas, mas os princípios na engenharia de software são bases que duram por muito tempo e guiam boas escolhas de tecnologias e práticas.
Para escalarmos a qualidade das nossas soluções, precisamos empoderar os engenheiros para terem autonomia em decisões técnicas. No entanto, autonomia sem alinhamento pode gerar caos e os princípios vêm justamente para garantir esse alinhamento.
Com base nos princípios, os engenheiros conseguem ter um referencial claro para julgar se a solução é boa ou não (ou se é ortodoxa ou não haha), garantindo consistência nas decisões técnicas tomadas em toda a engenharia.
Jason Warner, CTO do GitHub, quando ofereceu uma série de conselhos sobre como escalar times de engenharia, mencionou a criação de princípios como algo inegociável para os times. Em sua série, Warner falou que possuir princípios claros é como darmos aos engenheiros âncoras em torno das quais eles podem construir suas soluções no dia a dia e, assim, tomar decisões com segurança.
Para encontrar esses princípios procuramos olhar para trás, analisar as decisões que tomamos e extrair quais foram as verdades fundamentais que guiaram essas decisões. Com isso em mente, chegamos aos 5 princípios da engenharia do Asaas:
1. Focamos na solução
Não executamos cegamente requisitos definidos por outros. Entendemos os problemas que queremos resolver e ajudamos a criar as soluções que os resolvam.
2. Não negociamos qualidade
Temos consciência que abrir mão da qualidade traz sérias consequências a longo prazo. Quando necessário, entregamos menos ou entregamos mais tarde, mas sempre com alta qualidade.
3. Entregamos em pequenas partes
Grandes alterações são difíceis de entender e revisar. Resolvemos grandes problemas quebrando-os em pequenas partes entregues separadamente ao longo do tempo.
4. Mantemos simples
Excesso de complexidade destrói nossa habilidade de nos movermos rápido. Abrimos mão de uma solução técnica perfeita e altamente complexa em prol de simplicidade e facilidade de manutenção. Gostamos de soluções familiares, reutilizando padrões já estabelecidos em soluções diferentes sempre que possível.
5. Trabalhamos colaborativamente
Constantemente praticamos o compartilhamento de conhecimento e descobertas. Não acreditamos que desenvolvimento de software é uma disciplina fria e feita de maneira solitária.
É com base nesses princípios que temos feito engenharia de software aqui no Asaas e colhido excelentes resultados. Isso nos permite escalar o time, empoderando os engenheiros para tomar boas decisões técnicas e sem perder de vista a consistência das soluções entre os diferentes times.
Uma engenharia de software ortodoxa é aquela que segue princípios claros em todas as suas decisões. Os princípios podem ser pessoais ou particulares do seu time ou organização. O seu time já possui os próprios princípios?