diagram-design 这个词初看像是个给设计师准备的素材项目,实际上做完整套流程之后,我最深的感受是:它本质上是一次把复杂逻辑翻译成视觉结构的建模工作。架构图、流程图、数据流转图、系统时序图,名称各不相同,但核心动作一致——找出实体,理清关系,再决定用什么形状、什么颜色、什么连线把这些关系讲明白。写文档可能几百字才能描述清楚的链路,一张设计良好的图几秒就能让人建立全局认知。这篇文章适合两类人:一类是经常要画架构图但总觉得自己画出来偏乱的开发者,另一类是要对外输出可交付图表的交互设计师。我按自己的实际工作流来拆解,从建模、画布、样式到导出交付,每一步后面都补上踩坑后总结出来的教训。
1. 先把图画对,再谈画得好看:图表设计的建模思路
画图最常见的问题,是拿到需求直接开画。以前我也犯过:“我要画一个订单链路”这个念头一起,马上拖两个方块,中间连一根箭头,然后越加越多,十几个节点铺满一屏,线条乱成一团。回头复盘,问题的根源不是配色,不是手残,而是没有做建模。
图表的本质是关系集合:节点代表实体,连线代表关系。节点选得对不对,连线有没有遗漏,层级分得清不清楚,比任何样式细节都重要一百倍。所以我现在画任何图,第一件事不是打开画布,而是先把节点和链路在脑子里或者草稿纸上过一遍。
1.1 节点与链路:图的语法
一张图表里的每个节点,都要能回答三个问题:这是什么、为什么出现在这里、读者应该在哪个层级注意到它。
节点类型大致分四类:实体节点代表系统、服务或模块;动作节点代表流程中发生的操作;状态节点代表某个对象所处的情形;数据节点代表存储、文件或消息队列。这四类节点建议用不同形状固定下来。我常用的组合是:实体用矩形或含圆角的矩形,动作用圆角矩形,状态直接用圆形或胶囊,数据用圆柱形或一侧开口的四边形。形状本身就是语义,不需要读者读文字也能先建立直觉。
链路比节点更容易被忽视。同样是连线,是调用关系、数据流动,还是时间先后顺序?语义不同,线的表达方式就该不同。调用关系用带箭头的实线,数据流动可以用带箭头的虚线,时间先后有条件分支时用折线更清楚,容器归属关系则用一条不带箭头的细线表示“属于某个子系统”。这些约定一开始就要统一,不然后面维护时会非常痛苦——有一次我为了省事,所有连线都用同一种蓝色实线,结果过了两周再打开文件,光靠脑子根本分不清哪些是数据流,哪些是服务调用。
我做链路梳理时有个固定动作:把每一根连线都写成“主语 + 动词 + 宾语”的短句。比如“用户中心调用订单服务”“支付回调写入消息队列”。短句写不出来,说明链路本身还没想清楚;短句写出来,连线上的标注文字也就顺手有了,不会出现“这条线是干嘛的”的尴尬。
1.2 图层设计:主干、次级与注释
很多人把图的所有信息放在同一个平面,结果整张图又厚又堵。我更推荐把信息分成三个层级:主干链路、支撑细节、注释说明。
主干链路是读者第一眼要看到的东西,通常不超过五到八个节点,一条主线能从头走到尾。它是整张图的骨架。支撑细节是旁路逻辑、异常分支、次要系统,它们需要存在,但视觉上不能抢主干的戏。注释说明则包括定义、数据格式、口径说明,这些往往和具体节点绑定。
三个层级对应到图纸上就是三个图层组:主干层、次级层、注释层。画完之后,给不同的人看的时候可以开合图层。给领导汇报,只开主干层,一张干净的主链路图;给开发评审,三个图层全开,细节都在;给新同事培训,主干加注释层,既看流程又看口径。
图层设计对后期的可维护性影响极大。我见过太多人画图,所有元素全部铺在同一层,想改一个模块的位置,得小心翼翼地把相关线条一根根重连。正确做法是从一开始就养成习惯:把这些元素分组,连线单独放一层,注释文字独立一层。分组不是画完之后的清理动作,而应该在第一笔落下之前就想好。
2. 视觉语言的四根支柱:网格、连线、色彩和文字
模型理清楚了,接下来才是视觉表达。很多人把视觉表达理解为“好看”,但我觉得更准确的说法是“可读”。设计良好的图,扫一眼能看出重点,再扫一眼能看出关系,第三眼才能注意到细节。这个过程越顺畅,图越合格。
视觉语言主要受四件事影响:网格怎么用、连线怎么走、色彩怎么分配、文字怎么排版。四根支柱互相影响,任何一根出问题,整张图都会失衡。
2.1 网格系统:一切对齐问题的根源
很多画图新手犯的第一个错误是随意摆放节点位置。节点之间距离参差不齐,边线不上不下,看上去总觉得“哪里不太对劲”,但又说不清问题在哪。这个“不对劲”基本都来自没有网格约束。
我所有图表统一使用 16px 的基础网格。为什么是 16 而不是 8 或 10?因为 16 和界面设计里常用的 8px 栅格是倍数关系,容易换算;同时 16px 在放大缩小后仍然能被整除,导出 2 倍图时不会出现半像素的边缘。画布设置里开启网格吸附,节点矩形框的边界必须落在网格线上,连线的拐点也尽量落在网格点上。这样最终成品的边缘始终是整数,导出任何尺寸都不会发虚。
间距同样要有节奏。节点之间的最小间距我习惯设为 24px(也就是 1.5 个网格),分组之间的间距再加一倍。同类元素间距一致,不同层级间距拉开,层次感不用靠颜色也能建立起来。实际操作时可以先摆好三四个节点,然后按住对齐工具让它们的间距均匀化。多数矢量绘制工具都有“分布间距”功能,把选中节点的水平间距或垂直间距设为同一个值即可。别小看这一步,它比后面花时间微调配色收益高得多。
2.2 连线不是装饰:语义优先级在线的造型上
连线是所有图表里信息承载密度最高的元素,也是最容易被随手画的元素。我见过不少图,节点做得精致,连线却乱拉一气,斜线、曲线、直角线混着用,读者根本分不清主次。
连线的造型应该是有意识的选择,而不是“哪个看起来顺眼用哪个”。直线适合表达直接的服务调用和明确的数据流转,给人干脆、快速的感觉;曲线适合表达容器内部的从属关系或柔性流程,视觉上更柔和;直角折线适合流程步骤,尤其在泳道图里,直角能让人明确感知“这一步移动到下一个泳道”的方向变化。
箭头方向也不容忽视。单箭头表示单向调用,双箭头表示双向通信,没有箭头的线表示静态归属关系。箭头大小全图要统一,我一般把箭头边长设为 6px 到 8px,太大抢眼,太小在缩放后根本看不见。
交叉是连线最大的敌人。两条连线交叉时,读者会自动开始判断“是不是有关系”,无形中增加理解负担。减少交叉的办法不是画线时绕着走,而是调整布局:把主链路上的节点按顺序排成一条直线或者“S”形,把分支逻辑放在主干的下方或侧边,而不是零散地堆在中间。这个调整在建模阶段就要考虑,到画线阶段再改布局就太晚了。
2.3 色彩数量控制在四个以内
色彩在图表里的作用是传递状态和属性,不是装饰。颜色一多,读者就会开始猜“这个颜色是不是有特殊含义”,猜不到就会烦躁。
我的配色原则是:一个主色、一个辅助色、一个警戒色、再加若干中性色。主色用于核心链路和关键节点,辅助色用于次级模块和支撑系统,警戒色只用于异常分支、告警状态或需要特别强调的内容,中性色(灰、白、浅灰)用于背景、边框、注释文字。总共不超过四个有色彩倾向的颜色,剩下的全交给中性色去平衡。
同时要避开红绿组合。不是红色的锅,而是红绿色盲人群占比太高。我常用蓝橙作为主对比色,蓝色代表常规链路,橙色代表异常链或重点提示。这两种颜色在色盲滤镜下也能明显区分。
还有一个容易被忽略的点:不要用渐变。渐变色在单张图上很漂亮,但图表经常需要局部修改,一旦要调整渐变节点,颜色极难保持一致。纯色才是真正可维护的选择。如果你一定要强调某个节点,用加深同色系的方式,而不是新增第五种颜色。
2.4 文字层级与可读尺寸
图的文字不是文章,越短越好。节点标题控制在六个字以内,连线标注控制在十个字以内,注释说明也不建议超过二十个字。文字一旦变多,节点就会被迫变大,节点变大之后整张图的密度就会失衡。
字号体系我固定为三档:16px 加粗用于总标题和核心节点标题,13px 到 14px 用于普通节点标签,11px 到 12px 用于连线标注和注释。这个体系能保证即使在笔记本屏幕上 100% 缩放,最小的字依然看得清。有些工具按 pt 而不是 px 显示,换算也很简单:1pt 约等于 1.33px,注意统一单位,别混用。
还有一个基础但重要的问题:中文字符宽度比英文字符大,节点框的宽度不能按英文字符数量预估。我的经验是,一个包含四个汉字的标签,节点左右留白加起来至少 24px,否则文字会贴住边框。画节点时,先输入文字内容,再把节点框拉大到文字两侧各有 12px 以上留白,再统一对齐,这样所有节点看起来才会舒服。
3. 一张系统架构图的完整实操过程
理论讲了不少,下面用一个实际例子完整走一遍。假设现在要画一张订单系统的核心链路架构图,涉及用户、订单服务、库存服务、支付网关和消息队列。没有真实项目背景,就是一个典型的模拟场景,但操作过程完全可复用。
3.1 需求输入:先列一份元素清单
拿到需求后,第一件事不是打开画布,而是列清单。我用表格记录节点信息:节点编号、节点名称、节点类型、所在层级、主要连线方向。
| 编号 | 节点名称 | 节点类型 | 所在层级 | 主要连线 |
|---|---|---|---|---|
| N1 | 用户端 | 实体 | 主干 | 下单 -> N2 |
| N2 | 订单服务 | 实体 | 主干 | 调用 N3;异步通知 N5 |
| N3 | 库存服务 | 实体 | 主干 | 扣减库存 -> 返回结果 |
| N4 | 支付网关 | 实体 | 次级 | 接收支付回调 -> N2 |
| N5 | 消息队列 | 数据 | 次级 | 异步处理 -> N6 |
| N6 | 对账模块 | 实体 | 注释 | 消费消息 -> 写报表 |
这份清单里还看不出图好不好看,但它保证了画图时不会漏掉任何一个重要节点。我在实际操作中遇到过很多次:自认为画完了,同事指着一处问“这里支付失败怎么办”,我才发现异常分支根本没进元素清单。清单就是图的边界,先有边界,再谈内容。
3.2 分层绘制:先把骨架摆出来
画布我建议拉成 16:9 的横版,默认尺寸 1600 x 900,这样在大多数会议室屏幕上都能完整展示,缩放时也不容易糊。
第一步画主干。把 N1、N2、N3 三个节点按“从左到右”的主流程横向排开,右键开启网格吸附,让它们的底部对齐在同一条水平网格线上。节点之间保持 80px 间距,这个间距足够放下连线标注文字,也不至于拉开太远导致视野分散。
第二步连主干线。从 N1 右边缘中点引出箭头到 N2 左边缘中点,标注“下单请求”。从 N2 右边缘引出箭头到 N3 左边缘中点,标注“扣减库存”。线宽默认 2px,拐点走直角,保证整个主干是一条水平直线,不用斜线。
第三步加次级节点。N5 放在 N2 和 N3 下方偏右的位置,用虚线从 N2 下边缘引出到 N5 上边缘,表示“异步通知”。这里一定要让虚线拐点在网格点上,导出时才不会出现断断续续的锯齿。N4 放在 N2 下方左侧,用实线连接,表示支付网关回调路径。注意:N4 和 N5 所在的位置不要侵入主干层的垂直空间,否则读者视线会被干扰。
第四步加注释层。在 N5 下方放一个浅灰色圆角矩形,写入一段说明:“消息队列在峰值时最多堆积约 5 万条,对账模块按批消费。”这类信息属于口径解释,不该出现在主干上。
最后把三层建成分组,命名清楚:主干、次级、注释。我看到很多图元件的分组名还是默认的“Frame 9”“Layer 14”,过两天谁都分不清哪个是哪个。图层命名这件事,画的当下觉得浪费时间,改图时才会感谢自己。
3.3 尺寸、间距与导出参数
小到一个节点,大到整张画布,都要有统一的尺寸基准。我习惯把基础节点设为宽 160px、高 48px,圆角 8px。这个尺寸在 1600 x 900 的画布上能放下约七个主干节点,不会太密。如果节点数量超过八个,优先考虑拆成两张图,不要硬塞。
间距上,主干节点水平间距 80px,次级节点与主干节点垂直间距 64px,注释层与最近的次级节点间距 48px。这些数值不是玄学,它们都建立在网格系统之上,保证任何两个元素边缘的距离都能被 16 整除。
导出参数是我被问过最多的问题。按不同用途给一个参考表:
| 用途 | 导出格式 | 缩放 | 说明 |
|---|---|---|---|
| 文档内嵌 | SVG | 保持矢量 | 文字可选中,支持检索 |
| PPT 引用 | PNG | 2 倍图(3200 x 1800) | 保证投影不虚 |
| 打印 | 1:1 | 如果有字体,记得嵌字体 | |
| 网页预览 | PNG | 1 倍图 | 控制体积,单图尽量不超过 500KB |
关于 SVG 有一点要提醒:SVG 是目前对图文关系最友好的矢量格式,很多文档系统都能直接插入,但它的渲染依赖字体环境。如果用户打开文档的电脑没有装对应字体,排版会乱。保险做法是在非编辑场景下转成嵌入字体的 PDF,或者在 PPT 里把 SVG 转成图片后使用。
4. 工具选型与参数设置:不要被自动布局绑架
聊完实操,必须聊工具。很多人在工具选择上纠结半天,其实问题不是“哪个工具更好”,而是“哪个工具更匹配当前场景”。我按工作方式把图表工具分成三类,每种都有明确的长处和短板。
4.1 三类工具的取舍
第一类是静态绘制类工具,也就是常见的矢量绘图软件。优点是自由度极高,像素级控制,适合精细设计;缺点是所有节点都得手动摆放、手动拉线,效率偏低。
第二类是自动布局工具,通常以“拖入节点 -> 自动排列 -> 一键生成”为卖点,适合快速起稿和探索结构。我经常用它先验证链路是否通顺,但它的自动布局结果往往机械感很强,最终还是会回到静态绘制工具里重新排样式。这类工具还有一个问题:布局算法一换,整张图全部重排,想要的微调很难保留。
第三类是代码式绘图工具,用文本描述节点和连线,再解析成图。优点是可版本化、可复用,适合图表数量大且需要频繁更新内容的团队;短板也很明显:样式定制能力有限,想做出高度精致的细节设计非常费力。
我的组合方式是:快速建模用代码式绘图工具草稿,正式交付用静态绘制工具精修。草稿阶段最重要的是“快”,让脑子里的关系立刻落到纸面;精修阶段最重要的是“可控”,每个像素都由我决定。中间不要混着用,否则很可能用自动布局工具调了半天样式,效率反而更低。
4.2 我常用的参数基准
不管用什么工具,我会先建一套自己的参数基准,存在模板文件里。这样每张图出来,风格都能保持一致。按图表类型有三个预设:
| 参数 | 架构图预设 | 流程图预设 | 状态图预设 |
|---|---|---|---|
| 画布 | 1600 x 900 | 1600 x 1000 | 1200 x 800 |
| 网格 | 16px | 16px | 16px |
| 基础节点 | 160 x 48,圆角 8 | 200 x 52,圆角 4 | 随内容自适应 |
| 连线宽度 | 2px | 2px | 1.5px |
| 主色 | 蓝 | 蓝 | 蓝 |
| 辅助色 | 橙 | 橙 | 橙 |
| 警戒色 | 红(仅限异常) | 红(仅限条件) | 红(仅限错误态) |
| 正文字号 | 14px | 14px | 13px |
| 标注字号 | 12px | 12px | 12px |
模板里还固定了一套命名规则:颜色变量叫 primary、secondary、warning、neutral,同义词少一点,团队协作时大家理解一致。节点图层命名格式统一为“类型_内容_层级”,比如“实体_订单服务_主干”。这套命名坚持下来,即使中途换人接手,读图成本也会低很多。
5. 常见问题与排查技巧实录
画图这件事,做多了总会遇到一些重复性的问题。我把这几年踩过的坑整理成一张速查表,再挑几个典型展开分析。表格没法覆盖所有情况,但大部分图表翻车现场都能在这张表里找到影子。
| 常见问题 | 可能原因 | 解决思路 |
|---|---|---|
| 导出后文字发虚 | 画布尺寸与导出尺寸不一致 | 画布设目标尺寸,勿后期拉伸 |
| 字体排版错乱 | 未嵌入字体或字体缺失 | 导出前转曲,或使用通用字体 |
| 连线交叉成蜘蛛网 | 节点布局没有按主链路规划 | 回到建模层重新排布节点 |
| 修改节点后连线错位 | 连线未锁定锚点 | 连线两端锚定到节点边界中点 |
| 节点比例失衡 | 节点大小没有随内容预估 | 先填文字,再拉框,最后对齐 |
| 颜色前后不一致 | 每次手动选色 | 使用模板颜色变量 |
| 图越改越乱 | 图层未分组、命名混乱 | 每次保存前清理分组与命名 |
| 一图塞了太多信息 | 想表达的边界没控制住 | 拆成多张图,只保留主干 |
5.1 导出后文字发虚,大多是尺寸和格式的问题
这个问题出现概率极高。一大半是因为先选了 1000 x 600 的画布,画到一半觉得内容放不下,直接把画布拉成 2000 x 1200,最后导出 PNG 时文字边缘全都糊了。原因很简单:画布修改后,里面元素的比例没有等比缩放,文字会以非整数值被渲染。
正确的做法是在画之前就定好画布尺寸,或者在修改尺寸时勾选“缩放全部元素”选项,确保字体大小、节点边框仍然保持整数像素。另一个坑是直接在网页里把 SVG 截图当 PNG 用,这种二次截图的画质极不稳定。SVG 该导出就导出,不要截图。
5.2 连线交叉成蜘蛛网:优先改布局,不要硬画
交叉线多的时候,大多数人会尝试在连线层面绕来绕去,结果越绕越乱。我踩过一次大坑:一张图里有六条线交叉,我花了四十分钟在“从上面绕”“从下面穿”之间反复调整,还是没有完全避开。后来退一步看布局,把两组成员互换一下排列顺序,交叉立刻少了三条。
所以现在一看到交叉过多,我会先停下来,回到网格视图重新排列节点。这里有个经验:把主链路节点按照业务时序排列,分支节点统一排到主链路的同一侧,交叉概率会大幅下降。实在避免不了的交叉点,标注一个小圆弧跳线,或者留白断开,而不是粗暴地把一根线盖在另一根线上。
5.3 图改起来比画起来难:图层命名的价值
几乎所有长期维护的图表,最后都会面临修改。而修改时最大的敌人是找不到目标:某个注释在哪个图层?这条线连的是哪个节点?命名混乱的时候,这些都要靠肉眼找,时间全耗在读图上。
我从某次剧烈返工之后学到一个习惯:每次完成关键步骤就保存新版本,用日期加版本号命名,比如“订单链路_20250601_v2”。文件内图层按主干、次级、注释分组,每个节点在命名里带上类型前缀。这样即使一张图放了半年,重新打开也只需要十秒就能定位。很多人觉得这就是形式主义,直到需要在客户面前现场改图时才意识到:好的命名习惯会救命。
5.4 信息密度失控:一图只说一件事
最后这个问题最难纠正,因为它是认知层面的。画图时总觉得这张图最好把所有上下文都带上,免得对方还要看别的文档。结果是信息密度过高,读者视线无处安放,主链路完全被淹没。
我现在奉行“一图一事”的原则。一个核心链路,对应一张主题图;相关的异常分支、数据细节、注释信息,通通放进附属图或文字说明。这不会让信息变少,但会让信息可读性变强。读者先看懂主题图,再有需要去查附属材料,比一开始面对一张拥挤无比的大图要舒服得多。
有些图确实需要全局全景,那就单独画一张全景图,把数据口径统一,不在全景图里堆操作细节。全景图解决“系统有哪些部分”,细节图解决“部分之间怎么运作”,两者分开画,效果远好于硬缝合。
我个人很早以前也总觉得画图是顺手做的事,没有章法,全凭感觉,后来因为一张核心链路图画得混乱,被同事连续追问了不下五次“这条线到底什么意思”,才彻底意识到图表设计是需要认真对待的工序。diagram-design 难的不是会操作某个软件,而是能不能在动手之前把关系想清楚,动手之后把层级做干净。
最后分享一个一直在用的小技巧:每次画完图,离开电脑前花三十秒对整张图做一次“缩小检测”——把图缩放到 25% 的尺寸,眯着眼看整体,哪个地方显得特别拥挤,哪里颜色突然跳出来,哪里有莫名其妙的空白,一眼就能发现。这个习惯不需要任何额外工具,却比盯着 100% 视图反复挑细节高效得多。记住:好图不是画出来的,是改出来的,而且改的一定先是结构,最后才是颜色和线条。先把这套流程跑通,再谈风格和创意,你会发现自己画出来的图,既清楚又耐看。