产品沉思录 产品沉思录 产品沉思录 产品沉思录
Simple Made Easy

Simple Made Easy

Rich Hickey

简单与容易的区别在于,简单是通过解耦和明确的设计来实现的,而容易则依赖于熟悉度和快速上手。真正的软件工程需要在初期忍受不易,通过深思熟虑和严格的解耦追求客观上的简单。AI更倾向于简单的逻辑结构,而非人类通常追求的易用性。设计API时应注重简单性,而不应过分妥协于易用性。

软件工程哲学中最重要的一课

来源:视频与摘要 | 演讲全文 | 观后感

simpleeasy
词源:Simplex,单折、这一股词源:临近(Adjacent / Lying near)
反义词:Complex (复杂),词源 Complex,编织在一起反义词:Hard (困难)
定义:没有交织(Interleaving)。它只有一个角色,完成一个任务,关注一个概念。定义:物理上的临近:触手可及。认知上的临近:熟悉(Familiar)。
客观的、原语、原子化的,组合是定义简单的关键。相对的,简单的方法是完成某件事最快的方法。
ComplexSimple
状态 (State):极其复杂的,它把“值”和“时间”纠缠在一起。Values(不可变数据)是简单的。
Object 纠缠了状态、标识和值Data(Map, List, Set)是透明且通用的。
方法纠缠了函数逻辑与状态。函数
继承将类型耦合在一起,是典型的编织。组合/多态 (Polymorphism à la carte)
与其发明复杂的语法,不如直接用数据结构来表达逻辑。数据 (Data)

这里说说复杂。

Rich 复活了一个古词:Complect,意思是把东西编织、纠缠在一起。

模块化不等于简单:你把代码分成了很多模块,但如果它们之间逻辑紧密纠缠,那依然是一团乱麻。

真正的简单是让它们互不知道对方的细节(解耦)。

简单是一种选择(Simplicity is a choice)。

如果你构建了复杂的系统,那是你的错。不要把“易用(熟悉、顺手)”误认为是“简单”。

你需要培养对“纠缠(Entanglement)”的嗅觉,时刻警惕复杂度的产生。

设计简单系统的步骤:使用 Who, What, Where, When, Why, How 进行拆解

不要相信直觉上的“容易”,因为那通常只是“熟悉”的幻觉。

真正的软件工程需要忍受初期的“不易”,通过深度的思考和严格的解耦,去追求客观上的简单(Simple)”。

请停止编织代码,开始解耦设计。

来源:https://jt.lol/posts/simple-vs-easy-vs-ai

Jamie Turner 刚入职场实习的时候仰慕的一位工程师给他的 2 个建议

这里重点说 vi 如此成功的重要原因——它在组合方面表现出色。

一旦你学会了几个操作如“d”(删除),和移动如“w”(词),

你就会意识到你可以将它们串联起来做基本上任何事情。

你并不是在记忆所有混乱的字符组合,你仅仅是在记忆少量的原语。

对于一个新工具或想法,这里有两条截然不同的曲线在起作用:易于使用和易于学习。

如果我是 vim 用户而你是 Emacs 用户,对我来说在 vim 里删除一行是“easy”的,但对你来说可能不是。

然而,在两个编辑器中删除一行这个操作本身都是“simple”的。

人类倾向于容易。

人类因为受限于大脑的“工作集”大小和学习成本,往往倾向于选择 Easy 而非 Simple。

我们不愿仅仅为了可能得不到的回报去克服陡峭的学习曲线。

AI 不在意容易,因此更倾向于简单。

AI 并不在乎一个工具是否 Easy(易上手),

但它和人类一样受益于工具的 Simple(逻辑清晰、无歧义、可组合), 这减少了推理错误的概率(幻觉、Bug)。

以前,我们为了迁就人类的懒惰(追求 Easy),制造了很多泄漏的抽象。

现在,我们为了 AI(也为了最终更好的系统稳定性),设计更加 Simple 但可能学习曲线较陡峭(Not Easy)。

一个有趣的考量:

AI 时代的 API 设计应该回归本质上的 Simple,而无需过分妥协于 Easy。