我也曾是一个"文档通过率"的信徒。
2018年,我负责一个电商中台的重构项目。为了彰显"架构师的专业性",我憋了一周,写出了一份长达60多页的《详细架构设计说明书》。里面从类图到部署图,从数据库范式到非功能性需求,应有尽有。
结果呢?
开发阶段,前端来问接口字段,后端来问Redis缓存策略。我恼火地吼道:“文档第42页不是写了吗?“对方一脸茫然:“太长了,实在找不到,也没时间看。”
项目上线三个月后,系统因为一个配置错误瘫痪了。运维排查时发现,真实的部署架构和我的文档早已大相径庭——那份文档,成了典型的"Write Only Memory”(只写存储器),除了感动我自己,没有任何价值。
这次惨痛教训让我明白一个反常识的道理:在中小团队,越"标准"的文档,死得越快。
对于几十人的研发团队,我们要的不是大厂那种面面俱到的"八股文”,而是能保命、能落地、能沟通的"作战地图"。今天,我把这两年一直在用的"极简文档三件套"分享给你。
一、 扔掉类图,先画一张"系统全景图"
很多新手架构师一上来就喜欢钻进代码细节,画复杂的UML类图。相信我,代码变动比你画图快多了,这种图画完即作废。
你的第一页文档,必须是Context Map(系统上下文图)。
我们要解决的第一个痛点是:新来的兄弟,哪怕不看代码,能不能在5分钟内知道我们在做什么?
真实案例
去年有个外包项目交接,接手的负责人小张在那骂娘。前任留下了几百个Java文件,却没告诉他这个系统依赖了哪些外部服务。结果上线第一天,因为防火墙没开通某第三方支付的IP白名单,支付全挂,老板差点掀桌子。
解决方案:C4模型的Level 1
不要被C4模型这个术语吓到,其实就是一张"关系图"。你只需要画出三个东西:
- 用户:谁在用系统?(运营?C端用户?管理员?)
- 核心系统:我们的黑盒子。
- 外部依赖:我们连了谁?(微信API、阿里云OSS、友商的数据接口)。
这就够了。不需要涉及任何技术选型。
实操建议:
我习惯用 PlantUML 或 Mermaid 来画,因为它们是代码,可以直接存在Git里。
graph TD
User[C端用户] -->|下单/查询| OrderSystem[核心订单系统]
Admin[运营人员] -->|管理商品| OrderSystem
OrderSystem -->|发送通知| EmailService[第三方邮件服务]
OrderSystem -->|支付请求| PaymentGateway[微信/支付宝]
OrderSystem -->|读写数据| DB[(主数据库)]
这张图贴在README的第一页,价值超过1万行代码注释。
二、 核心链路,只画"时序图"
有了全景图,接下来要解决最复杂的业务逻辑问题。
很多项目烂尾,不是因为技术难,而是因为状态流转不清。比如一个订单,从"创建"到"支付"再到"发货",中间涉及库存扣减、优惠券核销、积分累加。
如果只靠口头沟通,后端说"我以为你扣了库存",前端说"我以为你回滚了",最后数据对不上,产生"幽灵库存"。
真实案例
如果你经历过"双十一"或者大促,就知道我在说什么。我曾见过一个拼团项目,因为没有梳理清楚"拼团失败"后的退款时序,导致用户钱退了,库存却没释放,最后不得不人工跑脚本修数据,整个组通宵了两天。
解决方案:关键业务时序图
别把所有接口都画时序图,那是浪费生命。只画核心链路(Core Path)。
这一页文档,是为了救命的。当出现Bug时,拿着这张图去对日志,一抓一个准。
我在团队里有个硬性规定:涉及到资金流转、状态变更超过3步的业务,不画时序图不许写代码。
你可以不用标准的UML规范,但必须体现出:
- 参与者(前端、后端、数据库、第三方)。
- 方向(请求还是响应)。
- 关键动作(特别是写操作)。
避坑提示:千万别想着用自动生成工具从代码反向生成时序图,生成的图往往乱得像盘丝洞,根本没法看。必须人脑梳理,这本身就是设计的过程。
三、 拒绝"口头约定",用ADR记录决策
这是中小团队最容易忽视,但也是导致"技术债"堆积如山的罪魁祸首。
你有没有遇到过这种情况: 接手一段老代码,发现里面用了一个极度冷门的框架,或者写了一段匪夷所思的死循环逻辑。你想重构,但不敢动,因为你不知道前人为什么要这么写——也许是为了绕过某个诡异的Bug?
如果是大厂,可能有繁琐的审批流程留痕。但在中小团队,往往是两个大佬在楼下抽烟时,就把技术选型定了:“就用MongoDB吧,那个快。”
两年后,因为数据一致性问题要迁回MySQL,团队为此付出了三个月的重构代价。
解决方案:轻量级ADR(架构决策记录)
不要写长篇大论的方案对比。在项目根目录下建一个 doc/adr 文件夹,按编号存放Markdown文件。
一个ADR只需要包含4个要素:
- 背景:遇到了什么问题?(例:高并发下订单ID重复)
- 选项:看了哪些方案?(UUID vs 雪花算法 vs 数据库自增)
- 决策:最后选了哪个?(选了雪花算法)
- 后果:这个选择带来了什么代价?(需要依赖NTP时间同步,服务器时间回拨会报错)
实操模板:
# ADR-005: 采用雪花算法生成订单ID
## 状态
已接受
## 背景
原有的数据库自增ID在大促分库分表时产生冲突,且容易暴露业务量。
## 决策
使用Twitter的雪花算法(Snowflake)。
## 后果
优点:生成速度快,甚至不需要连库,天然按时间排序。
缺点:强依赖机器时钟。
应对:运维需确保服务器开启NTP同步,若时钟回拨超过5ms,服务自动熔断。
这个文档不需要多漂亮,关键是记录了"为什么"。这是给后来者留下的"锦囊",也是给自己的"免责声明"。
结语
架构文档的本质,不是为了证明你懂得多,而是为了降低沟通成本和传递设计意图。
对于中小团队,“够用"即是正义。
这时候你可能会纠结:这些文档放在哪里?
- A方案:放在Confluence/Wiki等知识库系统里,方便非技术人员看。
- B方案:直接放在代码仓库的
/docs目录下,随代码一起版本控制。
你更倾向于哪种方案?为什么?欢迎在评论区告诉我你的选择。
最后,如果你想摆脱"文档地狱”,建议下周一上班就开始尝试以下三个行动:
- 做减法:打开你现有的架构文档模板,删掉那些你从来不填或者填了也没人看的章节(比如什么"参考资料"、“术语定义”)。
- 补全景:花30分钟,用纸笔或者Mermaid,画出当前项目的"系统全景图",贴在项目的README里。
- 记决策:下次因为技术分歧争论不休时,不再只凭嗓门大做决定,试着写下第一篇ADR。