O que é código negativo?


Respostas:


501

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.


257
Perfeição é alcançada, não quando não há mais nada a acrescentar, mas quando não há mais nada para tirar - Antoine de Saint-Exupéry
systempuntoout

7
O #LOC é uma boa medida da qualidade do código? Eu poderia 'Minify' qualquer código C ou C ++ e reduzir a contagem de linhas significativamente, mas seria um pesadelo para manter.
precisa saber é o seguinte

8
@systempuntout - e então houve de Einsten "(A teoria científica) deve ser tão simples quanto possível, mas não mais simples"
Jonathan Dia

32
Nada corre mais rápido, é mais confiável ou requer menos manutenção do que o código que não existe. "Em caso de dúvida, evite!"
TMN

4
@JBRWilkinson: Eu diria que existe um "ponto ideal" em relação à brevidade do código. Geralmente, quanto mais curto é melhor, mas chega um momento em que o código pode ficar muito conciso e não ser fácil decifrar para outro programador.
GordonM

131

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.


30
Sim, esse é o problema de qualquer tipo de métrica. Assim que você os usar para avaliar o desempenho das pessoas, elas começarão a jogar os números.

5
Alguém já usou o LOC como métrica de desempenho? Eu só vi isso usado para coisas como "como estamos falando de um projeto aqui?"
Michael Borgwardt

5
@ Michael: sim. Infelizmente sim.
Michael Petrotta

4
estamos falando do mesmo Bill G., que tem uma empresa que por essa metáfora produz 10000 jatos GTON? :)
Daniel Mošmondor

37
Um programador que escreveu o código para os computadores de bordo do ônibus espacial me disse que tinha de responder pelo peso do software! O software era real (dinheiro foi pago por isso); estava no ônibus espacial; o peso de tudo carregado no ônibus espacial deve ser levado em consideração. Primeiro exemplo de medição da produtividade do programador por peso de código. (Zero não foi permitido, então ele especificado 0,00001 grama e tudo foi satisfatória.)
Mark Lutton

118

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.


10
Mais uma prova de que a contagem de linhas de código é um :-) métrica muito gameable

44
Esse programa BASIC é brilhante! É bastante perturbador o fato de o professor desqualificar o programa. Afinal, as tabelas de pesquisa (às quais o programa é semelhante) podem ser encontradas na programação do mundo real.
Noctis Skytower

6
Um professor sábio pode ter aceitado esse programa BASIC e usado para destacar a importância de obter uma SRS correta. Me lembra um treinador de beisebol que ficou tão frustrado com seu time que, para mostrar a eles como jogar, ele acertou o taco, acertou três tacadas seguidas e não deve ser superado, gritou para o time: "Veja! ***** estão jogando. Agora pegue o bastão e jogue corretamente! ". Também me lembra a pessoa que escreveu "a criação viu o criador e corou" e venceu o concurso de redação sobre 'vinho'.
Nav

3
@ Nav: lembra-me uma história semelhante que começa da mesma maneira. Então o treinador lança uma bola no ar, oscila e erra. Ele joga no ar novamente, balança e erra. Ele joga no ar uma terceira vez, balança e erra. Então ele diz para a equipe: "Veja, é assim que você deve estar lançando!" (Eu não tenho nenhuma idéia do que esta história pode ter a ver com o desenvolvimento de software.)
Jay

13
Eu ficaria muito chateado se fosse desclassificado por isso. Um problema determinístico merece uma solução determinística, certo? Quando escrevo um aplicativo 'Hello World', não o codigo para verificar se estou digitando 'Hello' corretamente.
precisa saber é o seguinte

34

É 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.


2
Vejo de onde você é, mas o código de pequenas dimensões conciso e fácil de entender raramente é alcançado de uma só vez. Geralmente é gravado para que funcione (muitas linhas), otimize a velocidade (um pouco menos de linha) e otimize a manutenção / legibilidade (menos linhas ainda). O custo real com o longo retorno do investimento é o segundo e o terceiro passo, portanto, eles geralmente são ignorados por completo. É como "lá é barato, rápido e bom - você escolhe dois".

2
Na verdade, o IME, otimizando a manutenção / legibilidade, pode realmente aumentar o LOC, pois a reescrita do código para torná-lo mais auto-documentado tende a torná-lo mais detalhado.

1
@ Visage: "... todas as outras coisas são iguais".
Ira Baxter

acho que o ponto é que todas as outras coisas não podem ser iguais entre código conciso e código detalhado.
Tomas Narros

A razão pela qual a linha média do código custa $ N é porque você gasta seu tempo escrevendo Xlinhas. Em seguida, ao longo de várias iterações, reduzindo o produto final por Ylinhas. Portanto, as (X-Y)linhas restantes parecem muito caras porque a carnificina da refatoração cortou todo o lixo.

27

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.


3
Além disso, escrevendo menos LOC significa que você pode fazer menos erros e identificá-los facilmente-
LucaB

3
Não é verdade para Haskell e outros idiomas que podem ser compactados para ruídos aleatórios. :)
Macke

1
Claro, meu argumento não era "comprimir código", mas escrever algoritmos eficientes que diminuem em menos LOC :) +1 para você comentar.
LucaB

9

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.