软件即知识:代码简洁性的哲学思考与技术实践

本文探讨软件开发的本质,提出"软件即知识"的核心哲学理念,分析代码复杂度与知识传递的关系,并讨论如何通过知识管理原则优化软件开发流程和团队协作模式。

软件即知识 » 代码简洁性

代码简洁性

软件即知识

2012年5月10日 作者:Max Kanat-Alexander

我不常深入探讨代码简洁性的哲学基础,但我越来越意识到,这些文字背后存在一些值得分享的哲学原则。其中一些哲学理念直到我长期投入工作、在许多场景中应用并与多人讨论后才完全成型。这个理论——关于如何在心智中将软件视为知识并进行处理的理论——已经在我脑海中酝酿了相当长的时间。现在是时候至少在博客文章中将其部分内容付诸"纸面"了。那么,请看:

从根本上说,软件是由知识构成的实体对象。它遵循知识的所有规则和定律。在任何给定情境下,它的行为方式与知识完全相同,只不过它以具体形式存在。例如,当软件复杂时,往往会被误用;当软件出错(即存在缺陷)时,往往会造成损害或问题;当人们不理解某些代码时,往往会错误地修改它。这些情况既适用于知识,也适用于软件。错误的数据会导致人们行为失常;错误的代码会导致计算机行为失常。我并不是说计算机和人可以相提并论——我是说软件和知识可以相提并论。

人们希望以合理且逻辑的形式获取知识。同样,人们也应该希望以合理且逻辑的形式获得软件——尤其是代码。因为代码就是知识,在查看代码时,它应该几乎立即转化为人们心智中的知识。如果不能,那么其中某些部分就过于复杂——可能是底层编程语言或系统,但更可能是代码设计者创建的代码结构。

当我们渴望知识时,有多种获取方式。可以通过阅读、思考、观察、实验、讨论等方式获取。总的来说,我们可以将这些方法分为自行获取数据(通过观察、实验、思考等)或从他人那里获取数据(阅读、交谈等)。

在某些情况下,我们必须自行获取数据,特别是当这些数据以某种独特方式适用于我们,无法依赖他人正确解决时。举个极端例子,当我身体还很小时,学会用双腿走路可能需要进行大量的个人实验。我可能得到了一些帮助,但这些知识必须由我自己发展。

然而,在更多情况下,我们必须依赖二手数据。如果一个人想要在生活中表现出色,需要了解很多东西——一个人根本无法自行获取如此多的信息。这时就需要他人的帮助:他们知道的数据、他们学到的教训以及可以教给我们的东西。

这些相同的原则似乎也描述了何时应该自己编写代码或使用现有代码。你几乎不可能自己编写所有代码直到硬件层面,并创造出我们今天拥有的一些最有用的软件。当然,有些东西只有我们才有独特的资格编写——通常是我们正在开发的产品的特定逻辑。但还有更多的东西我们必须依赖现有代码,就像我们必须依赖现有的二手知识作为个体生存一样。

我们或许还可以用这个原则来决定如何在开发人员之间分配工作。是让某人根据自己的第一手知识编写一段代码更快,还是让一群人查看现有系统(二手知识)并开始贡献自己的部分(随着时间的推移,这些部分基本上会成为他们的第一手知识)更快?答案显然取决于具体情况,尽管这里的基本想法可能并不太新颖(有些程序员已经比其他人更了解系统,因此他们更快),但我们得出这个想法的方式才是重要的。我们首先理论化软件就是知识,然后突然可以看到一条清晰的逻辑线延伸到某个已知普遍正确的现有原则。这非常方便,表明我们很可能从这个原则推导出其他更有用的信息。

当然,这本身并不是一门科学或科学体系。它只是一个想法,一个似乎能很好地推导开发原则的想法。事实上,我会说这是我能开发的关于软件的最广泛的哲学理论之一。它似乎涵盖了所有方面并解释了所有行为。我其实可以坐在这里整天理论化这个想法,但我不是来闲聊的,只是做一个简短的总结,然后看看你们有什么看法。

-Max

分享 点击在Facebook上分享(在新窗口中打开) Facebook 点击在LinkedIn上分享(在新窗口中打开) LinkedIn 点击在Hacker News上分享(在新窗口中打开) Hacker News 点击在Reddit上分享(在新窗口中打开) Reddit 点击在Threads上分享(在新窗口中打开) Threads 点击在X上分享(在新窗口中打开) X

7条评论 发表回复

Mars 说:2012年5月11日上午12:48 嗨,Max 好文章! 我想分享的是,软件开发人员/设计师应该花更多时间学习哲学知识,这对我们设计和制作具有高质量代码的优秀软件非常有用。软件即知识,它需要来自具有超级心智的超人。 谢谢 Mars 回复

Mike W. 说:2017年7月25日下午6:35 有趣的观点。我略有不同:我认为所有软件都由决策组成,别无其他。🙂(决策是更特定类型的知识。) 当然,你可以提出所有知识都直接来自决策,此时这将变得无关紧要。(事实上可能是这样,因为我们是在哲学层面上讨论。)但我认为将软件称为"决策"更好,因为它更强调这些决策的可变性。相比之下,大多数人将"知识"视为来自自身外部且无法改变的东西。(世界上最高的山是____,高____英尺。)另一方面,决策可能更难或更容易改变。因此它给出了更清晰的内涵。 基于芯片设计师、固件设计师、操作系统设计师、编译器作者、语言设计师所做的决策……你将你自己的决策放入计算机,结果就是软件。(如果你不理解例如语言设计师所做的决策,结果就是语法错误。) “黑客"然后可以定义为"做出新决策而不是检查和修复旧决策。“我认为这就是"让它永不回来"的要点。(http://www.codesimplicity.com/post/make-it-never-come-back/) 就像你一样,我可以坐在这里整天从这个原则推断,但我只是想传达对我来说一直是理解所有计算机事物的基本工作原则。🙂 回复

Max Kanat-Alexander 说:2017年7月26日晚上9:29 当然。我知道我们之前也当面讨论过这个问题。 我认为将其视为知识更简单,因为大多数人不会真正理解如何处理"决策”,但人们有很多处理知识的经验。如果你指出一个程序就像一百个人同时编写的大书(这是我找到的唯一好的类比,向非程序员解释有组织的编程),那么人们就理解这个问题。它不仅有助于解决问题——还有助于向他人传达解决方案。 你必须考虑的是,大多数编程涉及使用现有系统,而不是创建新系统。“决策"是你做的事情(从大多数人的角度来看),但对大多数程序员来说,软件是他们拥有的东西。所以将其视为"知识"更简单,这是你拥有的东西。 关于这一点我还有很多可以说的,但可能下次见面时再谈更容易。 -Max 回复

Mike W. 说:2017年7月26日晚上9:47 听起来很棒!你的观点对于广泛理解很有意义。🙂 回复

Sandeep yadav 说:2018年5月28日凌晨3:04 是的当然,在实际编码之前哲学知识很重要。 回复

软件即知识 – coding | factory 说:2018年12月22日下午6:48 […] 电子邮件 […] 回复

bradapp 说:2020年7月11日上午11:49 仅供参考——这个引用/结论的来源(据我回忆)来自Phil Armour在90年代末,并于2000年8月在CACM的"软件业务"专栏开篇发表,后来在他的书《软件过程法则》中"软件不是产品。它是……存储可执行知识的媒介。……因此软件开发是一种知识创造活动!……或者相反,一种无知减少活动[学习]” URL: http://www.corvusintl.com/CaseforaNewBusinessModel.pdf 书: http://www.amazon.com/Laws-Software-Process-Production-Management/dp/0849314895/ 另请参阅(来自Phil Armour):* “5阶无知” — http://www.corvusintl.com/CACM002-5OI.htm * “项目的精神生活” — cacm.acm.org/magazines/2002/1/7171-the-spiritual-life-of-projects/fulltext | http://www.corvusintl.com/CACM007-SpiritualLife2.htm (www.researchgate.net/publication/220422468_The_Spiritual_Life_of_Projects) 回复 发表回复取消回复

联系 关于 书:理解软件 书:代码简洁性 输入您的电子邮件…… 订阅 © 2025 版权所有。由The Fox提供技术支持。 管理同意 为了提供最佳体验,我们使用cookie等技术来存储和/或访问设备信息。同意这些技术将允许我们处理诸如浏览行为或本网站上的唯一ID等数据。不同意或撤回同意,可能会对某些特性和功能产生不利影响。 功能 功能 始终活跃 技术存储或访问严格用于允许使用订阅者或用

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计