- 作者:Eric Normand
- 出版社:Manning,2021出版,有简体中文版《深入浅出简约:用函数式思维驯服复杂软件》
- 前言:Guy Steele、Jessica Kerr
- 示例语言:JavaScript;思想完全通用,可迁移 Java/Python/Go/TS 等命令式语言
定位:不是一本函数式编程语言教程,是函数式思维在日常业务代码落地的工程书籍,Jolt停办之后普遍被认为气质最接近旧Jolt Productivity Award(生产力奖)的作品。核心目标:在可变语言里,降低业务系统意外复杂度,提升可测试性、可维护性。
核心模型:Actions / Calculations / Data(动作‑计算‑数据)
全书基石,把代码划分为三类,不依赖纯函数式语言编译器能力:
- Calculations(计算):纯逻辑,不修改外部状态、无IO;输入→输出,可重复、易于单元测试。
- Actions(动作):产生副作用:修改变量、IO、网络、数据库、DOM;不可重复,最难调试。
- Data(数据):简单不可变数据结构(plain object、数组),无行为。
设计原则:尽可能把逻辑抽成 Calculations;把 Actions 压缩到最小范围;Data 保持简单;隔离副作用。
大部分业务代码复杂度来源:动作与计算混杂在一起。
全书结构
第一部分:Actions, Calculations, and Data(动作、计算、数据)
- 识别三类代码,把计算逻辑从动作代码中抽取出来;重构手段。
- 动作代码的设计原则:缩小副作用的影响范围。
- 可变语言下实现不可变:如何在JS这类原生可变语言做不可变更新,处理不受信任外部输入。
-
Stratified Design(分层设计):本书重要原创设计模式。
- 上层:动作(IO、外部交互)
- 中层:计算(业务规则)
- 底层:纯数据
业务规则全部下沉到无副作用计算层;上层只负责调用计算、执行副作用,业务逻辑不在动作层写。
第二部分:First‑class Abstractions(一等抽象)
- 一等函数、高阶函数;函数式迭代;替代循环写法。
- 组合抽象,消除重复代码;不搞过度抽象。
第三部分:时间与异步(Time)【本书独特章节,同类书少见】
处理异步、并发、回调、时序bug。
- 引入时间线模型:把事件、请求当作时间线上事件看待;
- 分析竞态条件;把时间相关逻辑转为可测试计算;
- 异步代码如何拆分动作与计算,解决异步时序bug。
第四部分:项目实战
完整业务案例,从头到尾应用 Stratified Design;练习识别动作/计算/数据,重构遗留代码。
✔️本书优点
- 低门槛函数式思维:不要求懂 Haskell/Clojure,直接用于 JS/TS/Python/Java 现有业务项目,不需要全栈技术栈改造。
- 可落地重构方法论:提供识别、拆分、重构的步骤,不是空谈理论。
- Stratified Design 分层设计是非常实用的业务架构思路,适合后端、前端、Web应用。
- 专门覆盖异步并发时序问题,填补很多干净代码书籍的盲区。
- 大量插图、练习、自测题;Grokking系列风格,重在“真正理解内化”。
⚠️局限
- 不是FP语法教程:不讲解Monad、Functor等学术概念,不教一门函数式语言。
- 示例以JavaScript为主;其他语言读者需要自行翻译示例思路。
- 不讨论大规模分布式系统架构,聚焦应用层业务逻辑复杂度治理。
适合 / 不适合人群
✅适合:
- 中高级开发者,业务代码经常陷入状态混乱、难以单元测试;
- 想学习函数式思想,但不想切换到纯函数语言;
- 处理前端状态、异步回调、后端业务流程;
- 需要重构遗留项目,降低副作用蔓延。
❌不适合:
- 想要学习 Haskell / Clojure 语法;
- 追求底层、高性能算法。
和相近书籍对比
- 《Functional‑Light Java》:Java语境下轻量函数式;偏重语法流。
- 《Grokking Simplicity》:偏重代码组织、架构分层、副作用隔离,工程重构视角更强。
如果你需要,我可以整理一份Actions‑Calculations‑Data + Stratified Design 速查表。