Skip to content

Software Systems Atlas — 统一叙事与风格指南

本文档合并自 语气.md(叙事框架)和 NARRATIVE_STYLE.md(写作原则), 并集成 .suggestion.md 的审校反馈(v2)。

所有章节的编写和修改均以此文档为准。


核心原则

隐喻是拐杖,不是腿。新手村用拐杖,远征军必须扔掉拐杖,直接凝视代码与电路的深渊。

  • 读者是冒险者/玩家,你是向导/旅伴
  • 技术是旅途中的工具和技能点
  • 你不只是在"教授知识",是在"带读者闯关"
  • 冒险帮助建立直觉,机制负责准确

Part 1: 世界观与叙事框架

叙事关系

身份代词使用场景
读者 / 冒险者操作指令、观察、练习、排障
作者 / 向导我们共同推理、拆解、复盘
故事中的角色我/他(角色名)只出现在开场、案例、跨章承接或练习场景中

注意避免在同一段内频繁切换人称。如果一段文字需要给读者操作指令,用"你";如果是在回顾之前学过的内容,用"我们";只有在预设的叙事场景中才用"我"。

世界设定:变量村到数据预言厅

读者从 变量村 出发,一路成长。每一卷是这个世界的一片区域:

目录世界区域冒险阶段叙事密度
Vol 0开发者工坊出发前工坊收拾装备、认地图、练基本功较高
Vol 1编程之基变量村【新手村】跟着老陈师傅学基础魔法较高
Vol 2DS&A算法森林学会使用各种兵器和战术较高
Vol 3计算机系统计算机地心探究魔法本质——代码如何变成电流中等
Vol 4网络魔法驿道法师传送信息的空中走廊中等
Vol 5数据库与数据系统数据堡垒建仓库、挖地窖——从 SQL 到 LSM-Tree中等
Vol 6软件工程工匠之都学习怎样造一流的装备、协作修工程较低
Vol 7分布式系统远征军前线投军到林将军麾下——一个人打不了天下较低
Vol 8安全边境要塞路上遇到强盗,学会穿盔甲较低
Vol 9语言深度语言遗迹探索不同语言的遗迹,理解它们的灵魂很低
Vol 10数学数学塔馆长递来一本魔法书——数学是万事的根基很低
Vol 11编译原理咒术高塔研究造物者的咒语——懂了才能创造新东西很低
Vol 12数据处理与数据科学数据预言厅从战报数据中提炼真金很低
Vol 13AI/ML模型工坊让程序从规则执行走向数据驱动决策很低

叙事衰减规则: 随着卷号增加,逐步抽离魔幻设定,回归技术本真。Vol 0-2 可以有较高叙事密度;Vol 5+ 削减至仅保留开场钩子和跨卷承接;Vol 9+ 只在章节开头用一句话承接,正文直接进入技术内容。

叙事密度指南

阶段叙事密度叙事主要位置隐喻策略
Vol 0-2(新手营)20%-30%开场、例子、练习、收尾密集的奇幻隐喻,全文贯穿
Vol 3-5(系统进阶)10%-15%问题引入、事故、总结隐喻减少,增加工程术语
Vol 6-8(工程实战)5%-10%场景引入、架构案例保留框架性隐喻,砍掉细节装饰
Vol 9+(高阶/抽象)5%以下开头跨卷承接、少量精准比喻仅保留记忆锚点类隐喻,正文直接讲技术

主要配角

角色身份主要出现卷定位
老陈师傅变量村的铁匠兼编程老师Vol 1-2,后续仅在卷首语书信中出现慈祥但严格,总是说"自己动手试试"
阿花在变量村的同学Vol 1-2,后续在远方写信一起学编程,后来去做 AI(Vol 13 被回忆)
馆长大学的图书馆管理员Vol 10-11博学但话少,总是指一下书架说"答案在那里"
林将军远征军的统帅Vol 7严肃、运筹帷幄

高阶卷(Vol 7+)逐步取消冒险配角介入正文讲解。读者此时已成长为一名资深工程师,叙事变为"你站在系统顶层,审视眼前的架构"。配角只出现在章节开头的承接段落或卷首语中。

故事脉络(跨卷钩子)

我在做什么跨卷钩子
Vol 0拿到第一把武器(终端),学会基本生存
Vol 1在变量村跟着老陈师傅学基本功老陈说"学好这些,以后去建数据堡垒"
Vol 2在变量村后山探索算法森林老陈给我一张地图(复杂度分析)
Vol 3钻进机器的地下,看代码怎么变成电流我开始理解"为什么代码长这样"
Vol 4走出变量村,学会修路(网络)老陈说"外面很大,你需要一条路"
Vol 5到达数据堡垒,开始建仓库老陈来信问"你的数据存好了吗"
Vol 6加入工匠团队,学正规军协作团队里有从数据堡垒来的师兄
Vol 7投军到林将军麾下林将军说"一个人打不了天下"
Vol 8路上遇到强盗,学会穿盔甲路上捡到的密信提到"边境要出事"
Vol 9发现不同语言的遗迹,理解它们的灵魂在遗迹里找到老陈留下的笔记
Vol 10才知道数学是万事的根基馆长递来一本魔法书
Vol 11研究造物者的咒语馆长说"懂了咒语你才能创造新东西"
Vol 12从战报数据中提炼真金我看到数据中藏着整个旅程的答案
Vol 13让程序从规则执行走向数据驱动决策想起阿花在信里说"它要是能自己学就好了"

Part 2: 写作原则

原则 1:先有问题,再有概念

任何概念、工具、协议或算法出现之前,读者必须先看到它要解决的问题。

❌ "Git 有三大区:工作区、暂存区、仓库区……"
✅ "你改了代码,但改错了。你想回到一小时前——可是文件已经覆盖保存了。
    这时候你发现 Git 的暂存区就像你的存档选择界面……"

每一节的推进节奏:

  1. 遇到了问题 / 卡住了
  2. 读者意识到"我需要一个工具/概念来解决这个"
  3. 介绍概念(不多不少,够用就行)
  4. 马上动手用这个工具
  5. 进入下一关

问题可以来自失败、性能瓶颈、安全风险、规模增长、协作成本或设计约束。不要求每一节都设计"事故",但每一节都必须回答:

为什么现在需要知道这件事?

原则 2:比喻建立直觉,机制负责准确

每章可以使用一个核心隐喻,但隐喻不能替代正式定义、状态机、代码、图示或实验。

比喻使用规则:

  • 比喻用于建立直觉,不替代正式定义。
  • 每个核心比喻都必须有适用范围。
  • 涉及内存、并发、密码学、AI、分布式一致性时,必须补充"这个比喻在哪里失效"
  • 不得用比喻替代协议、算法、状态机、数据结构或安全边界。
  • 当读者需要精确模型时,立即切换到正式模型。

建议在容易误导的章节末尾加入固定小节:

md
### 这个比喻在哪里失效?

"变量像口袋"能帮助你理解"名字对应一个值",
但它不能解释引用、别名、对象共享和闭包。

到了这些场景,我们要换成更准确的模型。

原则 3:读者是主角,作者是向导

教科书说法冒险叙事说法
"变量是存储数据的容器""你面前的变量就像口袋,可以装东西"
"接下来我们学习循环""你发现有些事要重复很多遍——有没有更聪明的方法?"
"本节介绍了继承的概念""恭喜,你掌握了继承!现在你可以站在前人的肩膀上……"
"注意:别忘了加分号""小心——这里的陷阱是分号"

语气范围(灵活使用):

  • 直接
  • 有陪伴感
  • 不居高临下
  • 不故作幽默
  • 不假装经历过不存在的事情
  • 不用夸张语气掩盖复杂性

常用话术(偶尔使用,避免模板化):

  • "想象一下:你早上打开电脑……"
  • "如果你的第一反应是……——你猜对了"
  • "还记得之前的 X 吗?它在这里派上用场了"
  • "行,动起来"

避免高频重复固定句式。 以下句子每卷出现不宜超过一次,否则会变成模板味:

  • "停——这里有个坑"
  • "你猜怎么着?"
  • 虚构个人经历("我当年忘了一下午")

原则 4:删除这些教科书句式

别用替换为
"接下来我们讲解……"直接进入场景
"本节主要内容……"冒险不需要课程大纲
"正如前文所述""还记得吗,之前我们……" / 直接链接到具体概念
"需要注意""小心" / "当心" / "这里有个坑"
"简单来说"直接说,不用说"简单来说"
"即" / "换言之"说一遍就够了
"本节的目的是……"用问题引出,或者直接写"这一节结束后,你应该能……"

原则 5:章节结构(场景引入 + 精确讲解 + 记忆锚点)

每章按以下骨架,但不必机械套用所有标题:

🗺️ **你在哪**(1-2句:这章在解决旅程中的什么问题)

🎯 **你的任务**(一段话概括这章要解决的核心问题)

⚔️ **遭遇战 → 获得技能**
(读者先遇到问题 → 旧办法不够 → 获得新工具/概念;
    核心知识 + 代码 + 三语言对比)
    ├── 第一层:够用(解决当前问题)
    └── 第二层:深入(为什么这样设计?)

💥 **常见陷阱**
(真实陷阱 / 常见误用 / 我踩过的坑)

🏆 **通关挑战**
    🧪 动手试试(2-3个练习)
    ✅ 验收标准

🕐 **常见卡点**

📜 **旅人笔记**(本章核心知识的一句话总结)

→ **下一站预告**(1-2句引出下章)

注意: "遭遇战"和"获得技能"是交织的,不必强行分两个标题。核心知识讲解切换到"精确但对话式"的技术叙述(占 70% 篇幅),仅开头用冒险场景引出问题(占 10%),难点/陷阱处用冒险语言做记忆锚点(占 20%)。

原则 6:代码是武器

代码块不是枯燥的示例。每次展示代码时都要带上下文:


```java
int x = 5;

(然后下一段解释这是变量)

✅ "你的口袋现在空空的。你需要往里放一个数字。在 Java 里是这样操作的:

java
int numberOfApples = 5;   // 👈 你的口袋里现在有 5 个苹果

看到了吗?int 说这口袋只能装整数,numberOfApples 是你给口袋起的名字……"


**每个代码块至少满足其中一种:**
1. 最小可运行示例
2. 可以复制到 Playground 的示例
3. 一个真实工程中的截取片段
4. 一段需要读者补全的练习代码

**每个可运行代码块标注:**
- 语言与版本
- 如何运行
- 预期输出
- 读者应该改哪里
- 会出现什么错误

### 原则 7:不动摇的知识深度

冒险风格 ≠ 降低内容质量。核心知识不能丢:
- 三语言对比 ↔ 原样保留
- 难点深入 ↔ 原样保留
-  常见陷阱 +  动手试试 ↔ 原样保留
-  验收标准 +  常见卡点 ↔ 原样保留

改的是 **表达方式**,不是 **内容深度**。

### 原则 8:冷热交替

连续 3 章硬核理论后,必须插入 1 章"实战/拆解"来调剂节奏。可通过案例研究、工具操作、Debug 故事或完整应用实现。

---

## Part 3: 例子与素材规范

### 例子策略:三层递进

| 层次 | 类型 | 作用 |
|:----:|------|------|
| 第一层 | 冒险世界例子(背包、卷轴、地图、城堡) | 建立第一层直觉 |
| 第二层 | 中性技术例子(文件、消息、日志、聊天室、任务队列) | 连接真实系统 |
| 第三层 | 经典 CS 问题场景与真实系统案例(Git、Linux、PostgreSQL、Kafka、浏览器) | 迁移与应用 |

**禁止的:** 牵强附会的低阶商业系统(奶茶店点单、员工管理系统、超市收银)。

**允许的:** 经典的计算机科学问题场景(银行转账→事务 ACID、网页爬虫→并发、哲学家就餐→死锁、缓存穿透→缓存策略)。这些场景剥离了商业故事,只保留纯粹的技术约束。

**鼓励的:** 冒险世界 + 真实系统案例的组合。例如:"两个城堡之间同步战报"引入,然后用"数据库主从同步"作为真实案例。

### 例子关联度规范

- **规则 1**: 每章开头加 1-2 句叙事承接(上次说到哪、这章去干什么)
- **规则 2**: 同一卷内例子用同一套角色/场景
- **规则 3**: 跨卷例子尽可能关联(Vol 5 建的 order 表,Vol 12 可以拿来做数据分析)
- **规则 4**: 每卷最后一章结尾加一句"下一站预告"

### 图示规范

至少定义四类图:

| 图类型 | 适合内容 |
|--------|---------|
| 心智模型图 | 栈、堆、缓存、索引、线程 |
| 时序图 | HTTP、RPC、Raft、事务 |
| 状态机图 | TCP、锁、任务状态、认证流程 |
| 架构图 | 微服务、数据库、Kubernetes、数据平台 |

每张图应有:
- 标题
- 阅读方向
- 图例
- 关键结论
- 文字版描述

不要用纯装饰性"冒险地图"替代系统图。

---

## Part 4: 三语言策略

- Java(主)+ Python(副)+ C/C++(副)
- **不再每章三份完整代码**:主语言完整实现 + 对比窗口只讲核心差异
- 不同场景主语言不同:

| 场景 | 主语言 | 说明 |
|------|--------|------|
| OOP、后端、工程实践 | Java |  |
| 算法、数据分析、ML | Python |  |
| 内存、CPU、并发、系统性能 | **C/C++** | **Vol 3(计算机系统)必须用 C 主视角**。如果坚持用 Java 讲 CSAPP 内容,会失真。内容正确性高于风格统一性 |
| Shell、部署、自动化 | Bash |  |

---

## Part 5: 每章格式模板

title: 第X章:章节标题 volume: vol-XX chapter: XX

元数据卡

  • 前置知识:Vol Y 第Z章
  • 预计时间:xx 分钟
  • 核心难度:⭐(入门)/ ⭐⭐(进阶)/ ⭐⭐⭐(黑魔法)
  • 阅读模式:🍃 轻松漫游 / ⚡ 高度专注(建议 40 分钟+)
  • 可选跳过:如果只求应用,可跳过"XX 小节"
  • 完成标志:能够 xxx

🗺️ 你在哪 (1-2句:这章在整个旅程中的位置)

🎯 你的任务 (一段话概括这章要解决的核心问题,用冒险叙事)

⚔️ 遭遇战 → 获得技能 (先让读者遇到问题,旧办法为什么不够; 核心概念讲解,深度充分; 三语言对比窗口(如需要); 代码块带上下文引子)

🏔️ 深入冒险 (更复杂的情况,可选进阶内容)

💥 常见陷阱 (真实陷阱 / Debug 故事 / 常见误用)

🏆 通关挑战

  • 🗡️ 热身(5 分钟,必做):确认你理解概念
  • ⚔️ 挑战(30 分钟,选做):写出完整 Demo
  • 观察:通过日志、抓包、测试、性能数据看到机制
  • 排障:给定错误现象,定位原因

验收标准 (能解释、能实现、能观察、能定位错误)

🕐 常见卡点

现在不需要理解

📜 旅人笔记 (本章核心知识的一句话总结,方便复习)

下一站预告(1-2句引出下章)


**在高级卷(Vol 7+)中,` 你在哪` 和 ` 遭遇战` 可简化为 1-2 自然段,不强制分标题。**

---

## 练习设计指南

| 类型 | 说明 | 示例 |
|------|------|------|
| 🗡 热身 | 确认你理解概念 | 修改参数观察输出变化 |
|  构建 | 写出或修改代码 | 实现一个最小版本 |
|  观察 | 通过工具看到机制 | curl/ss/tcpdump观察HTTP请求 |
|  排障 | 定位错误原因 | 为什么服务端收不到完整消息? |
|  挑战 | 可选,连接下一章或真实系统 | 给缓存加上超时策略 |

---

## 对照检查表

每章写完后检查:

- [ ] 去掉开头两段,只看正文——还像是在讲故事吗?
- [ ] 有没有贯穿整章的核心比喻(不只在开头用了一次)?
- [ ] 每个概念之前是不是先遇到了问题?
- [ ] 读者是"你在做……"还是"读者应该知道……"?
- [ ] 有没有"接下来我们讲解……"这类教科书过渡语?
- [ ] 代码块有没有上下文引子?
- [ ] 例子来自冒险世界或经典 CS 场景,不是低阶商业系统?
- [ ] 首尾是否跟前后章连贯?
- [ ] **知识准确性:** 冒险叙事是否扭曲了技术概念的本质?
- [ ] **难度曲线:** 这章比上一章难多少?是否在读者承受范围内?
- [ ] **前置知识验证:** 读者真的具备"前置知识"吗?有没有隐性依赖?
- [ ] **代码可运行:** 所有代码块是否能在标准环境下直接运行?标明了版本、预期输出?
- [ ] **三语言一致性:** 同一概念的三种语言实现是否等价?
- [ ] **篇幅控制:** 是否超过目标阅读时间?(建议每章控制在 30-45 分钟)
- [ ] 验收标准能改写成"通关条件"的感觉吗?
- [ ] **比喻失效边界:** 使用隐喻的章节是否标注了"这个比喻在哪里失效"?(必要章节如内存、并发、密码学、AI、分布式一致性)

Built with VitePress | Software Systems Atlas