跳转到主要内容
类别: 原则
类型: 设计哲学
起源: 美国海军航空,1960年代 / 软件工程,1970年代-2000年代
别名: KISS、保持简单愚蠢、KISS原则
快速回答 — KISS原则(Keep It Simple, Stupid)指出,大多数系统如果保持简单而不是被复杂化,就能更好地工作。该原则主张在设计、实施和维护中保持简单,认识到复杂化会带来脆弱性、增加成本并创造失败的机会。虽然确切起源存在争议——可以追溯到1960年代美国海军航空以及后来被软件工程师采用——但该原则的智慧在工程、商业和创意领域数十年来得到了验证。

什么是KISS原则?

KISS原则是一种设计哲学,主张简单性是创建系统、产品和解决方案的核心价值。KISS是”Keep It Simple, Stupid”(保持简单,愚蠢)的首字母缩写(尽管变体包括”Keep It Simple and Stupid”或”Keep It Short and Simple”)。其基本前提看似简单却非常有力:简单的解决方案比复杂的解决方案更容易理解、实施、维护和调试。
“简单是终极的复杂。” — 列奥纳多·达·芬奇
这一原则源于多个领域的观察。在工程中,复杂的系统有更多的故障点,需要更多的维护,而且更难修改。在商业中,复杂的流程会造成瓶颈,使利益相关者感到困惑,并抵制变革。在软件开发中,过度设计的代码成为技术债务,多年来困扰着团队。KISS原则将这些观察结晶为一条可操作的准则:除非真正必要,否则始终优先选择简单。 一个常见的误解是KISS意味着”简化”或创建原始解决方案。实际上,实现简单往往比创建复杂需要更多的努力。简单的解决方案仍然必须是完整的、功能性的和优雅的——只是避免不必要的装饰,不服务于任何实际目的。

KISS原则的三层理解

  • 入门: 在解决问题时,在添加功能之前先问”什么是最简单有效的解决方案?“避免猜测未来可能永远不会出现的需求的诱惑。
  • 实践: 根据当前需求以最低可行复杂度设计系统。使用清晰、可读的代码,而不是巧妙的一行代码。记录为什么做出决策,而不只是记录实现了什么。
  • 进阶: 认识到简单性是情境相关的——对专家简单的东西对新手来说可能不可能。通过构建可以组合成复杂行为的简单接口,在简单性和可扩展性之间取得平衡。

起源

KISS原则的确切起源有些模糊,有多个可信来源声称有不同的根源。最广为流传的起源故事将其追溯到1960年代的美国海军航空,当时飞机维护工程师使用”KISS”作为提醒,以保持飞机系统简单和可维护。该短语据报道出现在维护手册中,强调大多数飞机可以通过简单的程序保持运行。 该原则在1970年代和1980年代在软件工程中获得了更广泛的认可,因为开发人员努力应对日益复杂的软件系统。极限编程和测试驱动开发的先驱肯特·贝克(Kent Beck)将简单性作为影响几乎所有软件设计决策的核心价值。同样,传奇工程师艾达· Lovelace 经常被引用(虽然有时不正确)主张在计算机器中保持简单。 该原则得到了众多思想领袖的强化。阿尔伯特·爱因斯坦 famously 声明”一切都应尽可能简单,但不应过于简单”,捕捉到了简单性必须为功能服务的细微差别。在软件中,Unix”做一件事并做好它”的哲学在操作系统设计中回响着KISS。该原则的持久性源于其普遍适用性——简单性在几乎每个人类努力领域都能降低成本、错误和认知负担。

核心要点

1

简单性减少故障点

每个组件、功能或代码行都是潜在的故障点。简单的系统有更少的地方可能出问题,使它们更可靠,更容易在问题发生时进行故障排除。
2

复杂性随时间累积

最初的复杂性看起来是可以管理的,但维护会加剧它。每个功能都与现有的功能交互,产生指数级增长的问题。开始简单可以防止这种积累。
3

简单的解决方案更容易修改

复杂的系统抵制变革,因为理解修改的全面影响需要掌握复杂的相互依赖性。简单的系统可以被整体理解,使修改更安全。
4

清晰胜过巧妙

看起来巧妙的代码往往经不过时间考验,因为只有其作者理解它。简单、明显的代码可以由任何人维护,经得起人员变动的考验。

应用场景

软件开发

编写可读且可维护的代码。使用清晰的变量名、简单的算法,避免过度工程。一个有效的50行解决方案比需要解释的10行解决方案更好。

产品设计

创建需要最少培训即可直观使用的产品。每个功能都应该通过解决真实用户问题来赢得其位置,而不是通过展示技术能力。

业务流程

简化工作流程以消除不必要的步骤。复杂的审批流程会造成延迟和挫折,而不会相应改善结果。

项目管理

将项目范围定义为仅包含必要的交付物。通过严格根据核心目标评估每个添加来避免功能蔓延。

经典案例

在2000年代初期,谷歌的搜索基础设施 famously 体现了KISS原则。谷歌早期的工程师没有构建具有大量功能集的企业级复杂系统,而是构建了简单、可靠的组件,可以灵活组合。他们的分布式文件系统(GFS)和并行处理框架(MapReduce)在简单性方面很优雅——做好一件事,然后链接在一起解决复杂问题。这种简单性使谷歌的基础设施能够从服务数百万查询扩展到数十亿,与构建复杂得多的系统的竞争对手相比, 工程开销相对较小。教训:简单、专注的组件比复杂、功能丰富的组件更具可扩展性。

边界与失效场景

KISS原则虽然强大,但有重要的局限性。首先,过度简化可能牺牲必要的功能。并非所有复杂都是不必要的——有些问题确实需要复杂的解决方案。关键在于区分本质复杂性和偶然复杂性。 其次,对一个受众简单可能对另一个受众不简单。对专家简单的系统可能对新手难以理解。KISS原则需要考虑谁将维护和使用该系统。 第三,天真的简单性可能造成脆弱性。有时添加一层抽象(增加即时复杂性)可以防止以后更大的复杂性。该原则应该鼓励消除不必要的复杂性,而不是避免必要的复杂性。

常见误区

简单性不是关于做尽可能少的事情——而是关于在保留完整功能的同时消除不必要的元素。真正简单的解决方案通常需要比复杂的解决方案更多的思考。
创新往往来自于为复杂问题找到更简单的方法。真正的创新通常意味着删除一些东西,而不是添加一些东西。
该原则普遍适用——适用于业务流程、组织设计、沟通、产品开发,以及涉及系统或解决方案的几乎任何人类努力。

相关概念

奥卡姆剃刀

在竞争的假设中,应选择假设最少的一个。KISS是这个哲学原则的实际应用。

YAGNI原则

不要构建你实际上不需要的功能。YAGNI是KISS在软件开发中的具体应用,可以防止过早的复杂性。

DRY原则

不要重复自己。通过减少重复简化代码,使系统更容易维护和理解。

Unix哲学

软件应该做好一件事。这一设计哲学在系统层面体现了KISS原则。

最小可行产品

构建提供价值的最简单的产品,然后根据反馈进行迭代。KISS通过强调基本功能来为MVP策略提供信息。

一句话总结

保持简单——复杂性容易添加但维护成本高,所以总是从最简单的有效解决方案开始,只在证明必要时才添加复杂性。