意识到谈论物理代码行毫无意义会更好。物理代码行 (LoC) 的数量非常依赖于编码风格,以至于它可以从一个开发人员到另一个开发人员变化一个数量级。
在 .NET 世界中,有一种方便的方法来计算 LoC。序列点。序列点是一个调试单元,它是放置断点时以深红色突出显示的代码部分。使用序列点,我们可以谈论逻辑 LoC,并且可以在各种 .NET 语言之间比较该指标。大多数 .NET 工具都支持逻辑 LoC 代码度量,包括 VisualStudio 代码度量、NDepend 或 NCover。
例如,这是一个 8 LoC 方法(不考虑开始和结束括号序列点):

必须长期计算 LoC 的产生。有些日子你会吐出超过 200 个 LoC,有些日子你会花费 8 个小时来修复一个错误,甚至不添加一个 LoC。有些日子你会清理死代码并删除 LoC,有些日子你会花所有时间重构现有代码,而不是在总数中添加任何新的 LoC。
就个人而言,我仅在以下情况下才将单个 LoC 计入我自己的生产力得分:
- 它被单元测试覆盖
- 它与某种代码合同相关联(如果可能,当然不是所有的 LoC 都可以通过合同进行检查)。
在这种情况下,我在过去 5 年中为 .NET 开发人员编写 NDepend 工具的个人得分是平均每天 80 个物理 LoC,而不会以任何方式牺牲代码质量。节奏是持续的,我认为它不会很快减少。总而言之,NDepend 是一个 C# 代码库,目前重量约为 115K 物理 LoC
对于那些讨厌计算 LoC 的人(我在这里的评论中看到了很多),我证明一旦经过充分校准,计算 LoC 是一个很好的估计工具。在对我的特定开发环境中实现的数十个功能进行编码和测量之后,我可以精确估计 LoC 中任何 TODO 功能的大小,以及我将其交付到生产环境所需的时间。