什么是负码?


Answers:


501

这意味着通过消除冗余或使用更简洁的结构来减少代码行。

例如,请参阅原始Apple Lisa开发人员团队的著名轶事

当Lisa团队在1982年推动对其软件进行最终定型时,项目经理开始要求程序员每周提交一次表格,以报告其编写的代码行数。比尔·阿特金森(Bill Atkinson)认为这很愚蠢。在他将QuickDraw的区域计算例程重写为快6倍,缩短2000行的那一周,他在表格上加上了“ -2000”。再过几周后,经理们不再要求他填写表格,他很高兴地遵守了。


257
完美之道不在于没有更多的补充,但是当有什么东西可拿- 安东尼·德·圣艾修伯里
systempuntoout

7
#LOC是衡量代码质量的好方法吗?我可以“缩小”任何C或C ++代码并显着减少行数,但是这将是一场噩梦。
JBRWilkinson

8
@systempuntout-然后出现了Einsten的“(科学理论)应该尽可能简单,但不要简单”
Jonathan Day 2010年

32
没有任何代码可以运行得更快,更可靠,需要的维护更少。“如果有疑问,那就把它挡出去!”
TMN 2010年

4
@JBRWilkinson:我想说一下关于代码简洁性的“最佳地方”。通常,越短越好,但是有时候代码可能变得过于简洁,不容易被其他程序员理解。
GordonM

131

比尔·盖茨(Bill Gates)的一句话是用代码来衡量程序员的工作效率,就像用重量来衡量飞机的建造进度。

我想补充一点,LOC指标鼓励使用过于冗长的语言,并故意重新发明轮子以达到配额。


30
是的,这是任何度量标准的问题。一旦您使用它们来判断人们的表现,他们就会开始计算数字。

5
有人真正使用过LOC作为性能指标吗?我只看到它用于“我们在这里如何谈论项目的错误?”之类的东西。
Michael Borgwardt 2010年

5
@迈克尔:是的。不幸的是。
Michael Petrotta 2010年

4
我们是否在谈论同一个比尔·G·比尔(Bill G.),他的公司以这种隐喻生产了10000吨GTON喷气机?:)
DanielMošmondor2010年

37
一个为航天飞机的机载计算机编写代码的程序员告诉我,他必须考虑软件的重量!该软件是真实的(为此付出了金钱);它在班车上;必须考虑到航天飞机上装载的所有物品的重量。通过代码权重衡量程序员生产力的第一个示例。(不允许使用零,所以他指定了0.00001克,一切都令人满意。)
马克·卢顿2010年

118

当我上高中时-是的,我们早在70年代就拥有计算机,尽管我们不得不用石刀将它们用动物皮制成-一位数学老师参加了编程竞赛。规则是,获胜的程序将产生正确的输出,并且代码行乘以运行时间的乘积最小。也就是说,如果您的程序花费了100行代码并运行了5秒钟,则您的得分为500。如果其他人编写了90行代码并运行了6秒,则他的得分为540。低分获胜,例如高尔夫。

这让我印象深刻,因为它是出色的评分系统,既简洁又表现出色。

但是技术上符合获奖标准的参赛作品将被取消参赛资格。问题是要打印所有小于100的质数的列表。取消资格的条目是这样的(当时大多数学生都在使用BASIC):

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"

撰写该文章的学生指出,它不仅简短而且非常有效,而且即使对编程知识很少的人,该算法也应该显而易见,从而使该程序具有很高的可维护性。


10
更多的证据表明,对代码行进行计数是一个非常可衡量的指标:-)

44
那个BASIC程序很棒!老师取消了该计划的资格,这真是令人沮丧。毕竟,在实际编程中肯定可以找到查找表(程序与之有些相似)。
Noctis Skytower 2010年

6
明智的老师可能已经接受了此BASIC程序,并用它来强调正确设置SRS的重要性。让我想起了一个棒球教练,他对他的球队感到沮丧,以示向他们展示如何打球,他接过球拍,连续三击而又不甘示弱,他向他的球队大喊:“瞧!这就是你的基础*****正在玩。现在就击球并正确玩吧!”。还让我想起了写过“创造看到创作者并脸红了”并赢得“葡萄酒”征文比赛的人。
导航

3
@Nav:让我想起了以相同的方式开始的类似故事。然后,教练向空中掷球,挥杆并未击中。他再次将它扔向空中,摇摆并错过。他第三次将它扔向空中,挥杆并未击中。然后他对团队说:“瞧,那就是你应该如何投球!” (我不知道这个故事可能与软件开发有关。)
Jay

13
如果我没有资格参加比赛,我会很沮丧。确定性问题值得确定性解决方案,对吗?当我编写“ Hello World”应用程序时,我不会编写代码来检查我是否正确拼写了“ Hello”。
柯克·布罗德赫斯特

34

这是嘲讽。如果每条平均编码行花费$ N,那么编码“负行”肯定是赢家。

作为实践建议,这意味着完成所有工作的小代码比在相同条件下做相同事情的大代码要好得多。


2
我知道您来自哪里,但是简洁,易于理解的小尺寸代码却很难一achieved而就。通常将其编写为使其工作(许多行),优化速度(减少一行)和优化维护/可读性(减少行数)。具有长投资回报的实际成本是第二步和第三步,因此通常会完全忽略它们。就像“便宜,快速和优质-您可以选择两个”一样。

2
实际上,针对维护/可读性进行优化的IME实际上可以提高 LOC,因为重写代码以使其更具自记录性也往往使其变得更加冗长。

1
@Visage:“ ...其他所有条件都相同”。
艾拉·巴克斯特

我认为,要点是,简明代码和冗长代码之间的所有其他条件都不相同。
Tomas Narros 2010年

平均代码行花费$ N的原因是因为您首先花费时间编写代码X。然后,经过几次迭代,逐行减少最终乘积Y。因此,(X-Y)剩余的生产线似乎非常昂贵,因为重构的大屠杀消除了所有的麻烦。

27

用更少的代码编写相同的程序是每个人的目标。

如果一个程序用200 LOC进行编码,而我用150编写,则编写了-50 LOC。所以我写了负面代码。


3
另外,减少LOC意味着您可以减少错误并轻松发现它们
LucaB 2010年

3
对于Haskell和其他可以压缩为随机噪声的语言而言,情况并非如此。:)
Macke 2010年

1
当然,我的意思不是“压缩代码”,而是编写有效的算法以减少LOC的代价:) +1为您注释。
LucaB

9

历史上看,Thilo的答案可能是最准确的,但是“负代码”的隐喻也可以包括性能和内存使用-奖励将执行或分配推迟到实际需要之前的工作。

这种“精打细算”的思想产生了诸如“什么都不做总比做某件事更快”,“最快的代码是永远不会执行的代码”和“如果您可以将其搁置足够长时间,您可能永远都不必这样做”(指的是将昂贵的操作推迟到实际需要之前进行)

实现否定代码的一种技术是挑战问题的初始假设和定义。如果您可以重新定义问题/输入域,以使“粘性问题#3”绝对不可能,那么您就不必花费时间或代码来处理粘性问题#3。您已经通过优化设计消除了代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.