Conselho: Como convencer meu líder recém-unificado da equipe a não escrever a base de código do zero

8

Eu trabalho em uma multinacional bastante conhecida, e o módulo em que trabalho foi atribuído a um novo "lead". A base de código é bastante grande (~ 130K ou mais, com interdependências em outros módulos), mas estável - algumas partes cresceram feias ao longo dos anos, mas é provável que esteja em funcionamento. (Nossos produtos estão em execução há anos, mesmo novos). O problema é que nosso líder deseja reescrever o código do zero , para abranger "granularidade mais fina e um design proativo".

Eu sei que isso não é uma boa ideia, mas como convencê-lo / ao restante da equipe (que são bem mais experientes do que eu em termos de anos de exp), sem parecer muito pedante (Você não deve reescrever, como Joel et al. têm artigos claros proibindo isso)?

Tenho uma boa relação de trabalho com a pessoa em questão e não quero estragar tudo, mas também não quero fazer parte de uma decisão que certamente nos atormentará nos próximos anos ! Alguma sugestão para uma abordagem mais branda, mas eficaz? Mesmo relatos de como você lidou com essa situação ao seu gosto me ajudariam muito!

EDIT: A base de código de que estou falando não é um produto / GUI, mas no nível do kernel com todas as funcionalidades críticas para o nosso produto. Espero que agora você saiba por que eu pareço tão apreensivo !!

TCSGrad
fonte
só para ter certeza, antes de dar esse tipo de conselho ... Você está fazendo muito trabalho de evolução / manutenção nesse trecho de código (e acaba gastando muito tempo corrigindo erros de regressão)? Você precisa adicionar novas funcionalidades, mas não pode, porque precisaria tocar nas partes "feias" do seu código? Eu acho que reescrever não é sempre uma má idéia ...
@ paolo - não, a base de código está funcionando bem (eu gostaria de poder nomear nossos produtos, você provavelmente está usando :)). Existem erros para alguns clientes, mas sem grandes cortes no código (exceto quando temos de disfarce para falhas de HW !!)
TCSGrad
1
Existem muitos prós e contras sobre c2.com/cgi/wiki?RewriteCodeFromScratch
k3b
130k de código do kernel como ele é, com os drivers com granularidade fina e design proativo. É suficientemente desafiador ou quase impossível implementar / fazer interface com novos dispositivos ou protocolos? O resultado das alterações pretendidas tornaria substancialmente mais fácil para clientes / usuários a jusante?
23611 JustinC
Os clientes não sentirão nada - as interfaces são bastante simples e robustas o suficiente. Qual era a intenção, como eu havia determinado, era reduzir a "complexidade de leitura do código". IMHO, essa é uma visão bastante subjetiva ... se você reescrever todo o código do zero, seria mais fácil para você ler - mas e os novos engenheiros, que teriam que ler os dois de qualquer maneira !!
TCSGrad

Respostas:

8

Faça as contas com ele juntos:

No lado da dívida:

  • quanto tempo levará para recriar os recursos que você tem no momento. Quanto custa isso (devs + overhead)

  • quanto a empresa perderá por não conseguir implantar novos recursos / correções ou apenas a uma taxa muito mais lenta?

  • qual é o risco de não ser capaz de concluir a reescrita e voltar à base de origem atual depois de n meses? Incluindo o risco de matar o produto todos juntos.

  • Quanto tempo levará até que a nova base de código pareça tão feia quanto a atual?

No lado do ativo:

  • quão melhor será o código após a reescrita (medido nos custos de manutenção salvos por mês)

Adicione tudo, possivelmente fazendo uma comparação entre o melhor e o pior cenário.

No final, você terá uma resposta. Se ele ignorar a resposta, converse com seu chefe.

Jens Schauder
fonte
Grande enumeração !! Eu os adicionaria às minhas anotações da reunião !!
TCSGrad
3
Você acha que esse é o caminho a percorrer, mas é louco como você superestima o tempo necessário para colocar novos recursos no antigo código base e, ao mesmo tempo, subestima o tempo necessário para obter o "novo" "o código se baseia na lista de recursos antigos.
wheaties 16/03/11
Excelentes pontos Seria bom obter essas estimativas de todos os desenvolvedores envolvidos. Portanto, todos têm uma imagem clara.
Aditya P
@wheaties Isso obviamente é um problema com todas as estimativas. A maneira de combater isso é repetir a estimativa com frequência e compará-la com o progresso real. (Pense produtos Burn Down)
Jens Schauder
muitas vezes o 'ativo' do novo código não é melhor do que o que ele substituiu - especialmente após algumas iterações de aprimoramento e manutenção. Reescritas totais IMHO nunca são a melhor idéia.
Gbjbaanb
13

Obrigatório: coisas que você nunca deve fazer, parte 1 (você já viu, mas se alguém encontrar essa pergunta e não tiver).

Reescrever do zero é muito tentador para os desenvolvedores. Ninguém quer trabalhar no código legado, todo mundo quer escrever um novo código sexy. Mas no final das contas, trata-se do que é melhor para os negócios. Por que é necessário reescrever? Eles podem apresentar esse caso de uma maneira clara que demonstre valor agregado aos negócios?

Você não deveria convencê-los a não gastar recursos. Eles devem ter que convencer a empresa a gastar recursos.

David
fonte
Eu amo esse artigo. Eu odeio reescrever as coisas!
Marque 'Canlas'
3
@ Mark Canlas: Na verdade, é meio engraçado, porque muitas vezes sou um defensor da reescrita. Eu odeio código legado :) Mas também entendo que, se não puder demonstrar valor agregado aos negócios, a reescrita não deverá ocorrer. Minha opinião precisa ser apoiada por números.
David
2
Eu também odeio código legado, mas desde que li esse artigo, aprendi a valorizar navios em execução versus navios teóricos. Um navio em movimento quebrado está gerando mais dinheiro por hora do que um hipotético escrito a lápis em um guardanapo. É um ato de equilíbrio!
Marque 'Canlas'
1
@ Mark Canlas: Absolutamente. E é aí que muitos desenvolvedores (mesmo os mais experientes em muitos casos) perdem o controle sobre os negócios em geral. Ele precisa ter um valor tangível real para os negócios e, muitas vezes, o produto existente possui esse valor. Embora um argumento que eu sempre odeie nos negócios seja "já gastamos dinheiro com isso, precisamos usá-lo". Às vezes, como no caso do meu último emprego, uma decisão como essa os leva ao chão. Não é "sempre reescreva" nem "nunca reescreva". Como você disse ... equilíbrio.
David
8

Quão bem sua abordagem de teste cobre a base de código? E quanto ao teste de unidade?

Se já não estiver lá, sugira que qualquer código seja reescrito apenas uma seção por vez e que qualquer seção sob reescrita tenha quase (90% +) cobertura de código de teste de unidade quase completa. Depois de fazer isso, você terá definido uma parte do código que está bem definida (poderíamos testá-lo) e também possui uma interface conhecida.

Nesse ponto, reescrever esse código é um risco muito menor. Os erros devem ser detectados por testes de unidade / outros testes, e supondo que você também tenha controle de origem pode ser facilmente revertido.

A reescrita em partes menores também permite que você e sua equipe liderem com mais precisão uma sensação de reescrita completa. Vocês dois sabem no que estão se metendo? Um de vocês é pessimista / optomista demais?

Chris Pitman
fonte
130k de código do kernel como ele é, com os drivers com granularidade fina e design proativo. É suficientemente desafiador ou quase impossível implementar / fazer interface com novos dispositivos ou protocolos?
23611 JustinC
2

Existem alguns fatores relevantes a serem considerados:

  • O fato de estar funcionando da maneira que os usuários desejam é uma indicação para refatorar, em vez de reescrever
  • Se você tiver testes de unidade, refatorar definitivamente, em vez de reescrever. Caso contrário, isso aumenta o esforço entre refatoração e reescrita (supondo que seu objetivo seja realizar testes de unidade para o sistema resultante). Se você não tiver testes de unidade, e todo o código estiver na camada da GUI, poderá ser mais rápido reescrever, especialmente se a funcionalidade estiver praticamente quebrada de qualquer maneira. Essa é a minha experiência.
  • Se seu objetivo é alterar completamente as plataformas (código não gerenciado -> .NET ou Windows -> Linux ou PHP -> python, etc.), esse é um argumento óbvio no suporte à reescrita.
Scott Whitlock
fonte
Não, não temos unittests.
TCSGrad
É improvável que o novo o tenha também, visto a quantidade de trabalho que já envolve. Além disso, a base de código de que estou falando não é um produto / GUI, mas no nível do kernel com funcionalidade crítica para o nosso produto. Espero que agora você saiba por que eu pareço tão apreensivo !!
TCSGrad
1
@ shan23 - por que você inicia uma reescrita e não mantém pelo menos um conjunto de testes de aceitação? Você acabará criando a mesma bagunça. O fato de ele não ter uma GUI facilita muito o teste!
Scott Whitlock
0

Apenas diga não." Seja convincente, mas esteja disposto a dizer "Você não apenas está incorreto sobre seus benefícios, mas também está errado porque é um desperdício de esforço humano".

Andy Finkenstadt
fonte
0

Onde está o caso comercial de uma reescrita? Você tem uma base de código que está preenchendo uma necessidade. É verdade que pode não ser perfeito, mas representa um investimento substancial em termos de tempo e recursos. O único momento em que uma reescrita completa é garantida é quando a qualidade do código é tão ruim que está fazendo com que a organização perca dinheiro ou oportunidades de negócios. É preciso lembrar o velho ditado, se não estiver quebrado, não conserte!

bit-twiddler
fonte
Eu tenho que dar um voto negativo, porque esse ditado é a pior coisa em nosso setor; promove a preguiça, a incompetência e o comportamento preguiçoso nos desenvolvedores, porque ninguém tem a coragem de resolver um problema adequadamente, porque "funciona" em pequena capacidade.
Wayne Molina
@WayneM: a opção "reescrever" é a pior, muitas vezes devido ao ego e incompetência entre os desenvolvedores que não podem trabalhar com o código existente. Eles querem escrever coisas novas e legais e acabam cometendo erros piores em sua atitude equivocada que são muito melhores do que os caras que fizeram as últimas coisas. Somente quando o código antigo tiver evoluído por muito tempo (ou era uma porcaria no começo) você deve reescrever e, mesmo assim, uma refatoração séria deve ser considerada primeiro.
Gbjbaanb
0

Compre o maior número possível de shorts no estoque. Se a gerência concordar em cometer suicídio, pelo menos você deve ganhar dinheiro com isso. Afinal, em breve você estará na rua depois que o tanque.

SnoopDougieDoug
fonte