SYSTEM DESIGN / CURRICULUM V3 · 2026-10-04

从第零章开始,
学会为一个小项目做设计。

目标是理解系统怎样工作,并能说明自己的设计为什么适合需求。用浏览器阅读、实测记录与自评先建立判断,再按需要动手实现。

自检修订版目录 11 章 · 0–10 20 个来源入口

这次把“看懂原理”变成可自评的学习路径

现有可靠保存样板预设读者已懂请求、数据库和提交。新顺序先建立运行位置、请求与状态的模型,再讨论数据、接口、权限和故障。全课围绕同一份小项目设计档案逐步修改;已有样板保留为第 6 章素材,本轮没有把它整体重写成新第 6 章。

每章同一条内容链:场景与需求 → 观察及证据边界 → 责任与状态 → 不可破坏的业务规则 → 正常/失败路径 → 可行方案及代价 → 选择与改选条件。先自己判断,再看分层提示与参考理由,最后换一个小场景检验。

这是一份经过自检修订的目录与作者工作约定,不是某门原课的缩写,也没有经过目标学习者试学验证。初始对象仍是“会读简单函数,但缺少后端经验”的学习者;第 0–1 章尽量只用浏览器与中文解释。

主线与选做怎样分开

核心路线:浏览器阅读、观察当前课件、阅读带环境与步骤说明的实测请求记录、作出判断并写设计。无需安装工具,也不要求注册云平台。Network 面板自行观察可补充证据;不方便操作时可使用课内记录。没有运行成功的环境问题单独记录,不能当成概念题答错。

选做深化:下载并手动启动课程提供的 Python 标准库+SQLite 最小后端,按说明复现实验。需本机可用 Python 3,但不需安装第三方包;启动、重置与数据位置以演示说明为准。演示的功能边界和后续待制作实验分别标注,不把教材模拟当成真实并发检验。

每章如何独立检查自己

先做预测或错例诊断 → 提示 1 指回相关观察 → 提示 2 给出缺失的比较维度 → 再看参考判断与自评要点。参考回答解释关键依据和可接受的替代答案。读完或勾选完成不代表掌握;学习者须能用自己的场景重写同一条理由。

章节总览与交付状态

章节标题、阶段与状态要回答的问题学完带走什么
第 0 章你正在使用的网页,究竟算一个什么系统?A · 看懂系统 · 本轮提供学习页同一个网址,为什么两个人的学习进度不同?一张带证据等级的系统图与一份“已知/未知”记录。
第 1 章从输入网址到点击保存:一次请求怎样走完?A · 看懂系统 · 本轮提供学习页看到新内容,是否意味着向服务器保存了数据?一份请求证据记录,以及读、写各一张时序图。
第 2 章从“我想做个应用”到一份能执行的设计B · 做出最小系统 · 目录计划,正文待制作一个个人笔记工具,第一版到底需要哪些东西?一页需求与约束、两张可行候选图、一份统一决策表。
第 3 章数据放在哪里,怎样存才不容易弄错?B · 做出最小系统 · 目录计划,正文待制作关页、重启、写到一半失败,以及两次不同编辑,会发生什么?存储选择、数据关系图、三条不变量、一个事务边界与一个冲突判断。
第 4 章把功能变成明确的接口和责任B · 做出最小系统 · 目录计划,正文待制作前端说“保存”,后端究竟承诺做什么?API 契约、输入边界和可核实的正常/错误案例。
第 5 章多人使用后,谁有权看到和修改数据?B · 做出最小系统 · 目录计划,正文待制作登录了,为什么也不能读取别人的笔记?权限矩阵、校验位置,以及至少三条拒绝访问案例。
第 6 章保存没有回复,接下来该怎么办?C · 可靠地运行 · 现有样板素材,待重写第一次已经写入,又点一次会怎样?可靠保存协议,包含结果未知、操作身份、有限重试与验收案例。
第 7 章把它交给别人:上线、观察、备份与恢复C · 可靠地运行 · 目录计划,正文待制作“我这里能用”之后,怎样知道别人也能正常使用?发布核对表、一次定位记录、一份代码回滚与数据恢复的核验表。
第 8 章真的变慢了:先测量,再谈索引和缓存D · 按问题扩展 · 目录计划,正文待制作列表加载慢,应该换服务器、改查询,还是加缓存?瓶颈证据、可比较的改动前后记录和缓存采用条件。
第 9 章任务太久,能让它稍后完成吗?D · 按问题扩展 · 目录计划,正文待制作导出大量笔记时,用户必须一直等着请求吗?任务状态图、重复处理规则与积压时的反馈策略。
第 10 章为自己的小项目写一份有理由的设计E · 独立迁移 · 目录计划,正文待制作换一个项目,你能重新做决定,而不是复制笔记应用吗?有可行备选、有验收证据计划、有改选条件的小项目设计说明。

核心主线为第 0–7 章,完成后可进入第 10 章。第 8–9 章提供按问题扩展的判断,完整实现练习选做。第 3 章拆成存储、关系、事务三小课,第 7 章拆成发布、观察、恢复三个短任务;具体时长在试学后校正。

本轮从第零章和第一章开始

进入第 0 章:系统、状态与证据 · 进入第 1 章:请求的旅程。这两个学习页在本轮提供;没有据此声称真人试学已完成。第 2–5、7–10 章仍是写作计划。

第零章:先辨认“我知道什么”

  1. 先观察:在固定 HTTPS 样板页填写测试文字,记录刷新和换浏览器后的结果。
  2. 列候选解释:“浏览器本地保存”和“远端按会话保存”都可能与部分现象相符;先保留不确定性。
  3. 加实现证据:对照课内的本地存储与代码证据,说明当前课件实际怎样保存。有限网络记录只描述该次观察窗口。
  4. 再画边界:把学习者、浏览器、托管服务与保存位置画清楚;事实与推断用不同标记。
  5. 改变需求:区分手动导入到另一台设备、自动同步、并发编辑和作者收作业,不能用一句“跨设备”混在一起。

第一章:从请求记录走到可解释的写入

  1. 认识一次 GET:读 HTML 请求、状态和响应;代码在浏览器运行与文件来自服务器可以同时成立。
  2. 把箭头画清楚:区分可直接观察的请求与 DNS、TLS、数据库处理等概念示意。
  3. 比较 GET 和 POST:阅读本轮提供的最小后端实测记录,核对地址、载荷、响应及写后读取。记录标明来源、环境与存储方式。
  4. 选择是否动手复现:手动运行 Python+SQLite 演示为选做;不会安装工具也能完成记录分析与判断。
  5. 用错例自评:仅页面变了、仅收到某个状态码、确实写后读到数据,分别能支持多强的结论?
当前边界:旧可靠保存样板继续作为第 6 章的模拟素材。后续权限、冲突、真实并发、恢复和性能实验按章节制作;本轮最小后端不代替这些实验,也不是生产系统模板。

每章的先修、判断、练习和自评

第 0 章 · 你正在使用的网页,究竟算一个什么系统?

本轮提供学习页

同一个网址,为什么两个人的学习进度不同?

先修:会使用浏览器;不要求编程或安装工具。

  1. 分清输入、处理、状态和输出;代码下载的位置与运行的位置。
  2. 把观察、候选解释、实现证据分开:刷新仍保留、另一浏览器看不到,只是现象。
  3. 结合存储记录与已核对代码判断当前实现;保留尚未观察或核实的边界。

核心练习:在固定 HTTPS 课件页记录“输入—刷新—换浏览器”的结果;阅读给出的存储/实现证据卡,再修改最初画的图。使用临时测试文字,不清空自己的正常学习进度。

错例诊断:“刷新还在,所以一定只存本地;另一浏览器没有,所以绝对没有后端。”请给出一个也能产生类似现象的候选解释。

参考判断/自评要点:服务器按会话隔离数据也可能得到类似现象。判断当前课件用本地存储,需引用存储项及对应代码;有限的一段网络记录不能证明世界上不存在任何后端。图上分别标出观察、核实事实与未知。

带走的成果:一张带证据等级的系统图与一份“已知/未知”记录。

小迁移:改成一个天气网页:同一网页文件、城市选择和天气数据是否一定在同一处保存?至少写出一个仍需核实的问题。

依据与选读:MDN · How the web works · MDN · Client-server overview · C4 model · System context diagram

第 1 章 · 从输入网址到点击保存:一次请求怎样走完?

本轮提供学习页

看到新内容,是否意味着向服务器保存了数据?

先修:第 0 章;阅读 JSON 的就地补课卡。

  1. URL、DNS、HTTPS 与 HTTP 按职责解释;示意过程和直接观察分开标注。
  2. 读取地址、方法、状态、请求体、响应体;知道一次请求记录能证明和不能证明什么。
  3. 对比静态文件 GET、业务数据 GET/POST,以及浏览器内部的界面变化。

核心练习:浏览器主线阅读本轮附带的后端实测请求记录,并可在 Network 面板观察本课 HTML 的 GET。逐项标注请求、响应和写后再读的证据;绘制读取与创建流程。手动运行 Python 标准库+SQLite 演示后端为选做,不作为进入下一章的条件。

错例诊断:“页面多了一条笔记,就证明服务端数据库已经写入。”请指出缺少哪两类证据。

参考判断/自评要点:界面变化只说明页面状态改变;需查看写请求与响应,再结合后续读取及已知后端实现说明持久化。时序图不能把未直接观察的数据库步骤画成 Network 面板的实测事实。

带走的成果:一份请求证据记录,以及读、写各一张时序图。

小迁移:为“查询快递”和“修改收货地址”各画一条请求路径,标出只有后者需要改变的业务状态。

依据与选读:MDN · How the web works · MDN · Client-server overview · Helsinki Full Stack Open · Fundamentals of Web apps · Harvard CS50 Web · Lecture 3: Django

第 2 章 · 从“我想做个应用”到一份能执行的设计

目录计划;正文与证据包待制作

一个个人笔记工具,第一版到底需要哪些东西?

先修:第 0–1 章;不要求了解云产品目录。

  1. 先拆清跨设备:手动导出/导入、联网自动同步、两个设备并发编辑是不同要求。
  2. 固定第一版:个人使用、两台设备先后联网使用,打开或刷新时取得已提交的新内容;支持基本增删改查、拒绝未授权读取、低维护投入。离线同步和实时协作暂不做。
  3. 按责任划分比较“自己写业务 API+数据库”和“浏览器调用托管数据服务+服务端访问规则”;二者都可能托管,不能把“单后端”和“托管”当互斥类别。

核心练习:先判断纯本地+手动导入能否满足所写需求,再在两种真正满足自动同步要求的方案间作选择。用下方同一张决策表逐项对照,不从产品名称倒推需求。数据规模、预算和开发时间先写假设,再标验证办法。

错例诊断:“只要跨设备,纯本地就永远不合格;托管方案一定比单个后端省钱。”请分别补足“跨设备”的定义和成本证据。

参考判断/自评要点:若只要求手动迁移,本地方案可以成立;只有硬性要求自动同步时,纯本地才单独不够。两候选必须满足相同需求,再比较开发、运维、迁移与规则约束。可接受不同选择,但须写清代价和改选条件。

带走的成果:一页需求与约束、两张可行候选图、一份统一决策表。

小迁移:把笔记工具换成离线旅行清单:哪些要求变化会让本地优先成为更合适的选择?更新决策表而非只换图标。

同约束下的两候选与统一决策表

以下是教学假设,不是产品报价:个人低频使用、两设备先后联网访问、刷新取得最新已提交内容、仅本人可读写,不要求离线协作。先核实两方案均能满足这些要求,再比较责任和维护代价。

需求方案代价选择改选条件
自动同步、所有权验证、可导出A:浏览器 → 自写业务 API → 数据库;本人负责接口、校验与权限,可托管部署需编写和维护接口、配置与备份;规则更可控,迁移责任也更多若学习目标是理解完整请求与规则,且愿承担这些工作,可选 A维护成本超出预算,或需求能被现成规则完整表达时重评 B
完全相同的需求B:浏览器 → 托管身份/数据服务;平台执行访问规则,本人负责规则配置和客户端少写部分后端,仍需验证权限、成本额度、导出能力;受服务能力与接口约束若交付速度和低维护优先,且已验证规则满足需求,可选 B复杂业务超出规则能力,或锁定/费用不可接受时重评 A

两种选择都可成立。最终选择须引用自己的约束和核查证据;“托管”不等于不需设计权限,“自写 API”也不等于必须自己买服务器。后续每章都更新同样的“需求—方案—代价—选择—改选条件”五栏。

依据与选读:C4 model · System context diagram · C4 model · Container diagram · MIT 6.033 · Syllabus & Design Project(2018)

第 3 章 · 数据放在哪里,怎样存才不容易弄错?

目录计划;正文与证据包待制作

关页、重启、写到一半失败,以及两次不同编辑,会发生什么?

先修:第 2 章;SQL 语法按任务提供,不要求先学完整数据库课程。

  1. 3A · 存储:比较浏览器存储、进程内存、文件和数据库;用关页/重启后的已给结果判断持久化边界。
  2. 3B · 关系:用户、笔记和标签;稳定 ID、所有权、必填和唯一约束。只学读懂当前模型所需的 SQL。
  3. 3C · 事务与冲突:哪些多步写入必须整体成功;A、B 从同一旧版本各自编辑时,B 的保存可能覆盖 A。先写“不静默丢失已确认编辑”的业务要求,再比较拒绝旧版本、人工合并或明确允许最后写入覆盖。

核心练习:每小课只交一张表:存储与故障表、模型与约束表、正常/回滚/旧版本编辑结果表。读双窗口记录:A、B 都读到 v1,A 写 v2,B 仍基于 v1 保存。区分两个独立编辑与同一个创建请求的重试。

错例诊断:“已经用了事务或幂等键,因此两个窗口的编辑都不会丢。”找出它遗漏的冲突条件。

参考判断/自评要点:事务的整体成功与去重同一操作,都不自动决定不同编辑的冲突策略。必须点名业务不变量、旧版本如何识别及冲突如何反馈;不能把所有拒绝都叫重试。详细隔离级别、锁与 SQL 实现列为深化选读。

带走的成果:存储选择、数据关系图、三条不变量、一个事务边界与一个冲突判断。

小迁移:改成读书清单:新增一本书、修改短评、扣减最后一个预约名额,哪类操作需要更强的并发规则?预约只作加难情境。

依据与选读:Harvard CS50 SQL · Lecture 2: Designing · PostgreSQL Tutorial · Transactions

第 4 章 · 把功能变成明确的接口和责任

目录计划;正文与证据包待制作

前端说“保存”,后端究竟承诺做什么?

先修:第 1、3 章;核心路线用请求记录,不依赖 Web 框架安装。

  1. 创建、读取、修改的输入输出与错误含义;客户端反馈和服务端验证分工。
  2. 服务端对直接请求仍须验证;前端输入框限制不构成服务端验证证据。
  3. 用请求编号串联日志与响应;列表分页仅解释输入、返回与上限。

核心练习:比较两份记录:表单在发请求前拦住空文本;受控演示中绕过表单直接发送非法输入。对后者同时核对请求体、错误响应、写前和写后数据(内容与条数)。在本人运行的演示环境可选手动复现,不向不明第三方服务试探。

错例诊断:“我点保存看到了红色提示,所以数据库肯定没收到坏数据。”请指出该观察还没有检查哪个边界。

参考判断/自评要点:指出表单可能根本没发请求;服务端证据需包含到达它的非法请求、约定响应和数据未被错误改变的前后对照。用 400 或 422 等约定均可,关键是契约一致且不能只有页面提示。

带走的成果:API 契约、输入边界和可核实的正常/错误案例。

小迁移:为照片说明接口增加长度上限:分别写出浏览器的帮助性提示和服务端必须执行的规则。

依据与选读:MDN · Client-server overview · Helsinki Full Stack Open · Fundamentals of Web apps · Harvard CS50 Web · Lecture 3: Django

第 5 章 · 多人使用后,谁有权看到和修改数据?

目录计划;正文与证据包待制作

登录了,为什么也不能读取别人的笔记?

先修:第 3–4 章;身份系统采用成熟组件,密码学不作为前置。

  1. 认证回答“是谁”,授权回答“对这个对象能做什么”。
  2. 所有者、分享者和游客的最小权限;从服务端验证的身份判断,而不相信请求自报的 owner。
  3. 每个对象请求都检查权限;失败响应不能泄露不该读取的内容。

核心练习:阅读课程提供的两个测试账号请求记录,比较本人 ID、他人 ID 和未登录访问;说明列表与单条接口各自应怎样限制。自行复现只用课程隔离环境;本轮演示不等于已实现生产认证。

错例诊断:“隐藏别人的笔记按钮,再把编号改得很长,就不需要服务端权限检查。”指出直接请求仍然存在的路径。

参考判断/自评要点:用户能构造请求。矩阵须覆盖读/改/删和对象所有者;至少列出未登录、读取他人、修改他人三类拒绝。拒绝后既不泄露正文也不改变数据。

带走的成果:权限矩阵、校验位置,以及至少三条拒绝访问案例。

小迁移:将私人笔记改为“只读分享链接”,写出谁能读取、谁能修改、撤销后如何拒绝的一页契约。

依据与选读:OWASP · Authorization Cheat Sheet · Harvard CS50 Web · Lecture 3: Django

第 6 章 · 保存没有回复,接下来该怎么办?

旧样板素材;完整新章待重写

第一次已经写入,又点一次会怎样?

先修:第 1、3–5 章;先分清同一操作重试与不同编辑的冲突。

  1. 核心判断:超时可能发生在写前或写后;不能把没收到成功等同于没保存。
  2. 核心判断:同一次创建重试需保留操作身份;不同内容、不同操作和不同编辑冲突应分别处理。
  3. 核心判断:哪些错误可重试、次数/总时长上限、何时提示用户结果仍未知。深化实现:去重记录与写入的原子性、并发唯一约束、有效期和保留策略、退避抖动。

核心练习:阅读并使用旧样板的故障模拟,把结论回填第 4 章接口。必做只要求正确判定与有边界的协议;模拟不是网络或数据库并发实测。深化选做才编写并发去重和事务测试。

错例诊断:“超时就换一个新操作编号无限重试;最终成功一次就说明只写入一次。”指出两种可能重复和一个资源边界。

参考判断/自评要点:同一业务意图重发保留身份;新意图使用新身份。说明写前失败和写后丢响应都成立,列出重复、冲突、过期及永久错误路径,并限制请求总量。去重机制不能顺便解决两个独立编辑互相覆盖。

带走的成果:可靠保存协议,包含结果未知、操作身份、有限重试与验收案例。

小迁移:把新增笔记换成发送邮件:重试产生的副作用有什么不同?哪些承诺需要新的证据,不能照搬模拟结论?

依据与选读:PostgreSQL Tutorial · Transactions · AWS Builders’ Library · Timeouts, retries, and backoff with jitter

第 7 章 · 把它交给别人:上线、观察、备份与恢复

目录计划;正文与证据包待制作

“我这里能用”之后,怎样知道别人也能正常使用?

先修:第 4–6 章;核心路线阅读三个小型证据包,不要求注册云账号或搭监控平台。

  1. 7A · 发布:核对网址、版本、配置和一条正常读写路径。部署版本与业务数据分别记录。
  2. 7B · 观察:用一条失败请求及少量延迟、成功率和日志找下一步;区分网址/配置错误与业务逻辑错误。
  3. 7C · 恢复:分别阅读代码回滚记录与数据库在新副本恢复记录,检查恢复后的版本、条数、内容与业务操作。

核心练习:完成三个短任务,每次只回答“看到什么、支持什么、下一步查什么”。提供逐项参考判断与错例,先在证据上判断。真实部署、监控服务接入和备份恢复操作属于选做深化,不把搭平台变成通过本章的条件。

错例诊断:“上线返回 200 就证明用户保存正常;我有备份文件,按回滚按钮就能把误删数据找回。”将两处跳步分别改成可核验步骤。

参考判断/自评要点:发布要验版本和关键业务路径;日志需关联同一请求,不仅看一个 200。回滚代码不自动恢复数据;备份必须通过恢复后检查才证明可用。先在隔离副本验证,记录恢复范围和可能丢失的时间窗口。

带走的成果:发布核对表、一次定位记录、一份代码回滚与数据恢复的核验表。

小迁移:换成家庭菜谱站:页面发布错了与菜谱记录误删各选哪条恢复路径?为每条写一个成功证据。

依据与选读:Google SRE Workbook · Monitoring · PostgreSQL · SQL Dump / Restore · Cloudflare Pages · Rollbacks

第 8 章 · 真的变慢了:先测量,再谈索引和缓存

目录计划;正文与证据包待制作

列表加载慢,应该换服务器、改查询,还是加缓存?

先修:第 3、4、7 章;判断原则简读,性能实现实验按需要选做。

  1. 区分延迟、吞吐和并发;将一次请求分成可观察的阶段。
  2. 在相同数据与访问条件下比较查询和索引,记录读收益、写代价和空间代价。
  3. 先定义可接受陈旧时间和隐私边界,再决定是否缓存及如何验证或失效。

核心练习:从给定的分段耗时和查询记录定位瓶颈,比较一次只改一个因素的结果;选择“改查询/加索引/暂不缓存”并填写决策表。自行造数据和压测属于深化。

错例诊断:“页面慢,先加缓存;任何人的列表都用同一个缓存键。”指出一条缺失的测量和一条隐私风险。

参考判断/自评要点:结论要指向观测到的耗时段;前后对比须保持数据与请求条件可比。缓存决定需包含用户隔离、允许陈旧多久、失效办法和不缓存的可行方案。一次小样本变快不能证明所有负载都改善。

带走的成果:瓶颈证据、可比较的改动前后记录和缓存采用条件。

小迁移:收藏夹的新条目要求立刻可见,而书评统计允许晚几分钟。哪部分更适合缓存,为什么?

依据与选读:Harvard CS50 SQL · Lecture 5: Optimizing · MDN · HTTP caching · Google SRE Workbook · Monitoring

第 9 章 · 任务太久,能让它稍后完成吗?

目录计划;正文与证据包待制作

导出大量笔记时,用户必须一直等着请求吗?

先修:第 3、4、6–7 章;判断原则简读,中间件实现选做。

  1. 同步完成与返回任务 ID 的区别;接受请求不等于任务已经完成。
  2. 按需求比较直接执行、数据库任务表与队列;后台执行程序负责什么。
  3. 处理确认前后崩溃、重复执行、失败重试和积压;对用户展示可解释的状态。

核心练习:在已给时序记录中标出待执行、运行、成功、失败;判断处理程序在副作用前后崩溃时会怎样。保留最简单可行方案,不要求安装 RabbitMQ。

错例诊断:“进入队列就是成功;消息确认之后,任何业务动作都不会重复。”指出任务状态和业务副作用各缺什么证据。

参考判断/自评要点:成功须以最终产物和相应记录为依据;重复投递与业务去重分开设计。说明重试上限、失败可见性以及队列增长时的降载或等待反馈。按需求采用任务表也可以通过。

带走的成果:任务状态图、重复处理规则与积压时的反馈策略。

小迁移:比较生成文件和发送通知:哪种重复处理易于重建,哪种会直接打扰用户?更新重复规则。

依据与选读:RabbitMQ · Work Queues · AWS Builders’ Library · Timeouts, retries, and backoff with jitter

第 10 章 · 为自己的小项目写一份有理由的设计

目录计划;正文与证据包待制作

换一个项目,你能重新做决定,而不是复制笔记应用吗?

先修:第 0–7 章;第 8–9 章按项目需要补入。

  1. 常规项目选收藏夹或习惯记录;预约工具是加难选项,须补名额不超卖等并发不变量与争抢验收。
  2. 贯穿需求、责任与状态、业务不变量、正常/失败路径、方案代价、证据和修订触发条件。
  3. 明确预算与能力假设、已知限制和后续验证;设计稿不冒充已实现系统。

核心练习:独立完成初稿,然后使用课程提供的反例卡自查并修订;不依赖助教或自动评分。反例至少覆盖断网、重试、越权、旧版本编辑、恢复;可选请同伴按同一表反馈。至少保留两种满足相同要求的候选方案。

错例诊断:“我把笔记改名为预约,再加数据库和队列,所以它就是正确设计。”找出会导致两个用户同时拿到最后名额的遗漏。

参考判断/自评要点:按七项自评:需求可验、责任明确、状态可定位、不变量清楚、失败路径完整、候选可比、改选条件有证据。任一项只列产品名或空泛承诺就回到对应章节;多种方案可合格,前提是与约束一致。

带走的成果:有可行备选、有验收证据计划、有改选条件的小项目设计说明。

小迁移:最终换一个新约束(离线使用/多人分享/访问增长),只修改受影响的决定,并解释为何其他部分仍可保留。

依据与选读:C4 model · System context diagram · C4 model · Container diagram · MIT 6.033 · Design Project

每完成一个阶段,换一次小场景

每章的小迁移只改一个问题,阶段任务则检查能否把几章连起来。将结果加到同一份设计档案,不要求做成新的应用。

阶段小迁移自评依据
A · 第 0–1 章后天气网页:画出城市偏好与天气请求的状态路径观察、候选解释、已证实事实是否分开;每条箭头能否说明来源
B · 第 2–5 章后收藏夹:为私人收藏和只读分享写最小设计同约束两方案、所有权、不变量和直接非法请求案例是否完整
C · 第 6–7 章后习惯记录:补上超时重试和误删恢复同一操作与不同编辑是否区分;代码与数据恢复是否各有证据
D · 第 8–9 章后(选做)大量收藏导出:决定先优化同步,还是引入后台任务是否有测量、重复规则及重新选择的条件,而非默认加缓存和队列
E · 第 10 章改变一个真实约束,修订自己的设计能否指明哪些决定受影响,哪些仍成立,并用反例解释

持续更新的项目档案

始终保留七项:①可验收需求和边界;②责任/状态图;③业务不变量;④正常与失败路径;⑤统一五栏决策表;⑥证据、未知与测试办法;⑦促使下一轮修改的条件。无需一次填满,每章只补上有依据的部分。

已核对的教学资料

检索与节名复核日期:2026-10-04。以下均链接到课程作者、教育机构、标准组织或产品官方资料;中文说明为本课程的选材判断。学习者选读用于补充解释,作者备课材料用于校核原理与边界,不要求学生逐本逐课读完。每张卡片给出精读位置与一个阅读问题;默认只读所列小节。DDIA 此次只核对作者官网定位,未获取或复制付费正文。

学习者选读|第 0–1 章

MDN · How the web works ↗

客户端、服务器、URL、DNS 与 HTTP 的职责。先看完整往返,再补充术语;暂不展开协议内部细节。

精读位置:Clients and servers;So what happens, exactly?;HTTP basics

阅读问题:网页程序到了哪台机器才执行?一次成功的 HTML 响应能证明笔记已保存吗?

学习者选读|第 0–1、4 章

MDN · Client-server overview ↗

对比静态文件服务与服务端处理请求。用来解释“有交互”不等于“有保存答案的后端”。

精读位置:Static sites;Dynamic sites;Anatomy of a dynamic request

阅读问题:静态文件服务和业务数据处理分别负责什么?哪些交互可以只在浏览器内完成?

学习者选读|第 1、4 章

Helsinki Full Stack Open · Fundamentals of Web apps ↗

借鉴 Network 面板观察与时序图练习 0.4–0.6。示例含旧式实现,笔记存在内存;不把它当成持久化生产模板。

精读位置:HTTP GET;Forms and HTTP POST;Exercises 0.1.-0.6.

阅读问题:在练习 0.4–0.6 的时序图中,哪些箭头是网络请求,哪些只是浏览器内部处理?

作者备课|先修核对

Full Stack Open · General info ↗

全课需要较好的编程基础及 Web、数据库、Git 知识。这里只选用能拆解讲清的基础材料,不把整门课程列为本课前置。

精读位置:Prerequisites;Course material

阅读问题:哪些先修不能直接假设本课初学者已具备?把一个原练习改成本课任务,还缺哪些解释和现成证据?

作者备课|第 1、4 章

Harvard CS50 Web · Lecture 3: Django ↗

任务清单示例串起路由、表单、请求处理与会话。提取责任划分和数据隔离问题,框架语法另放实现附录。

精读位置:HTTP;Routes;Forms;Sessions

阅读问题:路由、表单校验、会话各负责什么?如果绕过表单,哪些检查仍必须由服务端执行?

学习者选读|第 0、2、10 章

C4 model · System context diagram ↗

先画使用者、系统边界和外部依赖。用于明确系统解决谁的问题,避免一开始就画服务器和技术产品。

精读位置:Scope;Primary elements;Supporting elements

阅读问题:图中有没有把用户、我们负责的系统和外部服务混成一个方框?

作者备课|第 2、10 章

C4 model · Container diagram ↗

下一层再画应用与数据存储的责任和通信。这里的 container 指应用或数据存储,不等于 Docker 容器。

精读位置:Scope;Primary elements;Notes

阅读问题:每个应用或数据存储的责任是什么?图中的 container 为什么不能直接解释成 Docker?

学习者选读|第 3 章

Harvard CS50 SQL · Lecture 2: Designing ↗

从对象、关系进入表、键和约束。改编成用户、笔记、标签的小模型;SQL 基础语法通过补课卡解释。

精读位置:Relating;Table Constraints;Column Constraints

阅读问题:一条笔记属于谁、如何稳定引用、哪种错误数据必须由约束拒绝?

学习者选读|第 3、6 章

PostgreSQL Tutorial · Transactions ↗

通过多步操作建立整体成功、提交和回滚的概念。后续再区分数据库提交与客户端收到响应;隔离级别细节放延伸。

精读位置:3.4. Transactions(提交、回滚和银行转账示例)

阅读问题:哪些步骤必须整体成功?事务提交与客户端收到成功响应是否是同一事件?

作者备课|第 5 章

OWASP · Authorization Cheat Sheet ↗

认证与授权、默认拒绝、每次请求校验和对象级权限。用合法测试账号演示更改笔记编号后的越权风险;身份组件使用成熟实现。

精读位置:Deny by Default;Validate the Permissions on Every Request

阅读问题:用户已经登录,服务端为什么仍须校验这条笔记归谁?检查失败后哪些数据不应变化?

作者备课|第 6 章

AWS Builders’ Library · Timeouts, retries, and backoff with jitter ↗

超时后的副作用不确定性、重试负载和等待策略。将现有样板章放回完整保存流程里,并明确模拟与真实故障测试的差别。

精读位置:Timeouts;Retries and backoff;Jitter

阅读问题:超时留下哪些未知事实?重试为什么可能放大副作用和负载?如何限制次数与总时长?

作者备课|第 7–8 章

Google SRE Workbook · Monitoring ↗

围绕成功率、延迟、日志和可行动的问题诊断。课程保留小系统用得上的观测方法,不要求复制 Google 的监控组织和平台。

精读位置:Sources of Monitoring Data;Metrics with Purpose

阅读问题:为判断一次保存失败,哪些数据能改变下一步行动?哪些数字只是看起来热闹?

学习者选读|第 8 章

Harvard CS50 SQL · Lecture 5: Optimizing ↗

先计时和观察查询计划,再引入索引及其写入、空间成本。训练“慢在哪里”的判断,而非背优化清单。

精读位置:Index;Space Trade-off;Time Trade-off

阅读问题:读取变快的收益来自哪里?新增索引对写入和空间有什么代价?

学习者选读|第 8 章

MDN · HTTP caching ↗

缓存重用、过期、验证,以及私有和共享缓存。先从浏览器缓存入手,再讨论是否真的需要服务端缓存。

精读位置:Types of caches;Fresh and stale based on age;Validation

阅读问题:什么时候可重用旧响应,什么时候应验证?用户私有内容可以进入共享缓存吗?

作者备课|第 9 章

RabbitMQ · Work Queues ↗

耗时任务、worker、确认、重投和持久化。借用失败实验的思路,不把安装消息中间件作为必修前置。

精读位置:Message acknowledgment;Message durability;Fair dispatch

阅读问题:确认前后崩溃分别会怎样?消息持久化为什么不等于业务副作用只发生一次?

作者备课|全课与第 10 章

MIT 6.033 · Syllabus & Design Project(2018) ↗

借鉴设计论证、系统批评和逐次改进设计报告的目标。它有计算机组成与编程先修要求,不能直接缩成零基础目录。

精读位置:Prerequisites;Learning Objectives;Course Structure

阅读问题:原课期待的系统批评与设计论证能力是什么?哪些大学课程先修不应搬成本课门槛?

作者备课|第 10 章

MIT 6.033 · Design Project ↗

参考初稿、反馈、修订和最终报告的结构;本课改为个人小项目,验收依据是需求、证据和取舍是否一致。

精读位置:Design Project Overview;Deliverables

阅读问题:如何把阶段提交与修订变为独立学习者可执行的自评,而不依赖不存在的助教?

作者备课与实现示例|第 7 章

PostgreSQL · SQL Dump / Restore ↗

参考数据库导出、恢复到新库、角色权限和恢复错误的处理。练习须核对恢复后的测试数据与功能;拥有备份文件不等于已验证可以恢复。最终操作步骤随所选数据库调整。

精读位置:SQL Dump;Restoring the Dump

阅读问题:如何在新库中验证恢复结果?保存一个导出文件还缺少哪条可恢复证据?

作者备课与平台示例|第 7 章

Cloudflare Pages · Rollbacks ↗

以现有课件使用的平台说明如何切回成功构建的生产版本;预览部署不能直接作为回滚目标。课程另要求区分程序版本回滚与数据库恢复,具体后端部署步骤须依据最终选型补充。

精读位置:Rollbacks 正文中的回滚操作与目标限制

阅读问题:恢复的是哪次部署的代码?为什么不能据此声称数据库已回到同一时刻?

进阶阅读|完成主线之后

Designing Data-Intensive Applications · 作者官网 ↗

比较不同数据系统设计及其取舍。只作为作者校核和进阶入口,不声称本次已阅读全书,也不要求学习者先读完它。

精读位置:How this book is different;Compare several designs(仅作者官网)

阅读问题:为什么需要比较多种可行方案?这里能核实图书定位,但不能据此声称已读完正文。

第一轮的内容边界与试学安排

按需补课:变量/函数、JSON、SQL 阅读放在第一次用到的位置。终端、Git、部署和手动数据库操作只服务选做深化,不让工具链准备挡住核心学习。

先放进阶:多实例、负载均衡、复制与分片、CAP 与共识、跨地域、微服务、Kubernetes 和隔离级别细节。完成主线后由真实问题引出;不以大规模架构面试题检验入门学习。

章节制作约定:每章必须有完整讲解例子、可追溯的观察或实测记录、至少一个合理错例、分层提示、参考判断和小迁移。真实记录注明环境、步骤、重置方式和前后结果;示意和模拟明确标识。后续正文尚未制作的章节,不把这些教学要求说成已经交付。

下一步验证:先让目标初学者试读第 0–1 章,记录启动障碍、误解、提示使用和用时,再决定第 2–4 章的篇幅与拆分。当前尚无真人试学结果,章节时长与教学效果仍待验证。

资料用途:20 个来源继续保留原始出处,只选读卡片指定部分。作者备课材料用于核对边界,不自动成为学生必读;本课程的中文解释、案例与判断题仍需独立组织。