跳到正文

导航

← 所有文章
ZTHINK engineering

如何准备软件工程师的系统面试——资料篇

准备系统设计面试该读哪些经典教材:从 DDIA 打根基,到架构权衡、领域建模、可靠性和经典模式,最后读 MIT 分布式系统课程的原始论文。每本书的作者、版本和中文版都已对照出版方页面核实。

Read in English ↗
如何准备软件工程师的系统面试——资料篇 — Aileen Wright
本文目录

系统设计面试考的是设计大型软件系统的功夫:数据怎么存,请求怎么分发,机器坏了怎么办,以及每个选择要付出什么代价。这些功夫来自这个领域的经典教材。这篇文章只收教材和经典著作,不收专门讲面试题的书。书单分成六组,最后给出我建议的阅读顺序。

每本书的作者、版本和出版时间,我都在 2026 年 10 月 30 日对照了出版社或作者本人的页面;中文版的信息来自豆瓣读书的书目页和作者本人的页面。书单里有几本出了新版,买书之前最好再确认一下版本。

第一组书讲数据系统和分布式系统的原理

一座正在打地基的房子,石块砌成的地基里嵌着一本蓝色封面的厚书,当作基石

《Designing Data-Intensive Applications》是整份书单的根基

Martin Kleppmann 的《Designing Data-Intensive Applications》,大家习惯简称 DDIA。第二版的目录从数据模型、存储和编码讲起,再讲到复制、分片、事务和分布式系统的种种麻烦。系统设计面试里常被追问的取舍,大多能在这几章里找到原理。

DDIA 现在有两个版本。第二版由 Kleppmann 和 Chris Riccomini 合写,O’Reilly 的页面把出版时间标为 2026 年 2 月,Kleppmann 个人主页的著作列表写的是 2026 年 3 月,两处差一个月。第一版由 Kleppmann 一人撰写,2017 年 3 月出版,中文版《数据密集型应用系统设计》由中国电力出版社在 2018 年 9 月出版,译自第一版。读得惯英文的读者,我建议直接读第二版;只读中文的读者,第一版的中文版仍然够用,书里讲的基本原理没有过时。

《Understanding Distributed Systems》适合先过一遍全局

Roberto Vitillo 的《Understanding Distributed Systems》比 DDIA 薄。作者网站上写着,这本书现在是第二版,共 33 章、328 页,全书分成通信、协调、扩展性、韧性和可维护性五个部分。前两章可以在作者网站上免费阅读。

作者在网站上说,这本书重广度、不重深度。网络协议栈、数据一致性模型、扩展性和可靠性模式、可观测性,后端工程师要用到的知识大致都讲到了。工作经验少、没做过大规模后端的读者,可以先读这本,再啃 DDIA。

《Database Internals》往存储引擎深处再走一步

Alex Petrov 的《Database Internals》由 O’Reilly 在 2019 年 10 月出版。作者网站介绍,全书分为存储引擎和分布式系统两部分:前一部分讲 B 树、LSM 树、预写日志这些数据结构,后一部分讲故障检测、领导者选举、一致性和共识算法。

面试很少问到这么深。但面试官追问“这个数据库为什么写得快”“你选的存储为什么适合这个读写比例”的时候,读过这本书的人能答到数据结构那一层。

第二组书帮读者建立架构权衡的框架

绘图桌上的一架黄铜天平,一边放着一栋大楼的模型,另一边放着一群相连小房子的模型,两边几乎持平

《Fundamentals of Software Architecture》教人系统地比较架构风格

Mark Richards 和 Neal Ford 的《Fundamentals of Software Architecture》已经出到第二版,O’Reilly 在 2025 年 3 月出版,比第一版新增了五章。全书前几章先定义“架构特征”,也就是扩展性、可用性这类功能以外的要求,然后逐一讲微服务、模块化单体、微内核、分层等架构风格。系统设计面试最常见的追问是“为什么选这个方案而不选那个”,这本书给了一套比较方案的词汇和步骤。

《Software Architecture: The Hard Parts》专讲没有标准答案的难题

《Software Architecture: The Hard Parts》的作者有四位:Neal Ford、Mark Richards、Pramod Sadalage 和 Zhamak Dehghani,O’Reilly 在 2021 年 10 月出版。第一章的标题就叫“没有‘最佳实践’的时候怎么办?”。全书讨论服务该拆多细、服务之间的契约怎么管、分布式事务怎么处理,这几样也是面试里容易被追问的地方。

两本讲代码层面设计的书可以选读

下面两本书讲的是模块和代码层面的设计,和分布式系统的关系不大,属于选读。

Robert C. Martin 的《Clean Architecture》由 Pearson 在 2017 年 9 月出版,目录依次是设计原则、组件原则和架构三大部分,其中一章专讲怎么划定边界。中文版叫《架构整洁之道》,电子工业出版社 2018 年出版,孙宇聪翻译。

斯坦福大学教授 John Ousterhout 的《A Philosophy of Software Design》在 2021 年 7 月出了第二版。第二版在两章里新增了几节,专门拿本书的观点和 Robert Martin 的《Clean Code》对比,作者说两人在函数长度和注释的作用这些问题上分歧很大。两本书对照着读,比只读一本更能看清设计取舍。

第三组书讲领域建模和服务拆分

一张手绘的小镇地图,彩色铅笔把小镇分成几个街区,每个街区里放着一座小木屋

面试题一旦涉及“这个系统要拆成哪几个服务”,就要用到领域建模的概念。

Eric Evans 的《Domain-Driven Design》由 Addison-Wesley 在 2003 年 8 月出版,Evans 任教的培训公司 Domain Language 把这本书称作“蓝皮书”(The Big Blue Book)。通用语言(Ubiquitous Language)、聚合(Aggregate)、限界上下文(Bounded Context)这些面试里常听到的概念,书里都有专门的章节。中文版《领域驱动设计:软件核心复杂性应对之道》由人民邮电出版社出版,豆瓣上的版本是 2016 年 6 月。

Vaughn Vernon 的《Implementing Domain-Driven Design》由 Addison-Wesley 在 2013 年 2 月出版,讲的是怎么在项目里落实 Evans 提出的概念。中文版《实现领域驱动设计》由电子工业出版社在 2014 年出版,滕云翻译。

Sam Newman 的《Building Microservices》第二版由 O’Reilly 在 2021 年 8 月出版。作者说第二版是对第一版的完全重写,第一章可以在作者网站上免费下载。中文版《微服务设计(第2版)》由人民邮电出版社在 2024 年 4 月出版。

第四组书讲可靠性和上线运维

一艘帆船的剖面图,船舱被竖直的隔舱壁分成几格,进水的舱格被隔住,船身仍然平稳,远处有一座灯塔

Google 免费公开了三本 SRE 的书

Google 的《Site Reliability Engineering》第一版由 O’Reilly 在 2016 年 4 月出版。Google 在 sre.google 上免费公开了这本书的全文,同样可以在线读全文的还有配套的《The Site Reliability Workbook》和《Building Secure & Reliable Systems》。服务等级目标(SLO)、前端和数据中心的负载均衡、过载处理这些面试常见话题,书里都有专门的章节。

Google 现在又推出了完全重写的第二版。sre.google 书目页上,第二版只给了 Google Books 的购买链接,没有在线阅读的入口;免费公开的仍然是第一版。第一版的中文版叫《SRE:Google运维解密》,电子工业出版社 2016 年出版,孙宇聪翻译。

《Release It!》讲系统在生产环境里怎么出故障

Michael Nygard 的《Release It!》第二版由 Pragmatic Bookshelf 在 2018 年 1 月出版。书里有一章专讲稳定性模式,包括超时、断路器和舱壁隔离。面试时被问到“下游服务挂了怎么办”,这一章的模式可以直接拿来回答。

第五组书是经典的模式目录,适合查阅

图书馆的卡片目录柜拉开一个抽屉,桌上摊着几张只画了方框和箭头的卡片,旁边有台灯和眼镜

这三本书出版时间都在二十年以上,书里的技术例子比较老。我把它们当成工具书:遇到不熟悉的模式名,再翻到对应的章节去读。

Martin Fowler 的《Patterns of Enterprise Application Architecture》出版于 2002 年。Fowler 介绍,这本书前一部分是约 100 页的教程,其余部分是四十个左右模式的参考,主题包括企业应用怎么分层、怎么组织领域逻辑、怎么把领域逻辑接到关系数据库上。

Gregor Hohpe 和 Bobby Woolf 的《Enterprise Integration Patterns》由 Addison-Wesley 在 2003 年 10 月出版,收录了 65 个集成模式,讲的是系统之间怎么通过消息传递协作。网站上的模式目录列有发布订阅通道、死信通道和幂等接收者等模式,面试里设计消息队列时常用到这些概念。

Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合写的《Design Patterns》由 Addison-Wesley 在 1994 年 10 月出版。这本书讲面向对象代码层面的模式,对系统设计面试帮助有限。中文版《设计模式:可复用面向对象软件的基础》由机械工业出版社在 2000 年出版。

第六组资料是公开课程和原始论文

一本摊开的速写本,同一座桥被反复画了很多遍,旁边立着一个沙漏

MIT 的分布式系统课程 6.5840(原课号 6.824)把课表、阅读材料和实验都公开在网上。2026 年春季学期的课表要求学生课前读 GFS(2003)、Raft(2014)和 Spanner(2012)等论文,实验要动手实现 MapReduce 和 Raft。想知道 DDIA 里那些原理出自哪篇论文,可以照着这份课表去读原文。

我建议按这个顺序读

  1. 先读 DDIA 打根基。 工作经验少的读者,可以先用《Understanding Distributed Systems》过一遍全局,再读 DDIA。
  2. 再读《Fundamentals of Software Architecture》,建立比较架构方案的框架。 读完之后,回答“为什么选这个方案”就有了章法。
  3. 按需选读领域驱动设计、微服务和 SRE 的书。 目标岗位偏业务系统,多读 Evans、Vernon 和 Newman;偏基础设施,多读 SRE 的书、《Release It!》和《Database Internals》。
  4. 最后照着 MIT 6.5840 的课表读原始论文。 读 GFS、Raft、Spanner 这些论文的时候,回头对照 DDIA 的相应章节,弄清楚书里的结论从哪里来。

第五组的模式书不必通读,遇到不熟悉的模式名再去查。时间紧的读者,最少读 DDIA 和《Fundamentals of Software Architecture》;时间充裕的读者,再做几个 MIT 课程的实验,面试时说起复制和共识会更有底气。

参考来源

出版社页面、作者本人的页面和课程主页是一手来源。豆瓣读书是书目数据库,只用来核实中文版信息。

数据系统和分布式系统

软件架构

领域建模和服务拆分

可靠性和运维

经典模式

公开课程