第二章:架构文档的目的与读者
好,咱们接着聊。上一章我们讲了架构文档到底是个什么东西。这一章,我想聊聊一个更根本的问题——我们为什么要写它?写给谁看?又在什么场景下看?
说实话,我见过不少团队,架构文档写得比小说还厚,结果没人看。为什么?因为写的人没想清楚这三个问题。我自己也踩过这个坑,所以今天把这部分单独拎出来讲。
2.1 为什么需要架构文档
你可能觉得,代码就是最好的文档。嗯,这话对了一半。代码确实能告诉你“做了什么”,但它说不清楚“为什么这么做”。
我个人的习惯是,把架构文档看作团队的共享心智模型。说白了,就是让所有人对系统的理解保持一致。
架构文档的核心价值:
- 沟通的桥梁——不同角色之间,靠它对齐认知
- 决策的记录——为什么选A方案而不是B,白纸黑字写下来
- 演化的基线——以后改东西,有个参照物
- 入门的向导——新人来了,不用追着你问东问西
我在项目中遇到过一件事,印象特别深。有一次,一个同事改了一段刹车压力调节的代码,他觉得只是优化了算法。结果测试的时候,ABS在低附路面上的表现完全变了。后来一查,他根本不知道原来的设计里有一个安全回退机制,而那个机制在架构文档里写得清清楚楚。你说,如果文档没人看,或者压根没写,这锅谁来背?
所以,架构文档不是写给领导看的,也不是为了应付评审。它是团队的救命稻草。
2.2 文档的读者是谁
这个问题,我建议你写文档之前先想清楚。不同的人,关心的东西完全不一样。
| 读者角色 | 他们关心什么 | 文档里该有什么 |
|---|---|---|
| 系统架构师 | 整体结构、模块划分、接口定义 | 架构视图、组件图、接口规范 |
| 软件工程师 | 具体模块的职责、数据流、状态机 | 详细设计、时序图、伪代码 |
| 测试工程师 | 关键路径、异常处理、测试策略 | 测试用例设计、边界条件、故障注入点 |
| 项目经理 | 技术风险、依赖关系、交付节奏 | 技术决策记录、依赖清单、里程碑 |
| 功能安全工程师 | 安全机制、故障响应、ASIL等级 | 安全分析、FMEA、故障树 |
| 新人/维护者 | 系统全貌、关键概念、常见陷阱 | 术语表、快速入门、避坑指南 |
你看,同样是ABS的架构文档,给不同的人看,侧重点完全不同。我曾经见过一份文档,把所有内容混在一起,结果软件工程师嫌太粗,项目经理嫌太细,谁都不满意。
我的建议是:按读者分层。核心章节写给所有人看,但每个小节可以标注“本文主要面向XXX读者”。这样大家各取所需。
2.3 文档的阅读场景
这个问题容易被忽略。你想想看,读者是在什么情况下翻开这份文档的?
- 场景一:系统设计阶段
架构师和工程师一起讨论方案。这时候文档是讨论的载体。我建议用图为主,文字为辅。一张清晰的架构图,胜过千言万语。 - 场景二:代码评审阶段
评审者需要对照文档,检查实现是否偏离了设计。这时候文档要精确、可追溯。每个模块的接口、行为、约束,都得写清楚。 - 场景三:问题排查阶段
线上出了bug,工程师翻文档找线索。这时候文档要快速定位。我习惯在文档里加一个“常见问题”章节,把以前踩过的坑列出来。 - 场景四:新人入职阶段
新人啥都不懂,文档是他的救命稻草。这时候文档要循序渐进,从整体到局部,从概念到细节。 - 场景五:功能安全评审
这是最严格的场景。文档要完整、无歧义,每一个安全机制都要有对应的说明和验证方法。
一个小技巧: 我写文档的时候,会在每个章节开头加一个“阅读指引”,告诉读者“如果你只有5分钟,请读这一节;如果你在排查问题,请跳到第X节”。这样能节省大家的时间。
2.4 避坑指南
讲了这么多,最后分享几个我亲身踩过的坑。
我曾经犯过的错:
- 坑一:文档写得太完美——恨不得把所有细节都画出来。结果文档比代码还复杂,没人愿意看。后来我学会了“80%原则”:覆盖核心场景,留20%的细节让代码说话。
- 坑二:读者定位模糊——一份文档想讨好所有人。结果谁都不满意。现在我写文档前,会先问自己:“这篇文档的第一读者是谁?”
- 坑三:只写“是什么”,不写“为什么”——比如“这里用了状态机”,但没写“为什么用状态机而不是查表”。后来别人改代码的时候,完全不知道当初的权衡,很容易改出问题。
- 坑四:文档和代码脱节——架构图画得漂漂亮亮,代码里根本不是那么回事。嗯,这个最要命。我现在的做法是:每次迭代结束,花半小时更新文档。不追求完美,但至少保证关键部分是对的。
好了,这一章就到这里。总结一下:架构文档的目的,是让团队对系统有一致的理解;读者是多元的,要分层对待;阅读场景不同,文档的侧重点也不同。 下一章,我们聊聊架构文档的具体内容结构,也就是到底该写些什么。