我见过不少团队的技术方案图,打开下来的第一反应是想帮忙把节点拖拽对齐。箭头绕了三道弯,注释比代码还长,红黄蓝绿全用上,三十秒之后我已经不知道图的核心链路到底在哪条线上了。diagram-design 这个事,表面看是"画图",本质是信息结构工程。图的起点不是画布,而是你要讲的那件事;终点也不是导出的图片,而是别人看到之后能做出正确的判断。
这篇内容我不会教你把形状画得多精致,也不会推荐一堆看起来很炫的工具。我把自己在几个项目里反复验证过的一整套方法摊开讲,包括信息整理、工具选型、布局法则、制作流程、后期维护和踩坑排查。适合正在画系统架构图、流程图、时序图的技术同学,也适合所有需要在文档、演示、评审里把复杂东西讲清楚的文字工作者、产品经理和运维同事。
1. 先想明白一件事:diagram-design 处理的是信息,不是图形
1.1 为什么很多图画得漂亮却看不懂
先揭穿一个误区:很多人以为图的质量取决于美术功底,所以使劲堆颜色、渐变、阴影、图标,结果往往是"高保真"反而害了信息。判断一张图好不好,标准不是"好看",而是"信息获取速度"。如果读者需要五秒才能分清谁是主流程,谁是次要分支,这张图已经失败了。
我见过一张用户请求链路图,节点全都加了渐变填充和投影,几个关键服务被装饰性元素遮了一半,连中心数据流的箭头都被背景色淹没了。改成最朴素的线框后,问题反而消失了。这和地铁图的逻辑一样——北京地铁图不会按真实地理距离画,它故意把线路拉直、把站点等距排列,就是要让乘客三秒找到换乘点。diagram-design 的核心,就是牺牲一部分"视觉真实",换取"信息有序"。
1.2 画图前先做一次"信息减脂"
急着打开画板工具是最大的错误。设计一张图之前,先回答三个问题:
- 给谁看?评审的同事、刚入职的开发,还是客户?对象的背景决定了你能省掉哪些解释。
- 在什么场合看?投影、线上文档,还是打印在纸上的附件?场合决定了字号、对比度和配色上限。
- 希望读者看完做什么?定位故障、确认接口依赖,还是照图实施部署?不同的行动目标,决定了图的取舍重心。
比如一张"性能优化架构图",如果目标是让核心链路负责人快速定位瓶颈,就完全可以隐去大部分边缘服务,只保留链路入口、热点服务和存储节点。把所有东西都画上去,等于什么都没强调。我习惯把这步叫"信息减脂",减脂做得越狠,后续布局越轻松。
1.3 三类最高频的图,对应三种不同的设计逻辑
不同图种的信息组织模式完全不同,不能用一套模板硬套:
| 图种 | 核心信息 | 设计重点 | 最常犯的错 |
|---|---|---|---|
| 架构图 | 系统边界、模块分层、依赖关系 | 用容器表达边界,嵌套表达层级 | 把每个服务画得一样大,看不出主次 |
| 流程图 | 顺序、分支、并行、判定 | 箭头方向一致,分支条件用文字标注 | 用颜色表达流程不同路径,打印后失效 |
| 时序图 | 时间轴、参与者、消息往返 | 参与者置于顶部,按时间自上而下推进 | 为了布局美观,让消息线横跨多个参与者 |
结构定了,工具怎么选、用什么样的布局和配色才会有意义。这也是我下面要说的——很多人在第一步就选错了工具,后面所有操作都在和工具搏斗,而不是在图本身。
2. 工具选型:我先筛掉了"网红工具"
2.1 工具差异不在画布,在导出、协作和可维护性
选画图工具时,最容易被人忽略的恰恰是长期价值。一套工具好不好用,主要看四个维度:文件格式是否开放,能不能导出 SVG 或源码;协作方式适不适合团队现状;支不支持文本化和版本 diff;一年之后重新打开,还能不能继续编辑。
那些主打"漂亮模板"的在线工具,往往把文件锁在自家格式里,导出还要会员,或者一张图只能一个人编辑,换个人就得复制整个文件。短期用着爽,长期维护全是债。反过来,外观朴素但格式开放的工具,虽然刚上手时不够惊艳,却能在项目生命周期里一直陪伴你。
2.2 我现阶段留给团队的三个选择
与其研究十个工具,不如把三类场景各留一个主力工具:
| 工具 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| draw.io(diagrams.net) | 开源、全平台、免费导出 SVG,文件就是一个 XML,可进 Git | UI 朴素,部分操作需要适应 | 正式架构图、交付图、需要长期维护的图 |
| Excalidraw | 上手零成本,手绘风格亲和,适合在线协作 | 复杂结构图容易画乱,语义表达弱 | 头脑风暴、快速草图、评审前的讨论 |
| Mermaid | 纯文本描述,可直接嵌在文档和代码里,天生适合 diff | 复杂布局控制力弱,跨容器连线容易乱 | 文档内嵌流程图、自动化生成的简单图 |
我自己的固定组合是:快速讨论用 Excalidraw,出了结论后用 draw.io 画正式版,需要嵌进文档的流程用 Mermaid 描述。Graphviz 这种我也会在生成依赖关系图时用,但普通团队不需要一开始就上。
2.3 一条始终有效的文件策略:源文件与交付物双轨
任何一张重要的图,永远保留两个文件:源文件和一个可交付的矢量导出文件。源文件保证未来能改,SVG 或 PDF 保证当前能看、能排版。如果只存 PNG,半年后想改一个服务名,基本等于重画。
我在协作中接过一张高清截图,对方让我改其中一个模块名,我只能拿像素级修图工具硬擦,图里所有关联线都对不齐。反过来,如果当初给的是 draw.io 源文件,一分钟就能解决。这件事听起来很基础,但绝大多数团队都栽在"图只有最终稿、没有源文件"上。
3. 让信息一秒可读的四条法则
3.1 法则一:一图一主题,节点超过二十个就拆图
一张正式阅读的图,节点最好控制在二十个以内。超过这个数,人眼就会开始迷路。如果节点实在多,优先考虑分组,把一组相关节点收进同一个容器;再不行就拆成多张图,用"总览图 + 局部图"的方式组织。
一图一主题还有个更硬的判断标准:一张图里如果出现了两种不同语义的箭头,比如数据流和调用关系混在一起,那基本就是在讲两个故事。我在一个系统设计评审里见过把"部署拓扑、请求链路、数据流转"画在一张图上的,作者讲了三分钟,底下的人还是没有建立统一认识。后来拆成三张图,评审效率立刻上来了。
3.2 法则二:视觉重量跟着信息优先级走
视觉重量是边框粗细、填充深浅、字号大小、阴影这些元素叠加出来的感知强度。设计原则很简单:最重要的信息,必须是读者第一眼看到的。架构图里核心业务模块应该用粗描边、深填充强调,支撑模块用浅灰弱化;如果所有节点都一样重,就相当于没有重点。
我见过一个反例:整张图所有节点全部加粗、全部着色,连旁注文字都用了亮色。结果满屏都在抢注意力,核心链路反而找不到了。调成"核心醒目、外围灰度"之后,图面一下子安静下来。需要注意,强调手段同时最多用两三种,边框、颜色、字号三选二就够,多了反而互相干扰。
3.3 法则三:布局方向即阅读顺序
人阅读图有默认顺序:从上到下、从左到右。布局应该顺着这个习惯安排,让视觉流自然从入口移动到出口。架构图按"入口-处理-出口"三段排布,流程图严格沿一个主轴前进,尽量避免连线掉头穿越已经画好的区域。
如果真的有回流或者异步回调,让它贴着画布边缘走,不要穿过图中央。看图的体验就能从"迷宫逃生"变成"看交通指示牌"。我自己有个强迫症:图中任意一条线,只允许拐两个以内的弯。超过三个弯,就说明布局或拆分有问题。
3.4 法则四:颜色只承载语义,不承载装饰
配色建议控制在四个主色以内,中性灰占一半以上。颜色一旦出现,就必须有含义:红色代表异常链路,绿色代表成功路径,蓝色代表外部系统,黄色代表待办或风险。用色最大的忌讳是"同一个系统不同模块涂不同颜色",那是装饰色,可以用容器线框来替代。
投影和打印是最容易暴露颜色问题的场景。屏幕上区别明显的浅蓝色和黑色,投到会议室的幕布上可能糊成一片。所以重要图在使用前,务必用灰度预览或黑白打印检查一遍。更稳妥的做法是给颜色附上第二重信息通道,比如异常链路用"红色 + 虚线",这样哪怕颜色失效,线型仍然能区分语义。
4. 从原始材料到一张合格架构图:我的六步流程
4.1 第一步:收集"废话清单",强制自己不碰画布
我画图的第一个动作是打开一个空白列表,把所有与项目相关的名词、动词、依赖关系全部倾倒进去,完全不排版。这一步叫"废话清单",目的是把信息先捞出来,避免边画边想导致的反复重排。
接着对清单做分层:分区、组件、模块。分区是系统边界,比如"客户端""网关""订单域";组件是分区里的可独立部署单元;模块是组件内部的逻辑单元。分完层后,给每个节点编一个稳定的编号,比如 SVC-01、DB-02。这个编号会成为后续讨论的坐标,评审时一句"看 SVC-01 那个出口",比"看左下角那个框"高效得多。
4.2 第二步到第五步:容器、节点、连线的顺序不能乱
在画布上执行的顺序是:先画容器,再放节点,最后连线。容器相当于系统边界,节点是边界里的服务和角色,连线表示依赖或数据流。这个顺序之所以不能乱,是因为动了节点就会带动连线,先连线再移动节点,最后留下的都是弯弯曲曲的线。
打开画布工具的网格和对齐辅助功能,把同层节点做成等间距。宁可先留白再收紧,也不要一开始就把所有东西塞满。节点文字用名词短语,箭头上的文字用动词短句,比如"写入",而不是"这里进行了数据的写入操作"。线型尽量收敛:一张正式图最多用实线、虚线两种,实线表示明确的调用或数据流,虚线表示异步或规划中的依赖。用箭头形状统一,不要在实心箭头和空心箭头之间混用,否则读者会开始猜测两者含义的差别。
4.3 第六步:"陌生人测试"代替自我感动式检查
画完当天不要急着说"完成"。放一晚,第二天以新同事视角重看一遍,逐节点问三个问题:这是什么、为什么在这里、这条线代表什么。答不上来的节点要么删,要么加注释。
正式交付的图,最好带上图例。图例里写清楚线型、颜色、虚实的含义,包括容器边界代表什么。这一步很多人嫌麻烦,但是一张没有图例的复杂图,一周后再打开就是别人的阅读理解题。评审收集到的意见,也不要来一条改一次布局,先统一记在废话清单里,标注"版本二调整",攒够一批再改,避免整个下午都在挪节点。
5. 我踩过的坑:五类 diagram 翻车现场与排查思路
5.1 坑一:自动布局工具把节点全部叠起来
有一次我用某个自动布局工具生成依赖图,节点之间完全没有间距,导出后连线横穿多个无关服务,整个图看起来像一团毛线。原因是工具按拓扑关系铺节点,但忽略了视觉分组和用户阅读顺序。
排查的时候,先缩小画布看整体,看有没有大量跨容器连线。跨容器连线多,说明容器层级设计有问题,不是布局问题。修复分两步:先把容器和节点之间的继承关系理顺,再清掉自动生成的连线,按业务流重新手动接线。手动接线时,每个容器只留两三个出口,所有从容器出去的线尽量从同一边引出,整个画面立刻清爽很多。
5.2 坑二:文字堆进节点,阅读成本高到没人看
很多新手喜欢把节点当 Word 用,往里面写一整句话,比如"用户通过客户端发起注册请求,服务端校验通过后写入数据库"。这种节点图,信息密度看着很满,真正阅读时没人愿意读。
原因很简单:图的信息单元是结构关系,不是句子。修复方法是把长描述搬到节点外面,节点里只保留名词和编号,细节放进节点下方的注释,或者用编号指向外部文档里的表格。经验是,评论区翻车最少的图,往往是图上只有五到八个字、备注里却写得很满的图。
5.3 坑三:颜色在导出后突然失灵
在屏幕上很清晰的蓝红色对比,导出 PNG 后发给别人,对方说看不清,打印出来更是一团灰。因为显示器、投影仪、打印机的色彩空间不一致,只靠色相区分信息,必然会在某个环节失效。
排查办法很土但有效:把完成图导出一份灰度图,自己先看一眼。如果灰度图里信息仍然可读,说明表达结构是健康的;如果变成一团灰,就说明你太依赖颜色了。修复方式是用"颜色加线型"双通道,比如异常链路用红色虚线,关键路径用绿色实线,再加粗处理,而不是单靠红和绿。
5.4 坑四:图改了一版又一版,最后团队不知道哪张是对的
还有一类坑不是技术问题,而是管理问题。图放在个人网盘里,文件名从"架构图_最终版"一路改成"架构图_最终版_v3_new_真真最终版",三个月后连作者本人都不敢确定哪张是当前版本。
排查起来很简单:你能否在五分钟内找到当前架构图的源文件?能否说清楚最近一次修改改了什么?如果两个问题都答不上来,说明图的资产化已经失败了。修复方案是给图一个好名字,例如 purchase-flow_v1_202501.drawio,并把这个文件放进代码仓库或者有版本历史的共享目录,让每次修改都有记录可查。没有语义的图名,三个月后等于一张废图。
6. 让图在团队里长期活着:diagram 也是需要维护的资产
6.1 把图交给版本管理,而不是交给个人网盘
图跟代码一样,是会演化的。架构调整、服务改名、接口变更,都会让旧图失效。把图的源文件放进文档目录或代码仓库,每次修改都有 diff 记录,不同版本可以回溯。如果团队没有代码仓库,也至少放进支持版本历史的共享空间,不要放在个人的聊天文件里。
更进一步,把改图纳入评审流程。改图提案等于"改图加更新说明",评审同事对着 diff 看这次改了什么,比对着整张图重新读一遍要高效得多。我见过团队把一张架构图像代码一样提交合并,每次都有提交说明,半年后翻历史,图的演进过程清清楚楚。
6.2 建一张"图表明细",让每张图都有负责人
低成本但效果极好的做法,是在团队文档里维护一张 Markdown 表,记下图名、源文件路径、导出版本、最近更新、负责人、状态(当前态/规划态/已废弃)。这张明细表解决两个问题:有负责人意味着有人对图是否过期负责;有更新时间意味着别人能判断这张图是否还值得信任。
| 图名 | 源文件路径 | 最近更新 | 负责人 | 状态 |
|---|---|---|---|---|
| 下单流程 | docs/diagrams/purchase-flow.drawio | 2025-02-10 | A同学 | 当前态 |
| 支付时序 | docs/diagrams/payment-seq.mmd | 2025-01-18 | B同学 | 当前态 |
| 目标架构 | docs/diagrams/target-arch.drawio | 2024-11-30 | A同学 | 规划态 |
一开始可能觉得维护表很麻烦,但它能救急。任何一次演进讨论,打开明细表就能确认哪张图可信、哪张图已经过期,避免对着旧图争论半小时。
6.3 图和实现的一致性检查:三个月一次即可
图的更新频率不需要和代码每次改动同步,否则团队会被维护成本压垮。我建议每三个月做一次关键架构图与当前实现的一致性抽查:图中的模块名是否还存在于代码或配置里,服务之间的连线是否和实际调用关系一致。
这里要特别强调"当前态"和"规划态"的区分。不要在图画上混着表达"现在部署了什么"和"未来打算怎么部署"。如果一定要在同区展示规划内容,用灰色虚线框加"待建"标注。含糊混画会快速消耗团队对图的信任感——信任一旦破了,图就变成墙上的装饰画,再也没人愿意看,后续维护也就没有意义了。维护图的本质,其实是维护团队对信息的信任。
最后说一个我在实际项目里坚持的习惯。每张图做完之后,我会把导出的图片发给一两个不熟悉这个模块的同事,请他们用十五秒说出图里最重要的一条链路;如果说不出来,我就回去删边、减字、削弱装饰。diagram-design 在我的理解里,不是把图做得好看,而是做到"当别人第一眼看见时,他已经知道该把视线停在哪里"。希望这套经验能让你少走我走过的那些弯路。