4.3

4.3 Processamento de código e análise de pontos quentes

Visão geral e motivação

O processamento de código mede com que frequência um ficheiro ou módulo muda ao longo do tempo, linhas acrescentadas, modificadas, e eliminadas através de commits sucessivos. Por si só, o processamento é um sinal razoavelmente fraco: alguns ficheiros mudam frequentemente porque estão sob desenvolvimento ativo e saudável, e alguns raramente mudam porque são estáveis e corretos, não porque são negligenciados. O verdadeiro poder diagnóstico da abordagem deste tema vem de combinar o processamento com a complexidade (tema 4.1): um ficheiro que é tanto frequentemente mudado como altamente complexo, um ponto quente, é desproporcionalmente provável de ser uma fonte de defeitos e um travão à velocidade da equipa, e a investigação empírica confirma isto consistentemente através de muitas bases de código e organizações.

A análise de pontos quentes, popularizada pelo trabalho de Adam Tornhill sobre análise de software, é especificamente valiosa porque não exige nenhum levantamento manual ou julgamento subjetivo para encontrar os seus alvos. O histórico de controlo de versões já contém tudo o que é necessário para calcular tanto o processamento como, combinado com ferramentas de análise estática, a complexidade, para cada ficheiro numa base de código automaticamente. Isto permite a uma equipa ou organização identificar, com evidência real em vez de anedota ou a queixa mais ruidosa numa retrospetiva, exatamente qual pequena fração da base de código merece atenção de refatoração primeiro.

Para equipas grandes, a análise de pontos quentes resolve um problema genuíno de alocação: uma base de código com centenas de milhares de linhas tem muito mais código do que qualquer equipa se pode dar ao luxo de refatorar compreensivamente, e a intuição sobre onde vivem os piores problemas é frequentemente errada, enviesada por quem se queixou mais recentemente ou qualquer ficheiro de que um engenheiro sénior calhe não gostar. As organizações empresariais e governamentais a gerir bases de código grandes e de longa duração dependem desta priorização baseada em dados para direcionar o orçamento genuinamente escasso de refatoração para o código que produzirá o maior retorno.

Princípios-chave

  • O processamento sozinho é um sinal fraco; o processamento combinado com a complexidade é forte. A combinação, não qualquer métrica sozinha, é o que identifica um ponto quente genuíno.
  • A análise de pontos quentes não exige nenhum levantamento manual. O histórico de controlo de versões já contém tudo o que é necessário para a calcular automaticamente.
  • Um ponto quente é um sinal de priorização, não um veredito automático. O julgamento humano ainda é necessário para decidir que ação um ponto quente específico justifica.
  • A mudança frequente não é inerentemente má. Algum processamento reflete desenvolvimento ativo e saudável em vez de um problema de qualidade.
  • Esta análise escala precisamente onde a intuição falha: em bases de código grandes demais para qualquer indivíduo pesquisar e priorizar apenas pelo instinto.

Recomendações

Calcular o processamento e a complexidade juntos, e classificar pela sua combinação

Extraia a frequência de mudança por ficheiro do histórico de controlo de versões ao longo de uma janela significativa, tipicamente seis meses a um ano, e emparelhe-a com uma medida de complexidade (tema 4.1) para os mesmos ficheiros. Classifique os ficheiros pela combinação, comummente o produto do processamento e da complexidade, em vez de por qualquer métrica sozinha, já que esta combinação é o que a investigação subjacente associa consistentemente a taxas elevadas de defeitos e custo de manutenção.

Investigar os principais pontos quentes com julgamento humano antes de agir

Uma lista classificada de pontos quentes identifica candidatos para atenção, não uma lista automática de ação. Para cada um dos seus principais pontos quentes, investigue com um olho humano: este é genuinamente código mal desenhado que precisa de refatoração, ou é um ficheiro que legitimamente precisa de mudança frequente porque fica no centro de lógica de negócio ativa e em evolução, caso em que a prioridade poderia ser melhores testes ou documentação mais clara em vez de uma reescrita estrutural. Isto reflete a distinção do tema 4.1 entre complexidade essencial e acidental, aplicada aqui ao sinal combinado de processamento-complexidade.

Verificar de forma cruzada os pontos quentes contra dados de incidente e defeito

Onde disponível, verifique se os seus pontos quentes identificados se correlacionam com incidentes reais de produção (tema 6.2) ou dados de escape de defeito (tema 5.1). Uma forte correlação valida a análise de pontos quentes como genuinamente preditiva para a sua base de código específica e fortalece o argumento de negócio para agir sobre ela; uma correlação fraca ou ausente sugere ou um problema de qualidade de dados ou que o processamento e a complexidade não são, no seu contexto particular, a combinação certa de sinais para priorizar.

Rastrear a tendência de pontos quentes através de análises sucessivas, não apenas um único instantâneo

Execute novamente a análise de pontos quentes periodicamente, trimestral é comum, e rastreie se os pontos quentes previamente identificados estão a melhorar, a piorar, ou resolvidos, e se novos estão a emergir. Um ponto quente que persiste através de múltiplos ciclos de análise apesar de ser assinalado repetidamente indica ou que o esforço de remediação não foi realmente aplicado ou que uma tentativa anterior de remediação não abordou o verdadeiro problema subjacente.

Usar os dados de pontos quentes para informar, não substituir, as conversas de priorização ao nível da equipa

Apresente a análise de pontos quentes como evidência numa discussão de priorização, não como um mandato automático que anula o próprio julgamento contextual de uma equipa sobre o que mais importa agora mesmo. Uma equipa pode ter boas e legítimas razões para despriorizar temporariamente um ponto quente conhecido, uma reescrita planeada iminente torna a refatoração incremental um esforço desperdiçado, por exemplo, e a análise deveria informar essa conversa, não substituí-la.

Trocas: prós e contras

AbordagemPrósContras
Priorização baseada em intuiçãoRápida, nenhuma ferramenta necessária, aproveita o conhecimento contextual da equipaEnviesada pela recência, preferência pessoal, e quem se queixa mais alto
Apenas processamentoSimples de calcularSinal fraco por si só; a mudança frequente não é inerentemente má
Processamento combinado com complexidade (análise de pontos quentes)Forte, baseada em evidência, automática a partir de dados existentesExige combinar duas fontes de dados e interpretar resultados com julgamento
Análise de pontos quentes verificada cruzadamente com dados de incidenteValidada, evidência mais forte para priorizaçãoExige ligação fiável de incidente a código, que nem toda a organização tem

A tensão central é evidência versus contexto. A análise de pontos quentes fornece evidência objetiva e escalável que a priorização baseada em intuição não consegue igualar ao tamanho de uma base de código grande, pouco familiar, ou de longa duração, mas carece do julgamento contextual que uma equipa tem sobre porque um determinado ponto quente importa, ou não, agora mesmo. Resolva a tensão tratando a análise de pontos quentes como a base de evidência para uma conversa de priorização, combinada com, nunca substituindo, o próprio julgamento contextual da equipa sobre tempo e trocas.

Perguntas para debater com a sua equipa

  1. Quais são os nossos cinco principais pontos quentes, classificados por processamento e complexidade combinados, e essa classificação corresponderia à intuição da nossa equipa sobre onde vivem os nossos piores problemas? Execute a análise e compare o resultado contra o que a sua equipa teria adivinhado antes de ver os dados; as discrepâncias são muitas vezes a descoberta mais valiosa.

  2. Os nossos pontos quentes identificados correlacionam-se com incidentes reais de produção ou dados de escape de defeito? Se tiver os dados para verificar isto, faça-o diretamente; se não tiver, essa lacuna vale a pena nomear como algo a construir.

  3. Para o nosso principal ponto quente agora mesmo, o problema subjacente é complexidade essencial que legitimamente exige mudança frequente, ou complexidade acidental que uma refatoração poderia genuinamente corrigir? Percorra o ficheiro juntos e faça este julgamento explicitamente em vez de assumir qualquer das respostas.

  4. Um ponto quente previamente identificado persistiu através de múltiplos ciclos de análise apesar de ser assinalado? Se sim, investigue honestamente porquê: a remediação nunca foi realmente tentada, ou uma tentativa anterior não abordou a verdadeira causa subjacente.

  5. Estamos atualmente a priorizar o trabalho de refatoração com base em evidência, ou com base em quem se queixou mais recentemente ou mais alto? Seja honesto sobre o processo real atual de priorização da sua equipa e como se compara ao que uma análise de pontos quentes baseada em evidência sugeriria.

  6. Quanto nos custaria, em taxa de defeitos ou abrandamento de entrega, deixar o nosso ponto quente atual não abordado por mais um ano? Esta pergunta força uma estimativa concreta de custo que pode ancorar uma decisão de priorização, em vez de deixar o ponto quente como uma preocupação abstrata e facilmente despriorizada.

Perspetiva setorial

Startup. A análise formal de pontos quentes é normalmente desnecessária com uma base de código pequena e jovem que toda a equipa ainda mantém coletivamente nas cabeças. A técnica torna-se valiosa especificamente quando a base de código cresceu para além do tamanho onde qualquer indivíduo consegue identificar fiavelmente as piores áreas apenas pela memória, muitas vezes algures no primeiro ano ou dois de crescimento sustentado.

Pequena empresa. As ferramentas gratuitas ou de baixo custo conseguem extrair dados de processamento diretamente do seu histórico existente de controlo de versões com configuração mínima; combine-os com quaisquer dados de complexidade que a sua ferramenta existente de verificação de estilo ou análise estática já reporta, em vez de investir em software comercial dedicado de análise de pontos quentes a esta escala.

Empresa. A análise de pontos quentes é onde a priorização baseada em evidência ganha o maior retorno, já que a intuição genuinamente falha à escala de uma base de código que abrange centenas de serviços e milhares de ficheiros. Invista em executar esta análise regularmente através de toda a base de código e em verificar cruzadamente contra dados de incidente para construir um caso validado e defensável para investimento de refatoração.

Governo. Os sistemas de longa duração, por vezes com décadas, são um ajuste natural para a análise de pontos quentes, já que o histórico acumulado de controlo de versões fornece um sinal rico e de longo prazo sobre quais partes do sistema genuinamente se provaram problemáticas ao longo do tempo. Esta abordagem baseada em evidência é também uma ferramenta persuasiva e concreta para justificar investimento em modernização a interessados que precisam de mais do que a opinião informal de um engenheiro para aprovar financiamento.

Exemplos

Empresa. A plataforma de processamento de sinistros de uma seguradora, abrangendo mais de dois milhões de linhas de código através de dezenas de serviços, tinha acumulado anos de queixas informais sobre “o módulo de validação de sinistros” ser problemático, mas nenhuma priorização formal alguma vez se seguiu dessas queixas. Uma análise de pontos quentes combinando seis meses de dados de processamento com pontuações de complexidade identificou um ficheiro completamente diferente, um utilitário partilhado de conversão de moeda enterrado profundamente numa dependência raramente discutida, como o verdadeiro principal ponto quente, um que nunca tinha surgido em nenhuma queixa retrospetiva. A verificação cruzada contra dados de incidente confirmou que este utilitário estava implicado numa parcela desproporcional de defeitos de cálculo financeiro no ano anterior, e uma refatoração direcionada desse utilitário específico, em vez do módulo que toda a gente tinha estado informalmente a culpar, produziu uma redução mensurável em incidentes relacionados no trimestre seguinte.

Governo. O sistema de licenciamento com décadas de existência de uma agência estadual de veículos motorizados passou por uma análise de pontos quentes como parte de um caso de negócio de modernização. A análise identificou um pequeno conjunto de ficheiros, representando menos de 3% da base de código total, responsável por uma parcela desproporcional tanto de processamento como de complexidade, e a verificação cruzada contra o registo de incidentes da agência mostrou que este mesmo conjunto era responsável por quase 40% de todos os defeitos reportados do sistema nos três anos anteriores. Esta descoberta concreta e baseada em evidência, muito mais persuasiva do que uma afirmação geral de que “o sistema é antigo e precisa de modernização,” tornou-se a peça central de um pedido orçamental bem-sucedido para um esforço direcionado e incremental de modernização focado especificamente nesse conjunto em vez de uma substituição completa e muito mais cara do sistema.

Argumento de negócio: motivações, ROI, e TCO

O retorno da análise de pontos quentes é investimento direcionado e baseado em evidência: ambos os exemplos acima mostram um caso onde a análise formal redirecionou a atenção de refatoração para longe de onde a queixa informal a tinha focado e em direção a onde os dados realmente mostraram que o problema vivia, produzindo um retorno mensuravelmente melhor do que um investimento não direcionado ou impulsionado por intuição teria.

O custo total de propriedade é baixo, já que os dados de processamento vêm diretamente do histórico existente de controlo de versões e os dados de complexidade normalmente já estão disponíveis a partir de ferramentas de análise estática (tema 4.4); o principal investimento é o esforço periódico de análise e o tempo de julgamento humano para interpretar os resultados e decidir que ação cada ponto quente identificado justifica.

Antipadrões e armadilhas

  • Usar apenas o processamento sem a complexidade: um sinal fraco por si só que pode assinalar código saudável e ativamente desenvolvido como um falso positivo.
  • Tratar uma classificação de pontos quentes como uma lista automática de ação sem julgamento humano: perde a distinção essencial-versus-acidental que determina a resposta certa.
  • Priorizar a refatoração com base na queixa mais ruidosa em vez de evidência: desvia frequentemente o esforço de onde os dados realmente mostram que o problema vive.
  • Nunca verificar cruzadamente os pontos quentes contra dados de incidente ou defeito: perde o passo de validação que fortalece o argumento para agir sobre a análise.
  • Executar a análise uma vez e nunca a repetir: perde se o esforço de remediação está realmente a funcionar ao longo do tempo.
  • Ignorar um ponto quente persistentemente assinalado sem investigar porque a remediação não pegou: desperdiça o valor diagnóstico da análise repetida.

Modelo de maturidade

  • Nível 1, Iniciar: As prioridades de refatoração são definidas por intuição ou volume de queixa, sem dados de processamento ou complexidade a informar a decisão.
  • Nível 2, Desenvolver: Algumas equipas verificam informalmente dados de processamento ou complexidade, mas não há prática consistente e à escala da organização de análise de pontos quentes.
  • Nível 3, Padronizar: A análise de pontos quentes combinando processamento e complexidade executa regularmente e informa consistentemente a priorização de refatoração em toda a organização.
  • Nível 4, Gerir: Os pontos quentes são verificados cruzadamente contra dados de incidente e defeito para validar a análise, e a tendência através de ciclos sucessivos é ativamente rastreada.
  • Nível 5, Orquestrar: A organização consegue apontar para melhorias específicas e mensuráveis na taxa de defeitos ou na entrega a partir de investimento de refatoração informado por pontos quentes, e a análise é uma entrada rotineira e confiável para decisões de investimento de engenharia.

Ideias para debate

  1. Como seria a nossa lista de principais pontos quentes se executássemos esta análise hoje?
  2. Essa lista corresponderia, ou contradiria, o sentido informal atual da nossa equipa sobre as nossas piores áreas de problema?
  3. Temos os dados para verificar cruzadamente os pontos quentes contra incidentes reais?
  4. Uma área de problema conhecida persistiu apesar de tentativas anteriores de a corrigir, e porquê?
  5. Quanto nos custaria deixar o nosso ponto quente atual não abordado por mais um ano?

Principais conclusões

  • O processamento combinado com a complexidade identifica pontos quentes genuínos muito mais fiavelmente do que qualquer métrica sozinha.
  • A análise de pontos quentes não exige nenhum levantamento manual; é calculável automaticamente a partir de dados existentes de controlo de versões e análise estática.
  • Trate uma classificação de pontos quentes como evidência para priorização, não um veredito automático; o julgamento humano ainda é necessário.
  • Verifique cruzadamente os pontos quentes contra dados de incidente e defeito para validar a análise e fortalecer o argumento para agir sobre ela.
  • Rastreie os pontos quentes através de ciclos sucessivos de análise para confirmar que a remediação está realmente a funcionar, não apenas uma vez como um instantâneo.

Referências e leituras adicionais

  • Your Code as a Crime Scene, de Adam Tornhill.
  • Software Design X-Rays, de Adam Tornhill.
  • Nagappan, Nachiappan, e Thomas Ball, “Use of Relative Code Churn Measures to Predict System Defect Density,” ICSE (2005).
  • Refactoring: Improving the Design of Existing Code, de Martin Fowler.