Pergunta

Como você começar a melhorar em um péssimo sistema?

Deixe-me explicar o que eu quero dizer antes de recomendar a criação de testes de unidade e de refatoração.Eu poderia usar essas técnicas, mas que seria inútil neste caso.

Na realidade, o sistema está tão quebrado que não faz o que ele precisa fazer.

Por exemplo, o sistema deve contar quantas mensagens que ele envia.Na maioria das vezes funciona, mas em alguns casos ele "esquece" para aumentar o valor do contador de mensagens.O problema é que muitos outros módulos com suas próprias soluções construir sobre este contador que se eu corrigir o contador, o sistema como um todo se tornou pior do que ela é atualmente.A solução poderia ser a de modificar todos os módulos e remover as suas próprias correções, mas com mais de 150 módulos que exigem muito de coordenação que eu não posso pagar.

Ainda pior, existem alguns problemas que tem soluções não no sistema em si, mas na cabeça.Por exemplo, o sistema pode não representar mais do que quatro mensagens em uma mensagem de grupo.Alguns serviços requerem cinco mensagens agrupadas.O departamento de contabilidade sabe sobre essa limitação e toda vez que a contagem de mensagens para esses serviços, eles contam a mensagem de grupos e multiplicá-lo por 5/4 para obter o número correto das mensagens.Não há absolutamente nenhuma documentação sobre esses desvios, e ninguém sabe quantas coisas estão presentes no sistema.

Então, como você começar a trabalhar para melhorar este sistema?Qual é a estratégia que você gostaria de seguir?

Algumas coisas adicionais:Eu sou um dos homens do exército de trabalho de tal modo que não é uma resposta aceitável para contratar o suficiente de homens e de redesenho/refatorar o sistema.E, em poucas semanas ou meses, eu realmente deveria mostrar alguns visível progressão por isso não é uma opção, para fazer a refatoração-me em um par de anos.

Alguns detalhes técnicos:o sistema é escrito em Java e PHP, mas eu não acho que realmente importa.Existem dois bancos de dados por trás dele, um Oracle e PostgreSQL um.Além das falhas mencionado anteriormente, o código em si é cheira muito, é muito mal escrito e documentado.

Informações adicionais:

O contador problema não é um problema de sincronização.O contador++ instruções são adicionadas para alguns módulos, e não são adicionados a alguns outros módulos.Uma rápida e suja correcção é adicioná-los onde eles estão ausentes.O tempo de solução é fazer com que tipo de aspecto para os módulos de que necessita, tornando impossível esquecê-lo mais tarde.Eu não tenho problemas com a fixação de coisas como essa, mas se eu poderia fazer essa alteração gostaria de quebra de mais de 10 outros módulos.

Atualização:

Eu aceito Greg D resposta.Mesmo se eu gosto do Adam Bellaire do mais, ele não iria me ajudar a saber o que seria o ideal para saber.Obrigado a todos pelas respostas.

Foi útil?

Solução

  1. Apagar os incêndios. Se houver algum problema de prioridade crítica, seja o que for, você precisa lidar com eles primeiro. Hackear se você precisar, com uma base de código fedorenta, está tudo bem. Você sabe que você melhorará no futuro. Esta é a sua técnica de vendas direcionada a quem você está se reportando.
  2. Escolha algumas frutas baixas. Suponho que você seja relativamente novo nesse software em particular e que foi testado novamente para lidar com isso. Encontre alguns problemas aparentemente fáceis em um subsistema relacionado do código que não deve levar mais de um dia ou dois para resolver cada um e consertá -los. Isso pode envolver a refatoração, ou não. O objetivo é familiarizar -se com o sistema e com o estilo do autor original. Você pode não ter muita sorte (um dos dois incompetentes que trabalhou no meu sistema antes de mim sempre pós-fixou seus comentários com quatro marcas de pontuação em vez de um, o que tornou muito fácil distinguir quem escreveu o segmento específico de código.), Mas você desenvolverá informações sobre as fraquezas do autor para saber o que procurar. Acoplamento extenso e apertado com o estado global versus o mau entendimento das ferramentas de linguagem, por exemplo.
  3. Estabeleça um grande objetivo. Se a sua experiência paralela a minha, você se encontrará em um pouco de código de espaguete cada vez mais frequentemente ao executar a etapa anterior. Este é o primeiro nó que você precisa desvendar. Com a experiência que você conseguiu entender o componente e o conhecimento sobre o que o autor original provavelmente fez errado (e, portanto, o que você precisa observar), você pode começar a imaginar um modelo melhor para esse subconjunto do sistema. Não se preocupe se você ainda precisar manter algumas interfaces confusas para manter a funcionalidade, basta dar um passo de cada vez.

Espuma, enxágue, repita! :)

Dado o tempo, considere adicionar testes de unidade para o seu novo nível Modelo Um abaixo de suas interfaces com o restante do sistema. Não grave as más interfaces no código por meio de testes que os usam, você estará alterando -os em uma iteração futura.

Abordando os problemas específicos que você menciona:

Quando você se depara com uma situação em que os usuários estão trabalhando manualmente, Fale com os usuários sobre mudar isso. Verifique se eles aceitarão a mudança se você fornecer antes de afundar o tempo nela. Se eles não querem a mudança, seu trabalho é manter o comportamento quebrado.

Quando você se depara com um componente de buggy que vários outros componentes contornaram, adoto uma técnica de componente paralelo. Crie um contador que funcione como o existente deve trabalhar. Forneça uma interface semelhante (ou, se prática, idêntica) e deslize o novo componente para a base de código. Quando você toca em componentes externos que funcionam em torno do quebrado, tente substituir o componente antigo pelo novo. Interfaces semelhantes facilitam a portas do código e o componente antigo ainda estará por aí se o novo falhar. Não remova o componente antigo até que você possa.

Outras dicas

O que está sendo perguntado a você agora? Você está sendo solicitado a implementar a funcionalidade ou corrigir bugs? Eles sabem o que querem que você faça?

Se você não tem mão de obra, tempo ou recursos para "consertar" o sistema como um todo, tudo o que você pode fazer é resgatar água. Você está dizendo que deve poder fazer algum "progresso visível" em alguns meses. Bem, com o sistema sendo tão ruim quanto você descreveu, você pode realmente piorar o sistema. Sob pressão para fazer algo perceptível, você simplesmente adiciona código e tornará o Sysem ainda mais complicado.

Você precisa refatorar, eventualmente. Não há maneira de contornar isso. Se você pode encontrar uma maneira de refatorar que seja visível para seus usuários finais, isso seria ideal, mesmo que demore de 6 a 9 meses ou um ano em vez de "alguns meses". Mas se você não puder, então você tem a opção de fazer:

  • Refatorar e correr o risco de ser visto como "não realizar nada", apesar dos seus esforços
  • Não refatore, atinja objetivos "visíveis" e torne o sistema mais complicado e mais difícil de refatorar um dia. (Talvez depois de encontrar um emprego melhor, e espero que o próximo desenvolvedor apareça nunca possa descobrir onde você mora.)

Qual é mais benéfico para você depende pessoalmente da cultura da sua empresa. Um dia eles decidirão contratar mais desenvolvedores ou substituir completamente esse sistema por algum outro produto?

Por outro lado, se seus esforços para "consertar as coisas" realmente quebram outras coisas, eles entenderão a monstruosidade que você está sendo solicitado a enfrentar sozinho?

Não há respostas fáceis aqui, desculpe. Você precisa avaliar com base em sua situação única e individual.

Este é um livro inteiro que basicamente dirá o teste de unidade e o refattor, mas com conselhos mais práticos sobre como fazer isso

http://ecx.images-amazon.com/images/i/51rcxgpxq8l._sl500_aa240_.jpg

http://www.amazon.com/working-effectivamente-legacy-robert-martin/dp/0131177052

Você abre o diretório que contém esse sistema com o Windows Explorer. Em seguida, pressione Ctrl-A e, em seguida, entregue. Isso soa como uma melhoria no seu caso.

Sério, porém: esse contador parece ter problemas de segurança de tópicos. Eu colocaria uma fechadura nas funções crescentes.

E com relação ao restante do sistema, você não pode fazer o impossível, então tente fazer o possível. Você precisa atacar seu sistema de duas frentes. Cuide das questões mais visivelmente problemáticas primeiro, para que você possa mostrar progresso. Ao mesmo tempo, você deve lidar com os problemas mais infraestruturais, para ter uma chance de realmente consertar essa coisa algum dia.

Boa sorte, e que a fonte esteja com você.

Escolha uma área que teria dificuldade média para refatorar. Crie um esqueleto do código original com apenas as assinaturas do método dos existentes; Talvez use uma interface até. Então comece a invadir. Você pode até apontar os métodos "novos" para os antigos até chegar até eles.

Em seguida, teste, teste, teste. Como não há testes de unidade, talvez apenas use bons testes antiquados de unidade ativada por voz (pessoas)? Ou escreva seus próprios testes à medida que avança.

Documente seu progresso à medida que você passa em algum tipo de repositório, incluindo frustrações e perguntas, para que, quando o próximo pobre Schmuck, que recebe esse projeto, não estará onde você está :).

Depois de concluir a primeira parte, passe para a próxima. A chave é construir sobre o progresso incremental, é por isso que você não deve começar com a parte mais difícil primeiro; Será muito fácil ser desmoralizado.

Joel tem alguns artigos sobre reescrita/refatoração:

http://www.joelonsoftware.com/articles/fog0000000069.html

http://www.joelonsoftware.com/articles/fog0000000348.html

Estou trabalhando com um sistema herdado com as mesmas características há quase três anos, e não há atalhos que eu conheço.

O que mais me incomoda com o nosso sistema herdado é que não tenho permissão para corrigir alguns bugs, pois muitas outras funções podem quebrar se eu os consertar. Isso exige soluções alternativas feias ou para criar novas versões de funções antigas. As chamadas para as funções antigas podem ser substituídas pelo novo de cada vez (durante o teste).

Não tenho certeza de qual é o objetivo da sua tarefa, mas recomendo fortemente que você toque o mínimo possível do código. Faça apenas o que você precisa fazer.

Você pode querer obter o máximo possível documentado pela entrevistando pessoas. Esta é uma tarefa enorme, já que você não sabe quais perguntas fazer, e as pessoas terão esquecido muitos detalhes.

Fora isso: verifique se você está sendo pago e apoio moral suficiente. Haverá choro e ranger de dentes ...

Bem, você precisa começar em algum lugar, e parece que há bugs que precisam de consertar. Eu trabalhava nesses bugs, fazendo refatoramentos rápidos e escrevendo quaisquer testes de unidade possíveis ao longo do caminho. Eu também usaria uma ferramenta como SourConitor para identificar algumas das partes mais "complexas" do código do sistema e ver se eu poderia simplificar o design deles de alguma forma. Por fim, você só precisa aceitar que será um processo lento e dará pequenos passos em direção a um sistema melhor.

Eu tentaria escolher uma parte do sistema que pudesse ser extraída e reescrita isoladamente rapidamente. Mesmo que não faça muito, você pode mostrar o progresso rapidamente e não tem o problema de interface com o código legado diretamente.

Felizmente, se você puder retirar algumas dessas tarefas, elas o verão fazendo progresso visível e apresentar um argumento para contratar mais pessoas para reescrever os módulos maiores. Quando partes do sistema dependem do comportamento quebrado, você não tem muita escolha a não ser se separar antes de consertar qualquer coisa.

Felizmente, você pode gradualmente construir uma equipe capaz de reescrever todo o lote.

Tudo isso teria que andar de mãos dadas com algum treinamento decente, caso contrário, os velhos hábitos das pessoas ficarão e seu trabalho ficará culpado quando as coisas não funcionarem como esperado.

Boa sorte!

Deixaram de usar tudo o que existe atualmente que tem problemas, e escrever novos que funcionam corretamente.Documento tanto quanto você pode sobre o que vai mudar e colocar grandes piscar em vermelho, os sinais em todo o lugar, apontando para esta documentação.

Fazendo dessa forma, você pode manter os seus erros (aqueles que estão a ser compensada em outro lugar) torno sem abrandar o seu progresso para a obtenção de um real sistema de trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top