《程序员的逻辑学》

查看原文 HN 讨论

文章摘要

《Logic for Programmers》是形式化方法专家 Hillel Wayne 历时五年完成的新书,副标题是「一本关于数学、软件,以及用前者修复后者的书」。全书 227 页、约五万字,面向在职程序员,明确声明不需要数学背景。电子版包含 PDF 和 EPUB 且无 DRM,印刷版在亚马逊发售(内容相同,只是黑白印刷、页边距更宽),官网还提供免费的样章。

作者对这本书的定位很清楚:它是关于如何更好地设计、验证和推理软件的书,而它的切入点是——学一点逻辑(也就是布尔值的数学)就能解锁我们这一行里各种很酷的技术。

书中的所有内容都以实用为目标。前几章讲的是「简化条件判断」「确保 API 变更不会破坏客户端」这类日常问题;后面的章节逐渐进入稍微冷门的领域,比如「在假想的软件设计中找出竞态条件」「最小化分布式任务的墙钟时间」。作者坦承不是所有内容对所有人都有用,但希望每个人都能找到对自己有用的部分。

关于前置知识:读者只需要具备程序员日常经验中形成的布尔 AND/OR/NOT 直觉,其余的数学书里都会补上。但你确实需要会编程——这本书面向中级到高级程序员,默认读者了解循环、版本控制、测试这些通用主题,某些章节还需要 SQL 或 API 设计的具体知识。不过各章相互独立,不合口味的可以直接跳过。

书名里那两个奇怪的字母来自逻辑符号 ∀(对所有)和 ∃(存在)。为了降低学习门槛并方便全文搜索,作者在书中用英文词代替了数学符号——比如「每个人都有一种最喜欢的颜色」写成 all p in People: (some c in Color: IsFavoriteColor(p, c)) 而不是符号形式。

完整的目录及对应技术如下:

外加数学记号、常用重写规则和逻辑进阶话题的附录。所有代码示例都在 GitHub 上,另有一批同主题但未收入书中的额外示例。作者还专门维护了一个「额外学分」(extra credit)仓库,收录那些有趣但不够聚焦、放不进正书的话题(如如何计算状态空间大小、偏序理论等),大约四千字,书中有链接指向。

官网的 FAQ 里还顺手回答了一个经典困惑:为什么 Python 里 all([]) 等于 True?作者的解释是从性质出发的——我们希望对任意两个列表都有 all(xs . ys) == all(xs) && all(ys),如果取 ys 为空列表,那么当 all([])True 时等式退化为恒真;而如果 all([])False,就会推出 all(xs) 无论如何都是 False。原因在于 True&& 的单位元。同样的论证也解释了为什么空列表的和是 0、空列表的 anyFalse

作者本人专精形式化方法、分布式系统和软件史,此前著有《Practical TLA+》和 The Crossover Project,曾为 NASA、Meta、麦肯锡、西门子、西部数据等客户做过形式化验证与培训。

HN 评论精华

这条讨论(217 分、47 条评论)整体正面且友善,除了对书本身的祝贺外,最有价值的部分是一场关于「这本书该不该更理论化」的分歧。