Eu estava lendo o artigo da Wikipedia sobre Douglas McIlroy e encontrei uma citação que menciona
"O verdadeiro herói da programação é quem escreve código negativo".
O que isso significa?
Eu estava lendo o artigo da Wikipedia sobre Douglas McIlroy e encontrei uma citação que menciona
"O verdadeiro herói da programação é quem escreve código negativo".
O que isso significa?
Respostas:
Isso significa reduzir linhas de código, removendo redundâncias ou usando construções mais concisas.
Veja, por exemplo, esta famosa anedota da equipe original de desenvolvedores da Apple Lisa:
Quando a equipe de Lisa estava pressionando para finalizar seu software em 1982, os gerentes de projeto começaram a exigir que os programadores enviassem formulários semanais relatando o número de linhas de código que haviam escrito. Bill Atkinson achou aquilo bobo. Na semana em que ele reescreveu as rotinas de cálculo de região do QuickDraw seis vezes mais rápidas e 2000 linhas mais curtas, ele colocou "-2000" no formulário. Depois de mais algumas semanas, os gerentes pararam de pedir que ele preenchesse o formulário e ele concordou com prazer.
Há uma citação de Bill Gates, ao longo das linhas de medição da produtividade do programador por linhas de código, é como medir o progresso da construção de aeronaves em peso.
Gostaria de acrescentar que a métrica do LOC incentivou o uso de linguagens muito longas e reinventou deliberadamente a roda para atender às cotas.
Quando eu estava no ensino médio - e sim, tínhamos computadores nos anos 70, embora precisássemos fazê-los com peles de animais usando facas de pedra - um dos professores de matemática fez um concurso de programação. As regras eram que o programa vencedor seria aquele que produzisse a saída correta e que tivesse o menor produto de linhas de tempo de código em tempo de execução. Ou seja, se o seu programa pegou, digamos 100 linhas de código e funcionou por 5 segundos, sua pontuação foi de 500. Se alguém escreveu 90 linhas de código e correu por 6 segundos, sua pontuação foi de 540. Baixas vitórias, como o golfe.
Pareceu-me um sistema de pontuação brilhante, recompensando concisão e desempenho.
Mas a inscrição que atendeu tecnicamente aos critérios de vitória foi desqualificada. O problema era imprimir uma lista de todos os números primos menores que 100. A entrada desqualificada era algo assim (a maioria dos estudantes usava o BASIC naquela época):
100 print "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,"
110 print "67, 71, 73, 79, 83, 87, 89, 91, 97"
O aluno que escreveu essa entrada destacou que não era apenas curto e muito eficiente, mas o algoritmo deveria ser óbvio para qualquer pessoa com um conhecimento mínimo de programação, tornando o programa altamente sustentável.
É explícito. Se custar US $ N por linha média codificada, a codificação de "linhas negativas" certamente será uma vencedora.
Isso significa, como conselhos práticos, que o código pequeno que realiza o trabalho é muito melhor que o código grande que faz a mesma coisa, todas as outras coisas sendo iguais.
Escrever o mesmo programa em menos código é uma meta para todos.
Se um programa levou 200 LOC para codificar e eu o escrevi em 150, escrevi -50 LOC. Então eu escrevi código negativo.
A resposta de Thilo é provavelmente a mais precisa historicamente, mas a metáfora do "código negativo" também pode incluir desempenho e uso de memória - esforços recompensadores para adiar a execução ou alocação de algo até que seja realmente necessário.
Essa mentalidade de "procrastinação vale a pena" produziu axiomas explícitos como "Não fazer nada é sempre mais rápido do que fazer alguma coisa", "O código mais rápido é o código que nunca é executado" e "Se você pode adiá-lo por tempo suficiente, talvez você nunca precise fazer isso "(referindo-se ao adiamento de operações caras até que seja realmente necessário)
Uma técnica para realizar código negativo é desafiar suposições e definições iniciais do problema. Se você pode redefinir o problema / domínio de entrada de modo que "problema persistente nº 3" seja categoricamente impossível, não será necessário gastar tempo ou código lidando com o problema complexo nº 3. Você eliminou o código otimizando o design.