霍夫施塔特定律(Hofstadter’s Law):即使你考虑到了霍夫施塔特定律,项目的实际完成时间总是比预期的要长

霍夫施塔特定律(Hofstadter’s Law)由 Douglas Hofstadter 提出,并以他的名字命名。这个定律指出:即使你考虑到了霍夫施塔特定律,项目的实际完成时间总是比预期的要长。

这个“定律”是关于准确预估完成复杂任务所需时间的难度。这个定律具有递归性,反映了预估复杂项目的难度,尽管你可能已经做出了最大的努力,而且也知道任务的复杂性。

这就是为什么在制定项目工期时,必须要留有一个缓冲区。

另请参见侯世达定律 (Hofstadter’s Law)

参考

https://cloud.tencent.com/developer/article/1421055?from=article.detail.1525574

侯世达定律 (Hofstadter’s Law):即使考虑到侯世达定律,开发周期也总是比你预期的要长

侯世达定律 (Hofstadter’s Law):即使考虑到侯世达定律,开发周期也总是比你预期的要长。——侯世达 (Douglas Hofstadter)

在估计需要多长时间开发时,你可能会听到此定律。软件开发似乎有这样一条定理,即我们往往不能准确地估计需要多长时间才能完成。

语出《哥德尔、艾舍尔、巴赫:集异璧之大成》

侯世达定律(英语:Hofstadter’s law)是一句自指的格言,由侯世达在《哥德尔、埃舍尔、巴赫》一书中提出:做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。

侯世达定律指做复杂任务需要花费的时间总是很难预计的。程序员经常会引用这一定律,特别是在进行有关提高效率的讨论时(如《人月神话》和极限编程)。其自指的特征反映了即便意识到任务的复杂性,预计花费的时间仍是困难的。

这一定律最初是描述早年国际象棋人机对弈的现象。侯世达写道:“计算机下国际象棋的早期阶段,有人曾估计再要十年的时间计算机(或程序)就能得到世界冠军。可是,十年过去之后,计算机要成为世界冠军似乎还要再过十年……”他将这一现象看作是递归化的侯世达定律的一个例证。

参考

https://github.com/nusr/hacker-laws-zh

https://en.wikipedia.org/wiki/Hofstadter%27s_law

https://zh.wikipedia.org/wiki/%E4%BE%AF%E4%B8%96%E8%BE%BE%E5%AE%9A%E5%BE%8B

好代码本身就是最好的文档

“好代码本身就是最好的文档。当你需要添加一个注释时,你应该考虑如何修改代码才能不需要注释。” 这是 Steve McConnell 说的。同样,大部分人都不知道,或者忘掉后面半句:Good code is its own best documentation. As you’re about to add a comment, ask yourself, “How can I improve the code so that this comment isn’t needed?” Improve the code and then document it to make it even clearer. 如果你是程序员,回想一下多少次跟别人讨论代码是不是必须要注释时,这句话被引用到;有很多次在写代码时喜爱这句话,又多少次改别人的代码时痛恨这句话。

还是从我个人的观察来看,对很多程序员来说,其编码能力还不足以达到“代码本身就是最好的文档”的地步,包括我自己。敝司招聘过很多顶尖的工程师,有传说中的各种杰出前辈,可能在各种学校、公司内部事迹广为流传。但若是你哪天继承了他的代码遗产,就会发现很多传说中的明星跌落凡尘。成百上千行没有注释,使用一个公共库函数时要么接口就根本没注释只能基本靠猜,要么即使注释也语焉不详让你踩到未注明的大坑。每到这个时候你心里总会暗暗骂娘,后面别人再谈到他的光辉事迹时,你跟随讪笑时心中暗自腹诽:“牛逼个锤子!”

但我想很多人争论的焦点是:“注释是不是不可省略的、要强制执行的?”即使个别人能力真能达到“代码本身就是最好的文档”的地步(我还没见过),我也不建议在团队中传播“注释可以省略”这一想法。因为如果你说“注释可以省略”,可能你会发现大家都理解和实践成“终于可以不写注释了”。如果一个刚刚大学毕业、脑袋里从来没有过 documentation 概念、从来没写过注释的新人进入公司,就“终于可以不写注释了”,那么我想他的代码会很难达到“代码本身就是最好的文档”这个级别。因为他根本没有机会懂得什么叫做 documentation。

在公司里,代码注释深远地影响着团队合作的每个人,以及软件生存期里所有的维护者,甚至会影响自己的职业声誉。所以无论别人怎么想,我对注释这个问题的答案始终是:“注释是不可省略的,越完善越好的,甚至强制执行矫枉过正也没关系的!”

对于个人而言,“好代码就是好文档”也是一句空话,不信的话,你半年后再来看看自己半年前写的没有注释和文档的代码,你肯定会发出感慨:“这写的是什么玩意?!”

参考

https://yangwenbo.com/articles/words-that-make-code-bad.html

汉隆的剃刀 (Hanlon’s Razor):能解释为愚蠢的,就不要解释为恶意的

汉隆的剃刀 (Hanlon’s Razor):能解释为愚蠢的,就不要解释为恶意的。——罗伯特·汉隆 (Robert J. Hanlon)

这一原则表明,一个行为所产生的消极结果并不是恶意。相反,消极结果更有可能归咎于这些没有得到充分理解的行动或影响。

1990年,黑客字典收录了汉隆剃刀,将其注释为“墨菲定律版的奥卡姆剃刀”,汉隆的剃刀自此闻名。

歌德在《少年维特的烦恼》中著有意思相似的一句话:误解和忽视在世上所造成的混乱,比恶意和欺骗要多上许多。无论如何,后两者出现的频率都低得多。

英国前首席新闻秘书伯纳德·英厄姆爵士同样说过一段类似的话:许多记者沉醉在政府阴谋论中。我可以担保,如果他们支持的是“政府搞砸论”,报导就会更准确一些。

参考

https://github.com/nusr/hacker-laws-zh

https://en.wikipedia.org/wiki/Hanlon%27s_razor

https://zh.wikipedia.org/wiki/%E6%B1%89%E9%9A%86%E5%89%83%E5%88%80

哈特伯定律 (Hutber’s Law):对一个系统的改进可能会导致其他部分的恶化,所以系统能正常运行就不要再去动它

改善即恶化。——帕特里克·哈特伯 (Patrick Hutber)

这个定律说明了对一个系统的改进会导致其他部分的恶化;或者它会将其他的恶化隐藏起来,并导致系统整体状态的退化。 例如,某个端点的响应延迟减少,就可能导致请求流中的吞吐量和容量问题进一步增加,并影响到另一个完全不同的子系统。

因此在对系统做出改进之前,应该先做好各种测试,根据测出来的各项指标数据,再看看是否真的需要做出改变。

参考

https://github.com/nusr/hacker-laws-zh

https://en.wikipedia.org/wiki/Hutber%27s_law

古德哈特定律 (Goodhart’s Law):过于严格的度量标准会把人们逼成做题家(要激发创新,就必须有自由发挥的空间)

古德哈特定律 (Goodhart’s Law):过于严格的度量标准会把人们逼成做题家。

古德哈特定律(Goodhart’s law)是一个出自经济学家查尔斯·古德哈特的说法,玛丽莲·斯特拉腾(Marilyn Strathern)将之表述为:“当一个措施本身成为目标时,它就不再是一个好的措施(When a measure becomes a target, it ceases to be a good measure)。”

古德哈特最早是在一篇1975年的文章中提出这看法,这后来常被用以批判撒切尔夫人政府的货币主义政策。他的原始表述如下:

当压力施于其上以进行控制时,任何观测到的统计恒性都倾向消散。 然而,这其中的一些观念,在古德哈特在1975年提出该段叙述前一段时间就已存在。就在古德哈特出版他的文章后不久,一些类似的观念也陆陆续续被提出,其中包括了1976年提出的坎贝尔定律和卢卡斯批判(Lucas critique)等等。

然而,这其中的一些观念,在古德哈特在1975年提出该段叙述前一段时间就已存在。就在古德哈特出版他的文章后不久,一些类似的观念也陆陆续续被提出,其中包括了1976年提出的坎贝尔定律和卢卡斯批判(Lucas critique)等等。

在经济学上,这条法则为理性预期这项经济学理论所暗示。这理论所说的就是一个注意到奖惩系统的实体,在系统中会最适化其行为,以得到想要的结果,像例如说在一家以已知的量化标准来衡量表现的公司当中,员工会试着在这部分做出最适化行为,不论这行为是否会导致利润最大化也一样。尽管源自对市场的回应的状况,这项法则对组织中选择高阶目标的作为,有着深刻的启示。乔恩·丹尼森(Jón Danı́elsson)以“当用于决策之上时,任何的统计关系都会分崩离析”这形式引述这定律,并提出了一个用于金融风险模型上的引理:“当用于管制之上时,任何的风险模型都会分崩离析”。Mario Biagioli将这观念用于讲述使用引文影响力作为基准来衡量科学出版物的重要性的后果之上:

一切科学评估的量度,都注定会被滥用,古德哈特定律(以可能是最初提出这此说的英国经济学家为名)说若一个经济学的特性被用作经济指标,那这项指标最终一定会失去其功能,因为人们会开始玩弄这项指标

现实中的例子:

  • Assert-free 测试可以达到代码覆盖率的预期,但度量的目的应该是创造经过良好测试的软件。
  • 由 commits 的行数来评价开发人员的表现,从而导致了不合理的代码库扩增。

参见

参考

https://github.com/nusr/hacker-laws-zh

https://en.wikipedia.org/wiki/Goodhart’s_law

https://zh.wikipedia.org/wiki/%E5%8F%A4%E5%BE%B7%E5%93%88%E7%89%B9%E5%AE%9A%E5%BE%8B

复杂度守恒定律:复杂度只会转移不会消失

复杂度只会转移不会消失。

现实世界中的业务的复杂度是守恒的,不是说你软件代码的设计模式用得好就能解决业务的复杂度(在软件层面,解决业务问题的是算法和数据结构,而不是软件设计,软件设计得好只是能方便代码复用、提高运维效率罢了)。

真正能减少软件层面的业务复杂度的是,高效的管理及精简业务的流程。

软件不能解决管理问题,只能在流程上提高效率。因为软件只是工具,需要人去使用、去执行。企图开发一个软件来解决管理问题的人,是本末倒置,是懒,正确的思路应该是:管理制度及其流程已经设计好了,开发一个软件来提高执行流程的效率。

另请参见复杂性守恒定律 (The Law of Conservation of Complexity or Tesler’s Law)

布鲁克定律(Brook’s Law):为已经延期的软件项目增加人手只会让项目延期得更厉害

如果一个项目出现了延期,只是简单地增加人手很可能会带来灾难性的后果。对编程效率、软件开发方法、技术架构等因素进行评审总是会带来更好的结果。如果没有,那说明霍夫施塔特定律也在起作用。

霍夫施塔特定律(Hofstadter’s Law)由 Douglas Hofstadter 提出,并以他的名字命名。这个定律指出:即使你考虑到了霍夫施塔特定律,项目的实际完成时间总是比预期的要长。

这个“定律”是关于准确预估完成复杂任务所需时间的难度。这个定律具有递归性,反映了预估复杂项目的难度,尽管你可能已经做出了最大的努力,而且也知道任务的复杂性。

这就是为什么在进行项目预估时必须要有一个缓冲区。

软件开发后期,添加人力只会使项目开发得更慢。

这个定律表明,在许多情况下,试图通过增加人力来加速已延期项目的交付,将会使项目交付得更晚。布鲁克斯也明白,这是一种过度简化。但一般的论据是,新资源的时间增加和通信开销,会在短期内使开发速度减慢。而且,许多任务是密不可分的,换句话说,这样可以使更多的资源之间能轻易分配,这也意味着潜在的速度增长也更低。

谚语:十个女人不能在一个月内生一个孩子。与布鲁克斯法则同出一辙,特别是某些不可分割或者并行的工作。

这也是《人月神话》的中心主题。

参考

https://cloud.tencent.com/developer/article/1421055?from=article.detail.1525574

https://github.com/nusr/hacker-laws-zh

https://en.m.wikipedia.org/wiki/Brooks%27s_law

奥卡姆剃刀 (Occam’s Razor)又叫简约法则:如无必要,勿增实体

奥卡姆剃刀 (Occam’s Razor):如无必要,勿增实体。——奥卡姆的威廉 (William of Ockham)

奥卡姆剃刀指出,在几种可能的解决方案之中,最有可能的解决方案便是概念和假设最少的那个。因为这个解决方案最为简单,只解决了问题,并且没有引入额外的复杂度和可能的负面后果。

参见:

例子:

也就是说,在多个能够解决同一个问题的方法中,最简单有效的那种方法是最好的。

奥卡姆剃刀(英语:Ockham’s Razor、拉丁语:Lex Parsimoniae,意为“简约法则”)是由14世纪方济会修士奥卡姆的威廉(William of Occam,约1287年至1347年,英格兰萨里郡奥卡姆 (Ockham)人氏)提出的逻辑学法则,他在《箴言书注》2卷15题说“切勿浪费多余功夫去做本可以较少功夫完成之事”。换言之,如果关于同一个问题有许多种理论,每一种都能作出同样准确的预言,那么应该挑选其中使用假定最少的。尽管越复杂的方法通常能做出越好的预言,但是在不考虑预言能力(即结果大致相同)的情况下,假设越少越好。

所罗门诺夫的归纳推理理论是奥卡姆剃刀的数学公式化:在所有能够完美描述已有观测的可计算理论中,较短的可计算理论在估计下一次观测结果的概率时具有较大权重。

在自然科学中,奥卡姆剃刀被作为启发法技巧来使用,更多地作为帮助科学家发展理论模型的工具,而不是在已经发表的理论之间充当裁判角色。在科学方法中,奥卡姆剃刀并没有被当做逻辑上不可辩驳的定理或者科学结论。在科学方法中对简单性的偏好,是基于可证伪性的标准。对于某个现象的所有可接受的解释,都存在无数个可能的、更为复杂的变体:因为你可以把任何解释中的错误归结于特例假设,从而避免该错误的发生。所以,较简单的理论比复杂的理论更好,因为它们更加可检验。

客观剃刀理论

通用图灵机的最小指令集所需要的长度,在不同的形式中是大致相同的,而且其柯氏复杂度比大部分实际的理论小。马库斯·胡特在对剃刀的规范化中,利用这一恒常性定义了“自然”图灵机,用来排除那些过于复杂的指令集。将通用程序的描述作为“假设”,将证据的表示作为“程序数据”,可以在策梅洛-弗兰克尔集合论中证明:“模型的普适概率的对数之和加上模型输入的数据的概率的对数之和应为极小”。可以将它解释为让由两个部分组成符号串达到最短,包括模型的符号和数据的符号,这样我们就得到了最小描述长度定律。

将柯氏复杂性和奥卡姆剃刀的概念结合起来的可能结论之一是,一个理想的数据压缩器也会是一个科学解释/公式的产生器。已经有人尝试将已知的定律从简单性和压缩性的法则中重新推导出来。

对于居尔根·施密德胡贝尔来说,奥卡姆剃刀的恰当数学理论已经存在了,就是所罗门诺夫的归纳推断理论及其扩展。

反剃刀

康德为了对抗奥卡姆剃刀产生的影响,创建了他自己的反剃刀:“存在的多样性不应被粗暴地忽视”。

这么看来,奥卡姆剃刀过于实用主义了。

参考

https://github.com/nusr/hacker-laws-zh

https://en.wikipedia.org/wiki/Occam’s_razor

https://zh.wikipedia.org/wiki/%E5%A5%A5%E5%8D%A1%E5%A7%86%E5%89%83%E5%88%80