先坦白一个场景:我在某次方案评审会上,把自己精心画了两天的架构图投到大屏上,本以为能迎来夸奖,结果对面产品经理盯着图看了十几秒,问了一句“所以你的意思是,这个蓝色框调用了那个绿色框?蓝色和绿色分别是什么呢?”我一时语塞。更尴尬的是,评审记录里这张图被批注得密密麻麻,一半都是“这条线什么意思”“这两个框什么区别”。
那次之后我才认真开始琢磨 diagram design 这件事。一开始我以为“图表设计”就是把图画好看,后来发现完全不是——图表设计的本质是信息沟通。一个团队里真正的沟通过程,很多时候不是靠文档,而是靠图。而大部分图的通病,不是画得丑,而是读者根本不知道往哪看。这篇文章我想把图表设计这件事聊透:它解决什么问题、有哪些基本功、工具怎么选、不同类型的图怎么差异化处理,以及怎么让“图”从个人作品变成团队资产。适合所有需要画架构图、流程图、ER图、时序图的开发者和产品同学参考,哪怕你完全没学过设计。
1. 图表设计到底在解决什么问题——先厘清一个概念误区
很多人把图表设计当成“画图软件里的排版活”:框摆正一点、颜色调好看一点、连线拉顺一点。这其实是把“设计”矮化了。图表设计要解决的核心问题只有一个:让读者在最短时间内,以你期望的顺序,理解你想要表达的信息结构。
你可以把一张图理解为“一次性阅读的说明书”。读者从左上角进入,跟着视觉顺序走,最后在右下角得出一个结论。这个阅读顺序是不是可控的,完全取决于设计。如果所有元素一视同仁——同样的颜色、同样的粗细、同样的字号——读者就只能漫无目的地扫,信息传递效率直线下降。
我在实践中把图表设计拆成三层价值:
- 记录。把散落在各个脑子里的结构、依赖、流程、边界固化到一张图上,让信息有载体。
- 发现。画图的过程本身就是思考过程。很多次我画着画着就发现某个服务之间存在循环依赖,某个模块的边界根本没有定义清楚。这个价值特别容易被人忽略。
- 传递。让没参与这个项目的人,也能通过图快速进入上下文。这也是图区别于代码的最大价值所在。
围绕这三点,再去回看那些“画得难看”的图,问题往往不是审美的锅,而是信息层次没梳理。常见误解我总结了一个表:
| 常见误解 | 现实情况 |
|---|---|
| 图越长越全越好 | 一张图只该讲一件事,越大越没人看 |
| 所有元素都必须清晰可辨 | 只有重点元素需要突出,其余元素应该主动弱化 |
| 配色好看就是设计好 | 结构清晰永远在配色之前,颜色只是辅助 |
| 画完就算交付 | 图的维护成本同样计入文档维护成本,画完不更新等于零 |
所以,如果你现在正准备画一张图,先停下来问自己一句:这张图要传达的核心信息是什么?是一句话能说清的结论,还是一个需要读者自己探索的结构?这个问题想不清楚,后面用什么工具、怎么排版都是白搭。
2. 从要素到组合:布局、连线、配色和排版的四项基本功
图表设计的微观层面,其实就是四个基本盘:布局、连线、配色、排版。这四个词听起来简单,但每一项都有大量细节。我按自己画图时的处理顺序,逐一说下。
2.1 布局:空间本身就是信息
布局的核心是“让相近的东西在一起,让不同的东西分开”。人眼有天然的格式塔倾向,空间位置靠近的图形,会被自动归为一组。你可以利用这一点,完全不用画任何容器框,只是把节点距离拉开,读者就能感觉到“这几个东西是一伙的”。
我通常遵循三个原则:
- 对齐。同一层级的节点要么左对齐,要么居中对齐,绝对不要随手摆放。节点之间的间距保持一致的倍数关系,比如大模块之间间距 80,小节点之间间距 40。整齐的网格感会极大提升专业感。
- 分域。用浅色矩形把同一个子系统包起来,这比用连线表达“归属关系”直观得多。容器的标题写在左上角,字号略大于内部节点。
- 留白。每个核心区域之间必须呼吸。图不怕大,怕的是所有元素挤成一团。
我见过很多图的问题是:15个服务节点全部均匀分布在画布上,没有分层,没有分组,没有任何一个框表示边界。读者要挨个读节点名,才能猜出大概谁跟谁是一组。这就是典型的“画了结构,没画边界”。
2.2 连线:最容易栽跟头的地方
连线是图里信息含量最高的元素,也是最容易被随手处理的元素。我每次画图,在连线上花的时间差不多占一半。几个关键经验:
- 能走正交线就不要走斜线。横平竖直的连线可读性远高于斜插的线,尤其是节点密集的场景。
- 线不要穿节点,不要穿文字。宁可绕一点,也不要让线和文本重叠,否则读者会分不清标签属于哪条线。
- 标注放线上方中间。如果需要给连线加文字说明(比如写“REST调用”或“事件推送”),标签要放在线的中段上方,而不是放在线尾或者节点旁边。
- 减少交叉。连线交叉不可避免,但可以通过调整节点位置把交叉数量降到最低。两条线交叉的点,不许再出现第三条线。
还有一点特别想强调:能用单向箭头表达依赖,就不要用双向箭头。双向依赖出现在图里,往往意味着设计上可能存在循环依赖问题,画图过程中发现这种情况是好事,应该标记出来供架构评审讨论。
2.3 配色:语义比美观重要
配色的第一原则是克制。一张图里,颜色控制在 3-5 种足够。超过这个数字,读者的大脑就要开始记忆“这个颜色什么意思”,负担很重。
我的配色习惯是按语义区分,而不是按“哪个好看”:
- 主结构色:用于容器和边框,选低饱和度的灰调,比如接近浅灰蓝的 #E2E8F0。
- 强调色:只给最重要的 1-2 个元素使用,比如核心链路或关键告警,用高饱和蓝 #2563EB。
- 语义色:错误/风险用红 #DC2626,正常/成功用绿 #16A34A,注意/告警用琥珀色 #D97706。
- 中性背景:接近白色的浅灰 #F8FAFC。
需要特别提醒:红绿不能作为唯一区分维度,因为红绿色盲人群比例并不低。如果要用红绿表达状态,一定要加形状层面的辅助信号,比如红色节点加感叹号图标、绿色节点加对勾图标。这样即使转成灰度图,信息仍然不丢。
2.4 排版:字体与边框是隐藏的层级系统
排版在有些手绘感很强的画板工具里容易被忽略,但它恰恰决定了图的“阅读层级”。我的建议是:
- 字号分四档:图标题最大(比如 20px),容器标题次之(16px),节点标题再次(14px),属性/注释最小(12px)。
- 同一层级的文字字号必须一致,不许同一个容器里有的标题大有的标题小。
- 边框样式也是有含义的:实线表示物理或进程边界,虚线表示逻辑边界;粗线表示主链路,细线表示次要链路。
别小看这些细节。一张图,字体层级清晰、边框语义统一,读起来会有一种“不用想就知道往哪看”的顺畅感。反过来,如果全是 14px 相同字号的标签,读者就得逐个扫描,信息获取效率断崖式下降。
3. 工具选型的现实考量:拖拽画布与代码绘图的分岔路
聊完基本功,再聊一个大家特别爱争执的话题:用什么工具画图。市面上的工具大致可以分两类:一类是拖拽式画布工具,比如我们熟悉的 draw.io、Figma 这类在线画板;另一类是代码定义绘图工具,像 Mermaid、Graphviz、PlantUML 这类“图即代码”的方案。
两类工具的核心差异,并不只是“拖拽 vs 敲字”,而是背后的协作模型完全不同。
| 特性 | 拖拽式画布工具 | 代码定义绘图工具 |
|---|---|---|
| 上手成本 | 低,所见即所得 | 有学习曲线,但语法通常不复杂 |
| 自由排版 | 高,像素级控制 | 低,布局通常交给布局引擎 |
| 版本控制 | 弱,二进制或私有格式,diff 困难 | 强,文本格式,可逐行 diff |
| 团队评审 | 靠人眼比对截图 | 可以直接在代码评审里看改动 |
| 适合场景 | 会议脑暴、探索设计、UI 风格图 | 沉淀文档、自动化生成、长期维护 |
我个人的选型标准很简单:先问这张图未来会不会被反复维护。如果会,就选代码绘图;如果只是一次性探讨,拖拽画布更高效。
- 要沉淀进项目文档、未来要跟着代码一起维护的图,我会把绘图源文件放到文档仓库里,跟文档放同一个目录。这样改代码的时候顺手就能更新图,review 的时候改了什么节点一目了然。
- 会议、头脑风暴、探索阶段的图,我会随手打开一个拖拽画板。这种图重点是“快”,不需要美观,甚至越潦草越好,方便快速摩擦出想法。
- 方案评审图,我常常先用拖拽画布画个草稿,因为探索阶段手比脑子快;等方案定了,再花半小时用代码绘图重绘一版正式的,作为最终交付物。
这里有一个容易踩的坑:不要试图让代码绘图工具完成像素级排版。它的布局引擎确实不是万能的,复杂场景下你可能需要手动分组甚至调整节点顺序,但核心逻辑一定要让引擎处理,否则维护成本反而飙升。
如果你的团队里刚好有设计师,我强烈建议让他们用画布工具先做一次“样式总攻”:把颜色规范、字体、线宽、节点阴影全部定好。之后所有代码绘图的样式定义,都引用这套规范里的常量。这样团队产出的图看起来像出自同一个人,专业感会明显上一个档次。
4. 架构图、流程图、ER图三类高频场景的差异化处理
不同类型的图,读者的阅读习惯不一样,设计侧重点也不一样。市面上大多数“图表设计教程”喜欢把所有图混在一起讲,但实际上,架构图、流程图、ER图各有各的“阅读协议”。不遵守这些协议,画得再精致也会让人觉得别扭。
4.1 架构图:先分边界,再画依赖
架构图,尤其是系统架构图,第一优先级是边界,第二优先级才是依赖关系。很多开发画架构图容易陷入“平铺所有服务”的误区:把所有服务画成大小一致的盒子,然后拉满箭头。这样做读者根本不知道系统的物理边界在哪里、逻辑边界在哪里、外部系统在哪里。
我的习惯是:
- 先画外部角色。用户、外部系统、下游依赖,全部放在大画布的最外层,不进任何容器。
- 再按物理或逻辑边界分组。同一个进程或同一个子系统的组件,用一个大容器包起来。物理边界用实线容器,逻辑边界用虚线容器。
- 最后画依赖箭头。主请求方向从左到右,数据流方向从上到下。每个箭头上尽量标注协议类型,比如 HTTPS、gRPC、消息队列。
如果某个依赖链路是这次要表达的核心重点,就把这条链路上的节点和连线加粗、上色,弱化其他链路的视觉权重。这就是“单主题原则”在架构图里的应用:一张架构图只允许有一个视觉焦点。
4.2 流程图:形状约定与分支表达
流程图的阅读协议是所有图里最固化的,因为读者会默认你遵循标准形状约定。圆角矩形表示起止,矩形表示处理步骤,菱形表示判断,平行四边形表示输入输出。这个约定别去打破,除非你有特别强的理由。
分支表达是最容易出错的地方。判断节点出来的每条分支线上,都要写清楚分支条件,而且标签要放在线上,不是放节点里。两条分支线必须用标签区分,条件写清楚“是/否”“成功/失败”这样明确的状态。
如果你画的流程图涉及多个角色或系统,建议使用泳道图。泳道图的要点是:把每个角色或系统画成一列或一行泳道,所有步骤都落在对应的泳道里;跨泳道的连线一定要走直角,不要让线斜着穿越多个泳道。斜线会严重破坏“每个节点属于哪个角色”这一视觉判断。
这里要特别提醒一个概念混淆:状态图不等于流程图。状态图表达的是对象在不同状态之间的转移,比如订单的状态:“待支付、已支付、已发货、已收货、已取消”。流程图表达的是步骤序列,比如“下单->校验库存->扣款->发货”是一个流程。两者逻辑不同,表达方式也不同。把状态机当流程图画,画出来总有一种说不出的别扭,原因就在这里。
4.3 ER图:实体关系是数据团队的沟通基座
ER图(实体关系图)的设计重点和架构图、流程图又不一样。它更强调实体、关系、基数三者的清晰表达。
- 实体画成矩形,关系画成菱形,属性画成椭圆。这是经典的 ER 图表示法,适合严谨的设计评审。
- 如果你觉得经典表示法太老派,也可以用现代工具里常见的 crow‘s foot 标记:实体之间用连线加脚标表达 1 对多、多对多。这种表示法更简洁,但要保证团队里所有人都看得懂。
- 主键和外键的位置要摆得清楚。外键关系用连线直接表达,不要让关系线交叉。
- 阅读顺序上,先让读者看清有哪些实体,然后看清实体之间的关系,最后再看属性。所以属性能省略就省略,不要试图在一张 ER 图里表达全部字段。
一个实用的技巧:画 ER 图的时候,先把实体想清楚再连线,不要边画边想。我一般会在草稿纸上先列实体清单,标出主键和外键,确认关系基数,然后再正式画图。这样画出来的 ER 图结构干净得多。
5. 让图表从“能看”到“好用”:设计规范的沉淀与迭代
单张图画得好,只能说明你自己对这张图想得清楚。团队里每张图都稳定好用,靠的是规范。这几年我越来越觉得,“图表设计规范”和代码规范同样重要,只是很多团队没意识到要建。
5.1 把颜色、线型、图例变成团队约定
规范的第一步是统一语言。所谓语言,包括:
- 颜色语义。全团队约定红=错误、绿=成功、琥珀=告警、蓝=强调,任何人不得在系统图里随意用颜色装饰。
- 边框语义。实线=物理边界、虚线=逻辑边界、粗线=主链路,统一理解。
- 图标与形状。需要自定义图例的时候,把图例画在图内的固定角落,而不是只写在口头。
有了这些约定,团队里的图即使出自不同人之手,也能保持看起来像同一种风格。新同学看图时,不用重新学一套“这个团队的颜色用法”。
5.2 建立图表评审清单,把走查变成例行公事
规范不能只停留在“写在 wiki 里”,要变成评审动作。我目前每张图正式交付前,都会过一遍自查清单:
- 10 秒测试。找一个小白同事,让 TA 看图 10 秒,然后说出这张图在讲什么。说不出来,就说明重点不够突出。
- 顺序测试。观察读者的视线路径,看是不是按照我设计的“入口->主干->细节”顺序在走。
- 灰度测试。把图转成灰度,检查信息是否仍完整。可以有效揪出只靠颜色传达的状态信息。
- 重叠测试。检查所有线是否穿过了文字或节点。
- 单主题测试。问自己:这张图是不是试图讲两件事?如果是,拆成两张。
这五条检查下来,基本能过滤掉大部分“能看但不好用”的图。强烈建议把这份清单加进文档评审流程里,让画图的人自己先自查,评审人再快速复核。
5.3 用一次架构复盘启动“旧图重绘”
如果你想在团队里推动图表设计规范,不要上来就搞全员培训,那样效果很差。更有效的方式是找一次架构复盘或者方案评审的机会,挑一两张最关键的历史架构图,现场做一次“旧图重绘”:把原来密密麻麻的图整理成有层次、有边界、有语义色的新图。对比放出来,团队就直观理解了规范的威力。
我自己在那次评审会之后,花了两个下午,把核心模块的架构图全部重绘了一遍,并在文档仓库里建立了统一的绘图源文件目录。后续每次迭代,图跟着代码一起更新。三个月之后回头看,这可能是那段时间对文档质量提升最大的一笔投入。
还有一个额外的好处:因为图是代码绘制的,review 的时候能看到改动 diff,比如“新增了一个消息队列节点”“这条线从调用关系改成了订阅关系”。这种可追溯性,是拖拽工具很难提供的。对于跨团队协作的场景,这个优势特别明显。
最后再分享一个我现在画图前必做的动作:先写一句话,描述“这张图的目标读者是谁,读者第一眼应该看到什么”。写不出来就不开画。很简单的动作,但对成图质量的提升非常有帮助。久而久之你会发现,所谓图表设计,本质不是美术,而是思考方式的外化。你脑子里图的信息层次清楚,画出来自然清楚;层次混乱,工具再好也救不回来。