我真正意识到 diagram-design 比想象中重要,是在一次内部评审会上。讲解人把一张画满 30 多个方块的系统架构图投到屏幕上,大家沉默着找箭头从哪儿进、往哪儿出,整整五分钟没人能回答“数据到底是怎么流动的”。那是我第一次清晰地感觉到:图不是画出来就完了,它是被“设计”出来的。如果你也经常需要画流程图、架构图、时序图,或者只是想把脑子里一团乱麻的关系理清楚,这篇文章可以给你一套从观念到落地的工作方法,覆盖图表类型选择、工具选择、布局逻辑、视觉规范、重构实战和团队协作。
1. 先想清楚一个问题:你画的到底是图,还是设计
1.1 “图”和“设计”差在哪儿
很多人把 diagram-design 等同于“会用绘图工具”。双击打开画布,拖几个方框,连几条线,填上颜色,导出图片,完事。我过去也这样,直到被那张乱图砸到脸上才承认:工具只负责把你脑子里的关系变成像素,但“关系”本身想清楚没有,工具帮不了你。
真正的设计发生在画之前,你要回答五个问题:这张图给谁看?表达什么系统?核心链路是什么?边界在哪里?用什么媒介展示?给新同学 onboarding 用的架构图,和给老板汇报用的架构图,信息密度完全不同。前者要能照着图讲清楚每个模块的职责边界,后者只需要一条主链路加关键风险点。同一个系统,两张图,前者失败的风险远高于后者。
画图本质上是信息编排,不是形状堆砌。就像写代码要先设计接口,画图也要先设计信息的层次、顺序和权重。没有设计的图,后果不是“丑”这么简单,而是误导:两个模块的依赖方向画反,开发照着拆分微服务,拆完才发现耦合还在老地方,这种事故我见过不止一次。
1.2 我判断一张图是否“设计过”的三个标准
我不看工具、不看精美程度,只看三个东西。
第一,换一个对这个系统完全陌生的人,能不能在 30 秒内说出这张图的核心流向?如果不行,说明主线不清晰。很多人画图失败,不是没画完,而是没有主线:所有节点同等大小、同等颜色,像一张通讯录,信息全,但没有主次。
第二,能不能不读大段文字,仅凭图例就理解每个符号的含义?箭头代表什么?虚线是什么关系?颜色深浅分不分优先级?如果图里没有图例,或者需要旁边配 500 字说明才能看懂,那它就不是设计,是涂鸦。
第三,换媒介之后信息是否仍然有效?同一张图,从投影仪到手机缩略图,再到打印出来的 A4 纸。放大不失真、缩小不糊成一团、黑白打印依然能分清层次。这三点能做到,这张图的基础设计就达标了。至于业内常说的“美观”,是及格线之上的事,不在我优先考虑的范围内。
2. diagram-design 的战场地图:不同场景该用哪类图
2.1 六种常见图的适用边界
diagram-design 不是一个单一技能,而是一组“按需取用”的图式能力。大多数人只熟悉流程图和架构图,但实际工作中常见图式至少有六种,选错类型,画得再精细都会觉得别扭。
流程图适合表达“先做 A,再判断 B,然后走分支或循环”,强调步骤与决策。它的核心是过程,不是参与方。如果画着画着开始关心“这个步骤是谁执行的”,说明你已经越界到泳道图的领域了。
架构图表达的是静态结构:系统分几层、模块之间的依赖、部署形态、数据存储位置。架构图用的是“名词思维”,画的是空间分布。想知道“系统长什么样”,用架构图。
时序图则完全不同,它表达的是动词:谁先调谁、调了几次、返回什么、有没有超时重试。接口设计评审时,时序图是最高效的沟通工具。很多人用流程图代替时序图,结果把调用关系挤在一条线上,复杂案例根本说不清。
泳道图在流程图上加了“责任边界”,每一道泳道代表一个角色或子系统,节点落在哪一跳就归谁管。排查跨团队流程卡点、责任归属不清晰的问题,用泳道图。它能让“这里到底应该谁负责”这种争论,变成一眼可见的事实。
ER 图表达数据实体及关系,一对一、一对多、多对多。后端做数据库设计时离不开它。需要提醒的是,ER 图不要画进系统架构图里,两类图的抽象层级不同,硬塞在一起只会让架构图变成蜘蛛网。
网络拓扑图是基础设施领域的地图:机房、交换机、防火墙、服务器、负载均衡之间的物理或逻辑连接。运维排查网络链路时,一张准确的拓扑图能把事故处理时间缩短一半。
2.2 从需求到图类型的映射表
我把“遇到什么问题该用什么图”整理成一张表,这是我被反复咨询后沉淀下来的版本:
| 你想搞清楚的问题 | 推荐图式 | 核心表达 |
|---|---|---|
| 这件事先做什么后做什么 | 流程图 | 步骤 + 判断 |
| 系统整体长什么样、模块怎么划分 | 架构图 | 结构 + 依赖 |
| 接口调用顺序和超时重试逻辑 | 时序图 | 对象间消息顺序 |
| 这个环节到底归谁负责 | 泳道图 | 角色责任边界 |
| 数据表之间的关系 | ER 图 | 实体 + 关系 |
| 网络链路的走向与故障点 | 拓扑图 | 连接关系 |
| 一个对象状态如何迁移 | 状态图 | 状态 + 事件 |
选图式有一个简单的判断方法:先问自己“我到底想说名词、动词,还是形容词”。名词关系用架构图,动词顺序用时序图或流程图,边界责任用泳道图。选错图式,等于用一个不适合的容器去装内容,再怎么精修都难让人看懂。
3. 工具选型 = 取舍,不是集邮
3.1 三类工具的真实体验
工具是 diagram-design 最容易踩坑的环节。很多人误以为“多会几个工具 = 很专业”,实际上工具应该是为你的工作流服务的,而不是反过来。我按生产方式把工具分成三类,你可以根据自己的场景选配。
第一类是代码化绘图,典型代表是 Mermaid、PlantUML 和 D2。用文本描述场景,再渲染成图。优点非常突出:天然支持进 Git 仓库、可以 diff、可以 review,改一个字都知道历史变化。复杂依赖关系用代码表达也直观。缺点是排版可控性弱,一旦图特别复杂,自动布局可能把关联边的节点拉得很远。我的应对是,复杂架构图先用代码画草图,最终手动微调底图,或者直接换成可视化工具。
第二类是可视化拖拽绘图,draw.io(也就是 diagrams.net)、Excalidraw、Visio 都在这个阵营。所见即所得,适合快速出图,也适合不太熟悉代码的同事协作。Excalidraw 的“手绘风”是很多技术博主的最爱,画出来很有亲和力,适合教程配图;draw.io 功能均衡,支持 SVG/PNG 导出,且免费场景覆盖绝大多数需求。缺点是版本管理比较弱,多人同时编辑时容易互相覆盖。
第三类是设计协作类工具,常被用来画 PPT 风格的概念图或产品流程图,代表是 Figma 等在线设计工具。优势是视觉表现力强、组件库丰富,适合要“对外好看”的场景;劣势是对纯技术人来说偏重,打开速度、图层层级、组件引用等都要学,日常画个接口时序图,没必要杀鸡用牛刀。
三类工具没有绝对高低,关键看使用场景和目标受众。我把选择标准浓缩成下面这张表:
| 取舍维度 | 代码化工具 | 可视化拖拽工具 | 设计协作工具 |
|---|---|---|---|
| 上手成本 | 需学语法,中等 | 低 | 中等偏高 |
| 版本可控性 | 极强,可 diff | 弱,依赖导出 | 弱 |
| 美观上限 | 一般 | 中等 | 高 |
| 适合场景 | 文档化、CI、团队长期维护 | 快速草图、内部评审 | 对外汇报、产品演示 |
| 协作方式 | Git 为主 | 在线或文件共享 | 在线实时协作 |
3.2 团队协作场景下我的选择逻辑
如果你小组里既有后端又有产品经理,既有程序员又有不太熟悉命令行的运营同学,我建议按流程来选,而不是按个人偏好选。
首先问一个问题:这张图需要“活”多久?一次性评审用的临时图,用 Excalidraw 或白板工具,快速画完,讲完即弃,别为它引入复杂系统。需要持续维护的文档、架构描述,我强烈建议进入 Git 仓库,选代码化方案。因为它会过期。架构图最怕的不是画得丑,而是“没更新”,代码化工具至少能通过 diff 提醒你别人改过,不会出现“图已经和代码不一致但没人记得”的死图。
其次问:受众是否包含非技术人员?如果是纯技术评审,Mermaid 就行;如果要给产品讲交互流程、给老板讲业务闭环,就需要手动排版本,用 draw.io 整理后再导出。这里有个小技巧:不要在一张图里混合多种抽象级别,业务视角的图和系统技术视角的图分开出两个版本,比强拼一张要高效得多。
第三问:要不要多人同时编辑?需要的话,选在线协作能力强的工具;不需要,则更看重文件格式的通用性。我个人的工作流是:脏活快速草图用代码化工具,正式产出用 draw.io 整理排版,复杂的对外概念图偶尔用设计工具。每一个版本都会及时存回仓库,保证任何时候都能回溯到任意一版。
4. 把“关系”画在正确的位置上:布局与结构的底层逻辑
4.1 流向、分组与层级
工具选好,接下来是 diagram-design 真正开始的地方:把关系放到正确的位置上。我见过太多人把节点拉得横七竖八,理由是“图能看懂就行”。其实位置本身就是信息,位置的混乱会让读者潜意识里觉得关系也混乱。
先说流向。中文读者的默认阅读方向是从左到右、从上到下。你的主链路应该顺着这个方向流过整张图,除非极其特殊,否则不要反转。一张图内不要混合多种流向,更不能一会儿从左到右、一会儿从下到上。分支路径可以拐弯,但主干要保持单调方向。这条规则能解决 80% 的“图看着乱”问题。
然后是分组。和代码要分模块一样,图也要用容器或泳道来表达边界。所谓容器,就是图上框出一块区域,告诉读者“这些节点属于同一个子系统、同一个服务或者同一个团队”。把该分组的节点分散在画布各处,是仅次于无主线的第二大败笔。看到一群没有边界的节点时,读者会自己脑补分组,而脑补的结果往往和你真实的设计不符。
层级则体现包含关系:外层容器大,内层节点小;父级在上,子级在下,这既是视觉习惯,也符合大多数系统的调用方向。画分层架构图时,从上到下写“接入层—应用层—数据层—基础设施层”,不要横着排,更不要为了省空间把层叠在一起。层次就是图的地心引力,读者靠它建立空间记忆。
4.2 对齐和间距为什么决定专业度
布局基本功里,最容易被忽略的其实是网格和对齐。优秀架构图和业余图的差距,往往只在几个细节:所有节点左边是否对齐,间距是否一致,箭头与边框的距离是否统一。这不是审美强迫症,而是信息处理规律——人眼天生对“稀稀拉拉”和“整整齐齐”的认知成本完全不同。
具体操作上,打开绘图工具里的“显示网格”和“对齐到网格”选项,让所有图形的宽高取 8 的倍数,间距也尽量取 8 的倍数。如果工具支持“分布”功能,选中一排节点后平均分布,会立刻让图提升半个档次。坐标和尺寸一套上倍数逻辑,后续调整位置时就不会出现“改一个节点,整条连线全乱”的连锁反应。
字号也要定一套等级,我通常只保留三级:图上主标题 16px,节点内模块名 14px,辅助注释 12px。超过三个字号,读者就要在阅读时不断切换注意力,这不是设计,是噪音。文字长度也保持简洁,节点内放名称和一句话职责,超过就直接放到图例或附录里,不要试图让一个方框撑下整段需求描述。
5. 一眼就懂的颜色、线条与标注规则
5.1 语义化配色与线条字典
颜色是 diagram-design 里最容易被滥用,也最容易被忽视的地方。很多人喜欢把每个节点涂成不同颜色,觉得“彩色就是好看”,结果一张图七八种颜色铺满,读者注意力全部被颜色抢走,真正的依赖关系反而没人关心。
我的建议:一张正式图的主色板不超过 5 个颜色,其中中性色 2 个(描边和正文),语义色 3 个左右。颜色必须承载语义,不能只当装饰。比如:蓝色表示核心业务模块,绿色表示外部系统,橙红色表示风险点或最终目标。当你把颜色和意义绑定时,读者看到颜色会自动联想含义,看图速度会快很多。
线条也要有“字典”。我最常用的三档:实线代表强依赖、已有接口、确定关系;虚线代表弱依赖、异步调用、可选路径;点线代表数据流或未来规划。这个字典要写进图例,并在整个团队或项目内保持一致。否则每个人画虚线都有自己的理解,协作时就会互相误解。我在团队里试过这个约定,统一后评审会上几乎没人再问“这条虚线什么意思”,因为图例已经回答了。
5.2 让图自我解释的标注系统
图例是最容易被跳过但最必要的部件。一张信息量再少的图,也值得花 30 秒加一个图例区,解释颜色、线型、图标含义。图例最好放在图的下方或右上角,不干扰主流程,但一进来就能看到。缺少图例的图,就像没有单元测试的代码:看起来能跑,但没人敢保证它是对的。
除图例外,还要有“图题区”:图的标题、版本号、更新时间、维护人。你可能觉得这是繁琐的文档仪式,但实际维护中,这是救命信息。我在某次改造中看到公司内部一张画了半年的架构图,文件名是“final_v2_最终版.drawio”,里面没有任何版本标注,最后没人敢用。加了版本和日期之后,哪怕图的内容有误区,至少能知道它可能过期了,再去代码里核对。图的核心是信息可信度,标注就是可信度的背书。
模块编号同样有效。给核心节点编号,比如“1. 接入层 2. 应用层 3. 数据层”,然后在图下方的注释区按编号写关键说明。读者先看主图建立空间感,再到注释区补充细节,阅读体验会顺畅很多。这个方法尤其适合大图,因为大图塞不进过多文字,编号就是连接图与文档的锚点。
6. 实战拆解:一张混乱架构图的重构全过程
6.1 原图的问题清单
理论说了那么多,拆一个真实场景的改版过程会更有体感。某团队让我帮他们整理一套内部系统的架构说明,先给我的是他们的“现有架构图”,我拿到手列出的问题清单是这样的:
- 23 个节点来自 3 个不同团队,互相之间有 40 多条连线,交叉得像毛线团;
- 节点颜色 8 种,没有图例,没人解释颜色含义;
- 箭头混合了实线、虚线、粗线,但没有标注任何区别;
- 没有泳道、没有分组、没有层级标签,外部系统和内部模块混在一起;
- 图上没有任何版本号和日期,团队自己也说不清这张图是什么时候画的。
这些问题不是少数团队才有,而是普遍现象。它们的共同根源是:画图时把“所有内容都放上来”当成目标,而没想清楚“读者应该先看什么”。原图的信息完整度堪忧,但可用价值几乎为零,因为没人能从中快速提取出结论。
6.2 重构思路与每一步的执行
第一步,明确读者。这张图的核心读者是新加入的后端同学和参与评审的技术负责人。目标不是炫技,而是让新同学 30 秒内找到主链路,让负责人快速判断边界和依赖风险。把目标读者写下来之后,所有取舍都有判断依据了。
第二步,画主线。我问团队:用户从发起请求到数据落库,经过哪几个核心模块?把这条链路上的节点先放在图纸中央,用蓝色标注,它们是图的脊椎。其余节点都围绕它们展开,不能抢主线位置。这一步最难,因为团队很容易陷入“我们每个模块都很重要”的思维,而我坚持:重要不等于主线,主线只能有一条。
第三步,定边界和分组。把外部系统框在虚线圈里,内部服务按接入层、应用层、数据层三个泳道排列。跨团队责任也顺手用泳道分隔了——不该互相越界的关系一目了然。这一步做完,原来的 23 个节点就有了归属,乱象立刻缓解。
第四步,统一配色和线型。主链路用蓝色,外部系统用绿色,数据流向用点线,异步依赖用虚线,同步强依赖用实线。颜色总量控制在 4 个,并把字典写进图例。原来 8 色乱飞的问题直接归零。
第五步,加标题、版本号、日期、图例和模块编号。“模拟项目X 系统架构图 v2.3 / 2024-06-15 / 维护人:某开发同学”写完之后,顺手把三个关键说明加到注释区。这些看似次要的信息,恰恰是团队长期使用图的前提。
第六步,对齐所有节点。按 8 倍数网格重新吸附坐标,统一节点宽高,平均分布泳道间距。这一步花了 40 分钟,但完成后整体观感立刻“专业”起来。
6.3 重构后的对比与验收
改版后我做了两次验证。第一次,我让一位刚入职两周的同学看了 30 秒,他能说出“用户请求先进接入层,再走应用层,最后落库”,主链路判断完全正确。第二次,我让另一位工程师试着按图指出“如果消息队列挂了,哪些模块会受影响”,他在一分钟后锁定了数据层和异步依赖链路,效率比之前高了很多。
前后的差别用表格很直观:
| 维度 | 原图 | 重构后 |
|---|---|---|
| 找到主链路所需时间 | 5 分钟以上 | 约 30 秒 |
| 颜色数量 | 8 种,无图例 | 4 种,有图例 |
| 模块分组 | 无 | 泳道 + 容器 |
| 版本信息 | 无 | 版本号、日期、维护人 |
| 新同学自主读图 | 失败 | 成功 |
重构的过程没有引入任何新技术,只是回到了设计的基本动作:定读者、定主线、定边界、定语义、定版本。这些动作任何绘图工具都支持,缺的只是有人愿意在画之前,先把“关系”想清楚。
7. 图也要进版本库:从单机画图到团队级协作
7.1 图即代码的价值
很多小伙伴画完图之后,往共享网盘一丢,或者直接微信发个 PNG,图从此变成“一次性用品”。这里面最大的坑不是文件会失效,而是图一旦脱离代码和文档流,就永远不会被更新。三个月后系统改了,图还是老样子,后来的人照着旧图做事,等于拿着过期地图找路。
把图当作代码来管理,是 diagram-design 进入团队协作阶段的标志。代码化渲染工具天然支持这个思路:文件后缀是 .md、.puml 或 .d2,存在 Git 仓库里,谁改了什么,一眼可见。语义化的文本 diff 比二进制图片 diff 强太多,我在 review 同事改的图片时,只能看到“文件被替换”的通知,而在 review 一份代码化图形时,能精确看到“这里增加了一条异步调用、那里删除了一个节点”,这种审查粒度对于保证图的正确性非常重要。
draw.io 这类拖拽工具也能贴近这个工作流,它的源文件本质上是 XML 文本,可以存进 Git,只是 XML 的可读性不如专门的语言好。我通常建议:如果图会被长期维护,优先代码化语言;如果必须用拖拽工具,就约定好导出 SVG 的同时也提交源文件,并规范文件名,绝不使用“最终版”“最新版”这种无信息量的命名。
7.2 我踩过的协作坑与当前工作流
协作过程中我也踩过不少坑。第一坑是“多人同时编辑”——几个人同时打开同一份 draw.io 文件,后保存的人悄悄覆盖了前面人的改动,最后谁也不知道内容是哪个版本。解决方法是改用在线协作模式,或者严格遵循“先拉到本地、改完及时提交、冲突时坐下来口头对齐”的规则。比起工具冲突,人的沟通延迟才是问题的根源。
第二坑是“自动导出骗人”。有些 CI 流程会定时把代码化图渲染成 PNG 发布到文档站,看似自动化,但一旦渲染脚本依赖了特定版本的绘图库,升级库之后所有图的样式都变了。我的处理是固定渲染依赖的版本,并把“渲染结果和源码是否一致”加入检查项,避免图默默和被看习惯的样子不一样。
第三坑是“没有接入团队的文档规范”。一张图再规范,如果它没有主入口、没有相邻文档的链接,新同学还是要靠搜索才能找到它。我现在会把核心架构图放在团队文档库的固定位置,并在图题区写明“相邻文档:需求文档地址、接口说明地址”。这样图就变成了文档体系的一个节点,而不是孤岛。
我当前的工作流可以概括为:头脑中先定主线,用 Mermaid 或 draw.io 快速画草稿;评审通过后转入正式文件,统一视觉规范并加入图例;所有源文件进 Git,带版本号和维护人;最后由脚本或手动导出 PNG/SVG 发布到团队文档站。这一步一步看似占了额外时间,却省掉了“因为图过期而开错了评审会”这种隐性成本。
最后分享一个我自己验证过无数次的小经验:每次画图前,先逼自己在白板上用一句话写出这张图要回答的问题。写不出来,就别打开绘图工具。Diagram-design 的门槛从来不在工具,而在你想清楚“读者需要从图里带走什么”的那一刻。