Eugene Yan 撰写的文章《Simplicity is An Advantage but Sadly Complexity Sells Better》,这篇文章探讨了为什么简单性在某些情况下可能不被充分重视,尽管它本身是一个巨大的优势,以及为什么复杂性在某些情况下会卖得更好。文章还讨论了简单性的优势,以及如何正确地思考复杂性。
我们有时会听说论文提交因方法过于简单而被拒绝,或者晋升因工作工件缺乏复杂性而被拒绝。我认为这可以部分地用 Dijkstra 的话来解释:
“简单是一种伟大的美德,但它需要努力工作才能实现,并需要接受教育才能欣赏它。更糟糕的是:复杂性卖得更好。” —埃兹格·迪杰斯特拉
复杂性为何更受欢迎:
复杂性传达了努力的信号:由于所付出的努力,它们通常被认为具有更高的质量。
复杂性标志着精通:如果外行人很难理解复杂的想法或系统,那么它的创造者一定是专家。
复杂性传达了创新:具有从头开始构建的组件的系统被认为比重复使用现有部件的系统更具创造性。仅仅构建或重用现有工作的工作并不是那么创新。
复杂性意味着更多的功能:相对于简单系统,复杂系统具有更多的乐高积木,因此它们被认为更具适应性并且能够更好地响应变化。
总而言之,上述情况导致了复杂性偏见,我们对复杂的想法和系统给予了不适当的信任,并偏爱复杂的想法和系统,而不是简单的想法和系统。
为什么简单是一个优势?
简单的想法和功能更容易理解和使用:相比之下,复杂的系统更难以解释和管理,使用户很难弄清楚要做什么以及如何做。由于旋钮太多,错误更频繁。因为步骤太多,所以效率低下。
简单的系统更容易构建和扩展:更简单的系统具有更少的复杂性、代码和系统内交互,因此它们更容易理解和测试。更轻松地找到能够实施和维护该技术的合格人员。
简单的系统具有较低的运营成本:大部分工作是在系统投入生产之后进行的,很可能是由构建该系统的原始团队以外的其他人完成的。通过保持系统简单,我们降低了维护成本并延长了使用寿命。
- 简单的系统具有更少的可能损坏的移动部件,使其更可靠且更容易修复。由于系统内的交互较少,因此升级或更换各个组件也更加容易。
- 相比之下,复杂的系统更加脆弱,维护成本也更高,因为有太多组件需要由有限的团队来处理。拥有更多相互依赖的部分也会使故障排除变得更加困难。
“任何事情越简单,就越不容易混乱,而且混乱后也更容易修复。” ——托马斯·潘恩, |
《常识》,1776 年 |
具体到机器学习,简单的技术不一定比更复杂的技术表现更差。
示例的非详尽列表包括:
- 基于树的模型 > 45 个中型表格数据集上的深度神经网络
- 贪心算法 >组合图问题上的图神经网络
- 多任务学习问题上的简单平均≥复杂优化器
- 32 篇论文中简单方法 > 复杂方法的预测准确性
- 点积 >项目推荐和检索中的神经协同过滤
复杂性受到欢迎会造成什么影响?
它激励人们让事情变得不必要的复杂化:最简单的解决方案不再是最明显的解决方案。复杂性会变得更加复杂,最终导致工作变得不可能。
它鼓励“非此处发明”的心态,即人们倾向于从头开始构建,而不是重用现有的组件。
banq注:
其实上面这句上下文背景有问题,把软件等同于机械组件或建筑,软件组件与上下文使用方式有很大耦合,虽然我们可以切割成模块 包或微服务,但是最终跨包 跨模块和跨微服务调用的场景比比皆是,随着业务发展,上下文实际情况会发生严重变化,而软件代码的最大优势是可以删除,删除成本很低,不像建筑材料,一旦生产出来就已经有成本,扔掉不用就是浪费。
在软件领域,重用组件好像与重用建筑砖块一样迷人,其实软件组件带有创建者的严重偏见,潜藏的预设前提是最大危险,如同毒药,喝了之后才知道有毒,在根本方向上已经无法改变,南辕北辙了。为何一个本来成本如此低廉,再用AI辅助编程情况下,成本几乎为零的代码不能轻易抛弃?这只能是自恋者过于爱惜自己羽毛所致。
我们应该如何考虑复杂性?
- 目标应该是用尽可能简单的解决方案解决复杂的问题。
- 考虑多个专注的解决方案,而不是一个复杂的、通用的解决方案。
"一切都应尽可能简单,但不能更简单"--爱因斯坦
与其制定一个复杂的、包罗万象的解决方案,不如考虑多个重点突出的解决方案。一刀切 "式的解决方案通常没有预期的灵活和可重用性。而且,由于它服务于多个用例和利益相关者,往往会 "紧密耦合",在规划和迁移过程中需要更多协调。相比之下,单一用途的系统更容易操作,而且不可避免地会被淘汰。
果汁值得榨吗?
克服复杂性偏见的方法之一是#奥卡姆剃刀。它指出,最简单的解决方案或解释通常就是正确的。因此,我们不要急于否定简单的想法,也不要为了证明自己的价值而增加不必要的复杂性。
或者,扪心自问:考虑到复杂性的代价,果汁是否值得挤压?
banq注:产品时思维或语言对话的中间产物,复杂与否是#辩证法 思维的一个体现,想象有两个专家辩论:一个说复杂了;一个说不复杂。两个人永远辩论下去。
其实抛开辩论内容,我们抛开到底复杂与否,而是看看他们辩论的形式,是一种对话思考过程,是一种计算过程,也许未来某天在这个解决方案上得到一个大道至简的解决方案,但是我们因为最后一个馒头吃饱了,就说前面十个馒头白吃吗?
因此,在实践中,本着对话原则,如果你觉得对方把问题想得简单了,因为才遭遇今天需要重构的困境,人非圣贤,没有人能提前预知未来的情况,更不可能脱离他当时处于的上下文情况。如果你觉得原方案太简单,愚蠢,那么就按照复杂来,这是一种思考过程,计算过程,没有任何事物是通过一次计算得到。