直接说结论:所谓 diagram-design,往大了说是信息架构的视觉化表达,往小了讲就是把系统流程、模块关系、数据流向画成一张别人一眼能看懂的图。
我做了多年的技术方案与架构梳理工作,经手过的项目架构图、业务流程图、时序图加起来在大几百张以上。最深的体感是:画图这件事,恰恰是很多团队最不重视、但实际最拖后腿的环节。一个需求讨论半天定不下来,根因经常不是逻辑没想清楚,而是那张图没画对,每个人脑中的模型都不一样。好图能把讨论时间压缩一半,烂图能把两小时的评审拖成一整天。这篇就把我做 diagram-design 的全套思路、选型逻辑和实操过程摊开讲清楚,从为什么画、画什么类型、怎么排版到用什么工具链,全程附可直接抄作业的方案。
1. 为什么设计了半天,评审还是“看不懂”——diagram-design 的核心价值
1.1 一张图就是一次沟通效率的压缩包
很多人把画图当成技术文档的“配图”,这是最大的误解。我在实际协作里发现,图的核心价值不是记录结果,而是压缩沟通成本。一个模块的边界、一条数据的流转、一次异常的分支处理,用文字描述需要好几段话,而且不同人读出来的理解还不一样;但一张画得清楚的图,大家看到的信息是同一个。
这里的“画得清楚”不是指好看,而是信息层级准确。我做模拟项目X的架构梳理时,一开始直接用大画布画,把所有服务、数据库、第三方依赖全部铺开,结果评审时每个人关注的点都不一样,有人看部署结构、有人看调用关系、有人问数据从哪里来。后来我把一张图拆成三层——系统上下文图、容器/模块图、组件交互图——讨论效率立刻不一样了。这就是 diagram-design 的本质:不是画一张大而全的图,而是针对当下的沟通对象和讨论目标,裁切出合适的视图范围。
一个值得记住的结论:图上每多一个元素,理解成本不是加一分,而是乘一分。画图的第一原则是克制,不是丰富。
1.2 图表设计中的隐性成本:谁在承担“看不懂”的代价
图表设计做得不好,代价往往不会马上显现,而是在后面连续爆发。最常见的场景:架构图只有画图的人自己看得懂,换一个人接手,要重新猜每个框的含义;流程图缺少异常分支,开发照着实现到一半发现漏了边界情况;时序图画得过于详细,服务端和客户端在评审时对消息是同步还是异步产生分歧。
这些问题的共同根源是:画图时只想着“把内容堆上去”,没有想清楚“这张图给谁看、看完要做什么决策”。我把这称为图表设计的“目标读者缺失”。后来我在每次动笔前固定问自己三个问题:这张图给谁看?他希望从中得到什么信息?看完之后他会做什么动作?三个问题答不上来,说明这图不该画,或者不该以这种形式画。
这在实际项目中能省掉大量的返工。之前处理某跨平台系统的接口梳理时,前后端误会的次数明显减少,原因也很简单:每次画交互图之前,先标注“读者是前端”,然后只画前端关心的消息序列和返回码,部署细节全部忽略。读者明确,信息才精准。
1.3 “图”和“设计”之间的区别
diagram-design 里的 design 很容易被忽略,以为只要工具用得溜、图形拖得齐就算完成。但真正的设计发生在动笔之前——决定画什么、不画什么、先后顺序怎么排、哪条路径画成主线。这个过程本质上和写代码一样:先做架构,再写实现。
“画什么、不画什么”是我最想强调的一点。一上来把所有细节都描出来,图必然拥挤。画图的本质是选择性暴露:只暴露当前讨论最重要的层级,把其他内容折叠进一个框里。比如画系统架构图时,数据库表结构完全不需要暴露,只需要在数据库框里写上“订单库”三个字即可。等讨论到表结构时,再单独画一张物理数据模型图。这种分层暴露的做法,就是图表设计里的“信息折叠”,是专业图表和业余图表的显著分水岭。
2. 动手之前:图表类型的选择逻辑
2.1 按信息关系选图的“三维判定法”
很多人画图是从工具里随便挑一个模板开始,比如流程图模板、时序图模板,结果往往是形式和内容错位。我的经验是:先判定人与人之间需要传递的信息是什么关系,再决定用什么图承载。这里有一套我一直在用的三维判定法,基本覆盖日常工作中的一切场景。
第一维是流向。如果内容有明确的先后顺序或执行逻辑——比如一个用户下单的流程、一段异常处理的逻辑——那适合用流程图或活动图;如果是时序上的消息交换——比如客户端和服务端的接口调用顺序——则适合用时序图。第二维是归属结构。如果画的是系统里有哪些模块、模块的上下级关系、目录的层级结构,那就是结构关系,适合用架构图或树形图。第三维是依赖与交互。如果重点是“谁调用了谁”“数据从哪里到哪里”,那需要的是依赖图、调用关系图或数据流图。
把这三问做完,图的类型基本自己就跳出来了。我见过太多人硬把流程图画成架构图,把调用关系画成流程图,导致该强调的顺序被弱化、该突出的边界被涂抹,整张图的价值大打折扣。
2.2 五种高频图表的适用场景对比
实际工作中,我高频使用的图表类型基本固定在五种,每种的“外形基因”和适用场景差异很大。选错图表类型,是 diagram-design 中最常见、也最影响沟通效果的错误。
架构图适合表达静态结构和模块边界。它的阅读逻辑是“这张图里有哪些盒子、盒子在什么位置、谁跟谁放在一层”。架构图不需要箭头满天飞,重点是分区和分层的视觉暗示。流程图适合表达分支和流转,强调“条件判断之后走哪条路”,配合泳道可以清晰区分角色职责。时序图适合表达跨系统的消息往来,纵轴是参与者的生命周期,横轴是时间,多用于接口设计中对齐调用顺序。状态图适合刻画一个对象在各种事件下的状态迁移,比如订单从创建到完成再到取消的全过程。数据流图则重点回答“数据从哪来到哪去走什么链路”,适合做数据领域建模和链路排查。
我整理过一个简表,每次不确定时直接查它:
| 图类型 | 典型沟通场景 | 核心阅读逻辑 | 最怕画成什么样 |
|---|---|---|---|
| 架构图 | 系统模块划分、边界梳理 | 看分层、看分区、看依赖 | 箭头密如蛛网、分区不明 |
| 流程图 | 业务逻辑、异常分支 | 顺着箭头走、在判断框分流 | 主路径被异常分支挤占 |
| 时序图 | 接口调用、消息交互 | 看纵向顺序、看横向参与者 | 信息堆叠、看不清先后 |
| 状态图 | 对象状态变迁 | 看事件、看转移条件 | 状态爆炸、转移条件模糊 |
| 数据流图 | 链路追踪、数据归属 | 看节点、看流转路径 | 外部实体和存储混成一团 |
2.3 类型选错时的“症状”自查
哪怕没听过这套方法,画完也能通过“症状”判断是不是选错了图。我总结了三类高频情况:
如果你发现自己为了把箭头走通,增加了大量“备注文字”来解释流转逻辑,那大概率应该在画流程图而不是架构图。架构图里的箭头应该尽量少而明确,主要靠布局体现结构,一旦需要大量文字兜底,说明形式撑不住内容。如果你发现时序图画到一半需要“跨角色画判断分支”——A 模块发给 B 模块一个请求,下一行换成 C 模块在处理——说明这不是时序关系,该切到活动图或流程图。时序图永远刻画的是消息在两个角色之间的同步/异步往来,不是处理逻辑的分派。
还有一类经常被忽略:当讨论的焦点明明是“哪个模块负责什么”,却用了流程图来画,最后大家会不自觉开始讨论模块内部的逻辑细节,偏离了边界讨论的初衷。此时回到架构图,重新用一个大盒子把模块内部逻辑封装起来,讨论立刻就能收回来。这是我实践中用过最有效的纠偏方式。
3. 图表设计的底层原则:先搭骨架,再谈美观
3.1 三个原则:层次、流向、留白
画图不是画画,但审美逻辑是相通的。我见过很多工具操作很熟练的开发者,拖拽方框的速度很快,出来的图却始终有股“说不出的凌乱感”。拆开看,基本都栽在三个点上:层次不清、流向混乱、留白不足。
层次是图表设计的骨架。一张图里必须有视觉优先级:核心模块最显眼,次要模块轻量化表达。最简单有效的做法是用“容器”建立层次——把一组小方框放进一个大方框里,读者第一眼看到的是大结构,往里再看才是细节,这就是视觉上的“渐进式披露”。很多时候不需要靠颜色区别主次,一个容器框就能解决问题。流向指的是读者的视线路径。好的图应该引导读者从左到右、从上到下地阅读,像看书一样流畅。混乱的流向表现为箭头乱窜、跨层连线、回环绕道,读者视线只能在图上反复跳动,心理上就会觉得“看不懂”。留白是个经常被忽视的细节。方框和方框之间至少留出一个方框宽度的空白,线从框边出发而不是从框角斜插,整个版面会立刻显得松快许多。从评审反馈看,同样的内容把留白拉大一倍,被提问的次数能减少一半。
3.2 配色“克制”比“丰富”更重要:一套可直接用的安全配色方案
图表配色是很多人容易用力过猛的地方。红黄蓝绿全上、每个框都填充鲜艳色块,结果一眼望去全是重点,等于没有重点。专业图表的配色思路是“大面积中性、小面积强调”。这里分享一套我用了很久的保守方案:背景用纯白或极浅灰;功能性模块统一用浅灰/米白填充,搭配深灰文字;强调的模块——比如本次改动涉及的服务、需要特别关注的环节——用单一高饱和色填充边框或做浅色底深色边;绝不用红色表达“正常功能”,红色只用于异常和删除等需要警示的场景。
这套思路可以在几乎所有图表工具中落地。以 draw.io 为例,选中一个方框后设置填充色为浅灰 #F5F5F5、边框色为深灰 #333333、边框粗细为 1px,就可以得到一个标准功能模块;需要强调时把边框改为深蓝 #1E6FFF、粗细调成 2px。仅靠这样微小的变化,读者关注点就会被精确引导。我在协同评审时还会在图上加一条规则:一个页面里高亮色模块不超过三个。数量一旦超了,立刻失去强调意义。
3.3 让“人人都能继续维护”的标注规范
图最容易腐烂的时刻是“画完之后”:需求一变,原图没有更新;下一次要用时还是旧版本,团队逐渐对图彻底失去信任。要避免这种结局,必须在动笔前定好几条“标注协议”,并且全组统一执行。
我的标注规范有三条。一是命名即注释:每个方框的文字必须是名词性短语,写完能说清“这个东西是什么”,禁止使用“模块一”“接口二”这类无信息量的命名;二是图上必须标注版本号和更新日期,哪怕只写在右下角一行小字,也能让人快速判断这张图值不值得信任;三是连线必须能说清“这是什么关系”——调用、依赖、数据流、消息通知——不要留裸箭头。为了简单统一,我在连线中间用一个小标签来标注,比如<<HTTP>>、<<DB>>,团队看了能瞬间理解边的语义。这三条规定成本极低,但让图从“一次性用品”变成了“可以持续演进的设计资产”。
3.4 逻辑正确优先于工具技巧
工具熟练度常常给人“画得很好”的错觉,实际坑就在这里。我见过有人用 PPT 画出了非常惊艳的架构图,配色、对齐、质感都很讲究,但模块之间到底是调用关系还是消息订阅关系,图上完全看不出来。精美但错误的图,比丑陋但正确的图更具破坏性,因为大家都容易被它“专业的外观”说服,跳过对内容的审视。
所以我对 diagram-design 的排序一直是:信息准确 > 逻辑清晰 > 排版美观 > 视觉美化。排版手段——比如对齐、连点、统一间距——是花十来分钟就能补齐的基础项,但信息逻辑一旦错了,再漂亮的排版也只是把错误包装得更易传播。每张图交付前,我都会把图上每条线的语义复述一遍,讲不通就改,直到每条线都能用一句话说清。
4. 实战:用工具链 5 分钟产出一张可维护的架构图
4.1 工具选型:文本优先还是画布优先
实际操作中,工具选型直接决定效率。我平时只右手两套工具:画布型的 draw.io / Figma,和文本型的 Mermaid / PlantUML。二者逻辑差异很大,选错会非常别扭。
画布型工具所见即所得,拖拽方框、连线、调整位置都很直观,适合探索阶段和自由布局的复杂架构图。它的缺点是版本管理麻烦,每次改完导出 PNG 或 SVG,如果文件没有存到共享目录,很容易出现多人各存一份、版本对不上的情况。文本型工具则是用代码写图,Mermaid 是最典型的一个。它的优点在于版本管理天然友好,可以直接把图源文件放进代码仓库,代码评审里也看得到 diff;缺点是布局自由度低、样式控制弱,图表大了之后实时预览会卡。
我自己的分工是:方案探索期用画布工具,快速把想法铺开;定稿后如果这张图需要长期维护、跟着代码走,就迁移到 Mermaid,放进仓库里。这种“先画布、后文本”的策略兼顾了前期的灵活和后期的可维护,是很实用的实践方式。
4.2 一个从需求到成图的完整案例
用一个简化但真实的案例走一遍全流程。某跨平台系统准备新增“订单导出”功能,希望先梳理清楚各模块的调用关系再细化设计。第一步是识别参与者,分别是前端客户端、后端接口层、导出任务服务、对象存储、消息通知,共五个角色。第二步给角色分组:前端和接口层归入“接入层”,导出服务和对象存储归入“处理层”,通知单独留在“基础服务区”。第三层再画调用路径:用户点击导出,后端接口生成导出任务并投递到队列,导出服务消费队列、从订单库查询数据、生成文件传到对象存储,完成后发通知给用户。
用 Mermaid 实现时,我倾向于把模块间最简单的分层架构关系先用代码固定下来:
flowchart TB subgraph 接入层 A[移动端] --> B[接口层] end subgraph 处理层 B --> C[导出任务服务] C --> D[(订单库)] C --> E[(对象存储)] end subgraph 基础服务区 C --> F[消息通知服务] F --> A end这段代码核心表达的点有几个:移动端和接口层用subgraph完成分组,在视觉上自动形成层级;存储资源我用[( )]语法画出圆柱形符号,文字表达“订单库”,从语法上就区别于普通方框代表的模块,让读者一眼识别数据存储;数据流从接入层往下走到处理层,再向上回到移动端,整体流向是一个闭环,完整表达了“请求-处理-返回”的主干逻辑。
Mermaid 画完后,我会导出一张 SVG 放进设计文档,同时在文档下方附上源文件链接。之后有任何人改动架构,直接改 Mermaid 源码,评审 diff 比对着截图猜测要直观得多。这就是“文本优先”在协作中最大的好处。
4.3 版本管理与协同:“图也是代码”
一旦把图的源文件变成代码,很多和代码一样的好习惯就能直接复用。我在实际团队里推过一套简单的流程:架构图源文件随项目仓库保存,图的每一次修改都通过一次提交来完成,提交信息里写明“调整订单导出的调用链,新增对象存储”;评审时看 diff 就能理解图的演进过程,不再需要“你截个图发我”这种低效协作。
对画布型工具生成的图,我也会做一个补充约定:文件名中带上版本号,并同时在图内联的角落标注同样版本号。这样做看起来多余,但能防止“拿了一张旧图去评审新需求”这类低级事故。有一次我在评审中发现,讨论者用的架构图比我记忆中多了两个模块,差距就来自版本不一致。从那天起,我的所有图表右下角一定带版本记录。
4.4 排版小技巧:对齐、等距、直连和网格
很多人觉得排版是“美术”的活,跟自己无关。实际上排版的操作非常机械化,只要掌握了几个固定动作,质量就能大幅提升。第一个动作是方框对齐:全选同类模块后,用工具提供的“垂直/水平分布”功能一次性摆整齐,它会让间距完全相等,观感立刻统一。第二个动作是连线要平直:全部走正交路径,不要斜向飞线,斜线极度影响“专业感”。第三个动作是锚点固定:连接点尽量都从方框的左/右/上/下四边中心引出,不要从框角接到框角,那样视觉上会显得杂乱。第四个动作是打开网格对齐,让所有框都落在网格上,后续调整尺寸时不容易错位。
这些动作单看都很琐碎,但它们组合起来就是“干净”的定义。我实操时的体感是:把上述四个动作做完,同一张图的信息量一分没加,但评审时收到的“这里我没看懂”的问题数量会明显减少。
5. 常见问题与排查技巧实录
5.1 图越画越乱:信息爆炸时的“降载三招”
图乱几乎都是信息过载,我总结了三个立竿见影的降载操作。
第一招是拆图:一张图画不下,就按视角或边界拆成多张,每张图只回答一个问题。十年前我习惯把所有信息堆到一张超大画布上,现在坚决不这样做,而是按“部署视图”“逻辑视图”“数据视图”分开成图,各司其职。第二招是折叠:相关细节用容器框收进一个子图里,对外只暴露一个边界和几条进出口信息。第三招是移除非必要装饰:阴影、圆角、渐变这些视觉元素删除后,信息干扰会大幅下降。很多时候所谓“专业感”恰恰来自克制,不是花哨。
5.2 别人总是理解偏差:从“编码表达”切换到“顺序表达”
当评审中一直有人提出“这个框为什么和那个框连在一起”这类问题时,大多数情况下是表达方式出了问题。连线在图上没有附带任何“原因”,表达的是存在性,没有表达“为什么”——而读者想知道的恰恰是“为什么”。
解决方法是给连线带上标签,哪怕只是调 API、订阅事件、写入订单库这几个字。效果非常明显:一张没有任何连线标签的图,会诱发大量猜测;给关键连线加上一到两个字的标签,讨论立刻会从“这是啥”切换到“这一步对不对”。另一个常被忽视的沟通技巧是从“编码式叙述”换成“顺序式叙述”。编码式是直接把图扔给读者让他自己解析,顺序式是陪着读者从左往右、从主到次讲一遍图的阅读路径。我在评审开场时讲的就是顺序式:先讲“从这到这是主链路”,再讲“这里有一个异常分支”,再讲“这里可以不关心细节”。读者在引导下吸收信息,误解少很多。
5.3 一套快速自查表:交付前 5 分钟过一遍
每次画完图准备交付前,我会对照一份不用花太多时间就能完成的自查表,逐条过一遍:
第一,是否已知核心读者的身份。如果答不出来,先补上再继续。第二,图上是否有一个以上“非必要元素”。删掉它。第三,是否所有连线都能用一句话说清语义。说不清的加标签,还说不清的删掉。第四,布局是否做到了从上到下、从左到右的主读序。第五,版本号和最近更新时间是否已标注。第六,高亮模块是否超过三个。超过了说明“重点”不重点了。
这套自查表从创建到现在用了很多年,几乎成了我交付前的肌肉记忆。它不保证画出一张神图,但能保证不会交付一张令读者困惑、令团队低效的图。
6. 经验沉淀与多维应用场景
6.1 从“画图”到“设计沟通”:图表不只是文档的一部分
做好 diagram-design 真正改变的是协作方式。以前我习惯写几十页的文档来解释系统,后来发现文档虽然很全,但阅读门槛太高、理解一致率很低,评审时还是要在白板上画来解释,相当于文档白写。把核心逻辑全部转成图之后,讨论路径直接被压缩成一屏和一个箭头方向。
技术方案、接口文档、复盘报告、团队新人培训,只要有信息往来的地方,图都能派上用场。我常用的一套组合是:描述现状用架构图,讲清流程用流程图,做接口对齐用时序图,追溯问题用数据流图。每种图解决一种沟通诉求,互相补充。
6.2 后续还能怎么扩展:工程化与自动化
走到这里,diagram-design 会自然往工程化方向延伸。最典型的两个方向,一是从模型生成图,二是从代码生成图。
前者适合维护成本高的场景:把实体关系、模块依赖等信息维护在结构化的数据文件里,之后通过脚本自动生成对应图表,保证图和数据同步,不靠人手工维护。后者适合代码考古:从真实工程代码中解析可调用的依赖关系和包结构,生成依赖图,用来排查循环依赖、做模块边界检查。这些不是必须的,但对于长期演进的项目,是值得尽早投入的方向。
我在实际尝试中已经用第二类方式处理过不少次“旧代码结构梳理”,跑出来的依赖图能直接指出哪些包存在反向依赖、哪些模块边界早被打破,比人翻源码高效得多。
6.3 再分享一个我的工作习惯
最后讲一个我自己很看重的习惯:把图当作“活的文档”,而不是“一次性的产物”。每张图都要有版本、有日期、有归属人,每个改动都要有记录。宁可图上内容少一些,也要保证它持续准确。否则团队最终会用脚投票——彻底不看图,回过头去翻代码。
做了这么多年,我和 diagram-design 的关系已经从“画画”变成了“设计沟通的接口”。一张简洁准确的图,胜过一场废话说尽的会议。这件事不需要天赋,也不需要工具造诣,只要愿意在动笔之前多想一步“给谁看、表达什么”,每一张图都会比上一张更有效。
这套流程和工具链我一直沿用到今天,也推荐你从下一张图开始,先定读者,再选图型,最后再动笔画框。