软件即知识
我不常深入探讨《代码简洁性》背后的哲学基础,但我越来越意识到,这些著作背后有一些哲学原则值得分享。而且,其中一些哲学思想直到我长期投入工作、在许多情况下应用它、并与许多人讨论之后,才完全成型。
这一个理论——关于如何在脑海中思考和操作软件的理论——已经在我脑海中酝酿了相当长一段时间。现在是时候至少在博客文章中把其中一部分写出来了。那么,开始吧:
从根本上说,软件是由知识构成的实体。它遵循知识的所有规则和定律。在几乎所有给定情况下,它的行为都与知识的行为完全一致,只不过它是以具体形式存在的。
例如,当软件复杂时,它往往会被误用。当软件出错(即有错误)时,它往往会造成损害或问题。当人们不理解某些代码时,他们往往会错误地修改它。人们可以说这些是关于知识的,也可以说这些是关于软件的。坏数据导致人们行为不当;坏代码导致计算机行为不当。我并不是说计算机和人可以相提并论——我是说软件和知识可以相提并论。
人们希望以合理和逻辑的形式拥有知识。同样,人们也应该希望以合理和逻辑的形式拥有软件——尤其是代码。因为代码就是知识,所以在看到它时,它应该几乎立即转化为人们脑海中的知识。如果没有,那么它的某些部分就太复杂了——也许是底层的编程语言或系统,但更可能是代码设计者创建的代码结构。
当我们渴望知识时,有多种获取方式。可以阅读、思考、进行观察、做实验、讨论等等。总的来说,我们可以将这些方法分为自己获取数据(通过观察、实验、思考等)或从他人那里获取数据(阅读、交谈等)。
在某些情况下,我们必须自己获取数据,特别是当这些数据以某种独特的方式适用于我们,而我们无法依赖他人正确解决时。举一个极端的例子,当我的身体还小得多的时候,用我自己的腿走路可能需要进行大量的个人实验。我可能得到了一些帮助,但这些知识必须由我自己发展。
然而,在更多的情况下,我们必须依赖二手数据。如果一个人想要在生活中做好工作,有很多东西需要知道——一个人根本不可能靠自己获取这么多信息。这就是他人帮助的用武之地:他们知道的数据、他们学到的教训以及可以教给我们的东西。
这些相同的原则似乎也描述了何时应该自己编写代码或使用现有代码。你几乎不可能自己编写所有代码直到硬件层面,并想出我们今天拥有的一些最有用的软件。当然,有些事情只有我们自己是唯一有资格编写的——通常是我们正在开发产品的特定逻辑。但还有更多的事情我们必须依赖现有代码,就像我们必须依赖现有的二手知识作为个体生存一样。
我们也可以在一定程度上使用这个原则来决定如何在开发人员之间分配工作。是让某人根据自己的第一手知识创建一段代码更快,还是让一组人员查看现有系统(二手知识)并开始贡献自己的部分(随着时间的推移,这些部分基本上会成为他们的第一手知识)更快?答案显然取决于具体情况,尽管这里的基本想法可能并不太新颖(有些程序员已经比其他人更了解系统,因此他们更快),但我们得出这个想法的方式才是重要的。我们首先理论化软件就是知识,然后突然我们可以沿着一条清晰的逻辑线看到一些已知普遍正确的现有原则。这非常方便,并表明我们很可能可以从这个原则推导出其他更有用的信息。
当然,这本身并不是一门科学或一个科学体系。这只是一个想法,一个似乎能很好地推导开发原则的想法。事实上,我想说这是我所能够发展的关于软件的最广泛的哲学理论之一。它似乎涵盖了所有方面并解释了所有行为。我其实可以坐在这里一整天对这个想法进行理论推演,但我不是来闲聊的,只是做一个简短的总结,然后看看你们对此有什么看法。
-Max
评论
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
是的,当然,在真实编码之前,哲学知识很重要。
回复
Software as Knowledge – coding | factory 说:
2018年12月22日下午6:48
[…] 电子邮件 […]
回复
bradapp 说:
2020年7月11日上午11:49
仅供参考——这个引用/结论的来源(据我回忆)来自 Phil Armour,在90年代末,并于2000年8月在CACM的“软件业务”专栏开篇发表,后来在他的书《软件过程定律》中。“软件不是产品。它是……存储可执行知识的媒介。……因此,软件开发是一种知识创造活动!……或者反过来说,是一种无知减少活动[学习]”
网址: http://www.corvusintl.com/CaseforaNewBusinessModel.pdf
书籍: http://www.amazon.com/Laws-of-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)
回复