portanto, alguns desenvolvedores / gerentes veem valor ao escrever menos código para fazer as coisas, para que tenhamos menos código para manter
É uma questão de perder de vista o objetivo real.
O que importa é diminuir as horas gastas em desenvolvimento . Isso é medido no tempo (ou esforço equivalente), não nas linhas de código.
É como dizer que os fabricantes de automóveis devem fabricar seus carros com menos parafusos, porque leva um tempo diferente de zero para colocar cada parafuso. Enquanto isso é pedanticamente correto, o valor de mercado de um carro não é definido por quantos parafusos ele faz. ou não tem. Acima de tudo, um carro precisa ter desempenho, segurança e facilidade de manutenção.
O restante da resposta são exemplos de como o código limpo pode levar a ganhos de tempo.
Exploração madeireira
Pegue um aplicativo (A) que não possui registro. Agora crie o aplicativo B, que é o mesmo aplicativo A, mas com o log. B sempre terá mais linhas de código e, portanto, você precisará escrever mais código.
Mas muito tempo será dedicado à investigação de problemas e bugs e à descoberta do que deu errado.
Para o aplicativo A, os desenvolvedores ficam presos lendo o código e tendo que reproduzir continuamente o problema e percorrer o código para encontrar a origem do problema. Isso significa que o desenvolvedor deve testar desde o início da execução até o final, em todas as camadas usadas, e precisa observar todas as peças lógicas usadas.
Talvez ele tenha sorte de encontrá-lo imediatamente, mas talvez a resposta esteja no último lugar que ele pensa em procurar.
Para o aplicativo B, assumindo um log perfeito, um desenvolvedor observa os logs, pode identificar imediatamente o componente defeituoso e agora sabe onde procurar.
Isso pode ser uma questão de minutos, horas ou dias economizados; dependendo do tamanho e da complexidade da base de código.
Regressões
Tome o aplicativo A, que não é compatível com SECA.
Tome o aplicativo B, que é SECO, mas acabou precisando de mais linhas por causa das abstrações adicionais.
Uma solicitação de mudança é arquivada, o que requer uma alteração na lógica.
Para o aplicativo B, o desenvolvedor altera a lógica (exclusiva, compartilhada) de acordo com a solicitação de mudança.
Para o aplicativo A, o desenvolvedor precisa alterar todas as instâncias dessa lógica em que se lembra de ter sido usada.
- Se ele conseguir se lembrar de todas as instâncias, ainda precisará implementar a mesma alteração várias vezes.
- Se ele não conseguir se lembrar de todas as instâncias, agora você estará lidando com uma base de código inconsistente que se contradiz. Se o desenvolvedor esqueceu um trecho de código raramente usado, esse bug pode não se tornar aparente para os usuários finais até o futuro. Naquele momento, os usuários finais vão identificar qual é a origem do problema? Mesmo assim, o desenvolvedor pode não se lembrar do que a mudança implicava e terá que descobrir como mudar essa parte esquecida da lógica. Talvez o desenvolvedor nem sequer trabalhe na empresa até então, e então alguém agora precise descobrir tudo do zero.
Isso pode levar a um enorme desperdício de tempo. Não apenas no desenvolvimento, mas em caçar e encontrar o bug. O aplicativo pode começar a se comportar de maneira irregular, de uma maneira que os desenvolvedores não possam entender facilmente. E isso levará a longas sessões de depuração.
Intercambiabilidade do desenvolvedor
Desenvolvedor A. Aplicativo criado A. O código não é limpo nem legível, mas funciona como um encanto e está sendo executado em produção. Sem surpresa, também não há documentação.
O desenvolvedor A está ausente por um mês devido a feriados. Uma solicitação de mudança de emergência é arquivada. Não pode esperar mais três semanas para o Dev A retornar.
O desenvolvedor B precisa executar essa alteração. Ele agora precisa ler toda a base de código, entender como tudo funciona, por que funciona e o que tenta realizar. Isso leva séculos, mas digamos que ele possa fazer isso em três semanas.
Ao mesmo tempo, o aplicativo B (que o desenvolvedor B criou) tem uma emergência. O Dev B está ocupado, mas o Dev C está disponível, mesmo que ele não conheça a base de código. O que nós fazemos?
- Se mantemos B trabalhando em A e colocamos C em B, temos dois desenvolvedores que não sabem o que estão fazendo, e o trabalho é realizado de maneira subótima.
- Se afastarmos B de A e fazer com que ele faça B, e agora colocarmos C em A, todo o trabalho do desenvolvedor B (ou uma parte significativa dele) pode acabar sendo descartado. Isso é potencialmente dias / semanas de esforço desperdiçado.
O desenvolvedor A volta de suas férias e vê que B não entendeu o código e, portanto, o implementou mal. Não é culpa de B, porque ele usou todos os recursos disponíveis, o código fonte simplesmente não era suficientemente legível. A agora precisa gastar tempo corrigindo a legibilidade do código?
Todos esses problemas, e muitos mais, acabam perdendo tempo . Sim, a curto prazo, o código limpo exige mais esforço agora , mas acabará pagando dividendos no futuro quando erros / alterações inevitáveis precisarem ser resolvidos.
A gerência precisa entender que uma tarefa curta agora economizará várias tarefas longas no futuro. Falhar no planejamento é planejar para falhar.
Em caso afirmativo, quais são alguns argumentos que posso usar para justificar o fato de que mais LOC foram escritos?
Minha explicação a seguir é perguntar à gerência o que eles prefeririam: um aplicativo com uma base de código de 100KLOC que pode ser desenvolvida em três meses ou uma base de código de 50KLOC que pode ser desenvolvida em seis meses.
Obviamente, eles escolherão o menor tempo de desenvolvimento, porque o gerenciamento não se importa com o KLOC . Os gerentes que se concentram no KLOC são microgerenciados e informados sobre o que estão tentando gerenciar.