O código
Tenho software de uso diário por cliente de alto valor comercial, escrito em PHP e com aproximadamente 600 mil linhas de código.
O cliente há muito tempo precisa, quer e exige novos recursos e funcionalidades. A hora de fazê-lo é ontem . Então, basta escrever os novos recursos e implementar novas funcionalidades e entregá-las ao cliente, sim? Bem, não, aqui estão alguns problemas que vêm causando uma dor considerável aos desenvolvedores atuais:
A base de código existente é ... uma grande bola de lama .
Problemas notáveis:
O código - é cabeludo - um único recurso permeia tudo, o código de rastreamento é penoso e a adição de um recurso pode afetar todo o restante
- não há testes
- mistura de código procedural e orientado a objetos montado em práticas de programação ruins
- arquivos alcançando 6000 linhas de HTML, CSS, PHP, SQL, jQuery, JavaScript, comentários
- completa desconsideração / inexistência do padrão MVC / separação de preocupações. O código é misturado
- alguma lógica de negócios depende de coisas voláteis que não têm relação com o código (como metadados do banco de dados)
- valores codificados, caminhos e falta de configurabilidade contribuem para a falta de segurança da arquitetura atual
- grandes blocos repetidos de essencialmente o mesmo código contribuem para que recursos semelhantes funcionem de maneira ligeiramente diferente. A atualização de um não atualiza o outro
- o código é lento, a falta de documentação, etc., etc. muitas outras coisas podem ser feitas melhor
Funciona ...
A coisa boa é que funciona ... A funcionalidade que está lá, é razoavelmente trabalhada para casos de negócios reais, mas ... indo para frente é doloroso.
O problema
É mais fácil agora (e mais rápido) adicionar um novo recurso usando o estilo de código existente, usando principalmente a abordagem cut-n-paste-n-modify, perpetuando a maldade, do que reescrevê-lo usando atualmente melhores práticas modernas existentes.
Solução?
Fala-se sobre reescrever tudo usando uma das estruturas atualmente líderes (ou seja, ZF2), mas isso significa ignorar as demandas do cliente, levar muito tempo para construir o software e, essencialmente, criar um novo software ( versão 0.0.1) para o cliente, com todos os bugs do novo software e falta de sensibilidade e funcionalidade do software maduro.
Outro pensamento é fazer algum desenvolvimento incremental. Ou seja, quando uma nova funcionalidade surge, escreva-a usando uma nova abordagem. No momento, isso está falhando pelo motivo indicado no título "O problema" acima.
Outra idéia é fazer uma lenta refatoração da base de código existente ... Pode funcionar na limpeza de coisas como o MVC e uma série de outras coisas, e isso levará muito tempo, e será essencialmente como desvendar um bagunçado firmemente enrolado bola de fios. Mas fazer isso não resolverá problemas como testes de unidade, injeção de dependência, princípios de estrutura moderna e assim por diante.
Então, no final, novos recursos estão chegando, código está sendo adicionado e a base de código existente não está melhorando. O que você sugere para fazer neste caso?