1. 从“diagram-design”这个标题说起:它到底在解决什么问题
第一次看到“diagram-design”这个标题,很多人会下意识觉得它只是“画图”或者“做设计”。但如果你真正在技术团队、产品团队或者咨询交付场景里待过,就会明白:图不是画给自己看的,而是用来降低沟通成本的。一张架构图、一张流程图、一张时序图,背后承载的是系统边界、数据流向、角色职责和异常分支。图画错了,代码就可能写歪;图讲不清,评审会就变成扯皮会。
“diagram-design”这个项目,核心就是围绕“如何把复杂逻辑用图表达清楚”这件事展开。它不是一个单纯的绘图工具教程,也不是某个冷门软件的说明书,而是一套从需求拆解、图形选型、布局规范、工具落地到团队协作的完整方法论。它适合谁看?我认为有三类人最值得花时间:第一类是需要频繁输出技术方案的后端、前端、运维和算法工程师;第二类是需要把业务逻辑翻译成流程图的 product owner 和业务分析师;第三类是做技术写作、文档维护、开源项目说明的开发者关系同学。
为什么这个标题值得单独拿出来讲?因为大部分团队在“画图”这件事上,长期处于一种“能用就行”的状态。结果就是:有人用 PPT 画架构图,有人用在线白板画流程图,有人直接手绘拍照发群里。短期看效率很高,长期看维护成本极高。改一个模块名,要翻五张图;换一个数据库,三张图全部过期。diagram-design 要解决的,正是“图与系统同步演进”的问题,而不是单纯追求图好不好看。
我自己的经验是,图的设计质量直接决定了一次技术评审的走向。图清晰,评审焦点会落在方案本身;图混乱,大家会先花二十分钟争论“这个箭头到底代表什么”。所以这篇文章我会从设计思路、核心细节、实操过程、常见问题四个维度,把 diagram-design 这件事拆开讲透,尽量让你看完就能在自己的项目里落地。
2. 内容整体设计与思路拆解:为什么图也需要“设计”
2.1 图的本质是信息压缩,不是美术创作
很多人把 diagram design 理解成“把图做得好看一点”,这个方向一开始就偏了。图的本质是信息压缩:把几百行代码、十几个服务、几十个接口调用,压缩成一张可以在几分钟内被理解的视觉结构。压缩就意味着取舍,取舍就意味着必须明确“这张图到底要回答什么问题”。
我在实际项目里总结过一个判断标准:如果一张图不能在一分钟内让目标读者说出“我大概知道系统怎么跑了”,那这张图的设计就是失败的。注意,这里说的是“目标读者”,不是所有人。给运维看的部署图和给产品经理看的业务流程图,即使描述的是同一个系统,也应该是两张完全不同的图。diagram-design 的第一原则就是:先定读者,再定图型,最后才定工具。
这个顺序不能反。我见过太多团队先选工具,比如“我们统一用某在线白板”,然后所有图都往一个模板里塞。结果业务流程图里出现了数据库表结构,架构图里出现了排期时间线。工具没有错,错的是设计顺序。正确的做法是:先问这张图给谁看、看完要做什么决策,再决定用流程图、时序图、状态图还是 C4 模型图。
2.2 图型选型背后的逻辑:不同问题用不同“镜头”
图型选型是 diagram-design 里最容易被忽视、但影响最大的一环。我习惯把图型比作“镜头”:广角镜头看全局,微距镜头看细节,长焦镜头看交互。选错镜头,不是拍不清楚,而是根本拍不到重点。
下面这张表是我在团队内部常用的图型选型对照,直接抄作业就行:
| 图型 | 回答的核心问题 | 适合读者 | 典型场景 | 不适用场景 |
|---|---|---|---|---|
| 流程图 | 事情按什么顺序发生 | 产品、业务、测试 | 审批流、订单状态流转 | 多服务并发调用 |
| 时序图 | 谁在什么时候调用了谁 | 开发、架构 | 接口交互、鉴权流程 | 业务规则说明 |
| 架构图 | 系统由哪些部分组成 | 架构、运维、新人 | 服务拆分、部署拓扑 | 详细代码逻辑 |
| 状态图 | 一个对象有哪些状态 | 开发、测试 | 订单、工单、任务状态 | 跨系统数据流 |
| ER 图 | 数据之间怎么关联 | 后端、DBA | 表结构设计、数据建模 | 运行时调用关系 |
| C4 模型图 | 系统在不同层级长什么样 | 架构、技术管理 | 技术方案评审、文档 | 快速沟通草图 |
这张表的价值在于:它把“画什么图”从个人偏好变成了可讨论的决策。比如有一次我们讨论一个支付回调流程,有人想画架构图,有人想画流程图。最后对照这张表发现,大家真正关心的是“回调失败后怎么重试、谁来补偿”,这其实是状态图加时序图的组合,而不是架构图。选对图型,评审效率至少提升一半。
2.3 为什么我不推荐一开始就追求“大而全”
新手做 diagram design 最常见的误区,是想用一张图把所有东西都讲清楚。结果就是图越画越大,箭头越连越多,最后变成一张“蜘蛛网”。读者看完的第一反应不是“懂了”,而是“算了”。
我的建议是:一张图只回答一个问题。如果一个问题需要三个答案,那就画三张图,然后用一个总览图把它们串起来。这个思路在 C4 模型里体现得特别明显:Context 图只讲系统和外部的关系,Container 图只讲系统内部有哪些可部署单元,Component 图只讲某个容器内部的组件。每一层都克制,整体反而清晰。
这种“分层克制”的设计思路,还有一个额外好处:图可以独立演进。当某个服务的内部实现变了,只需要改 Component 图,Context 图和 Container 图不动。如果一开始就画成一张大图,任何一个小改动都会导致全图重画,维护成本直接爆炸。
3. 核心细节解析与实操要点:从需求到成图的完整拆解
3.1 需求拆解:先写“图的目标声明”
在动手画任何图之前,我会强制自己写一句话,叫“图的目标声明”。格式很简单:这张图给谁看,看完之后他们要能回答什么问题。比如:“这张时序图给新加入的后端开发看,看完之后他们要能回答订单创建时经过了哪些服务、每个服务做了什么校验、失败时如何回滚。”
这句话看起来简单,但它能挡住 80% 的无效绘图。因为一旦写清楚,你就会发现很多原本想放进去的内容其实和目标无关。比如“订单创建时序图”里,就不需要放数据库索引设计,也不需要放前端按钮样式。目标声明是图的边界,也是图的灵魂。
写目标声明时,我建议用“动词+对象”的结构,避免模糊词汇。不要说“让读者了解系统”,而要说“让读者能画出调用链路”或者“让读者能定位失败环节”。越具体,后面画图越轻松。
3.2 布局规范:让读者的眼睛有路可走
图的内容对了,布局不对,读者照样看不懂。布局的核心不是“好看”,而是引导视线。人看图是有习惯的:从左到右、从上到下、从整体到局部。好的 diagram design 会顺应这个习惯,而不是对抗它。
我在布局上总结了几条硬规则,实测下来非常稳:
- 主流程走中线:把最重要的调用链放在画面中央,从左到右或从上到下,不要让读者找。
- 异常分支走侧边:失败、重试、补偿这些分支放在主流程下方或右侧,用不同颜色或线型区分。
- 同层元素对齐:同一层级的服务、组件、角色,尽量保持大小和对齐一致,减少视觉噪音。
- 箭头少交叉:如果箭头交叉超过三处,说明这张图该拆了,或者该换图型了。
- 留白是功能:不要为了省空间把元素挤在一起,留白能让读者区分模块边界。
注意:布局规则不是审美偏好,而是认知负荷管理。每多一个交叉箭头,读者就多一次“这个线从哪来”的停顿。
还有一个细节:文字方向尽量统一。我见过一些图,有的标签横着写,有的竖着写,有的斜着写,读者需要不断旋转脑袋。除非空间实在不够,否则所有文字保持水平。这个细节很小,但对阅读体验影响很大。
3.3 工具选型:没有最好,只有最合适
工具选型是 diagram-design 里争议最大的部分。有人坚持用代码画图,有人坚持用拖拽工具,有人直接用 PPT。我的观点是:工具要匹配图的寿命和维护频率。
如果这张图是一次性的,比如评审会上临时画个草图,那在线白板或者纸笔最快。如果这张图要进文档、要长期维护、要跟着代码一起版本管理,那就应该用“图即代码”的工具。如果这张图要给非技术同学频繁编辑,那就选拖拽式工具,降低门槛。
下面是我用过的几类工具对比,按维护场景分类:
| 工具类型 | 代表形态 | 优势 | 劣势 | 适合场景 |
|---|---|---|---|---|
| 图即代码 | 文本描述生成图 | 可版本管理、易 diff、易批量改 | 学习曲线陡、布局控制弱 | 架构图、时序图、长期文档 |
| 拖拽式 | 在线白板、桌面绘图 | 上手快、自由度高 | 难版本管理、易过期 | 评审草图、业务流程图 |
| 文档内嵌 | 文档工具自带绘图 | 和文档同步、分享方便 | 图型受限、复杂图难画 | 轻量流程、简单架构 |
| 代码生成 | 从代码或配置生成 | 和系统同步、不易过期 | 前期投入大、定制难 | 服务依赖、数据模型 |
我自己的组合是:长期维护的架构图和时序图用图即代码,评审草图用在线白板,业务流程图和产品一起用文档内嵌工具。这样既保证了核心图的可持续性,又不牺牲沟通效率。
3.4 命名与标注:图的可读性一半靠文字
很多人画图只关注图形,忽略了文字。实际上,图的可读性一半靠命名和标注。一个服务叫“ServiceA”,另一个叫“订单服务”,读者的理解成本完全不同。我在团队里推行的命名规则是:用业务语言命名,用技术语言标注。
比如一个服务,图上写“订单服务”,旁边用小字标注“Java / MySQL / 3 副本”。这样业务同学能看懂它是干什么的,技术同学能看懂它怎么部署的。如果反过来,图上写“order-svc-01”,业务同学直接懵,技术同学还得猜它和订单的关系。
标注还有几个实用技巧:
- 箭头标注动词:不要只画箭头,要写“创建订单”“扣减库存”“发送通知”,让读者知道这条线在干什么。
- 关键参数上图标:比如超时时间、重试次数、并发量,这些数字放在图上比放在文档里更容易被记住。
- 颜色有含义:不要为了好看而用颜色。比如红色代表失败路径,绿色代表成功路径,灰色代表异步,一旦定了就在全团队统一。
提示:如果你的图需要配一大段文字才能看懂,那说明图本身没设计好。图应该能独立表达核心信息,文字只做补充。
4. 实操过程与核心环节实现:从零画出一张能用的架构图
4.1 第一步:收集素材,但不要急着画
画图之前,我会先做一轮信息收集。注意,这里不是让你把代码全读一遍,而是带着目标声明去收集。比如目标声明是“让新后端能定位订单创建失败环节”,那我就只需要收集:订单创建涉及哪些服务、每个服务的职责、调用顺序、失败处理逻辑、日志位置。
收集素材时,我习惯用纯文本先列出来,不画图。比如:
- 网关接收请求,做鉴权
- 订单服务创建订单记录,状态为“待支付”
- 订单服务调用库存服务锁定库存
- 库存服务返回锁定结果
- 如果锁定失败,订单服务更新状态为“已取消”
- 如果锁定成功,订单服务调用支付服务生成支付单
- 支付服务返回支付单号
- 订单服务更新订单状态为“待支付”,返回给网关
这个列表看起来很简单,但它就是时序图的骨架。先有文字,再有图,这个顺序能避免你在画图时被布局带偏。
4.2 第二步:确定图型,画出第一版草图
根据上面的素材,目标读者是后端开发,要定位失败环节,所以时序图是最合适的。流程图也能表达顺序,但时序图能更清楚地展示“谁调用谁”和“失败发生在哪一步”。
第一版草图不需要追求完美,我通常用纸笔或者在线白板快速画。重点是把参与者和调用顺序摆出来:
- 参与者:客户端、网关、订单服务、库存服务、支付服务
- 调用顺序:按上面的 1 到 8 步
- 失败分支:第 4 步失败后,走第 5 步
画完第一版后,我会做一次“读者模拟”:假设我是一个新来的后端,只看这张图,能不能回答“如果库存锁定失败,订单状态会变成什么”。如果能,说明核心信息在了;如果不能,说明缺了关键标注。
4.3 第三步:用图即代码工具落地,保证可维护
草图确认后,我会用图即代码工具把它转成正式版本。这里以常见的文本绘图语法为例,展示关键结构:
客户端 -> 网关: 创建订单请求 网关 -> 订单服务: 鉴权通过,转发请求 订单服务 -> 订单服务: 创建订单记录(待支付) 订单服务 -> 库存服务: 锁定库存 库存服务 --> 订单服务: 锁定成功 订单服务 -> 支付服务: 生成支付单 支付服务 --> 订单服务: 返回支付单号 订单服务 -> 订单服务: 更新状态为待支付 订单服务 --> 网关: 返回订单信息 网关 --> 客户端: 返回创建成功如果库存锁定失败,我会单独画一个分支图,或者在同一个图里用不同颜色标注。关键原则是:主流程和异常流程不要混在一起,否则读者会分不清哪条是正常路径。
用图即代码的好处是,这张图可以进 Git 仓库,和代码一起 review。改一个服务名,只需要改一行文本,重新生成即可。图的维护成本从“重画”变成了“改字”,这是长期可用的关键。
4.4 第四步:评审与迭代,让图接受真实反馈
图不是画完就结束了,它需要经过评审。我通常会找两类人看:一类是目标读者,比如新后端;另一类是不懂这个系统的人,比如产品经理。目标读者能告诉你“信息够不够”,不懂的人能告诉你“表意清不清楚”。
评审时我会问三个问题:
- 你能说出这个流程的主路径吗?
- 你能指出失败时系统会怎么处理吗?
- 有没有哪个箭头或标签让你困惑?
根据反馈迭代,通常两到三轮就能稳定。不要怕改图,怕的是图错了没人发现。我见过太多团队把图当“交付物”,画完就锁进文档,结果三个月后没人敢用。图应该是活的,跟着系统一起长。
4.5 参数与细节补充:让图真正可落地
一张架构图或时序图,如果只有框和箭头,价值有限。真正好用的图,会带上关键参数。比如:
- 超时时间:库存服务调用超时 500ms
- 重试策略:支付服务失败重试 2 次,间隔 1s
- 并发限制:订单服务最大并发 200
- 数据一致性:库存锁定采用 TCC 或本地消息表
这些参数不需要全放,但关键路径上的参数一定要标。因为读者看图的目的是做决策或排查问题,没有参数,图就只是“示意图”,不是“工程图”。
注意:参数标注要克制。一张图标注超过 10 个数字,读者就会开始忽略。只标那些“不知道就会做错决策”的参数。
5. 常见问题与排查技巧实录:那些年我踩过的图坑
5.1 图过期了怎么办:从“定期更新”到“自动同步”
图过期是 diagram-design 最大的痛点。我试过定期更新,但靠人自觉基本不靠谱。后来我改成两条腿走路:核心图自动同步,辅助图定期清理。
核心图,比如服务依赖图,可以从配置文件或服务注册信息生成。每次服务上下线,图自动更新,不需要人工干预。辅助图,比如业务流程图,如果三个月没人看,就直接归档,不要留在主文档里误导人。过期的图比没有图更危险,因为它会让人做出错误判断。
5.2 图太复杂看不懂:拆图比简化更有效
遇到复杂系统,很多人第一反应是“简化”。但简化容易丢信息,丢信息又会导致误解。我的经验是:拆图比简化更有效。把一张大图拆成三张小图,每张回答一个问题,然后用一个总览图串联。这样既保留了细节,又降低了单张图的认知负荷。
拆图的维度可以按层级拆(C4 模型)、按流程阶段拆(下单前、下单中、下单后)、按读者拆(业务视角、技术视角、运维视角)。拆图的关键是每张图都能独立成立,而不是变成“图 1-1”“图 1-2”这种碎片。
5.3 团队图风格不统一:定最小规范,不做审美警察
团队里每个人画图风格不同,这是常态。强行统一审美,成本高且容易引发抵触。我的做法是:定最小规范,只管影响理解的要素。比如:
- 必须写图的目标声明
- 必须标注箭头含义
- 必须区分同步和异步调用
- 必须标注失败路径
至于颜色、字体、圆角还是直角,不强制。规范是为了沟通,不是为了好看。最小规范执行三个月后,团队自然会形成一些默契,这时候再慢慢收敛风格,阻力会小很多。
5.4 常见问题速查表
下面这张表是我在实际项目中整理的高频问题和处理方式,遇到类似情况可以直接对照:
| 问题现象 | 可能原因 | 排查思路 | 处理建议 |
|---|---|---|---|
| 读者说看不懂主流程 | 主流程被分支干扰 | 检查主流程是否走中线 | 把异常分支移到侧边或单独成图 |
| 图改一次要半天 | 工具不支持文本编辑 | 检查是否用拖拽工具画核心图 | 核心图迁移到图即代码工具 |
| 图上有信息但没人看 | 图没有明确目标声明 | 问读者“看完能回答什么” | 重写目标声明,删无关内容 |
| 箭头交叉太多 | 图型选错或该拆图 | 数交叉点,超过三处就拆 | 换图型或按层级拆分 |
| 图与代码不一致 | 缺少同步机制 | 检查图是否可自动生成 | 核心图接配置或注册中心 |
| 评审时争论箭头含义 | 标注不清晰 | 检查箭头是否有动词标注 | 补标注,区分同步异步 |
5.5 独家避坑技巧:图是给人看的,不是给工具看的
最后分享几个我踩坑后总结的技巧,常规文档里很少写:
- 先画草图再开工具:直接在工具里画,容易被工具能力带偏。纸笔或白板先想清楚,再落地。
- 图里不要放密码和密钥:即使是内部分享,也不要在图里写真实连接串。用占位符代替。
- 给图加版本号和日期:图一旦进入文档,就要有版本。否则读者不知道看的是不是最新版。
- 重要图打印出来看:屏幕上容易忽略布局问题,打印成 A4 或 A3,一眼就能看出哪里挤、哪里空。
- 让非技术同学试读:如果产品经理能看懂你的架构图主流程,说明图的设计是成功的。
这些技巧看起来小,但每一个都能帮你省下大量沟通成本。diagram-design 这件事,说到底不是画图,而是用图思考、用图沟通、用图沉淀。工具会变,图型会变,但这个核心不会变。
我在实际项目里的体会是:一张好图,能顶半小时的解释;一张烂图,能毁掉一小时的评审。所以每次动手画图前,我都会先问自己那句目标声明。这句话写清楚了,后面的图就不会偏。如果写不清楚,那说明我还没想清楚,这时候不该画图,该回去继续想。