2018-04-26 08:23:44 +0000 2018-04-26 08:23:44 +0000
185
185

Como falar com a gerência sobre código 'genial'?

EDIT:

Obrigado a todos pelos grandes conselhos, comentários e feedback.

Como acontece, ninguém era o “mau da fita” nesta situação. Os conselhos que recebi aqui ajudaram-me a voltar a entrar em contacto com o anterior líder do projecto. Acontece que a minha empresa, sem razão discernível, tinha recebido uma versão “em desenvolvimento” antecipada da base de códigos. A antiga empresa enviou-nos uma versão pronta para produção e, como uma cereja no topo, elogiou-me publicamente pela engenharia inversa eficaz de um produto incompleto à profundidade que eu tinha.

TL;DR

Eu herdei um projecto. Resumindo, o código que tenho a missão de manter é mau.


Esclarecimento: esta pergunta versus dívida técnica

_ Esta pergunta tem a ver comigo a desafiar crenças antigas sobre um produto sem cometer suicídio na carreira. Em vez de ser estritamente sobre lidar com dívidas técnicas, ](https://workplace.stackexchange.com/questions/37115/ask-company-to-allow-time-space-to-pay-off-technical-debt) há isto: a gerência sugere que talvez o código seja tão complexo que eu não consiga entendê-lo, e **postou que os erros são por desenho; ** _ que o desenvolvedor original é tão meta, que o que parece ser erros são na verdade traços de gênio. Talvez outra razão pela qual isto não seja bem uma dívida técnica é que a diferença entre código ‘genial’ e dívida técnica é que a gestão comunica que eu não devo alterar o código ‘genial’, e que o código ‘genial’ não é uma dívida técnica: é a magia negra secreta. **Queria que a gerência pensasse nisso como uma dívida técnica. Em vez disso eles não. A gerência não está preocupada com o tempo, custo ou dinheiro directamente – embora isso seja alguma preocupação.


Detalhes

A maior parte do tempo, eu não ficaria nervoso ao comunicar isto à gerência. Infelizmente uma longa linha de manutenção à peça por pessoas, algumas das quais tinham pouca experiência de desenvolvimento, que apenas “tocaram” no código o tempo suficiente para adicionar um adesivo aqui ou ali, e depois seguir em frente, pintou um quadro à gerência ao longo dos anos em que o projecto está apenas a um passo de estar pronto para a produção.

Isso não é lamentavelmente o caso. Uma pequena _ lista de problemas no código genial_ que encontrei na base de código ~1.5Gb são…

  • Há a mesma função, os mesmos nomes de variáveis do mesmo âmbito em toda a base de código (numa linguagem que não suporta isso).
  • As funções são definidas mas nunca chamadas.
  • Uso e inicialização de variáveis fora de ordem.
  • Versões incompatíveis das bibliotecas utilizadas.
  • URIs e endereços IP hardcoded sem documentação sobre o que fazem.
  • Randomly requested API routes which return nothing or gibberish; which are then not used.
  • Hard-coded, unencrypted passwords and private ssh keys.

Devo acrescentar que quando comecei a trabalhar nele, **_ nem sequer compilou. E quando o consegui compilar, falhou em tempo de execução.

É um pesadelo.

O problema é que a direcção recebeu a garantia de quem o herdou, e de anteriores programadores “gung-ho”, de que “funciona”, pelo que investiu significativamente nele… E agora o dinheiro é-me passado. E querem-no em produção em cerca de 2 meses.

Quando eu sugiro que os programadores anteriores podem não ter sido totalmente honestos ou compreendido o produto por completo, a gerência envia sinais mistos sobre “basta fazer”, e “porque é que ainda não está feito” … e “não temos a certeza se alguma vez funcionou” para “estava a funcionar quando o recebeu”, e “nunca o vimos funcionar” para “já está em produção”.

[EDIT: colou a maior parte do parágrafo seguinte na secção TL;DR.

A Direcção também sugeriu que talvez seja tão complexo que eu não o consiga compreender, e postou que os erros são por concepção; _ que o programador original é tão meta, que o que parece erros são na realidade traços de génio._ Admito, não sou nenhum génio, e talvez seja esse o caso: ao qual apresento as minhas observações anteriores sobre as questões muito fundamentais que encontrei.

Talvez haja política em jogo acima do meu nível.

Respostas (1)

0
0
0
2018-04-27 17:55:09 +0000

O seu plano de alto nível deve ser o seguinte:

  1. Arquitectar um caminho a seguir. (*)
  2. Faça uma estimativa do tempo necessário para implementar o seu “caminho para o futuro”.
  3. Reunir-se com as partes interessadas da empresa e comunicar o seguinte:
  4. Que não pode compilar/executar o código actual (se isso ainda for verdade).
  5. Que levará “X” dias/semanas para reabilitar a base de códigos para um estado compilável/construível/executável.
  6. Que existe um trabalho adicional, para além de apenas tornar esse código compilável, que deve fazer para tornar o código suportável e extensível.
  7. Que vai levar “X” meses para implementar o seu caminho em frente. Depois explique o seu caminho em frente.

(**) Isto é muito importante porque terá de persuadir as partes interessadas não técnicas e empresariais de que o seu plano é sólido, exequível e válido.

(*) Aqui está a minha recomendação para um caminho em frente, que pode começar imediatamente depois de poder compilar, construir e executar o código.

  1. Criar testes unitários automatizados.
  2. Os testes unitários irão demonstrar que compreende o código.
  3. As estatísticas de cobertura de código irão lembrar-lhe continuamente quais as partes da base de códigos que entende e quais as partes que ainda precisa de sondar.
  4. Não deixe ninguém fundir-se com o ramo principal sem um pedido de puxar que tenha sido aprovado por pelo menos duas pessoas.
  5. Os pedidos de puxar irão socializar o entendimento evolutivo da sua equipa sobre a base de código.
  6. Encoraje uma cultura de apoio, especialmente durante este período difícil, entre os seus programadores.
  7. Tente não perder a calma. Outros programadores sentirão a sua frustração e poderão frustrar-se a si próprios.
  8. Quando um programador tem dificuldades com algum código antigo e complicado, encoraje outros programadores a darem uma mão e a lidarem juntos com o código difícil, talvez com a programação em pares.