47 pontos por xguru 2023-03-20 | 2 comentários | Compartilhar no WhatsApp
  • O que é necessário para enxergar a dívida técnica como uma ferramenta estratégica
    • Reconhecer e resolver suposições negativas sobre dívida técnica
    • Classificar os 6 tipos de dívida técnica e responder de forma diferente a cada um
    • Entender a escala da dívida técnica
    • Como decidir a prioridade da dívida técnica

How to Not Manage Tech Debt

  • 4 suposições que levam a uma má gestão da dívida técnica

Suposição #1: dívida técnica = algo ruim

  • Nem toda dívida técnica deve ser classificada como "ruim"
  • É muito melhor nomear cada uma, medir o tamanho da dor e classificar as dívidas técnicas
  • Existem dívidas técnicas que vale a pena ter, e toda equipe deveria ter alguma dívida técnica
  • O caso do Twitter, que teve "boa dívida técnica": usou storage público e depois desenvolveu seu próprio banco de dados distribuído, o Manhattan
  • Perguntas para responder à suposição de que "dívida técnica = algo ruim"
    • O que ganhamos se assumirmos essa dívida técnica agora e resolvermos isso no próximo mês?
    • Em que situação a liderança se importaria com essa dívida técnica? Como devemos apresentar informações que ajudem o CTO a fazer o pitch para a liderança?
    • Como essa iniciativa pode se conectar à visão maior da empresa ou à direção estratégica?

Suposição #2: toda dívida técnica = trabalho complexo

  • Assim como em qualquer trabalho difícil, existem várias formas de lidar com tarefas complexas, e isso também vale para a dívida técnica
  • Especialmente no caso de dívida técnica, existe uma forma de abordar trabalho Defined/Undefined (definido/indefinido)
    • Defined = o trabalho tem começo e fim
    • Undefined = o trabalho tem começo, mas o fim não é claro
  • Para responder à suposição de que dívida técnica = complexidade
    • Deixar claro se a dívida técnica em questão é Defined ou Undefined
      • No caso de Defined, entender o tempo estimado para concluir o trabalho e deixar um pequeno buffer
      • No caso de Undefined, listar as partes pouco claras e comunicá-las aos stakeholders para que entendam por que o trabalho é complexo e não tem uma data de término clara, pedindo opinião sobre a melhor forma de avançar
    • Dividir dívida técnica Undefined em partes menores e mais fáceis de executar para reduzir a complexidade
      • Quando se transforma um trabalho grande e complexo em tarefas menores, ainda complexas mas executáveis, a equipe pode se sentir mais motivada a resolver parte da dívida técnica dentro de um sprint ou trimestre
  • Perguntas para responder à suposição de que "dívida técnica = trabalho complexo"
    • Que suposições erradas existem sobre o sistema?
    • Se trouxermos alguém experiente ou familiarizado com essa área, quais perguntas precisamos fazer sem falta?
    • Nossa equipe tem as pessoas e o conhecimento adequados para executar esse trabalho? Se não, como devemos pensar em redistribuir informação e quando seria o momento ideal para resolver isso?
    • Qual é a melhor forma de explicar a complexidade dessa dívida técnica para alguém que não a entende de forma alguma?

Suposição #3: dívida técnica ≠ trabalho de produto

  • As organizações costumam ter clareza sobre como trabalho de produto melhora métricas da empresa
  • Normalmente, a dívida técnica fica fora dessa conversa
  • Resolver dívida técnica no momento certo pode ser importante para impulsionar o crescimento da empresa, mesmo que isso não seja quantificável imediatamente
  • Para responder à suposição de que dívida técnica ≠ trabalho de produto
    • Mesmo que uma área específica de dívida técnica não esteja diretamente ligada a métricas, pensar de forma ampla em como isso pode ajudar a experiência do usuário ou do produto
    • Em vez de enfatizar só benefícios técnicos, dar o mesmo peso aos benefícios para usuário e produto facilita que outras pessoas entendam por que a equipe deveria se importar com esse trabalho
    • Reservar tempo para garantir que liderança de negócio e liderança técnica estejam alinhadas
  • Perguntas para responder à suposição de que "dívida técnica ≠ trabalho de produto"
    • Qual é a razão mais importante para fazer esse trabalho agora?
    • Quem precisa entender o impacto desse trabalho? Por que essa pessoa deveria se importar com isso?
    • O que estou tentando dizer? Isso está alinhado com o que o stakeholder quer ouvir? Se não, como posso resolver o problema dele?
    • O que eu ou a equipe consideramos um resultado razoável vs. excelente?
    • Estamos prometendo demais em relação aos resultados? Dá para nivelar as expectativas separando o que seria um resultado excelente do que seria um bom resultado?

Suposição #4: dor individual = dor organizacional

  • Engenheiros próximos da dívida técnica costumam repetir regularmente que lidar com ela é doloroso em nível pessoal
  • Para a pessoa pode parecer o fim do mundo, mas o restante da organização não sente a mesma dor
  • Isso é comum em pessoas no início da carreira e normalmente vem da falta de contexto estratégico mais amplo
  • Para responder à suposição de que dor individual = dor organizacional
    • Ao encontrar uma área de dívida técnica com alta prioridade, parar um pouco para avaliar se isso é uma dor em nível individual ou organizacional
      Em geral, problemas em nível organizacional afetam diretamente clientes ou negócio de alguma forma
    • Tentar pensar pela perspectiva de alguém com mais contexto organizacional do que você. Também pode ser útil explicar isso para alguém de outro time
  • Perguntas para responder à suposição de que "dor individual = dor organizacional"
    • Quantos times se beneficiam ao classificar e resolver essa dívida técnica?
    • Quando a empresa reconheceu ou recompensou alguém por assumir um trabalho de dívida técnica? Que tipo de dívida técnica era e por que isso era necessário naquele momento? Dá para falar sobre como essa pessoa posicionou esse trabalho?
    • Meu engineering manager entende o valor do trabalho de dívida técnica? Ele vai defender minha contribuição nesse trabalho durante a performance review?

6 tipos de dívida técnica

  • Maintenance debt (dívida de manutenção)
    • Quando a equipe não consegue acompanhar as atualizações da tecnologia
    • Também inclui não remover dead code após início de experimento / rollout de feature / rollback de deploy, além de não atualizar bibliotecas, comentar código de contexto ou documentar decisões de implementação
    • Ex.) A equipe experimentou a funcionalidade "log in with Spotify" e, quando cancelou, não removeu o código correspondente
  • Developer efficiency debt (dívida de eficiência de desenvolvedores)
    • Quando a empresa não tem testes, monitoramento e sistema de alertas adequados para o produto
    • É um tipo comum de dívida em que o workflow de engenharia é muito ineficiente, deploy/build leva horas ou dias, e desenvolvedores não conseguem detectar problemas técnicos antes de chegar à produção
    • Ex.) A organização cresceu de 15 para 50 pessoas em 1 ano, com experimentos demais acontecendo ao mesmo tempo. Releases para corrigir bugs encontrados em produção estão atrasadas em 2 ou 3 ciclos. Novos testes para a experiência de compra acabam ficando para trás
  • Stability debt (dívida de estabilidade)
    • Quando vários tipos de dívida técnica se acumulam e passam a afetar a estabilidade da infraestrutura da organização
    • Em vez de gerenciar on-call de forma preventiva, surgem cenários em que especialistas são chamados depois que o problema acontece, ou o time inteiro entra em on-call
    • Isso é um grande problema para engenheiros e para a equipe do rodízio de on-call, mas para o restante da empresa é difícil até entender e explicar o problema
    • A dívida de estabilidade também afeta a confiabilidade do produto, gerando problemas enfrentados por clientes
    • Ex.) O time mobile tem mais desenvolvedores iOS e por isso prioriza iOS em relação ao app Android. Como resultado, o app Android fica sem guidelines de produto para fluxos importantes para o negócio e ainda carrega código frágil (kryptonite) criado inicialmente por terceiros. Isso faz usuários Android sofrerem crashes ao acessar funcionalidades antigas, piorando a nota na Google Play
  • Security debt (dívida de segurança)
    • Quando se usa uma stack com vulnerabilidades de segurança, como brute force, vazamento de dados etc.
    • Muitas organizações acumulam dívida de segurança porque é difícil planejar e avaliar coisas que podem acontecer — ou talvez nunca aconteçam
    • Ex.) Por falhas em processos internos, a empresa não atualizou sistemas a tempo e deixou de aplicar patches para vulnerabilidades conhecidas, causando vazamento de dados pessoais de clientes (de empresas pequenas até casos como o da Equifax, que impactou 140 milhões de pessoas)
  • Technical product debt (dívida técnica de produto)
    • Quando o impacto negativo no produto se torna visível
    • É a dívida mais fácil de identificar e mais conveniente de resolver, porque afeta usuários e todos os times da organização conseguem ver impacto em vendas/receita
    • Ex.) Um usuário leva vários segundos para realizar uma tarefa específica dentro do produto. Isso pode vir de vários tipos de dívida, mas afeta a experiência central do produto
  • Decision debt (dívida de decisão)
    • Quando se paga o custo de uma decisão técnica anterior que estava errada em X% ou que exigiu trade-offs em escopo, tempo ou recursos
    • É a forma mais comum de dívida técnica
    • Ex.) Para um experimento específico no site, a equipe usou uma solução third-party. Depois de alguns anos de enorme crescimento, agora milhões de usuários visitam o site. Como resultado, times de tecnologia, dados e produto sofrem sempre que tentam executar experimentos complexos
      Isso aconteceu porque o time tomou uma decisão de trade-off entre third-party e solução própria, gerando dívida de decisão. Na época pode ter sido a escolha certa, mas agora os impactos começaram a aparecer

Definindo a escala da dívida técnica: Acute vs Systemic

  • Depois de entender os tipos de dívida técnica, é preciso definir a escala do custo para compará-la com o que será ganho
  • Quando o time pergunta "quando vamos ter tempo para trabalhar em dívida técnica?", muitas vezes é difícil saber, em termos de tempo, reflexão e esforço, se isso é pequeno ou grande
  • Dívida técnica Acute (aguda)
    • Dívida técnica relativamente pequena
    • Ex.) Para lançar uma nova funcionalidade, a equipe pulou trabalho para plataformas/navegadores com baixa escala de uso. Se não houver mais nada, isso pode ser adicionado facilmente em 1 dia
  • Dívida técnica Systemic (sistêmica)
    • Dívida técnica de grande a enorme escala
    • Ex.) O CTO/fundador tomou uma decisão sobre o produto (e indiretamente sobre tecnologia) há 5 anos, e a empresa construiu muita coisa em cima disso. Se isso for alterado, vai impactar diversas áreas.
      Essa dívida técnica não é fácil de resolver e pode levar de meses a anos para ser mudada

Priorizando dívida técnica de forma estratégica

  • Uma forma flexível de considerar e avaliar
    • Confidence: qual a probabilidade de isso levar a um problema sério? baixa/alta
    • Time: quando isso vai virar um problema? não urgente/urgente
    • Impact to User: se isso não for feito, haverá problema de velocidade/qualidade que prejudique a experiência do usuário? baixo/alto
    • Sequence: isso atrapalha chegar a um milestone importante? pequeno impacto/bloqueio
    • Accumulated debt: quanta dívida já decidimos acumular? pouca/muita

Portfólio estratégico de dívida técnica conforme o estágio de crescimento da empresa

  • Traction:
    • Antes do product-market fit
    • Decisões de engenharia devem privilegiar velocidade em vez de precisão, estabilidade e processo. Grande escala de dívida de eficiência de desenvolvedores
    • Em geral, isso significa escolher frameworks full stack como Django, Rails, PHP etc. para desenvolver rapidamente
  • Inflection:
    • Momento em que surgem sinais de PMF e o produto entra em um loop escalável
    • A equipe percebe que precisa de alguns processos (a dívida de eficiência de desenvolvedores começa a ser resolvida), mas como ainda está ajustando o equilíbrio entre processos internos e experiência do usuário, a dívida técnica de produto aumenta
  • Scale:
    • Período de hyper-growth da empresa
    • Ao encontrar equilíbrio entre práticas/processos internos e experiência do usuário, a dívida técnica de produto e a dívida de eficiência de desenvolvedores começam a cair e se estabilizar
    • Como resultado do crescimento muito rápido, aumentam dívida de segurança, dívida de manutenção e dívida de decisão
    • Há muitas mudanças e ajustes em automação de testes, sistemas de deploy, monitoramento e alertas, logging e instrumentation, ambientes de teste e staging, ETL etc.
  • Expansion:
    • Início da saturation. O negócio se torna mais maduro
    • Por causa da grande quantidade de código antigo e decisões passadas, dívida de manutenção e dívida de decisão continuam aumentando
    • À medida que a equipe busca novas oportunidades de crescimento, a dívida de eficiência de desenvolvedores volta a começar a crescer
    • Dívida técnica de produto, dívida de segurança e dívida de estabilidade estão entrando em equilíbrio após o período anterior

Dicas para gerenciar um portfólio de dívida técnica

  • Processos para reduzir a dívida técnica que está sendo criada
    • Embora acumular dívida técnica possa ser estratégico, em alguns casos faz sentido implementar processos desde cedo para evitar que ela seja criada
    • Isso é especialmente verdade nos estágios de Inflection e Scale, em que a dívida de eficiência de desenvolvedores deveria diminuir à medida que mais engenheiros entram
    • Quando a dívida de eficiência de desenvolvedores cai, ela pode ser substituída por aumento de dívida de decisão e dívida de manutenção
    • Exemplos desses processos: revisão de código/PR, padrões de monitoramento, aprovação de QA e revisão técnica/de design
  • Ferramentas para evitar a formação de certos tipos de dívida
    • Investir em ferramentas básicas pode impedir que alguns tipos de dívida se formem
    • Isso é especialmente importante no estágio de Scale para evitar problemas de segurança (dívida de segurança), bugs que afetam a experiência do usuário (dívida técnica de produto) e inconsistência de código (dívida de eficiência de desenvolvedores)
    • Exemplos dessas ferramentas: linter e pipelines de CI/CD
  • Trabalho de sprint para dívida técnica Reactive & Acute
    • Quando a organização chega a uma escala que exige on-call, sprints de on-call devem ser usados para apagar incêndios atuais ou para trabalho reativo ligado à dívida técnica
    • Isso permite que a organização trate itens urgentes de dívida técnica e execute ações reais sobre problemas atuais/passados por meio do time de on-call
    • Permitir on-call para trabalho reativo é especialmente importante nos estágios de Scale/Expansion do crescimento. Tratar dívida técnica urgente permite que outros times criem novas features/produtos e lidem com dívida adicional
  • Trabalho de roadmap para dívida técnica proativa e sistêmica
    • Colocar dívida técnica no roadmap exige alinhamento entre muitos times
    • Exemplos de dívida técnica no roadmap: grandes reescritas, reorganização do sistema de dados de funcionalidades muito usadas por clientes, definição e implementação de alertas para fluxos críticos, migração de sistema de pagamento etc.

Como transformar dívida técnica de fardo em ferramenta estratégica

  • A partir da dívida técnica acumulada, a equipe pode tomar decisões estratégicas mais amplas sobre quais iniciativas deve executar
  • Pensar nas suposições comuns sobre dívida técnica que a equipe enfrenta. Você discorda de "dívida técnica = algo ruim" ou "dívida técnica ≠ trabalho de produto"? Está ouvindo colegas que pensam que "dor individual = dor organizacional"?
  • Não usar o termo genérico "dívida técnica". Dar nomes como dívida de manutenção, dívida de eficiência de desenvolvedores, dívida de estabilidade, dívida de segurança, dívida técnica de produto e dívida de decisão
  • Definir a escala da dívida técnica para reduzir ambiguidade. É Acute ou Systemic?
  • Priorizar dívida técnica estrategicamente em comparação com outras áreas da empresa. Definir prioridades com base em vetores como confiança, tempo e impacto para o usuário
  • Evoluir e manter equilibrado o portfólio de dívida técnica conforme as mudanças e demandas do crescimento da empresa

2 comentários

 
roxie 2023-03-24

Acho que o conteúdo mais básico e importante é deixar claro que "essa é a sua dor". Seja em números ou de qualquer outra forma.

Se isso não for possível, na verdade talvez dê até para chegar à conclusão de que, afinal, nem era dívida técnica.

 
[Este comentário foi ocultado.]