Os Lannister sempre pagam suas dívidas. Qual é o lema Lannister? Yuri Boldyrev difama o pequeno blogueiro sub-Kremlin Rogers

Práticas tecnológicas de gestão de dívidas em uma única equipe


Há cerca de um ano, nossa equipe passou de uma fase de rápido crescimento de recursos para uma fase de desenvolvimento mais fluido, com foco na melhoria da qualidade. Neste ponto, nossos produtos acumularam uma quantidade notável de soluções abaixo do ideal, códigos feios e bibliotecas desatualizadas. Algo tinha que ser feito sobre tudo isso.


Até à data, conseguimos construir um processo que torna a luta contra a dívida técnica previsível, indolor e inevitável.


O que obtivemos como resultado:

  • A equipe está feliz. A retrospectiva do lançamento inclui regularmente pontos positivos sobre o aprimoramento da tecnologia e a redução do débito técnico.
  • Por vários lançamentos trimestrais consecutivos, conseguimos aumentar a funcionalidade sem aumentar o número de linhas de código no projeto. A remoção de código desnecessário e a simplificação do que era necessário reduziram o tamanho da base de código para a funcionalidade existente. E essa redução coincidiu aproximadamente em escala com o novo código que implementa a nova funcionalidade.
  • Durante refatorações e atualizações, o produto está sempre em condições de funcionamento. A cada duas semanas lançamos uma versão provisória totalmente funcional.

Deixe-me contar como conseguimos isso.

O que é dívida técnica

Minha definição prática de dívida técnica é a quantidade de trabalho que precisa ser feito para que um projeto atenda à visão da equipe sobre o que é ótimo. Observe que o débito técnico pode surgir não apenas devido ao uso liberal de muletas no desenvolvimento, mas também devido à mudança de ideias sobre beleza. Por exemplo, as práticas comuns da indústria mudaram. Ou os desenvolvedores deixaram de amar OOP e se apaixonaram pela programação funcional. Ou a estrutura que estava na moda não é mais um bolo e tornou-se difícil encontrar especialistas que gostariam de escrever sobre ela.


No entanto, a principal causa da dívida técnica é a entropia em toda a sua diversidade. Testes unitários desabilitados, comentários desatualizados que perderam contato com o código, decisões arquiteturais malsucedidas, implementação de funcionalidades que ninguém usa mais, base para um futuro que não chegou e muito, muito mais.


Segue-se que o aparecimento de dívida técnica é inevitável em qualquer projeto de longa duração.

Quando a dívida técnica não é um problema

Por que a dívida técnica é ruim? Aumenta o custo de desenvolvimento adicional devido a uma série de fatores:

  • A velocidade de implementação de novas funcionalidades é reduzida.
  • A probabilidade de regressões ao corrigir defeitos aumenta.
  • O processo de desenvolvimento torna-se menos previsível e, portanto, menos gerenciável.
  • O processo de introdução de um novo desenvolvedor no projeto está se alongando.

Esta perda é por vezes chamada de “juros sobre dívida técnica”


Existem situações em que estas perdas são mais baratas do que eliminar a dívida técnica:

  • O fim da vida do projeto está próximo. Observe que este não é o fim da adição de funcionalidades, mas o momento em que você também pode parar de desperdiçar esforços dos programadores em suporte. Esta categoria também inclui protótipos únicos, demonstrações únicas para exposições, etc.
  • O valor do tempo de desenvolvimento agora é muito maior do que o esperado no futuro. Correções urgentes para um prazo fixo, startups que estão ficando sem dinheiro na próxima rodada de financiamento, etc. Nesses casos, a correção da dívida técnica pode ser adiada até que o calor do momento esfrie. Existem projetos que não saem do estado de emergência, mas os conselhos deste artigo ainda não os ajudarão.

O que fazer com a dívida técnica? Abordagens falhadas

Abordagem nº 1. “Não temos tempo, o lançamento deve ser enviado ontem”

A vontade de cumprir o prazo de amanhã a qualquer custo, em detrimento da velocidade de desenvolvimento depois de amanhã.


Às vezes, uma estrutura pré-fabricada feita de muletas é uma escolha objetivamente correta. Na minha prática, isso foi expresso mais claramente ao fazer versões demo para exposições. A data do evento é estritamente fixada; se você não chegou a tempo para uma exposição importante, a próxima tentativa será dentro de um ano. Neste caso, você pode exibir o produto “fora de suas mãos”, evitando cuidadosamente todos os bugs. Como engenheiro, é desagradável para mim realizar tais projetos, mas as muletas neles são justificadas.


Quando você faz um produto que vai durar muito, tudo é diferente. Cumprir o prazo devido a soluções técnicas duvidosas é um prazer caro. O custo total é:

  1. desde a implementação da própria muleta,
  2. desde sua substituição subsequente por uma solução completa,
  3. do sofrimento de ter uma muleta entre os pontos anteriores.

O segundo ponto é muito fácil de subestimar e corre-se o risco de não pensar no terceiro, o mais caro.


Quando você encontra um líder de tecnologia com olhos trêmulos em uma conferência, pode acontecer que foi o pesadelo de depurar incessantemente um design feito de muletas que o trouxe a esse estado.


Abordagem nº 2. “Sim, aqui precisamos jogar tudo fora e escrever de novo”

Quanto pior a situação da dívida técnica, maior será a tentação de enterrar todo o código do projeto e escrever tudo novamente. Este é um dos erros clássicos que podem matar todo o projeto.


O tema é tão bem abordado no famoso artigo de Joel Spolsky que não vejo sentido em apresentar meus próprios argumentos.

Abordagem nº 3. “Refatoriaremos à noite e nos finais de semana para que o gerente não descubra.”

Argumentar a necessidade de eliminar a dívida técnica em termos de benefícios empresariais nem sempre é fácil. A equipe de desenvolvimento pode ficar tentada a contornar as arestas e iniciar uma grande refatoração no local. Isso pode ser feito fora do horário de trabalho, em pausas entre outras tarefas ou “na cauda” de outras tarefas, inflacionando as estimativas.


O que há de ruim nisso? Ah, um monte de coisas:

  • A transparência reduzida mina a confiança entre a gestão e a equipe. Muitas vezes, as tentativas subsequentes de corrigir a situação, impondo disciplina e apertando os parafusos, levarão a uma deterioração ainda maior no trabalho em equipe.
  • Uma situação arraigada em que as prioridades da equipe e da gestão são conflitantes causa desmotivação de ambos os lados.
  • Os frutos da refatoração são incluídos no produto de maneiras imprevisíveis e causam bugs de regressão onde não são esperados. Em equipes conscientes, isso leva a uma carga repentina e não planejada de controle de qualidade. No inconsciente, ele entra em produção e aí se decompõe.

Depois que a equipe usa essa receita, os olhos da administração começam a se contorcer.

Nossos princípios

1. Adicione tarefas técnicas ao backlog geral

Existem vários padrões na vida das tarefas nos projetos:

  • Uma tarefa que não está no backlog tem menos chances de dar certo.
  • Uma tarefa sem uma formulação clara tem menos chances de dar certo.
  • Uma tarefa que não pode ser estimada com alto grau de confiança tem menos chances de entrar em ação.
  • Uma tarefa grande esperará mais tempo na fila do que uma tarefa pequena.

Maxim Dorofeev fala muito bem sobre essas coisas em sua “Técnica da caixa de entrada vazia”


Para evitar a acumulação de dívida técnica, os trabalhos para a sua eliminação devem ser concluídos tendo em conta os princípios acima enumerados.


Todas as tarefas, exceto as menores, estão listadas no backlog. Dessa forma, eles têm a chance de serem realizados não apenas no tempo livre, mas também como parte do trabalho planejado. Além disso, é mais difícil perder completamente essas tarefas de vista - o backlog é examinado com mais frequência e mais de perto do que TODOs no código, pedaços de papel no monitor, páginas wiki abandonadas, guardanapos manchados de chá com diagramas e outros fontes de informação.

  • Se houver um TODO não trivial no código, ele conterá um link para a tarefa no backlog. Verificamos a conformidade com este princípio na revisão do código e não aceitamos TODOs complexos sem referências.

    Pode haver drama por trás do comentário.

    Certa vez, ao lado de tal TODO estava escrito: “Muleta. O Product Owner me obrigou a fazer isso. Remova o mais rápido possível."

  • Quando um desenvolvedor percebe que algum lugar requer refatoração, ele cria um problema no backlog.
  • Quando um desenvolvedor deseja melhorar a plataforma, ele cria uma tarefa no backlog.
  • Os planos arquitetônicos de longo prazo são colocados no backlog na forma de tarefas separadas assim que há certeza suficiente pelo menos sobre os primeiros passos.

Contanto que essas mudanças permaneçam baratas em termos de custos de desenvolvimento e da quantidade de testes necessários, poderemos melhorar gradualmente nossa base de código sem interromper os objetivos de negócios ou introduzir riscos adicionais.

2. Planeje histórias técnicas com base nas prioridades de negócios

Se uma árvore caísse na floresta, mas ninguém ouvisse, houve algum som? Se houver código incorreto em um projeto, mas esse módulo nunca precisará ser alterado, há dívida técnica?


Acredito que quando um programador acha desagradável olhar algum módulo antigo, isso por si só não é um problema muito grande. Muito pior é o que acontece quando você precisa adicionar novas funcionalidades a este módulo ou expandir o antigo. Em comparação com fazer alterações em código bem escrito, essas tarefas são mais prováveis ​​(e mais propensas a exceder a estimativa original) e contêm mais bugs. Às vezes muito mais. Para nos protegermos desses tipos de problemas, tentamos agendar refatorações para que sejam feitas antes de escrever novas funcionalidades no mesmo local.


Se as alterações de funcionalidade e refatorações parecerem pequenas, elas poderão ser feitas em conjunto. O tamanho da tarefa selecionado empiricamente para o qual esta abordagem será ideal é de 3 dias de trabalho para um desenvolvedor ou menos. Quando fica claro que há mais trabalho, ele é dividido em refatoração mantendo o comportamento atual e implementando novas funcionalidades.


Assim, a ordem de trabalho para eliminar o débito técnico é determinada pela ordem das tarefas de negócios no backlog.


O princípio das “prioridades empresariais” tem outra aplicação. Um dos problemas comuns que os desenvolvedores que se esforçam para escrever bem sofrem é a dificuldade de dedicar tempo para otimizar o desempenho, melhorar a capacidade de manutenção ou outras coisas que não estão diretamente incluídas no plano de trabalho. Quase sempre há uma necessidade comercial dessas melhorias. Quem não quer que o sistema funcione mais rápido, mais estável e cuja manutenção seja mais barata? Todos estes benefícios podem ser avaliados e, com base nesta avaliação, as tarefas de melhoria podem ser colocadas no backlog, juntamente com quaisquer outras.


Portanto, se você deseja otimizar o desempenho, mas precisa corrigir outro bug chato, talvez você simplesmente não saiba como explicar os benefícios da otimização em uma linguagem que o proprietário do produto possa entender.

3. Deixe o código mais limpo do que estava antes

Quase qualquer código, exceto aquele escrito muito recentemente, fica um pouco aquém da ideia atual de beleza no campo do estilo e da arquitetura. Quando você precisa alterar o código como parte de uma tarefa, é considerada uma boa prática fazer todas as melhorias seguras possíveis na área afetada. O que poderia ser?

  • Trazendo módulos para o estilo atual.
  • Alterar nomes de variáveis ​​internas para nomes mais compreensíveis.
  • Simplifique a implementação enquanto mantém o comportamento.
  • Refatorações locais que não introduzem alterações em grande escala em outros módulos.

Espera-se que essas melhorias melhorem o código, mas não aumentem significativamente o custo de desenvolvimento ou teste.


Devido a este princípio, a qualidade do código aumenta gradualmente em segundo plano, mesmo naqueles locais onde nenhuma refatoração separada foi planejada. Além disso, quanto mais trabalharmos em uma determinada parte do sistema, melhor será o código dessa parte. Um bom contraste com projetos onde o desenvolvedor gasta mais tempo nas partes com pior código.

4. Não importa o que aconteça, o sistema deve permanecer em condições de funcionamento.

Um dos princípios básicos do SCRUM diz que ao final de cada sprint o sistema deve atingir um estado estável.


“Ao final do sprint, o incremento deve estar pronto, o que significa que atende aos critérios de prontidão do Time Scrum e está pronto para uso. Deve estar pronto para uso, independentemente da decisão do proprietário do produto de liberá-lo ou adiá-lo.”

Qualquer trabalho para eliminar a dívida técnica é feito de acordo com este princípio.


Grandes transformações são necessariamente decompostas para que qualquer etapa individual possa ser concluída em um sprint. Por exemplo, alteramos o sistema de compilação em dois estágios (Angular 1.x: webpack rastejante, grunhido à espreita)


Trabalhamos com VCS de acordo com princípios próximos ao gitflow clássico. O desenvolvimento é realizado em ramos de recursos e os testes são realizados lá. Como regra, esse ramo não dura mais do que um sprint de duas semanas. Uma filial que dura mais tempo quase sempre resulta em custos adicionais.


Nossa experiência confirma claramente esse padrão. Cada vez que não conseguíamos concluir uma grande refatoração em duas semanas, era uma dor e um sofrimento. E quanto mais demorada era a tarefa e quanto mais durava a filial aberta, mais lento era o trabalho e mais problemas surgiam.


A necessidade de estar sempre a poucos passos de uma versão estável cria um dos problemas de engenharia mais difíceis e interessantes – encontrar a decomposição ideal dos planos estratégicos. Mudanças em grande escala podem ser divididas em etapas separadas e independentes. É aconselhável começar a receber os benefícios o mais cedo possível. Quanto melhor for realizada essa divisão do trabalho, maiores serão as chances de conclusão do trabalho.

Como é o nosso processo

Uma vez por lançamento, fazemos uma revisão detalhada do backlog técnico:

  • Fechamos histórias irrelevantes (relevância perdida, feitas como parte de outra coisa, duplicadas).
  • Atualizamos a descrição onde a visão do problema mudou.

Quando histórias de negócios aparecem no horizonte, é feita uma análise técnica e todas as histórias técnicas que ajudariam na implementação são associadas à história de negócios.


Em preparação para o planejamento do sprint:

  • Verificamos as conexões entre histórias técnicas e de negócios.
  • Vinculamos todos os bugs relacionados a histórias técnicas que podem ser corrigidas de forma barata no mesmo lugar.

Como formar a parte técnica do backlog

Quando assumi a função de líder da equipe, perguntei a cada desenvolvedor e controle de qualidade quais melhorias no produto eles mais queriam fazer. A maioria das solicitações estava relacionada a melhorias técnicas na plataforma e refatorações. Como a experiência mostrou, todos os principais problemas técnicos do produto foram incluídos neste conjunto de desejos. Portanto, você pode usar essa prática para construir rapidamente um backlog técnico do zero ou ter uma ideia geral do estado da dívida técnica em um novo projeto.


O atual preenchimento do backlog com tarefas técnicas ocorre devido às práticas descritas acima e não requer esforços ou análises separadas. Além disso, novas ideias para melhoria técnica do produto são agregadas ao backlog. Isso é feito por qualquer membro da equipe que tenha essa ideia. O principal nesta fase é não perder a ideia. O esclarecimento e a determinação da prioridade ocorrem posteriormente, durante o planejamento do trabalho.

conclusões

  • A dívida técnica é inevitável.
  • Para a maioria dos projetos, eliminar a dívida técnica é um bom investimento de esforço.
  • Se a dívida técnica não for resolvida, a velocidade de desenvolvimento aproximar-se-á gradualmente de zero.
  • A tentação de jogar tudo fora e escrever novamente pode matar ou prejudicar seriamente o seu projeto.
  • Os benefícios da eliminação da dívida técnica devem ser enquadrados em termos de benefícios empresariais, caso contrário corre-se o risco de as tarefas de criação de novas funcionalidades serem sempre consideradas mais importantes.
  • Vale a pena gerenciar tarefas para eliminar dívidas técnicas. Essas tarefas não são diferentes de outras tarefas do projeto em termos de contabilidade, planejamento e priorização.
  • Regularmente surgem situações em que você pode reduzir a dívida técnica e resolver um problema de negócios ao mesmo tempo mais barato do que fazê-lo separadamente. Essas oportunidades devem ser aproveitadas.
  • Convenções de estilo de código e processos de revisão cuidadosamente atualizados e atualizados ajudam a retardar o surgimento de novas dívidas técnicas.
  • Iterações curtas são tão úteis para refatorações quanto para desenvolver novas funcionalidades.
  • A equipe geralmente sabe onde está a dívida técnica no projeto e quão ruim ela é. Vale a pena utilizar esse conhecimento na hora de ter uma ideia do débito técnico do projeto.

Na minha resposta abordarei não apenas as Grandes Casas, mas também algumas outras casas sobre as quais pude obter informações.

1.Starkey - "O inverno está chegando". Significa que a paz e a segurança são temporárias e ilusórias; deve-se estar sempre preparado para desastres e guerras para enfrentar o perigo totalmente armado. Em Westeros, o inverno não é apenas uma estação que dura anos, mas também um símbolo de provações difíceis E, na verdade, este lema diz respeito não apenas à Casa dos Starks, mas a todo o país.

2. Lannisters- A Casa Lannister parece ter dois lemas, um confirmando um formidável brasão -" Ouça meu rugido!", o segundo, equivalente a um ditado, mas soando uma ordem de grandeza com mais frequência do que o primeiro -" Lannisters sempre pagam suas dívidas". O primeiro lema pode ser atribuído diretamente ao brasão. O brasão Lannister representa leão desenfreado- “um leão que ruge”, e o lema “Ouça meu rugido” o complementa diretamente, também é uma evidência de que o leão é o rei dos animais, e os Lannisters têm uma posição elevada na sociedade. O ditado "Um Lannister sempre paga suas dívidas" está principalmente associado ao Banco de Ferro de Bravos "O Banco de Ferro sempre receberá o que é devido." Em segundo lugar, "Um Lannister sempre paga suas dívidas" significa que os Lannister nunca esquecem aqueles que os ajudaram e que os Lannister nunca perdoam os erros cometidos contra eles.

3. Baratheon - "Estamos furiosos". originalmente pertencia aos Durrandons de Ponta Tempestade. Orys Baratheon (o irmão ilegítimo de Aegon I, o Conquistador), tendo matado Argilac, o Arrogante, o último Senhor das Terras da Tempestade, adotou seu lema. Mas o lema foi traduzido literalmente demais. Dá uma tradução lógica do lema" A raiva é o nosso elemento", com uma explicação do seu significado" A raiva é o nosso elemento, o que significa: quando você nos irrita, você joga o peixe no mar, onde é ótimo.“Ou seja, para os Baratheons, uma demonstração violenta de emoções às custas da razão fria não é um vício.

4. Greyjoy - "Nós não semeamos"Os Greyjoys são em sua maioria piratas. O território de suas terras está localizado em rochas nuas e areia. O lema desta casa é uma mensagem direta de que os Greyjoys não trabalham na terra (o que realmente não existe). Eles não semeiam qualquer coisa e não crescem, roubam quem tem colheita e despojo, pois não tem e não pode ter o seu.

5. Targaryen - "Fogo e sangue". O lema Targaryen pode ser interpretado de duas maneiras. A primeira - Aegon, o Conquistador e suas duas irmãs, em três dragões, subjugaram Westeros, que é chamado de “com ele e a espada”. A segunda opção - (a mencionada acima pôr do sol, solidão) - " Targaryens são draconatos, eles têm o sangue da Antiga Valíria e dos dragões, bem como um bônus de imunidade ao fogo e dragões domesticados. Quando os Targaryen dizem Fogo e Sangue, eles lembram aqueles que de repente se esqueceram disso."

6. Arryns - "Alto como honra"Por um lado, a Casa de Arryn, seguindo o exemplo de Jon Arryn, se preocupava em preservar a honra. Jon não podia ser intimidado ou subornado. E nas terras de Westeros era impossível encontrar alguém que se preocupasse mais em preservar a honra do que os Arryns. Mas depois da morte de Jon, provavelmente outra opção é mais aplicável - arrogância aristocrática, desdém por aqueles de status inferior, eles dizem, "de onde você é?"

7. Tarly - "Primeiro na batalha"A Casa de Tarly deu origem a muitos grandes guerreiros e generais notáveis, como este lema confirma.

8. Tully - "Família, dever, honra"A Casa Tully é leal acima de tudo aos seus laços familiares. O dever e a honra vêm depois deles, mas a família vem em primeiro lugar. A Casa Tully apoiou Rob Stark na Guerra dos Cinco Reis, pela qual eles pagaram.

9. Martells - "Inflexível, inflexível, inflexível". Um modelo de orgulho e inflexibilidade. Os Martells são a única casa que os Targaryen não puderam tomar à força. E pelo comportamento dos personagens desta casa é bastante óbvio que eles são teimosos e inabaláveis. Eles não precisam do as leis dos Senhores, a aprovação dos Reis, eles estão por conta própria, mas mostram claramente que não estão prontos para desistir.

10. Tyrel - "Crescendo, ficamos mais fortes". O lema da casa Tyrell foi confirmado por seu exército, cujo número não pode ser comparado a nenhum exército de Westeros. Os Tyrells também tinham uma “almofada” na forma da riqueza que acumularam. Considerando que o casaco dos braços desta casa representa uma rosa, um paralelo também pode ser traçado com ela De um pequeno broto a uma enorme roseira. Assim, os membros da casa Tyrell, gradualmente acumulando forças, desenvolveram e fortaleceram suas posições. Porém, como a própria Olenna disse, eles não são guerreiros.

11. Bolton -"Nossas lâminas são afiadas". Este lema serve mais como um alerta aos inimigos (e não só) da família Bolton. Os representantes desta casa têm uma reputação sombria; nos livros eles até usavam capas feitas de pele humana e decoravam as paredes de seus castelos com elas. : “Um homem nu não tem segredos, mas um homem esfolado e mais ainda.” “Nossas lâminas são afiadas” - aparentemente também pode significar lâminas para esfolar carne.

12. Mormont - "Aqui estamos nós". O lema, que, segundo Sunsetsolitude, também foi traduzido incorretamente para o russo." Aqui estamos - pode significar "Aqui estão as nossas terras", que por sua vez significa "Uma pequena mas orgulhosa ilha que não incomoda ninguém, mas pode definir-se por si mesma. Aqui estão as nossas terras, lembre-se disto quando vier aqui, nós será avisado." Ou pode ser traduzido como “Nisto permanecemos” – o que seria uma indicação direta da força da teimosia do Mormont."

13. Frey - "Estamos ombro a ombro“Os Frey valorizavam os laços familiares e a inviolabilidade desta palavra, que é o que este lema refletia. A partir daí, Walder Frey guardou um rancor indescritível contra Rob Stark, que quebrou sua promessa de se casar com sua filha, o que gerou tristes consequências.

"Um Lannister sempre paga suas dívidas." ©FFG ( Jason A. Engle)

"Os Lannisters sempre pagam suas dívidas"(Também: “Um Lannister sempre paga suas dívidas” ouço)) é um ditado popular nos Sete Reinos sobre a Casa Lannister e uma expressão favorita de Tyrion Lannister. Não é menos famoso que o lema “oficial” da casa, “Ouça-me rugir!” Esta expressão tem um duplo significado. Por um lado, significa que os Lannister, sendo a casa mais rica do estado, estão sempre prontos a pagar contas e agradecer a quem os ajudou, ou a prometer recompensas no futuro - pode sempre contar com a generosidade e o empenho dos “leões”. Mas este lema também tem um segundo significado ameaçador: os Lannister não esquecem os insultos que lhes foram infligidos e com certeza se vingarão dos infratores.

Na boca de Cersei Lannister, o ditado soou em um discurso dirigido contra o próprio Tyrion - Cersei acusou seu irmão de intrigas contra ela e Joffrey e tentou chantagear o capturado Alaya. Mais tarde, já à frente do chefe de Estado, Cersei usou as mesmas palavras para justificar a sua decisão de deixar de pagar dívidas públicas ao Banco de Ferro de Braavos - os Lannister pagam sempre as suas dívidas, e esta dívida será paga mais cedo ou mais tarde. Mais tarde, ela mencionou o ditado em um diálogo com Balman Birch e Falisa Stokeworth, prometendo-lhes uma recompensa por sua ajuda, e então enviou o Tyroshi que tentou enganá-la ao carrasco com as palavras “Os Lannister pagam suas dívidas, e você pagará também."

Tywin Lannister mencionou o ditado em conversa com Tyrion, justificando a necessidade de entregar Harrenhal a Petyr Baelish, já que ele mesmo assim o desejava. O próprio Tyrion imediatamente repetiu as palavras sobre dívidas, exigindo uma recompensa por seus serviços como Mão. Shae repetiu o ditado, lembrando Tyrion de sua promessa de colocá-la de volta na casa da cidade. Tendo aprendido sobre a deserção dos Westerlings para Robb Stark, Tyrion pensou consigo mesmo que Tywin certamente puniria os traidores, e lembrou-se do ditado.

Jaime Lannister lembrou Urswick dela, tentando seduzi-lo com riqueza, e mais tarde, tendo perdido a mão, repetiu o ditado para si mesmo, alimentando sua sede de vingança e desejo de viver. Ele disse a Brienne de Tarth que a salvou do estupro em gratidão pelo naufrágio da galera de Robin Rieger no início de sua jornada, lembrando novamente o ditado. Mais tarde, ele repetiu essas palavras em uma conversa com Varys, explicando assim seu desejo de libertar Tyrion. Depois de remover Edmure Tully do cadafalso nas muralhas de Correrrio, Jaime pensou consigo mesmo: “Os Lannister estão pagando suas dívidas e você é a única moeda que me resta”.

O próprio Edmure Tully relembrou o ditado ao saber do assassinato de Willem Lannister e Theon Frey por Rickard Karstark. Roose Bolton, falando da sua intenção de deixar Harrenhal e deixá-la para Vargo Howth, disse: “Os Lannister não são os únicos que pagam as suas dívidas”. Jaime repetiu o ditado ao se despedir dos Brave Boys ao sair do castelo, insinuando que se vingaria deles, e então, voltando ao castelo por Brienne, dirigiu as mesmas palavras a Vargo Haught, dizendo que receberia um resgate para Jaime e Brienne

Práticas tecnológicas de gestão de dívidas em uma única equipe


Há cerca de um ano, nossa equipe passou de uma fase de rápido crescimento de recursos para uma fase de desenvolvimento mais fluido, com foco na melhoria da qualidade. Neste ponto, nossos produtos acumularam uma quantidade notável de soluções abaixo do ideal, códigos feios e bibliotecas desatualizadas. Algo tinha que ser feito sobre tudo isso.


Até à data, conseguimos construir um processo que torna a luta contra a dívida técnica previsível, indolor e inevitável.


O que obtivemos como resultado:

  • A equipe está feliz. A retrospectiva do lançamento inclui regularmente pontos positivos sobre o aprimoramento da tecnologia e a redução do débito técnico.
  • Por vários lançamentos trimestrais consecutivos, conseguimos aumentar a funcionalidade sem aumentar o número de linhas de código no projeto. A remoção de código desnecessário e a simplificação do que era necessário reduziram o tamanho da base de código para a funcionalidade existente. E essa redução coincidiu aproximadamente em escala com o novo código que implementa a nova funcionalidade.
  • Durante refatorações e atualizações, o produto está sempre em condições de funcionamento. A cada duas semanas lançamos uma versão provisória totalmente funcional.

Deixe-me contar como conseguimos isso.

O que é dívida técnica

Minha definição prática de dívida técnica é a quantidade de trabalho que precisa ser feito para que um projeto atenda à visão da equipe sobre o que é ótimo. Observe que o débito técnico pode surgir não apenas devido ao uso liberal de muletas no desenvolvimento, mas também devido à mudança de ideias sobre beleza. Por exemplo, as práticas comuns da indústria mudaram. Ou os desenvolvedores deixaram de amar OOP e se apaixonaram pela programação funcional. Ou a estrutura que estava na moda não é mais um bolo e tornou-se difícil encontrar especialistas que gostariam de escrever sobre ela.


No entanto, a principal causa da dívida técnica é a entropia em toda a sua diversidade. Testes unitários desabilitados, comentários desatualizados que perderam contato com o código, decisões arquiteturais malsucedidas, implementação de funcionalidades que ninguém usa mais, base para um futuro que não chegou e muito, muito mais.


Segue-se que o aparecimento de dívida técnica é inevitável em qualquer projeto de longa duração.

Quando a dívida técnica não é um problema

Por que a dívida técnica é ruim? Aumenta o custo de desenvolvimento adicional devido a uma série de fatores:

  • A velocidade de implementação de novas funcionalidades é reduzida.
  • A probabilidade de regressões ao corrigir defeitos aumenta.
  • O processo de desenvolvimento torna-se menos previsível e, portanto, menos gerenciável.
  • O processo de introdução de um novo desenvolvedor no projeto está se alongando.

Esta perda é por vezes chamada de “juros sobre dívida técnica”


Existem situações em que estas perdas são mais baratas do que eliminar a dívida técnica:

  • O fim da vida do projeto está próximo. Observe que este não é o fim da adição de funcionalidades, mas o momento em que você também pode parar de desperdiçar esforços dos programadores em suporte. Esta categoria também inclui protótipos únicos, demonstrações únicas para exposições, etc.
  • O valor do tempo de desenvolvimento agora é muito maior do que o esperado no futuro. Correções urgentes para um prazo fixo, startups que estão ficando sem dinheiro na próxima rodada de financiamento, etc. Nesses casos, a correção da dívida técnica pode ser adiada até que o calor do momento esfrie. Existem projetos que não saem do estado de emergência, mas os conselhos deste artigo ainda não os ajudarão.

O que fazer com a dívida técnica? Abordagens falhadas

Abordagem nº 1. “Não temos tempo, o lançamento deve ser enviado ontem”

A vontade de cumprir o prazo de amanhã a qualquer custo, em detrimento da velocidade de desenvolvimento depois de amanhã.


Às vezes, uma estrutura pré-fabricada feita de muletas é uma escolha objetivamente correta. Na minha prática, isso foi expresso mais claramente ao fazer versões demo para exposições. A data do evento é estritamente fixada; se você não chegou a tempo para uma exposição importante, a próxima tentativa será dentro de um ano. Neste caso, você pode exibir o produto “fora de suas mãos”, evitando cuidadosamente todos os bugs. Como engenheiro, é desagradável para mim realizar tais projetos, mas as muletas neles são justificadas.


Quando você faz um produto que vai durar muito, tudo é diferente. Cumprir o prazo devido a soluções técnicas duvidosas é um prazer caro. O custo total é:

  1. desde a implementação da própria muleta,
  2. desde sua substituição subsequente por uma solução completa,
  3. do sofrimento de ter uma muleta entre os pontos anteriores.

O segundo ponto é muito fácil de subestimar e corre-se o risco de não pensar no terceiro, o mais caro.


Quando você encontra um líder de tecnologia com olhos trêmulos em uma conferência, pode acontecer que foi o pesadelo de depurar incessantemente um design feito de muletas que o trouxe a esse estado.


Abordagem nº 2. “Sim, aqui precisamos jogar tudo fora e escrever de novo”

Quanto pior a situação da dívida técnica, maior será a tentação de enterrar todo o código do projeto e escrever tudo novamente. Este é um dos erros clássicos que podem matar todo o projeto.


O tema é tão bem abordado no famoso artigo de Joel Spolsky que não vejo sentido em apresentar meus próprios argumentos.

Abordagem nº 3. “Refatoriaremos à noite e nos finais de semana para que o gerente não descubra.”

Argumentar a necessidade de eliminar a dívida técnica em termos de benefícios empresariais nem sempre é fácil. A equipe de desenvolvimento pode ficar tentada a contornar as arestas e iniciar uma grande refatoração no local. Isso pode ser feito fora do horário de trabalho, em pausas entre outras tarefas ou “na cauda” de outras tarefas, inflacionando as estimativas.


O que há de ruim nisso? Ah, um monte de coisas:

  • A transparência reduzida mina a confiança entre a gestão e a equipe. Muitas vezes, as tentativas subsequentes de corrigir a situação, impondo disciplina e apertando os parafusos, levarão a uma deterioração ainda maior no trabalho em equipe.
  • Uma situação arraigada em que as prioridades da equipe e da gestão são conflitantes causa desmotivação de ambos os lados.
  • Os frutos da refatoração são incluídos no produto de maneiras imprevisíveis e causam bugs de regressão onde não são esperados. Em equipes conscientes, isso leva a uma carga repentina e não planejada de controle de qualidade. No inconsciente, ele entra em produção e aí se decompõe.

Depois que a equipe usa essa receita, os olhos da administração começam a se contorcer.

Nossos princípios

1. Adicione tarefas técnicas ao backlog geral

Existem vários padrões na vida das tarefas nos projetos:

  • Uma tarefa que não está no backlog tem menos chances de dar certo.
  • Uma tarefa sem uma formulação clara tem menos chances de dar certo.
  • Uma tarefa que não pode ser estimada com alto grau de confiança tem menos chances de entrar em ação.
  • Uma tarefa grande esperará mais tempo na fila do que uma tarefa pequena.

Maxim Dorofeev fala muito bem sobre essas coisas em sua “Técnica da caixa de entrada vazia”


Para evitar a acumulação de dívida técnica, os trabalhos para a sua eliminação devem ser concluídos tendo em conta os princípios acima enumerados.


Todas as tarefas, exceto as menores, estão listadas no backlog. Dessa forma, eles têm a chance de serem realizados não apenas no tempo livre, mas também como parte do trabalho planejado. Além disso, é mais difícil perder completamente essas tarefas de vista - o backlog é examinado com mais frequência e mais de perto do que TODOs no código, pedaços de papel no monitor, páginas wiki abandonadas, guardanapos manchados de chá com diagramas e outros fontes de informação.

  • Se houver um TODO não trivial no código, ele conterá um link para a tarefa no backlog. Verificamos a conformidade com este princípio na revisão do código e não aceitamos TODOs complexos sem referências.

    Pode haver drama por trás do comentário.

    Certa vez, ao lado de tal TODO estava escrito: “Muleta. O Product Owner me obrigou a fazer isso. Remova o mais rápido possível."

  • Quando um desenvolvedor percebe que algum lugar requer refatoração, ele cria um problema no backlog.
  • Quando um desenvolvedor deseja melhorar a plataforma, ele cria uma tarefa no backlog.
  • Os planos arquitetônicos de longo prazo são colocados no backlog na forma de tarefas separadas assim que há certeza suficiente pelo menos sobre os primeiros passos.

Contanto que essas mudanças permaneçam baratas em termos de custos de desenvolvimento e da quantidade de testes necessários, poderemos melhorar gradualmente nossa base de código sem interromper os objetivos de negócios ou introduzir riscos adicionais.

2. Planeje histórias técnicas com base nas prioridades de negócios

Se uma árvore caísse na floresta, mas ninguém ouvisse, houve algum som? Se houver código incorreto em um projeto, mas esse módulo nunca precisará ser alterado, há dívida técnica?


Acredito que quando um programador acha desagradável olhar algum módulo antigo, isso por si só não é um problema muito grande. Muito pior é o que acontece quando você precisa adicionar novas funcionalidades a este módulo ou expandir o antigo. Em comparação com fazer alterações em código bem escrito, essas tarefas são mais prováveis ​​(e mais propensas a exceder a estimativa original) e contêm mais bugs. Às vezes muito mais. Para nos protegermos desses tipos de problemas, tentamos agendar refatorações para que sejam feitas antes de escrever novas funcionalidades no mesmo local.


Se as alterações de funcionalidade e refatorações parecerem pequenas, elas poderão ser feitas em conjunto. O tamanho da tarefa selecionado empiricamente para o qual esta abordagem será ideal é de 3 dias de trabalho para um desenvolvedor ou menos. Quando fica claro que há mais trabalho, ele é dividido em refatoração mantendo o comportamento atual e implementando novas funcionalidades.


Assim, a ordem de trabalho para eliminar o débito técnico é determinada pela ordem das tarefas de negócios no backlog.


O princípio das “prioridades empresariais” tem outra aplicação. Um dos problemas comuns que os desenvolvedores que se esforçam para escrever bem sofrem é a dificuldade de dedicar tempo para otimizar o desempenho, melhorar a capacidade de manutenção ou outras coisas que não estão diretamente incluídas no plano de trabalho. Quase sempre há uma necessidade comercial dessas melhorias. Quem não quer que o sistema funcione mais rápido, mais estável e cuja manutenção seja mais barata? Todos estes benefícios podem ser avaliados e, com base nesta avaliação, as tarefas de melhoria podem ser colocadas no backlog, juntamente com quaisquer outras.


Portanto, se você deseja otimizar o desempenho, mas precisa corrigir outro bug chato, talvez você simplesmente não saiba como explicar os benefícios da otimização em uma linguagem que o proprietário do produto possa entender.

3. Deixe o código mais limpo do que estava antes

Quase qualquer código, exceto aquele escrito muito recentemente, fica um pouco aquém da ideia atual de beleza no campo do estilo e da arquitetura. Quando você precisa alterar o código como parte de uma tarefa, é considerada uma boa prática fazer todas as melhorias seguras possíveis na área afetada. O que poderia ser?

  • Trazendo módulos para o estilo atual.
  • Alterar nomes de variáveis ​​internas para nomes mais compreensíveis.
  • Simplifique a implementação enquanto mantém o comportamento.
  • Refatorações locais que não introduzem alterações em grande escala em outros módulos.

Espera-se que essas melhorias melhorem o código, mas não aumentem significativamente o custo de desenvolvimento ou teste.


Devido a este princípio, a qualidade do código aumenta gradualmente em segundo plano, mesmo naqueles locais onde nenhuma refatoração separada foi planejada. Além disso, quanto mais trabalharmos em uma determinada parte do sistema, melhor será o código dessa parte. Um bom contraste com projetos onde o desenvolvedor gasta mais tempo nas partes com pior código.

4. Não importa o que aconteça, o sistema deve permanecer em condições de funcionamento.

Um dos princípios básicos do SCRUM diz que ao final de cada sprint o sistema deve atingir um estado estável.


“Ao final do sprint, o incremento deve estar pronto, o que significa que atende aos critérios de prontidão do Time Scrum e está pronto para uso. Deve estar pronto para uso, independentemente da decisão do proprietário do produto de liberá-lo ou adiá-lo.”

Qualquer trabalho para eliminar a dívida técnica é feito de acordo com este princípio.


Grandes transformações são necessariamente decompostas para que qualquer etapa individual possa ser concluída em um sprint. Por exemplo, alteramos o sistema de montagem em duas etapas ()


Trabalhamos com VCS de acordo com princípios próximos ao gitflow clássico. O desenvolvimento é realizado em ramos de recursos e os testes são realizados lá. Como regra, esse ramo não dura mais do que um sprint de duas semanas. Uma filial que dura mais tempo quase sempre resulta em custos adicionais.


Nossa experiência confirma claramente esse padrão. Cada vez que não conseguíamos concluir uma grande refatoração em duas semanas, era uma dor e um sofrimento. E quanto mais demorada era a tarefa e quanto mais durava a filial aberta, mais lento era o trabalho e mais problemas surgiam.


A necessidade de estar sempre a poucos passos de uma versão estável cria um dos problemas de engenharia mais difíceis e interessantes – encontrar a decomposição ideal dos planos estratégicos. Mudanças em grande escala podem ser divididas em etapas separadas e independentes. É aconselhável começar a receber os benefícios o mais cedo possível. Quanto melhor for realizada essa divisão do trabalho, maiores serão as chances de conclusão do trabalho.

Como é o nosso processo

Uma vez por lançamento, fazemos uma revisão detalhada do backlog técnico:

  • Fechamos histórias irrelevantes (relevância perdida, feitas como parte de outra coisa, duplicadas).
  • Atualizamos a descrição onde a visão do problema mudou.

Quando histórias de negócios aparecem no horizonte, é feita uma análise técnica e todas as histórias técnicas que ajudariam na implementação são associadas à história de negócios.


Em preparação para o planejamento do sprint:

  • Verificamos as conexões entre histórias técnicas e de negócios.
  • Vinculamos todos os bugs relacionados a histórias técnicas que podem ser corrigidas de forma barata no mesmo lugar.

Como formar a parte técnica do backlog

Quando assumi a função de líder da equipe, perguntei a cada desenvolvedor e controle de qualidade quais melhorias no produto eles mais queriam fazer. A maioria das solicitações estava relacionada a melhorias técnicas na plataforma e refatorações. Como a experiência mostrou, todos os principais problemas técnicos do produto foram incluídos neste conjunto de desejos. Portanto, você pode usar essa prática para construir rapidamente um backlog técnico do zero ou ter uma ideia geral do estado da dívida técnica em um novo projeto.


O atual preenchimento do backlog com tarefas técnicas ocorre devido às práticas descritas acima e não requer esforços ou análises separadas. Além disso, novas ideias para melhoria técnica do produto são agregadas ao backlog. Isso é feito por qualquer membro da equipe que tenha essa ideia. O principal nesta fase é não perder a ideia. O esclarecimento e a determinação da prioridade ocorrem posteriormente, durante o planejamento do trabalho.

conclusões

  • A dívida técnica é inevitável.
  • Para a maioria dos projetos, eliminar a dívida técnica é um bom investimento de esforço.
  • Se a dívida técnica não for resolvida, a velocidade de desenvolvimento aproximar-se-á gradualmente de zero.
  • A tentação de jogar tudo fora e escrever novamente pode matar ou prejudicar seriamente o seu projeto.
  • Os benefícios da eliminação da dívida técnica devem ser enquadrados em termos de benefícios empresariais, caso contrário corre-se o risco de as tarefas de criação de novas funcionalidades serem sempre consideradas mais importantes.
  • Vale a pena gerenciar tarefas para eliminar dívidas técnicas. Essas tarefas não são diferentes de outras tarefas do projeto em termos de contabilidade, planejamento e priorização.
  • Regularmente surgem situações em que você pode reduzir a dívida técnica e resolver um problema de negócios ao mesmo tempo mais barato do que fazê-lo separadamente. Essas oportunidades devem ser aproveitadas.
  • Convenções de estilo de código e processos de revisão cuidadosamente atualizados e atualizados ajudam a retardar o surgimento de novas dívidas técnicas.
  • Iterações curtas são tão úteis para refatorações quanto para desenvolver novas funcionalidades.
  • A equipe geralmente sabe onde está a dívida técnica no projeto e quão ruim ela é. Vale a pena utilizar esse conhecimento na hora de ter uma ideia do débito técnico do projeto.

CATEGORIAS

ARTIGOS POPULARES

2024 “kingad.ru” - exame ultrassonográfico de órgãos humanos