Como provar que um aplicativo é construído em uma base de código incorreta?

23

Atualmente, estou analisando um sistema criado por alguns desenvolvedores que trabalharam anteriormente no meu trabalho. O sistema funciona muito bem do ponto de vista do usuário, mas ao investigar o código, é uma bagunça total. Estou mais do que convencido de que a maneira como o aplicativo é construído não aguenta atualizações futuras, muito menos aumentos altos no uso.

O problema é que eu sei o quão ruim é, mas meus superiores não. Como posso provar isso ao meu gerente para que ele realmente veja o problema e possa ser convencido a fazer uma triagem mínima na base de código atual e, no futuro próximo, iniciar uma nova linha de desenvolvimento para a próxima versão do aplicativo?

ChrisR
fonte
6
programmers.stackexchange.com/questions/59050/… Talvez preste atenção ao quão mal a "grande reescrita" geralmente termina da perspectiva dos negócios. Isso seria o que um programador mais "sênior" faria.
você está
22
@qes, a única coisa pior do que fazer a "grande reescrita" é um medo paralisante da "grande reescrita". Quando iniciei minha posição atual, herdei uma bagunça de Perl CGI de dois ou três programadores diferentes sem controle de origem, rastreamento de erros ou testes. Demorou um pouco convincente, mas obtive aprovação para reescrever no Ruby on Rails, mantendo o código legado. Cinco meses depois, as ferramentas eram mais fáceis de usar e poderíamos adicionar novos recursos em dias ou semanas, em vez de meses. Os usuários estão em êxtase, e eu não estou enlouquecendo. A "grande reescrita" requer justificativa sólida, não total evitação.
Jason Lewis
1
@ JasonLewis: (Acho que você não seguiu o link no meu comentário anterior?) Parece desaconselhável para alguém que, há menos de um ano, se auto-descreveu como carecendo de habilidades importantes que um nível sênior possuiria e não faria ' Não sei por onde começar ao iniciar um novo projeto.
Quentin-starin
5
@JasonLewis Concordo plenamente com você. Sempre que alguém pergunta sobre como reescrever um aplicativo no SE, muitas pessoas vêm com essa ideologia "não faça uma grande reescrita". Eu acho que certamente existem muitas razões para não fazê-lo, mas você não deve evitá-lo a todo custo. Participei da reescrita de um aplicativo de 100 mil linhas de código e tivemos muito sucesso, muito semelhante ao que você descreveu. Conseguimos reescrevê-lo módulo por módulo (primeira parte da interface do usuário, depois o servidor e o restante). 12 meses depois, temos uma base de clientes muito muito feliz e todos estão orgulhosos da decisão que tomamos.
Alex
2
Isso faz parte de um problema mais geral: o do seu antecessor, que busca resultados imediatos a longo prazo. Ao assumir, você precisa explicar por que não consegue manter a mesma saída.
precisa saber é o seguinte

Respostas:

23

'Mas funciona agora' é a resposta padrão do gerenciamento às frustrações legítimas dos engenheiros de software. A primeira coisa que eu faria seria compilar a documentação (se houver) e usá-la para demonstrar contradições entre o código e a documentação.

Se puder, monte um conjunto abrangente de testes de unidade. Execute-os a cada alteração para documentar regressões que podem ser responsabilizadas na base de código existente.

Por fim, se você puder contratar um desenvolvedor de outro departamento cujo trabalho você confia, observe o código novamente. Um desenvolvedor dizendo 'isso é uma porcaria' é mais fácil de ignorar, do que quando um desenvolvedor sênior que já existe há algum tempo o atesta e diz: 'Não, Jim, ele está certo. Isso é besteira em uma porcaria de crack.

Obviamente, tudo depende do seu ambiente, tamanho da empresa etc.

Eu sempre recomendo dar uma olhada no Programador Pragmático, se você ainda não leu. Não apenas deve ser uma leitura obrigatória para todos os profissionais de software, mas também oferece boas sugestões para lidar com a gerência, colegas de trabalho, usuários etc. que não veem a engenharia de software como um ofício.

Jason Lewis
fonte
7
Não há documentos e o código é praticamente não testável, a menos que possamos refatorá-lo. Estou bastante confiante de que estou sendo apoiado por vários colegas, por isso, conseguir outro desenvolvedor na discussão pode ajudar.
ChrisR
@ChrisRamakers Essas são excelentes notícias (o suporte, não a falta de documentos!). É mais difícil (embora não impossível) para os gerentes negar / rejeitar a opinião profissional de vários desenvolvedores. E se seus apoiadores estão na empresa há mais tempo, eles podem ter uma experiência valiosa na navegação pelas políticas internas da organização. Boa sorte!
Jason Lewis
Além disso, se você conseguir se familiarizar com algum software de teste de carga, poderá mostrar como ele pode quebrar com uma carga alta.
HLGEM
13

Do ponto de vista da gerência, não há nada de errado com o sistema e você está apenas reclamando porque [você só quer reescrevê-lo / não entende o que os engenheiros anteriores fizeram / deseja que seu trabalho seja fácil]. Um pouco tímido, mas quando alguém no topo vê que as coisas estão funcionando bem no momento, está inclinado a ver uma crise em que você está (tenho certeza de que há uma alegoria de mudança climática em algum lugar ...) .

Até certo ponto, eles têm razão. A gerência vê problemas quando as liberações vão muito além de sua estimativa original, as estimativas parecem muito altas para o trabalho que está sendo realizado, "isso é impossível com nossa base de códigos existente" e as altas ocorrências de bugs passando pelo controle de qualidade. Se as coisas estão ronronando bem, é fácil dar um tapinha na cabeça e pedir para você fazer o seu melhor, porque isso não está afetando os resultados.

O que fazer depende da sua organização e do próprio software. Fundamentalmente, porém, sugiro documentar todas as complicações que surgem como resultado de um código legado ruim. Ao estimar tarefas, deixe claro para a gerência por que você acha que demorará tanto tempo, com explicações detalhadas sobre quais aspectos da antiga base de códigos estão adicionando esse custo extra. Quando erros forem introduzidos no código, inclua os motivos pelos quais esse erro ocorreu e como os problemas na antiga base de códigos são responsáveis.

Eu sugiro que você expresse suas preocupações para as partes interessadas de uma maneira que sugira que o software superou seu design original e agora é problemático para continuar melhorando.

Stefan Mohr
fonte
5

Existem várias ferramentas disponíveis que podem fazer cobertura e revisão de código. Ferramentas do Google adequadas para sua tecnologia, normalmente são ferramentas padrão do setor. Sugiro que você use essas ferramentas, elabore um relatório de qualidade de código e o apresente ao Manager. Certifique-se de que suas críticas sejam contrutivas e não políticas.

ViSu
fonte
Sim, pensei em calcular a complexidade ciclomática média e usá-la como argumento, mas estou certo de que isso não provará nada para o gerenciamento. Mas vale a pena uma tentativa, thnx
ChrisR
5
@ ChrisRamakers: Nada pode ser "provado" para um gerente. Esqueça a "prova". Reúna dados. Fatos são tudo que você tem. Mais fatos são mais convincentes. Mas não há "prova".
precisa saber é o seguinte
4

Escolha um exemplo que seja fácil de entender onde o gerenciamento consideraria uma simples solicitação de mudança, mas, devido ao design existente, é muito mais difícil.

Você não quer que eles insistam na solicitação específica, mas certifique-se de que eles saibam que é assim que QUALQUER solicitação de mudança será. Ninguém quer ser pintado em um canto com um aplicativo. Os desenvolvedores acreditam no YAGNI, mas a gerência acredita no CYA.

As sugestões para teste de carga podem ser uma boa abordagem, mas elas podem não estar convencidas de que o aumento das preocupações com o uso atenda a qualquer potencial de crescimento do mundo real (a empresa não vai dobrar em um ano).

Tudo é relativo. Eles podem não querer colocar os recursos nesse projeto quando tiverem planos para projetos mais importantes para gastar seu tempo. Não seja rotulado como não vendo o quadro geral.

JeffO
fonte
1
Depois de fazer a alteração, mostre o arquivo diff, que em uma base de código incorreta tocará em muitos arquivos de origem diferentes, com um "o que isso tem a ver com isso?" etc. Explique à gerência quanto desse trabalho, isto é, time == $$, foi relacionado à base de código ruim e que as mudanças no futuro terão todas essas características.
Larry OBrien
3

Quando você fala sobre provar algo, todo esse método científico entra em jogo, e parte do que isso significa é que, se você aceita padrões objetivos de decidir o que é verdade, deve aceitar a possibilidade de que, sob investigação, esses fatos irritantes acabe por não estar do seu lado.

No seu caso, acho que há duas coisas a serem provadas.

Primeiro, que a base de código atual é "ruim". O que você provavelmente pode provar é que "a opinião profissional de quase todos os desenvolvedores que examinam esse código é que é ruim".

Segundo, é melhor que a empresa reescreva a base de código. Isso é um problema porque, mesmo que o primeiro ponto seja verdadeiro, o segundo pode não ser. Além disso, você não sabe o suficiente para fazer essa determinação. Esse é o trabalho da gerência e, se você quiser que eles respeitem seu julgamento profissional sobre o primeiro ponto, respeite o deles sobre o segundo.

Mas eles não podem determinar o segundo ponto sem as informações fornecidas. Você precisa comunicar o que sabe sobre como os problemas no código afetarão os negócios e o que sabe sobre como uma reescrita afetaria os negócios. Isso é difícil, pois ambos envolvem prever um futuro com muita incerteza.

Mas você pode tentar declarar o problema em termos comerciais. Quanto tempo extra é gasto em alterações e regressões? Quanto custaria uma reescrita? Com que rapidez os custos do sistema atual aumentam com o tempo se não forem reescritos? E se houver um aumento no uso, qual a chance de um desastre se o código atual for mantido? Você realmente não pode saber nada disso, mas pode adivinhar melhor do que qualquer outra pessoa. Dê um intervalo ou algo para comunicar com que precisão você acha que pode prever essas coisas.

A maioria dos desenvolvedores não gosta de manter códigos ruins. É por isso que pode ser lamentável que o código que não é necessário reescrever da perspectiva do desenvolvedor não valha a pena reescrever da perspectiva do negócio.

Por exemplo, mesmo que a reescrita acabe lucrativa, pode valer menos que o custo de oportunidade de gastar o dinheiro em outro lugar da empresa. Ou a base de código ruim pode levar mais tempo para mudar e ter mais regressões, mas não o suficiente para tornar uma reescrita lucrativa. Eles podem querer ser comprados nos próximos meses, e gastar dinheiro em uma reescrita aparecerá nos livros, mas o software de buggy não.

Tente pensar sobre isso da perspectiva dos negócios e não cozinhe os números para conseguir o que deseja. Uma grande reescrita quase nunca é um acéfalo do ponto de vista comercial. Se você quiser provar algo que não é diretamente comprovável, tente o seu melhor para refutá-lo. Se você continuar tentando o seu melhor para chegar a uma forma não reescrever a partir do zero, mas nada que você venha com faz sentido, talvez , em seguida, é realmente hora de reescrever a partir do zero. E esse esforço mostrará à sua gerência que você é sério sobre a representação dos interesses da empresa, e não o seu (você representa o interesse da empresa, não o seu, certo?).

psr
fonte
2

Eu acho que depende do que há de ruim na base de código. Ser "não do jeito que eu faria as coisas" não significa que é uma base de código ruim.

Coisas que realmente fazem uma base de código ruim:

  • Falhas de segurança

    Problemas que deixam o servidor, o aplicativo e / ou os dados vulneráveis. Especialmente qualquer coisa que deixe em risco os dados confidenciais da empresa, cliente ou cliente. Estes devem ser fáceis de documentar.

  • Working Broken

    Ele está funcionando apenas porque você massageia os dados e realiza manutenção no aplicativo quase continuamente para mantê-lo funcionando. Se você fosse embora e ninguém aceitasse a folga, isso não funcionaria mais. - Documente quanto tempo você gasta fazendo isso. E observe quanto você poderia economizar. Muitas vezes, esses processos também são ineficientes para os usuários e você pode documentar isso também.

  • Na verdade não funciona

    Parece funcionar, mas os resultados estão incorretos. Isso geralmente causa problemas na linha, como números não correspondentes, alta taxa de defeitos, etc.

O que não é uma base de código ruim (apenas não é boa):

  • Escrito em tecnologia obsoleta e sem suporte. (VB6, COBOL, .net1.1 Etc.)

Observe as vantagens de migrar para uma nova tecnologia. Tente encontrar um caminho de migração que mova as peças de cada vez, para minimizar riscos e criar confiança no usuário e no gerenciamento. Verifique se a lógica funciona basicamente da mesma forma que o original.

  • Código não documentado / mal formatado

É o mais fácil de corrigir, porque geralmente você pode adicionar comentários e corrigir a formatação sem afetar o código. Mas isso não requer uma reescrita. Se você acha que isso está combinado com outros problemas, a primeira coisa a fazer é corrigir isso para avaliar melhor a viabilidade do código.

SoylentGray
fonte
1

Você respondeu sua própria pergunta de uma maneira.

A maneira de convencê-los a gastar dinheiro com o sistema é esperar até que não funcione bem para o usuário. Se você acha que não vai escalar, espere que isso aconteça ou faça um teste de carga para provar isso.

É então uma proposta simples de limpar essa escala, que custará X horas.

Jonno
fonte
8
O único problema é que, se ele é o principal responsável pelo sistema, ele será responsabilizado quando não funcionar mais. "Mas funcionou antes de você começar!", Eles dirão. Por isso, aconselhei uma abordagem proativa. Avisá-los com antecedência, documentar as questões, e depois o seu jumento é coberto quando ele quebra, e não só ele pode dizer 'eu avisei ao seu chefe', mas ele pode dizer 'eu disse a ele so' ao chefe de seu chefe.
Jason Lewis
3
@ Jason - Entendo o seu ponto de vista, mas, na minha experiência, a negação opera para baixo e 'disse a ele' subindo a cadeia será recebida muito rapidamente com 'não jogador da equipe' no caminho.
219 Jonno
2
Ele depende muito do local de trabalho individual, mas eu concordo com você ... Eu poderia ter formulado melhor ... Meu ponto principal foi documentar as razões que está indo a falhar com antecedência, argumentando o ponto, e mantendo a documentação disponível para quando isso acontecer ... no melhor cenário, você poderá corrigi-lo. Média, você não está ferrado quando falha. Pior, você afunda profundamente o sistema e suas fraquezas e como corrigi-las o suficiente para explicar de maneira impressionante (com detalhes vívidos) como e por que você deixou sua última posição para seu possível empregador quando acaba procurando emprego depois que ele falha ;-)
Jason Lewis
1
@JasonLewis Se os jogadores da empresa estão usando frases como I told you soessa, essa é uma cultura tóxica de culpa e não um lugar em que o OP gostaria de trabalhar por muito tempo. Um bom gerente não culpa, um bom gerente reconhece problemas e apresenta um plano.
maple_shaft
@maple_shaft Concordo. Eu não quis dizer essas palavras literalmente, estava mais me referindo a cobrir todas as bases. Idealmente, todos teríamos bons gerentes de suporte, por toda a cadeia de comando. Freqüentemente, no entanto, aceitamos o que é justo e mediano, para que possamos usar o trabalho que temos como trampolim para o trabalho que queremos.
Jason Lewis
1

Essa é uma situação difícil, porque, na perspectiva do usuário, tudo está em um ponto aceitável e estável agora. Principalmente com gerentes não técnicos, não há nada com o que se preocupar no momento, mas pedir para reescrever a base de código é uma decisão enorme e que não deve ser tomada de ânimo leve, especialmente com a opinião e os esforços de um único homem (você mesmo) .

Portanto, você está em um ponto difícil de tentar defender uma reescrita por causa de uma dívida técnica esmagadora (na sua opinião, não temos exemplos e precisamos acreditar nisso), além de estar no ponto difícil de ter a dificuldade de manter e adicionar recursos a este sistema.

Suas estimativas para novos recursos serão altas, justifique esses números altos com fatos, provando que essas coisas realmente levarão muito tempo. Se você não transmitir isso corretamente, seu gerente poderá presumir que você é incompetente e você certamente não quer isso. Quando ele questionar as altas estimativas, explique por que você acha que a dívida técnica acumulada está dificultando a capacidade de adicionar recursos de forma rápida e barata ao software atual. Se o seu gerente tiver duas células cerebrais para esfregar, ele começará a entender muito rapidamente.

O ponto é que você não deve tentar convencer seu gerente, mas orientá-lo com informações apropriadas (e cuidadosamente selecionadas) de que ele / ela pode se convencer de que uma reescrita é um curso aceitável. Você precisa fazer o gerente pensar que foi ideia dele o tempo todo.

maple_shaft
fonte
1

Primeiro, determine a dívida técnica acumulada na sua base de código. Em seguida, dê uma olhada nesta pergunta e respostas , onde é explicado como convencer a gerência a pagar a dívida técnica antes de prosseguir.

BЈовић
fonte
0

Há uma razão pela qual todo software maduro parece bagunçado:

  1. Toda a bagunça está codificando a lógica crítica em que a empresa confia. Sem isso, nada funciona. Tudo foi necessário para resolver o problema do usuário.
  2. Está usando uma tecnologia um pouco desatualizada. Os programadores atuais parecem pensar que, se não usar alguma mágica de modelo, é apenas uma bagunça. Esta é uma visão quebrada. Qualquer um que se atrase em um projeto maior terá esse estágio enquanto aprende todos os detalhes.
  3. Os requisitos que eram críticos há algum tempo não são mais tão críticos. Isso ocorre porque o software já corrigiu esses problemas. Chegando atrasado ao projeto, pode parecer que o software é complexo sem uma boa razão - o problema não existe mais, mas a complexidade do código ainda está lá.
tp1
fonte
Esse tipo de atitude leva os programadores a desculpar a enorme dívida técnica incorrida por ignorância ou preguiça. O trabalho de um programador é codificar a lógica de negócios através do uso de abstrações. As especificidades mutáveis ​​devem estar em metadados, não em números mágicos codificados. Em segundo lugar, 'um pouco desatualizado' pode ser subjetivo. IMHO, 'um pouco desatualizado' significa que a estrutura / plataforma ainda está ativamente desenvolvida, e eu tenho um caminho de atualização. A alternativa é 'obsoleta'. O número 3 é imperdoável. Você acabou de descrever a crosta. Ninguém refatorou ou limpou a base de código, e isso é aceitável?
Jason Lewis
claro, mas qual é o resultado depois de codificar a lógica de negócios através do uso de abstrações ... O código parecerá complicado. Essa é a definição de "bagunça". o (3) não é um problema, pois a complexidade ainda é necessária; a necessidade de tê-lo não desapareceu mesmo depois que o problema foi resolvido.
tp1 7/01/12