建立技术文档的编写标准,确保文档有用、可维护、与代码同步,避免"没有文档"或"文档过时比没文档更糟"的问题。
- 项目初始化时搭建文档结构
- 完成功能后补充文档
- 架构/接口发生变更时
- 新成员加入需要上手指南
- 文档审查(与代码审查同步)
| 类型 | 读者 | 内容 | 更新频率 |
|---|---|---|---|
| README | 所有人 | 项目简介、快速开始、技术栈 | 每次重大变更 |
| 架构文档 | 开发者 | 系统设计、模块关系、数据流 | 架构变更时 |
| API 文档 | 前端/第三方 | 接口定义、参数、示例 | 接口变更时 |
| 操作手册 | 运维/部署者 | 部署步骤、配置说明、故障处理 | 部署流程变更时 |
| 决策记录 (ADR) | 开发者 | 为什么这样设计 | 决策时 |
| CHANGELOG | 所有人 | 版本变更内容 | 每次发布 |
| 代码注释 | 开发者 | 复杂逻辑的 why | 随代码更新 |
每个项目/模块的 README 必须包含:
# 项目名称
> 一句话描述项目做什么
## 快速开始
### 环境要求
- Node.js >= 18
- PostgreSQL >= 15
### 安装与运行
```bash
# 克隆、安装、配置、启动的命令- 前端:...
- 后端:...
- 数据库:...
(关键目录说明)
(参见 .env.example)
(如何运行测试、lint 等)
(简述部署方式或链接到操作手册)
### 第三部分:代码注释规范
**何时写注释:**
- 解释 **为什么**(Why),不是做了什么(What)
- 复杂算法/业务逻辑
- 非显而易见的设计决策
- 临时方案/已知问题(TODO/FIXME/HACK)
- 公共 API 的参数和返回值
**何时不写:**
- 代码本身已经清晰的(好命名 > 注释)
- 注释掉的代码(直接删除,Git 有历史)
- 日志式注释("2024-01-01 张三修改")
**注释格式:**
```typescript
// 单行注释:解释紧接着的下一行代码
/**
* 函数/类的文档注释
* @param email - 用户邮箱
* @returns 是否发送成功
* @throws {ValidationError} 邮箱格式不正确时
*/
// TODO: [描述] — 待完成的功能
// FIXME: [描述] — 已知问题待修复
// HACK: [描述] — 临时方案,需要更好的解决
文档即代码原则:
- 文档和代码在同一个 PR 中更新
- 代码审查时同时审查文档变更
- CI 中可以检查文档是否过时(如链接检查)
维护触发点:
- 新增功能 → 更新 README / API 文档
- 架构变更 → 更新架构文档 + 写 ADR
- 部署流程变更 → 更新操作手册
- 发布版本 → 更新 CHANGELOG
- 发现文档错误 → 立即修复
定期审查:
- 每月检查一次文档准确性
- 删除过时内容
- 补充缺失内容
背景:规格 / 版本记录 / 台账这类历史文档承载审计链 —— 它们的旧文本本身就是证据(「当时是怎么写的」决定了后来能不能对上账)。批 7 的文档回写统一采用 「原文一字不改 + 就地加注」:更正、作废、角色变更、状态回退一律以加注表达,旧句原样留档。
规则:
- 🔴 唯一合法形态 = 「原文 + 就地加注」。不得字面删除 / 改写历史句;更正以「🔻 …(原文保留)」块表达,使原文可读、结论唯一。
- 🔴 机器判据 = 「diff 只有
+行、−列为 0」(git diff --numstat的删除列 +git diff的^-行数)。⇒ 派单里凡出现「删掉 / 移除 / 改成」这类字面删改措辞,一律按「加注作废 / 加注更正」执行,并在报告里指出该措辞与「−列为 0」的冲突。不要为迁就措辞去破该判据。 - 🔴 「不改历史原文」不能只看
numstat删除列 —— 回写类单元必须另做「标题 / 锚逐条对拍」(HEAD的^#{1,4}\s行 vs 工作树逐条比对)。批 7 已发生一次首版误删小节标题、靠标题对拍自捉的事故(numstat当时读作+150/−0,掩盖了那次删除)。 - 数字与结论必须带时点与来源:同一指标在不同时点的两个读数都留(例:「上游时点 578 文件 / 295–299 = 20」→「重跑时点 579 / 21」),并给出差额归因;不得只留一个使历史不可复算。
- 引述纪律:入库文档里凡转述他人给的数字 / 路径,必须标明来源;若事后证伪,保留错文 + 就地加注更正,并登记「错文曾被入库」这一事实(本批已发生一次:控制方的引述错误被逐字抄进入库文档)。
遵循 Keep a Changelog 格式:
# Changelog
## [1.2.0] - 2024-03-15
### Added
- 用户头像上传功能
- 订单导出为 CSV
### Changed
- 优化列表页加载速度(减少 40% 请求)
### Fixed
- 修复并发下订单号重复问题
### Security
- 升级 jsonwebtoken 修复 CVE-2024-xxxx好的文档应该:
- 准确 — 与实际代码/行为一致
- 完整 — 覆盖读者需要的所有信息
- 简洁 — 不废话,直达要点
- 可操作 — 读者能按步骤执行
- 有示例 — 代码示例胜过千言万语
- 有结构 — 标题层级清晰,可快速定位
归档定义:已实施完成、不再活跃维护的文档,移入 docs/archive/YYYY-MM-DD/ 快照(git mv 保留文件历史)。
判定标准:可归档 = 已落地实施的方案/设计文档、已验收的实施文档、已验证的知识卡(索引标 [ ] 已归档)、被取代的 ADR、已发布版本的规划文档、已执行的 spec/plan;不归档 = standards/、templates/、knowledge/index.md、生效 ADR、CHANGELOG、README、versions/ 内容。
流程(日收工,< 15 分钟):① 整理昨日归档 tech-debt.md(已偿标 closed,未偿继承 carried)② 扫描今日提交登记新债务 ③ git mv 已实施文档入今日归档夹 ④ 写当日 README 索引 ⑤ 更新活跃区索引(链接改指归档路径 + 标 [ ] 已归档)⑥ 原子提交。
只读约束:技术债只认最新归档的 tech-debt.md;除最新一日外归档文件禁止修改。
详见 归档机制说明。
- README 包含快速开始指南
- 环境变量有 .env.example 说明
- 公共 API 有文档注释
- 复杂逻辑有 why 注释
- 无注释掉的代码残留
- CHANGELOG 随版本更新
- 架构变更有对应文档更新
- 文档中的代码示例可运行
- 无过时的链接/截图
- 文档与代码在同一 PR 中更新
| 输出物 | 格式 | 存放位置 |
|---|---|---|
| README | Markdown | 项目/模块根目录 |
| 架构文档 | Markdown + 图 | 按需创建 docs/architecture/(或并入 Foresight/) |
| API 文档 | OpenAPI / Markdown | 按需创建 docs/api/(或并入对应服务文档) |
| CHANGELOG | Markdown | 项目根目录 |
| 操作手册 | Markdown | 按需创建 docs/operations/(或并入 server-ops 规范) |
| 误区 | 正确做法 |
|---|---|
| 写完代码不写文档 | 文档是交付物的一部分 |
| 注释解释"做了什么" | 注释解释"为什么这样做" |
| 文档写完就不管了 | 代码变文档也要变 |
| 注释掉代码留着 | 删掉,Git 有历史 |
| 文档全是文字无示例 | 代码示例 > 纯文字描述 |
| 一开始就写完美文档 | 先写最小可用,迭代完善 |