Comandos Git para executar antes de ler o código
(piechowski.io)- Ao entrar em uma nova base de código, analise o histórico do Git para entender a estrutura do projeto e as áreas de risco e assim definir uma direção de exploração mais eficiente
- Encontre os arquivos alterados com mais frequência no último ano e cruze frequência de mudanças com concentração de bugs para identificar código de alto risco
- Use a distribuição de contribuidores e tendências de atividade para verificar bus factor, lacunas de manutenção e possíveis quebras na transferência de conhecimento
- Acompanhe com commits mensais mudanças no ritmo e no ímpeto de desenvolvimento da equipe e avalie a estabilidade de entrega pela frequência de Revert e Hotfix
- Esses cinco comandos podem ser usados como ferramentas práticas para diagnosticar rapidamente a saúde do projeto antes mesmo de abrir uma única linha de código
Cinco comandos Git para executar antes de ler o código
- Ao analisar uma nova base de código, a proposta é diagnosticar a saúde do projeto pelo histórico do Git antes de abrir qualquer arquivo
- Pelo histórico de commits, dá para entender quem construiu isso, onde os problemas se concentram e quão estável a equipe entrega mudanças
-
O que muda com mais frequência?
- Comando:
git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20 - Exibe os 20 arquivos mais modificados no último ano
- Os arquivos do topo muitas vezes são aqueles que a equipe “tem medo de mexer”; quando alta frequência de mudanças (churn) se combina com evasão de ownership, eles se tornam o maior fator de peso da base de código
- Segundo um estudo da Microsoft Research (2005), métricas baseadas em frequência de mudança preveem defeitos melhor do que métricas de complexidade
- Cruze os 5 principais arquivos com o comando de concentração de bugs para identificar como maior risco os arquivos que mudam muito e também quebram muito
- Comando:
-
Quem construiu este código?
- Comando:
git shortlog -sn --no-merges - Classifica os contribuidores pelo número de commits
- Se uma única pessoa responde por mais de 60%, há risco de bus factor
- Se o principal contribuidor não teve atividade nos últimos 6 meses, pode haver uma lacuna de manutenção
- Se entre 30 contribuidores apenas 3 estiveram ativos no último ano, pode ter ocorrido quebra de conhecimento por rotatividade de desenvolvedores
- Porém, equipes que usam estratégia de squash-merge podem ter informações de autoria distorcidas em direção a quem fez o merge, então é preciso verificar a estratégia de merge
- Comando:
-
Onde os bugs se concentram?
- Comando:
git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20 - Extrai os 20 principais arquivos com ocorrência de bugs com base em commits que contêm palavras-chave relacionadas a bug
- Compare essa lista com a lista de frequência de mudanças para identificar como código de alto risco os arquivos alterados com frequência e que quebram com frequência
- A precisão do resultado varia conforme a qualidade das mensagens de commit, mas mesmo como um mapa aproximado de densidade de bugs já é bastante útil
- Comando:
-
O projeto está acelerando ou estagnando?
- Comando:
git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c - Permite visualizar a tendência de atividade pelo número de commits por mês
- Um ritmo constante indica um projeto saudável
- Se em um único mês o número de commits cai pela metade, pode haver saída de pessoal-chave
- Uma queda contínua por 6 a 12 meses sugere perda de ímpeto da equipe, enquanto picos periódicos seguidos de estagnação indicam um padrão de releases em lote
- Em um caso real, um gráfico de velocidade de commits levou um CTO a reconhecer: “foi nesse ponto que um engenheiro sênior saiu”
- Esses dados fazem sentido como dados da equipe, não do código
- Comando:
-
Com que frequência a equipe está apagando incêndio?
- Comando:
git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback' - Mede a frequência de Revert e Hotfix
- Algumas ocorrências por ano são normais, mas se isso acontece a cada duas semanas, é sinal de desconfiança no processo de deploy
- Isso pode indicar problemas mais profundos, como testes instáveis, ausência de staging ou procedimentos complexos de rollback
- Se o resultado for 0, a equipe pode ser estável ou as mensagens de commit podem ser imprecisas
- Padrões de crise aparecem com clareza, e sua simples presença já ajuda a avaliar a confiabilidade
- Comando:
Conclusão
- Esses cinco comandos podem ser executados em poucos minutos e, antes de abrir uma única linha de código, apontam por onde começar a leitura
- Com isso, em vez de explorar sem rumo no primeiro dia, fica possível fazer uma análise sistemática do código centrada nas áreas problemáticas
- Esse procedimento corresponde à primeira hora de uma auditoria de codebase (codebase audit) e leva ao processo de análise da semana seguinte
1 comentários
Comentários do Hacker News
Compartilharam exemplos no Jujutsu que podem substituir comandos de análise do git
Dá para verificar com
jj logquais arquivos mais mudaram no último ano, os principais contribuidores, onde os bugs se concentram, a vitalidade do projeto e a frequência de correções urgentesA sintaxe é mais próxima de programação do que de script de shell, mas há menos flags para decorar
Assim como o Nix é legal, mas adiciona complexidade, o jujutsu me passou essa mesma sensação
Usei por alguns meses e voltei para o git. O git já está nas mãos e é usado em todo lugar
Eu já fico feliz se lembro do loop de array no jq, então esse tipo de sintaxe realmente não entra na cabeça
Se eu fosse usar com frequência, encurtaria com alias
Por exemplo, existe uma biblioteca de geração de QR code sem atualização há 10 anos que funciona perfeitamente
Às vezes fico pensando se deveria adicionar commits inúteis com bot só por isso
Por isso prefiro os tradicionais comandos com pipes do UNIX a ferramentas como o jujutsu
É pelo mesmo motivo que uso Maven em vez de Gradle
Achei curioso o autor presumir que desenvolvedores escrevem boas mensagens de commit
Na prática, a maioria fica no nível de “changed stuff”
Gente como eu, que considera o log de commits importante, é minoria
Mensagens de commit geradas por IA podem ajudar bastante com esse problema
O desenvolvedor pode escrever os commits como quiser, porque depois ninguém lê mesmo
Nos Core, revisão de PR e explicações detalhadas são obrigatórias; nos Non-Core, dá para experimentar livremente
Nos Core, às vezes a mensagem de commit fica 20 vezes maior que o código; nos Non-Core, é algo no nível de “hope this works”
Na nossa empresa, as pessoas cobram isso umas das outras
Rodei os comandos em várias codebases e os resultados não batiam com a realidade
Por exemplo, no resultado de
git shortlog -sn --no-merges, às vezes a pessoa com mais commits já tinha saído da empresaTer muitos commits não significa contribuir mais
Commits em excesso ficam só na branch da feature, e o merge para a principal entra limpo
Em codebases comuns, costumam gerar resultados sem muito significado
Foi porque criei o projeto do zero; hoje outras pessoas fazem commit com mais frequência do que eu
Achei interessante a ideia de que “o arquivo que mais mudou é o arquivo que as pessoas têm medo de mexer”
Tirar conclusões só pelo resultado pode até fazer a pessoa parecer boba
Na prática, eles só mostram mais ou menos em que funcionalidades se trabalhou no último ano
Onde os dois são altos é a verdadeira zona problemática
Quando essas áreas se acumulam, começa o papo de “precisamos reescrever o app do zero”
Todo mundo precisa mexer neles, mas são grandes demais e difíceis de lidar
Eu criei um alias summary no git para mostrar de uma vez só resumo das branches, número de commits, autores, quantidade de arquivos etc.
Tirei a ideia de GitAlias/gitalias
.gitconfig; parece mais simples fazer só um script git-summarylog-of-count-and-emailÉ preciso adicionar fronteira de palavra (\b) na regex
Por exemplo, “bug” dentro de “debugger” pode gerar resultado errado
O exemplo corrigido fica assim
git log -i -E --grep="\b(fix|fixed|fixes|bug|broken)\b" ...\bnão é suportado, então em vez de-Eé preciso usar a opção de regex Perl-PDá para ajustar para o formato
git log -i -P --grep="\b(...)\b"Sem squash-merge, a pessoa com mais commits pode acabar sendo justamente o pior desenvolvedor
Já teve alguém assim no passado: vivia alterando o mesmo arquivo até ser demitido
O squash é uma boa forma de esconder esse tipo de problema
Estatísticas simples de número de commits são difíceis de confiar
Tem gente que só faz commit de código perfeitamente testado, enquanto outros fazem commit a cada linha
O valor de um commit pode variar 100 vezes de uma pessoa para outra
A taxa de variação importa mais do que o valor absoluto
Essa abordagem de análise lembra “Your Code as a Crime Scene”, de Adam Tornhill
Link do original
Também se parece com o conceito de Developer’s Legacy Index
Teria sido melhor se o autor tivesse mostrado diretamente o resultado de cada comando
Exemplos de saída teriam sido mais convincentes do que explicações