在互联网上,所有涉及到偏好的讨论,都不免引发口水战。

偏好是一种很个人的东西,但如果选择影响的人不仅仅是自己,也包括协作的团队成员,或者公司的利益,或者用户的体验,那么就需要更多的考虑。

无论选择是什么,应该都遵循某一个原则。不同人的原则不相同,对我来说,它是「Worse is Better」。

Worse is Better:简单性的胜利

Worse is Better 是 Richard P. Gabriel 提出的哲学。它表达的是一个系统的设计应该是简单的。如果其他方面的设计会导致系统变得更复杂,那么就应该考虑牺牲它们。

他以 Lisp/Lisp Machine 和同期的 C/Unix 为对比,我列出来给大家看看:

简单

  • Lisp 认为,设计必须简单,尤其是界面。如果简单的界面需要复杂的实现,可以接受。
  • Unix 认为,设计必须简单。实现的简单比界面的简单更重要。

正确

  • Lisp 认为,设计在各方面都应该正确的,不允许有任何错误。
  • Unix 认为,设计在各方面都应该正确的,但是如果为了简单,允许产生一些错误。

一致

  • Lisp 认为,设计在各方面都应该一致。
  • Unix 认为,设计不能过于不一致。有时候为了简单可以牺牲一致性,但最好放弃那些处理不常见情况的设计部分,而不是引入实现复杂性或不一致性。

完整

  • Lisp 认为,设计应该尽可能地覆盖重要的情况,必须覆盖所有合理预期的情况。
  • Unix 认为,设计应该尽可能地覆盖重要的情况。但是如果为了简单,可以牺牲完整性。

总之,为了简单而适当牺牲其他方面,是 Worse is Better 的核心概念。

看完这些对比,一般人会觉得 Lisp 的设计更好,但结果 Unix 却更成功。让我们来回顾一下到底发生了什么:

  1. 因为 Unix 和 C 的简单,可以在更便宜的硬件上运行,因此可以扩展到 Lisp 无法触及的地方。
  2. 因为 Unix 和 C 的残缺,没法一次性构建复杂的单片系统,所以大型项目必须分解成可重用的模块,于是软件工程的概念诞生了,程序改进的速度变快了。

于是「更差的」Unix 和 C 取得了胜利。

Vue vs React: 权衡与选择

半年前和客户的工程师聊天,他问我为什么常用 Vue 而不是 React。我说,用 Vue 心智负担没那么高,例如可以直接在一个 HTML 文件引入 vue,把 Vue 当一个更好的 JQuery 用。

所以使用 Vue,进可以 Nuxt.js 的方式启动一个现代 Web 项目,退可写 Vanilla Javascript,然后用 Vue 来优化开发体验。

这种灵活性,对我来说很有吸引力。因为很多时候,并不需要一个完整的 Web App,也就不需要维护它的依赖,也不需要处理它的复杂性。

Golang:简洁与效率的平衡

在 1.2 以前,Go 都是一个非常无聊的语言(现在是无聊的语言)。

比如说,检查列表是否包含某个元素,别的语言可以写 if item in list,但对 Go,很长一段时间里,是要写一个完整循环。

for _, v := range list {
  if v == item {
      return true
  }
}

Go 被诟病的错误处理显然也是师承 C。

但无聊也是 Go 的优势之一,比如团队成员之间的代码风格更容易统一,可读性和可维护性都更好(检查列表是否包含某个元素不是一个好例子,所以我们有了 slices.Contains)。

Go 在简洁和功能之间找到了很好的平衡。它可能不是最灵活或优雅的语言,但它的理念使得在构建高效可靠的系统时表现非常出色。

Markdown:简单与功能的权衡

自 Markdown 诞生以来就一直被争议。

一部分观点认为,作为一个标记语言,Markdown 的语法太过简单,不足以满足复杂的需求;缺少标准,导致不同的实现之间存在差异;总的来说,不如 ReStructuredText 和 Asciidoc。

另一部分观点认为,作为一个标记语言,所限颇多,不如更完整的 HTML 所见所得编辑器。

但 Markdown 刚好在一个很好的位置,所以它的流行程度证明了它在简单性和功能性之间取得了很好的平衡。

因为 Markdown 能力有限,所以它是标记语言里最容易学习的,能让「技术小子」以外的人能快速上手,仅凭借直觉也能写,用最基本的语法满足 90% 的需求。这让它几乎变成了可见即所得编辑器以外的「事实标准」,做到了 ReStructuredText 和 Asciidoc 没有做到的事情。

当然 Markdown 不适用精确控制排版的场景和需要复杂表格和图表的文档,对此所见所得编辑器是更好的选择。 但对于大多数写作需求,Markdown 提供了一个很好的平衡。

生物演化:简单带来可能

技术产业之外,生物演化也是 Worse is Better 的绝佳例证。

从简单到复杂

生命最初是从简单的单细胞生物开始的。这些「简陋」的生命形式并不完美,但它们能够生存和繁衍,为复杂生命形式奠定基础。

所以软件开发中,常常从一个简单但可用的版本开始,然后逐步迭代完善。

高度适应的高风险

在生物群体中,基因的多样性看似是一种平庸,但实际上为未来的演化提供了空间。相比之下,那些对环境高度适应、特异性强的生物,比如大型掠食动物,反而更容易在环境变化时灭绝。

在设计系统时,要注意过度设计和适应反而可能会降低适应性。例如,如果系统实现如果 lock in 到亚马逊云服务上,那么当亚马逊云服务出问题时,系统会无法工作。

产品决策也是如此。依附于一个大平台,例如微信生态,也许可以借助平台优势迅速获得发展,但也要面对微信生态中那些不可控的风险,因为它们可能会让人全盘皆输。

缺陷中的优势

有趣的是,某些看似是缺陷的基因可能在特定环境下成为优势。比如镰状细胞贫血基因,携带者虽然有贫血,但对疟疾有更强的抗性

一些选择和决策,它们可能有一些不足,但在特定场景下却能发挥意想不到的优势。例如:

  • Instagram 最初只允许用户上传正方形照片,这个限制被认为是一个缺点。但这个「缺陷」反而成为了 Instagram 的标志性特征,用户因此更加注重构图,创造出独特的视觉风格。
  • 早期的 Twitter 限制每条推文只能有 140 个字符,这个限制最初被认为是一个缺陷。但恰恰是这个「缺陷」促使用户更加简洁和创造性地表达,也让信息传播更快速。这个特性后来成为 Twitter 的标志性特征,塑造了一种独特的社交媒体文化。

所以不够完美并不意味着失败。相反,它可能为适应性和长期生存提供了更多可能性。在技术选择和产品设计中,一个简单但灵活的方案可能比一个完美但僵化的方案更有生命力。

最好的设计,往往是那些用户感受不到的设计;最实用的工具,常常是那些不引人注目的工具。大方无隅,大器免成,大音希声,大象无形。