神话人月10行每个开发者日 – 大型项目有多接近?

每个人都会说,他们可以从“神话人月”中击败每个开发者每天10行,开始一个项目,一般每天可以得到几百行。

但是在我以前的雇主那里,所有的开发人员都非常敏锐,但是这是一个大项目,超过一百万行代码,authentication要求非常繁重,并且与其他数百万线路项目相连接。 在某种程度上,作为一种好奇心的练习,我在集团的运输产品中绘制了一系列代码(不包括我们开发的工具),并且实际上,每个开发人员每天的净增加量大约为12行。 不计算更改,testing代码或者开发人员没有每天处理实际项目代码的事实。

别人怎么样? 你面对什么样的要求(我想它是一个因素)?

我认为增加的线路数量很大程度上取决于项目的状态,增加新项目的速度将远远高于起步项目的速度。

两者之间的工作是不同的 – 在一个大型项目中,您通常花费大部分时间来计算各部分之间的关​​系,而实际上只是一小部分实际更改/添加。 而在一个新的项目中 – 大多数情况下,你会写……直到足够大,速度下降。

在我目前的一个项目中,在某些模块中,我很自豪地为代码库贡献了一个负数。 识别哪些代码区域已经变得不必要的复杂性,并且可以用更清洁和更清晰的devise进行简化,这是一项有用的技能。

当然,有些问题本质上是复杂的,需要复杂的解决scheme,但是在大多数大型项目中,定义不明确或需求不断变化的领域往往会有过于复杂的解决scheme,每条问题的数量会更多。

鉴于要解决的问题,我更喜欢减less线数的解决scheme。 当然,在小项目开始的时候,我每天可以生成十多行代码,但是我倾向于不考虑我写的代码量,只是它做了什么以及它做得如何。 我当然不会瞄准每天击败十条线,或者认为这是一个成就。

我喜欢这个报价:

如果我们要计算代码行数,我们不应该把它们看作是“生产线”,而是把它看作是“花费的”。 – Edsger Dijkstra

有时候您通过删除代码而不是添加来贡献更多

你应该停止使用这个指标,大部分是没有意义的。 内聚,耦合和复杂性是比代码行更重要的指标。

别人怎么样?

我是我们公司唯一的全职开发人员,在过去7年中已经编写了500,000行OCaml和F#代码,相当于每天约有200行代码。 然而,绝大多数代码是由几百个单独的项目组成的教程示例,每个项目都有几百行。 另外,OCaml和F#之间还有很多重复。 我们不维护大于50kLOC的内部代码库。

除了开发和维护我们自己的软件之外,过去7年来我还为许多业内客户提供咨询服务。 对于第一个客户 ,我在3个月内写了2000行OCaml,每天20行代码。 对于下一个客户 ,我们四个人编写了一个编译器,在每个开发人员每天有2000行代码的情况下 ,生成了数百万行C / C ++ / Python / Java / OCaml代码以及6个月的文档。 对于另一个客户,我在6个月内用6kLOC的F#代替了50kLOC的C ++,这是每天-352行代码。 对于另外一个客户端 ,我正在重写F#中的OCaml的15kLOC,它的大小是相同的,所以每天有0行代码。

对于我们现在的客户 ,我将在1年内用160kLOC的F#代替1,600,000行C ++和Mathematica代码(通过编写一个定制的编译器),这将是每天-6,000行代码。 这将是我迄今为止最成功的项目,每年将为我们的客户节省数百万美元的持续成本。 我认为每个人都应该每天写6000行代码。

在没有真正检查我的“神话人月”(每个人都阅读这本应该有一个副本容易获得)的副本,有一个布鲁克斯书面看线条生产力的一个章节。 对他来说,有趣的一点不是每天写出的实际行数,而是汇编程序和PL / I中的大致相同(我认为这是使用的更高级的语言)。

布鲁克斯并不是要抛出一些任意的生产力数字,但他正在从实际项目的数据来工作,而我记得他们平均每天可能是12行。

他指出,生产力可能会有所不同。 他说,编译器是应用程序的三倍,操作系统是编译器的三倍。 (他似乎喜欢用三个乘数来分类。)

我不知道他是否赞赏程序员生产力之间的个体差异(尽pipe他在一个数量级的论点中假设了七个因素的差异),但是正如我们所知,卓越的生产力不仅仅是写更多的东西代码,而且还要编写正确的代码来完成这项工作。

还有环境问题。 Brooks推测了一下会让开发者变得更快或者更慢的原因。 像很多人一样,他质疑目前的stream行时尚(使用分时系统进行交互式debugging)是否比旧式的方式(使用整个机器进行两小时的小心预先计划)更好。

因此,我不理会他提出的任何实际生产力数字都是毫无用处的。 本书的持续价值在于人们坚持不学习的原则和更普遍的教训。 (嘿,如果每个人都学会了,那么这本书就只有历史的意义了,就像弗洛伊德的所有论点一样,这就像是一种潜意识的东西。)

每天获得几百行代码是很容易的。 但是,尽量每天获得几百条高质量的代码,这并不容易。 最重要的是,在debugging的同时,每天几乎没有新的线路,平均速度会很快下降。 我花了几个星期来debugging困难的问题,答案是1或2行代码。

认识到谈论物理代码行是非常没有意义的。 物理代码行(LoC)的数量依赖于编码风格,它可以从一个开发人员到另一个开发人员的数量级变化。

在.NET世界中有一个方便的方法来计算LoC。 序列点 。 顺序点是debugging的单位,当放置断点时,代码部分以深红色突出显示。 使用序列点我们可以谈论逻辑LoC ,这个度量可以在不同的.NET语言中进行比较。 大多数.NET工具都支持逻辑LoC代码度量,包括VisualStudio代码度量,NDepend或NCover。

例如,这里是一个8 LoC方法(括号内的开始和结束点不被考虑):

替代文字

LoC的产量必须长期计算。 有些日子你会吐出200多个LoC,有些日子你会花8个小时来修复一个bug,甚至不会增加一个LoC。 有些日子,你会清理死代码,并将删除LoC,有时你会花费你所有的时间重构现有的代码,而不是添加任何新的LoC的总数。

就我个人而言,只有在以下情况下,我才能以自己的生产力得分计算一个LoC:

  1. 它由unit testing覆盖
  2. 它与某种代码合同有关(如果可能的话,并不是所有的LoC当然都可以通过合同来检查)。

在这种情况下,过去5年我为.NET开发人员编写NDepend工具的个人分数平均为每天80个物理LoC,而不牺牲代码质量 。 节奏是持续的,我不会很快看到它的减less。 总而言之,NDepend是一个C#代码库,目前重约115K物理LoC

对于那些不喜欢计算LoC的人(我在这里看到很多评论),我certificate一旦经过充分校准,计算LoC是一个很好的估算工具 。 经过编码和测量,在我特定的开发环境中实现了许多特性之后,我达到了能够精确估计LoC中任何TODO特性的大小以及将其投入生产的时间。

没有银弹这样的东西。

像这样的一个指标本身是无用的。

例如,我有我自己的类库。 目前,以下统计数据是正确的:

总的线路:252.682
代码行:127.323
评论:99.538
空行:25.821

假设我根本不写任何评论,也就是127.323行代码。 根据你的比例,这个代码库将花费大约10610天的时间来编写。 那是29年。

我当然没有花29年的时间编写代码,因为这些都是C#,C#也没有这么长时间。

现在,你可以争辩说,代码并不是那么好,因为显然我一定是超过了你每天的12行的标准,是的,我会同意的,但是如果我把时间线缩短到当1.0发布的时候(我还没有真正开始,直到2.0发布),这是2002-02-13,大约2600天,平均每天有48行代码。

所有这些代码行都很好? 没有。 但是一天只能下载12行代码?

没有。

一切都依赖。

你可以让一个顶尖的程序员每天以数千行的顺序生成代码,而一个中等规模的程序员每天以数百行的顺序生成代码,质量也是一样的。

是的,会有错误。

你想要的总数是余额。 代码量发生了变化,发现错误的数量与代码的复杂性相比,修复这些错误的困难程度。

史蒂夫·麦康奈尔在他的书“软件估计”(p62表5.2)中给出了一个有趣的统计数字。他区分项目types(航空电子,商业,电信等)和项目规模10 kLOC,100 kLOC,250 kLOC。 在LOC / StaffMonth中给出了每个组合的数字。 EG航空电子:200,50,40内联网系统(内部):4000,800,600embedded式系统:300,70,60

这意味着:例如。 对于航空电子250-kLOC项目,有40(LOC /月)/ 22(天/月)== <2LOC /天!

我认为这是来自瀑布开发日,项目的实际开发阶段可能只有项目总时间的20-30%。 把代码的总行数除以整个项目的时间,你将会得到10行/日左右。 按照编码时间划分,你就可以更接近人们引用的内容。

我们的代码库约为2.2MLoC,花费了大约150个人工时间。 这使得在项目的整个生命周期内每个开发者每天大概有75行c ++或c#。

我认为项目规模和涉及的开发人员数量是很大的因素。 在我的职业生涯中,我远远超过了这一点,但是我一直都在独自工作,所以和其他程序员一起工作是没有任何损失的。

良好的计划,良好的devise和优秀的程序员。 你把所有的东西都写出来,你不会花30分钟写一行。 是的,所有的项目都要求你停下来计划,思考,讨论,testing和debugging,但是每天有两行,每个公司都需要一支军队去搞俄罗斯方块。

底线,如果你每小时工作2条线,你最好是给我很多的棺材和质量,所以你没有被解雇。

有人怀疑,当所有东西都是用C语言编写的系统应用程序时,这个经常使用的经理糖果就是被创造出来的,因为如果没有别的东西的话,神奇的数字会根据应用程序的语言,规模和性质而有所不同。 然后你必须打折评论和属性。 最终谁在乎写的代码行数? 当你达到10K线时你应该完成吗? 100K? 那么任意。

没用的。