Desculpe, isso vai demorar, mas é baseado na experiência pessoal como arquiteto e desenvolvedor em vários projetos de reescrita.
As seguintes condições devem levar em consideração algum tipo de reescrita. Vou falar sobre como decidir qual deles será feito depois disso.
- O tempo de aceleração do desenvolvedor é muito alto. Se demorar mais do que abaixo (por nível de experiência) para acelerar um novo desenvolvedor, o sistema precisará ser reprojetado. Por tempo de aceleração, quero dizer a quantidade de tempo antes que o novo desenvolvedor esteja pronto para fazer seu primeiro commit (em um pequeno recurso)
- Recém saído da faculdade - 1,5 meses
- Ainda verde, mas já trabalhou em outros projetos antes - 1 mês
- Nível médio - 2 semanas
- Experiente - 1 semana
- Nível Sênior - 1 dia
- A implantação não pode ser automatizada, devido à complexidade da arquitetura existente
- Até correções simples de erros demoram muito devido à complexidade do código existente
- Novos recursos demoram muito e custam muito devido à interdependência da base de código (novos recursos não podem ser isolados e, portanto, afetam os recursos existentes)
- O ciclo de teste formal leva muito tempo devido à interdependência da base de código existente.
- Muitos casos de uso são executados em poucas telas. Isso causa problemas de treinamento para usuários e desenvolvedores.
- A tecnologia em que o sistema atual está exigindo
- É difícil encontrar desenvolvedores de qualidade com experiência na tecnologia
- Foi descontinuado (não pode ser atualizado para suportar plataformas / recursos mais recentes)
- Existe simplesmente uma tecnologia de nível superior muito mais expressiva disponível
- O custo de manutenção da infraestrutura da tecnologia antiga é muito alto
Essas coisas são bastante evidentes. Quando decidir sobre uma reescrita completa versus uma reconstrução incremental é mais subjetivo e, portanto, mais cobrado politicamente. O que posso dizer com convicção é que afirmar categoricamente que nunca é uma boa ideia está errado.
Se um sistema puder ser reprojetado de forma incremental e você tiver o apoio total do patrocínio do projeto para isso, deverá fazê-lo. Aqui está o problema, no entanto. Muitos sistemas não podem ser redesenhados de forma incremental. Aqui estão algumas das razões que encontrei que impedem isso (tanto técnica quanto política).
- Técnico
- O acoplamento dos componentes é tão alto que as alterações em um único componente não podem ser isoladas de outros componentes. A reformulação de um único componente resulta em uma cascata de alterações não apenas nos componentes adjacentes, mas indiretamente em todos os componentes.
- A pilha de tecnologia é tão complicada que o design do estado futuro requer várias alterações na infraestrutura. Isso também seria necessário em uma reescrita completa, mas se for necessário em um novo design incremental, você perderá essa vantagem.
- Redesenhar um componente resulta em uma reescrita completa desse componente, porque o design existente é tão fubar que não vale a pena salvar. Novamente, você perde a vantagem se for esse o caso.
- Político
- Os patrocinadores não podem entender que um novo design incremental requer um compromisso de longo prazo com o projeto. Inevitavelmente, a maioria das organizações perde o apetite pelo dreno contínuo do orçamento criado por um novo design incremental. Essa perda de apetite também é inevitável para uma reescrita, mas os patrocinadores estarão mais inclinados a continuar, porque não querem dividir-se entre um novo sistema parcialmente completo e um sistema antigo parcialmente obsoleto.
- Os usuários do sistema estão muito apegados às suas "telas atuais". Se for esse o caso, você não terá a licença para melhorar uma parte vital do sistema (o front-end). Um novo design permite contornar esse problema, pois eles estão começando com algo novo. Eles ainda vão insistir em obter "as mesmas telas", mas você tem um pouco mais de munição para recuar.
Lembre-se de que o custo total da reformulação incremental é sempre maior do que uma reescrita completa, mas o impacto na organização geralmente é menor. Na minha opinião, se você pode justificar uma reescrita e tiver desenvolvedores de superstar, faça-o.
Só faça isso se tiver certeza de que existe vontade política de fazê-lo até o fim. Isso significa a adesão de executivos e usuários finais. Sem ele, você irá falhar. Estou assumindo que é por isso que Joel diz que é uma má ideia. A entrada de executivos e usuários finais parece um unicórnio de duas cabeças para muitos arquitetos. Você precisa vendê-lo de forma agressiva e fazer campanha por sua continuação continuamente até que esteja completo. Isso é difícil, e você está falando sobre apostar em sua reputação em algo que alguns não desejam que seja bem-sucedido.
Algumas estratégias para o sucesso:
- Se você fizer isso, no entanto, não tente converter o código existente. Projete o sistema a partir do zero. Caso contrário, você está perdendo seu tempo. Eu nunca vi ou ouvi falar de um projeto de "conversão" que não acabou miseravelmente.
- Migre os usuários para o novo sistema, uma equipe por vez. Identifique as equipes que sofrem mais com o sistema existente e migre-as primeiro. Que eles espalhem as boas novas de boca em boca. Dessa forma, seu novo sistema será vendido a partir de dentro.
- Projete sua estrutura conforme necessário. Não comece com uma estrutura que eu passei 6 meses construindo - que nunca viu código real.
- Mantenha sua pilha de tecnologia o menor possível. Não projete demais. Você pode adicionar tecnologias conforme necessário, mas removê-las é difícil. Além disso, quanto mais camadas você tiver, mais trabalho será feito pelos desenvolvedores. Não torne difícil desde o início.
- Envolva os usuários diretamente no processo de design, mas não permita que eles determinem como fazê-lo. Ganhe a confiança deles, mostrando a eles que você pode dar o que eles querem melhor se seguir os bons princípios de design.