1. 从“diagram-design”这个标题说起:它到底在解决什么问题
第一次看到“diagram-design”这个标题,很多人会以为它只是一个画图工具的代称,或者某个设计模板库的名字。但真正做过系统设计、技术方案评审、产品流程梳理的人一眼就能看出来,这个词背后指向的是一整套关于“如何把复杂逻辑用图讲清楚”的方法论和工具链。它不是一个单点工具,而是一个从需求拆解、结构建模、视觉编码到最终交付的完整工作流。
我在过去几年里参与过不少跨团队的技术方案评审和产品流程重构项目,最深的感受就是:图画得好不好,直接决定了沟通成本的高低。同样一套微服务架构,有人画出来三分钟能讲明白,有人画出来半小时还在解释箭头方向。这中间的差距,不是审美问题,而是设计方法问题。diagram-design 要解决的核心痛点就在这儿——让图成为真正的沟通工具,而不是装饰品。
这篇文章适合几类人看:一是经常需要画架构图、流程图、时序图的技术同学;二是需要梳理业务流程、做产品原型的产品经理;三是需要把复杂逻辑可视化呈现给非技术受众的咨询顾问或项目负责人。不管你用的是 draw.io、Excalidraw、Figma 还是代码化的 Mermaid、PlantUML,底层的设计思路是相通的。我会从整体设计思路、核心细节、实操过程、常见问题四个维度,把 diagram-design 这件事拆透。
2. 整体设计思路:为什么大多数人的图“不好看又不好懂”
2.1 图的本质是信息压缩,不是美术创作
很多人画图有个误区,觉得图要“好看”。好看当然重要,但好看是结果,不是目标。图的本质是信息压缩——把一段三百字的文字描述,压缩成一张十秒钟能看懂的图。压缩率越高,信息传递效率越高。你画一张架构图,如果读者需要对照旁边的文字说明才能理解,那这张图的压缩率就是零,甚至负数。
我在某次方案评审中见过一张“微服务调用关系图”,画了二十多个方框,箭头密密麻麻像蜘蛛网,每个方框里写着服务名,但没有标注调用协议、没有区分同步异步、没有标出核心链路。结果评审会上大家花了二十分钟在问“这个箭头是什么意思”“这个服务是干嘛的”。这就是典型的信息压缩失败——图只是把文字里的名词搬到了方框里,没有做任何结构化处理。
diagram-design 的第一个原则就是:先想清楚这张图要回答什么问题,再决定画什么。是要回答“系统有哪些模块”,还是要回答“请求怎么流转”,还是要回答“数据怎么存储”?不同的问题对应不同的图类型和不同的信息层级。一张图只回答一个问题,这是铁律。
2.2 图类型选择:别用流程图去干架构图的活
我见过太多人用流程图去画系统架构,用架构图去画业务流程,结果就是怎么看怎么别扭。每种图类型都有它擅长的信息结构,选错了类型,后面怎么调都救不回来。
| 图类型 | 擅长回答的问题 | 核心元素 | 典型场景 |
|---|---|---|---|
| 架构图 | 系统由哪些部分组成,如何分层 | 方框、分层、边界 | 技术方案评审、系统概览 |
| 流程图 | 步骤如何流转,决策点在哪 | 节点、箭头、判断菱形 | 业务流程、算法逻辑 |
| 时序图 | 谁在什么时候给谁发了什么消息 | 生命线、消息箭头、激活条 | 接口交互、协议设计 |
| 状态图 | 对象有哪些状态,如何迁移 | 状态圆角框、迁移箭头 | 订单状态、任务生命周期 |
| ER图 | 数据实体之间是什么关系 | 实体、属性、关系菱形 | 数据库设计、领域建模 |
| 思维导图 | 一个主题如何层层展开 | 中心节点、分支 | 需求拆解、知识梳理 |
选图类型的判断标准很简单:你的核心信息是“结构”还是“顺序”还是“交互”。结构用架构图,顺序用流程图,交互用时序图。如果一张图里既要表达结构又要表达顺序,那就拆成两张图,别硬塞在一起。
2.3 视觉编码:颜色、形状、粗细都是有语义的
diagram-design 里最容易被忽视但又最影响可读性的,是视觉编码。什么叫视觉编码?就是用颜色、形状、线条粗细、填充样式来承载信息。比如:
- 颜色:蓝色代表前端、绿色代表后端、橙色代表第三方依赖、红色代表风险点。颜色一旦赋予语义,就要全图统一,不能这张图蓝色是前端,下张图蓝色变成数据库。
- 形状:矩形代表服务、圆角矩形代表组件、圆柱代表数据库、菱形代表判断。形状的语义也要统一。
- 线条:实线代表同步调用、虚线代表异步消息、粗线代表核心链路、细线代表辅助链路。
- 分组:用背景色块或虚线框把同一层级的元素圈在一起,形成视觉分组。
我自己的习惯是,在画图之前先定一个视觉规范小卡片,写清楚这张图里每种颜色、每种形状、每种线条代表什么。画完之后对照检查一遍,确保没有“无语义的视觉元素”。什么叫无语义?就是你把那个颜色去掉、把那个形状换掉,图的信息量不变。那这个视觉元素就是多余的,要么赋予它语义,要么删掉。
2.4 布局原则:从左到右、从上到下、核心居中
布局是图的骨架。布局乱了,再好的视觉编码也白搭。diagram-design 的布局原则可以总结为三条:
第一,主流程从左到右或从上到下。人的阅读习惯是单向的,主流程方向要符合阅读习惯。如果是请求流转,就从左到右;如果是层级关系,就从上到下。
第二,核心元素居中或靠近中心。最重要的服务、最关键的节点,放在视觉中心位置。边缘位置放辅助元素、外部依赖、次要分支。
第三,减少交叉线。交叉线是阅读障碍,能避免就避免。如果实在避免不了,用“跳线”符号或者调整布局来减少交叉。我见过一张图交叉线多达三十多处,读者根本追不下去。
提示:布局阶段不要追求一步到位。先用纸笔或白板画出大致布局,确认信息层级和流向没问题,再进工具细化。直接在工具里拖拽,很容易陷入“局部好看但整体混乱”的陷阱。
3. 核心细节解析与实操要点:从需求到成图的完整拆解
3.1 需求拆解:先写“图的大纲”再动手
很多人画图是打开工具就开始拖方框,这是效率最低的做法。我的习惯是,画图之前先写一份图的大纲,用纯文本把这张图要表达的信息列出来。大纲包含四个部分:
- 图的目标:这张图要回答什么问题?给谁看?
- 核心元素清单:有哪些节点、角色、系统、数据实体?
- 关系清单:元素之间是什么关系?调用、依赖、包含、流转?
- 层级与分组:元素如何分层?哪些属于同一组?
这份大纲不需要很正式,用 bullet point 就行。但有了这份大纲,你在工具里拖拽的时候就有明确的“填充目标”,不会画着画着就跑偏。我实测下来,写大纲花五分钟,能省掉后面二十分钟的返工。
举个例子,假设你要画一个“用户下单”的流程图。大纲可能是这样的:
- 目标:说明用户从浏览商品到完成支付的完整步骤,给产品和技术团队看
- 核心元素:用户、商品列表、购物车、订单确认页、支付网关、订单服务、库存服务
- 关系:用户浏览→加购→确认订单→发起支付→支付回调→更新订单→扣减库存
- 分组:前端交互(浏览、加购、确认)、后端服务(订单、库存)、外部依赖(支付网关)
有了这个大纲,你进工具之后就是“填空”,而不是“创作”。创作阶段应该在大纲里完成,工具阶段只负责视觉呈现。
3.2 工具选型:没有最好的工具,只有最合适的场景
diagram-design 的工具选型,核心考量三个维度:协作需求、版本管理需求、输出格式需求。
| 工具类型 | 代表工具 | 适合场景 | 不适合场景 |
|---|---|---|---|
| 拖拽式白板 | 某白板工具、某设计工具 | 快速草图、协作讨论 | 复杂架构、精确布局 |
| 代码化图表 | Mermaid、PlantUML | 版本管理、文档嵌入 | 高度定制视觉、非技术受众 |
| 专业绘图 | 某绘图工具、某图表工具 | 正式交付、复杂布局 | 快速迭代、多人协作 |
| 设计工具 | 某设计平台 | 高保真视觉、品牌规范 | 技术图表、逻辑密集型 |
我自己的组合是:讨论阶段用白板工具,文档阶段用代码化图表,交付阶段用专业绘图工具。讨论阶段追求速度,白板工具最合适;文档阶段追求可维护性,代码化图表能进版本管理;交付阶段追求视觉质量,专业工具能精细控制。
注意:不要在一个项目里混用太多工具。工具切换的成本很高,而且风格不统一会让读者困惑。选定一套工具链,团队内统一使用。
3.3 视觉规范:建立你自己的“图表设计系统”
如果你经常画图,建议建立一套自己的图表设计系统。这套系统包含:
- 色板:定义 5-7 种语义颜色,比如主色、辅色、强调色、警告色、中性色。每种颜色有明确的语义。
- 字体规范:标题字号、正文字号、注释字号。通常标题 16-18px,正文 12-14px,注释 10-11px。
- 形状库:定义常用形状及其语义。矩形、圆角矩形、圆柱、菱形、圆形、六边形。
- 线条规范:实线、虚线、点线、粗细、箭头样式。
- 间距规范:元素之间的最小间距、分组框的内边距、画布边距。
这套系统不需要很复杂,一页文档就能写完。但有了它,你每次画图就不用重新做视觉决策,直接套用就行。而且团队内统一使用这套系统,出来的图风格一致,读者看起来也舒服。
我自己的色板是这样的:深蓝(核心服务)、浅蓝(辅助服务)、绿色(数据存储)、橙色(外部依赖)、灰色(基础设施)、红色(风险或重点)。这套色板用了三年,基本覆盖了所有技术图场景。
3.4 信息层级:一张图最多三层,超过就拆
信息层级是图的“深度”。一张图如果层级太多,读者会迷失。我的经验是,一张图最多三层信息层级。比如架构图:第一层是接入层,第二层是服务层,第三层是数据层。每层内部再分小组,但整体层级不超过三层。
如果信息确实需要四层甚至五层,那就拆成多张图。第一张图展示整体三层结构,第二张图深入某个层的内部细节。这叫渐进式披露——先给读者全局,再给细节。不要试图在一张图里塞下所有信息,那是文档干的事,不是图干的事。
提示:判断一张图是否层级过多,有个简单方法——把图缩小到 50% 看,如果还能看清主结构,说明层级合理;如果缩小后变成一团模糊,说明信息太密,需要拆分。
4. 实操过程与核心环节实现:从零画一张架构图的完整记录
4.1 第一步:明确目标与受众(5分钟)
假设我要画一张“某电商系统订单模块”的架构图,受众是技术评审委员会。目标是什么?回答“订单模块由哪些服务组成,它们之间如何交互,依赖哪些外部系统”。受众是技术专家,所以可以接受一定的技术细节,但不需要代码级细节。
这一步的输出是一句话:这张图要展示订单模块的服务组成、调用关系和外部依赖,给技术评审用。这句话决定了后面所有决策。
4.2 第二步:列出元素与关系(10分钟)
基于目标,列出核心元素:
- 接入层:API 网关
- 服务层:订单服务、支付服务、库存服务、通知服务
- 数据层:订单库、支付库、库存库
- 外部依赖:支付网关、消息队列
关系清单:
- API 网关调用订单服务
- 订单服务调用支付服务、库存服务、通知服务
- 支付服务调用支付网关
- 订单服务、支付服务、库存服务分别读写各自的数据库
- 订单服务、支付服务、库存服务通过消息队列异步通信
这一步的输出是一份纯文本清单,不需要任何格式。
4.3 第三步:选择布局与视觉编码(10分钟)
布局选择:从上到下三层——接入层、服务层、数据层。外部依赖放在右侧,用橙色标识。消息队列放在底部,用灰色标识。
视觉编码:
- 深蓝色矩形:核心服务(订单服务)
- 浅蓝色矩形:辅助服务(支付、库存、通知)
- 绿色圆柱:数据库
- 橙色圆角矩形:外部依赖
- 灰色圆角矩形:基础设施
- 实线箭头:同步调用
- 虚线箭头:异步消息
这一步的输出是一份视觉规范小卡片,画图时对照使用。
4.4 第四步:工具实操与参数配置(30分钟)
我选择用代码化图表工具来画,因为这张图需要进文档、需要版本管理。以下是一个简化的配置示例:
# 伪代码示意,展示结构定义思路 layers: - name: 接入层 elements: - id: gateway label: API网关 type: service color: deep-blue - name: 服务层 elements: - id: order-service label: 订单服务 type: service color: deep-blue - id: payment-service label: 支付服务 type: service color: light-blue - id: inventory-service label: 库存服务 type: service color: light-blue - id: notify-service label: 通知服务 type: service color: light-blue - name: 数据层 elements: - id: order-db label: 订单库 type: database color: green - id: payment-db label: 支付库 type: database color: green - id: inventory-db label: 库存库 type: database color: green external: - id: payment-gateway label: 支付网关 type: external color: orange - id: message-queue label: 消息队列 type: infra color: gray relations: - from: gateway to: order-service type: sync - from: order-service to: payment-service type: sync - from: order-service to: inventory-service type: sync - from: order-service to: notify-service type: async - from: payment-service to: payment-gateway type: sync - from: order-service to: order-db type: sync - from: payment-service to: payment-db type: sync - from: inventory-service to: inventory-db type: sync实际工具中,你需要根据具体语法调整。关键是先定义元素和关系,再调整布局和样式。不要一边画一边调样式,那样效率很低。
4.5 第五步:布局微调与交叉线消除(15分钟)
代码化工具通常会自动布局,但自动布局往往不完美。你需要手动调整:
- 把核心服务(订单服务)放在视觉中心
- 把外部依赖放在右侧边缘
- 把消息队列放在底部
- 调整箭头走向,减少交叉
如果交叉线实在太多,考虑调整元素顺序。比如把支付服务和库存服务的位置互换,可能就能减少好几条交叉线。
4.6 第六步:视觉检查与导出(10分钟)
导出之前,做一次视觉检查:
- 颜色语义是否统一?有没有无语义的颜色?
- 形状语义是否统一?有没有混用?
- 线条样式是否一致?实线虚线是否区分清楚?
- 文字是否清晰?缩小到 50% 是否还能看清主要标签?
- 是否有拼写错误?标签是否准确?
检查通过后,导出为 SVG 或 PNG。SVG 适合文档嵌入,PNG 适合即时通讯分享。如果工具支持,同时导出 PDF 版本,方便打印。
提示:导出时注意画布边距。边距太小会显得拥挤,边距太大又浪费空间。通常上下左右各留 20-30px 边距比较合适。
5. 常见问题与排查技巧实录:那些年我踩过的坑
5.1 图太乱怎么办:先删元素,再调布局
图乱的根本原因通常是元素太多。很多人舍不得删,觉得每个元素都重要。但图不是文档,图的价值在于选择性呈现。一张图如果超过 15 个核心元素,基本就乱了。
排查步骤:
- 列出所有元素,按重要性排序
- 只保留前 10-12 个最重要的元素
- 其余元素要么合并,要么放到第二张图
- 重新布局,减少交叉线
我自己的经验是,一张图超过 12 个元素,可读性就急剧下降。与其硬塞,不如拆图。
5.2 箭头方向混乱:统一流向规则
箭头方向混乱是常见问题。有人从左到右画,有人从右到左画,有人从上到下画,结果读者不知道按什么顺序读。
解决方法:全图统一流向规则。要么全部从左到右,要么全部从上到下。如果有反向箭头(比如回调),用不同颜色或虚线标识,并在图例中说明。
5.3 颜色太多太花:限制在 5-7 种
颜色是双刃剑。用得好,信息层级清晰;用不好,眼花缭乱。我的原则是:一张图的颜色不超过 7 种,其中 2-3 种是主色,2-3 种是辅色,1-2 种是强调色。
如果发现颜色不够用,说明信息层级没理清。先理层级,再分配颜色。
5.4 文字太多:标签要短,注释要精
图上的文字要短。方框里的标签最好控制在 6-8 个字以内。超过 10 个字,读者阅读速度就下降。如果需要更多说明,用注释或图例,不要塞进方框。
我见过有人在方框里写了两行文字,每行 15 个字,结果方框巨大,布局全乱。正确做法是:方框里只写核心名称,详细说明放在图下方的注释区。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 图太乱 | 元素太多、层级太深 | 删减元素、拆图、限制三层 |
| 箭头混乱 | 流向不统一 | 统一流向规则,反向箭头特殊标识 |
| 颜色太花 | 颜色语义不明确 | 限制 5-7 种颜色,赋予明确语义 |
| 文字太多 | 标签过长 | 标签控制在 6-8 字,详细说明放注释 |
| 交叉线多 | 布局不合理 | 调整元素顺序,核心居中,边缘放辅助 |
| 缩小后看不清 | 字号太小、间距太密 | 增大字号,增加间距,减少元素 |
| 风格不统一 | 没有视觉规范 | 建立图表设计系统,统一色板形状线条 |
提示:每次画完图,把图发给一个不了解背景的同事看,问他“这张图在说什么”。如果他能在一分钟内说出大意,说明图合格;如果他说“看不懂”,说明还有优化空间。
6. 进阶技巧:让图从“能看”变成“好用”
6.1 图例与注释:别让读者猜
图例是图的“说明书”。颜色、形状、线条的含义,都要在图例中说明。图例放在图的右下角或左下角,不要放在顶部,顶部通常留给标题。
注释用于补充关键信息。比如某个服务有特殊限制,某个调用有超时设置,都可以用注释标出。注释要精炼,一句话说清楚。
6.2 版本管理:图也要有变更记录
图是活的,会随着系统演进而变化。建议给图加版本号和变更记录。比如“v1.2,2024-06-15,新增通知服务”。这样读者知道这张图是什么时候的,避免拿旧图讨论新问题。
代码化图表工具天然支持版本管理,因为图就是代码,可以进 Git。拖拽式工具通常没有版本管理,需要手动保存不同版本。
6.3 多图联动:用一致的视觉语言
如果一个项目有多张图,确保它们使用一致的视觉语言。同样的颜色代表同样的含义,同样的形状代表同样的元素类型。这样读者在看不同图的时候,不需要重新学习视觉规则。
我自己的做法是,项目开始时先定一份视觉规范,所有图都按这份规范来画。规范文档放在项目 Wiki 里,团队成员都可以参考。
6.4 从图到文档:图的嵌入与引用
图最终要嵌入文档或演示文稿。嵌入时注意:
- 分辨率要足够,SVG 最佳,PNG 至少 2x
- 图要有编号和标题,方便引用
- 图下方可以加一段文字说明,补充图里没表达的信息
- 如果图会更新,文档里用链接引用,不要直接嵌入,避免版本不一致
7. 我个人的实操体会
画了这么多年图,最大的体会是:图的质量不取决于工具,取决于画图之前的思考。工具只是执行,思考才是核心。一张好图,是在脑子里已经画好了,工具只是把它呈现出来。
另一个体会是:图是给人看的,不是给机器看的。不要追求“完整”,要追求“清晰”。完整是文档的事,清晰是图的事。一张图能回答一个问题,就是好图。
最后分享一个小技巧:如果你不确定一张图好不好,把它打印出来,贴在墙上,退后三步看。如果三秒内能看出主结构,说明图合格;如果三秒内看不出,说明还需要优化。这个方法的原理是,退后三步相当于模拟了读者快速浏览的场景,能暴露信息层级的问题。