1. 从一张草图到一套系统:diagram-design 到底在解决什么问题
第一次听到 diagram-design 这个词,很多人会下意识以为它只是一个画图工具,或者某个设计软件的插件。但真正在项目里摸爬滚打过几年的人会明白,它更像是一套关于“如何把复杂信息变成可读图形”的方法论。我最早接触这个概念,是在给一个内部系统做架构梳理的时候。当时团队里五个人,每个人画的架构图都不一样,有人用矩形代表服务,有人用圆角矩形,有人把数据库画成圆柱,有人直接写个“DB”了事。结果就是,图发给不同的人看,理解成本极高,甚至出现过因为箭头方向理解错误导致接口对接返工的情况。
diagram-design 要解决的核心问题,就是图形表达的标准化与语义化。它不追求画得多好看,而是追求画得“对”——让每一个形状、每一条连线、每一种颜色都有明确的含义,并且这套含义在团队内部、在文档之间、在不同工具之间保持一致。你可以把它理解成给图形设计领域做了一套“语法”,就像写代码需要遵循命名规范一样,画图也需要遵循一套视觉规范。
这套东西适合谁?我总结下来有三类人最需要:第一类是技术团队的架构师或技术负责人,需要频繁输出系统架构图、流程图、时序图;第二类是产品经理和交互设计师,需要把业务流程和页面逻辑可视化;第三类是技术写作者和文档维护者,需要让文档里的图长期可维护、可更新。如果你只是偶尔画个示意图发群里,那可能用不上这么重的体系,但只要你涉及多人协作、长期维护、跨团队沟通,diagram-design 的价值就会立刻显现出来。
我见过太多团队在项目初期不重视图形规范,等到系统复杂了、人员流动了,才发现那些图没人看得懂,也没人敢改。这时候再回头整理,成本至少是当初的十倍。所以我的建议是,如果你现在正在从零搭建一个项目,或者正在整理一套历史文档,不妨把 diagram-design 的思路提前引入,哪怕只落地最基础的几条规则,后面都会省下大量沟通成本。
2. 核心设计原则:为什么是这五条而不是别的
2.1 语义优先:形状必须承载含义
diagram-design 的第一原则是形状即语义。什么意思?就是你不能因为觉得圆角矩形好看就把所有节点都画成圆角矩形,也不能因为某个图标漂亮就随便往图上放。每一个形状的选择,都应该对应一个明确的概念类别。
我在实际项目中总结了一套最简可行规则,经过多个项目验证,基本能覆盖百分之八十的场景:
| 形状 | 语义 | 典型用途 |
|---|---|---|
| 矩形 | 处理单元 | 服务、模块、函数、组件 |
| 圆角矩形 | 外部实体 | 用户、第三方系统、外部依赖 |
| 圆柱 | 数据存储 | 数据库、缓存、消息队列 |
| 菱形 | 判断节点 | 条件分支、开关、路由决策 |
| 平行四边形 | 输入输出 | 数据流入流出、接口调用 |
| 虚线框 | 逻辑分组 | 子系统边界、部署单元 |
这套规则看起来简单,但真正落地时最大的阻力来自“审美惯性”。很多人会觉得圆柱体太老土,想用个漂亮的数据库图标代替。我的经验是,图标可以用,但必须配合形状使用,比如在圆柱体内部放一个小图标作为辅助识别,而不是直接用图标替代形状。这样既保留了语义一致性,又兼顾了视觉丰富度。
还有一个容易被忽略的点是连线语义。实线代表同步调用,虚线代表异步消息,带箭头的实线代表数据流向,不带箭头的实线代表关联关系。这些规则一旦定下来,就要写进团队的绘图规范文档里,新成员入职第一周就要熟悉。我见过一个团队因为没定连线规则,结果架构图里实线和虚线混用,后来排查一个消息丢失问题时,花了整整两天才确认某条链路到底是同步还是异步。
2.2 层级克制:一张图只讲一件事
第二个原则是单图单主题。很多新手容易犯的错误是,试图在一张图里把整个系统的所有细节都画出来。结果就是图越来越大,线条越来越密,最后变成一张“蜘蛛网”,除了画图的人自己,没人能看懂。
diagram-design 提倡的是分层表达。一张图只回答一个问题:这张图是讲部署架构的,就只画部署单元和网络关系;是讲业务流的,就只画业务节点和流转方向;是讲数据模型的,就只画实体和关系。不同层级的图之间通过引用关联,而不是把所有内容塞进一张图。
我通常会把一个系统的图形文档分成四层:
- 上下文层:系统与外部世界的关系,通常只有一张图,画清楚系统边界和外部依赖。
- 容器层:系统内部的主要子系统或服务,展示它们之间的调用关系。
- 组件层:单个子系统内部的模块划分和职责。
- 代码层:关键流程的时序图或状态图,通常只针对核心链路。
每一层单独成图,图与图之间通过统一的命名和编号关联。比如容器层的某个服务,在组件层会有一张对应的展开图,图名保持一致,只是加一个层级后缀。这样任何人拿到这套图,都能快速定位到自己关心的层级,而不是在一张巨图里迷失。
2.3 一致性:跨工具、跨时间的视觉统一
第三个原则是跨工具一致性。现实中一个团队往往不会只用一种绘图工具,有人用 draw.io,有人用 ProcessOn,有人用 Figma,还有人直接用代码生成。如果每个工具里画的图风格都不一样,那协作效率就会大打折扣。
diagram-design 的解法是定义一套与工具无关的视觉令牌,包括颜色、字体、线宽、间距、圆角半径等。这套令牌以配置文件的形式存在,在不同工具中通过主题或样式模板的方式导入。比如主色调用什么色值,警告状态用什么色值,成功状态用什么色值,全部提前定好,画图的人只需要选择语义角色,而不是手动调色。
我自己的做法是维护一个diagram-tokens.json文件,里面定义了所有视觉变量。然后在 draw.io 里通过自定义样式库导入,在代码生成工具里通过主题配置读取。这样即使换了工具,图的视觉风格也能保持一致。更重要的是,当团队决定调整品牌色时,只需要改一个文件,所有图重新生成即可,不需要一张一张手动修改。
2.4 可维护性:图是代码,不是画作
第四个原则是图即代码。这个理念在 diagram-design 里非常重要。传统画图方式的问题在于,图是一次性艺术品,画完就固定了,后续修改成本极高。而 diagram-design 提倡用文本描述图形,通过工具生成最终图片。
这样做的好处非常明显:第一,图可以纳入版本控制,每次修改都有记录,可以 diff,可以回滚;第二,图可以通过 CI 自动生成,保证文档里的图永远是最新的;第三,图可以被程序解析,比如自动检查是否有孤立的节点、是否有循环依赖。
我目前主要用两种方式落地这个原则:对于结构相对固定的图,用声明式语法描述,比如用 Mermaid 或 PlantUML 的文本格式;对于需要精细布局的图,用代码调用绘图库生成,比如用 Python 的 diagrams 库或 JavaScript 的 D3。两种方式各有优劣,前者上手快但布局控制弱,后者灵活但学习曲线陡。我的建议是,团队内部先统一一种方式,不要混用,否则维护成本反而更高。
2.5 可访问性:让所有人都能看懂
第五个原则是可访问性。这一点经常被忽略,但实际影响很大。所谓可访问性,包括颜色对比度是否足够、是否仅靠颜色区分信息、文字大小是否可读、是否有替代文本等。
我遇到过好几次这样的情况:图在设计师的显示器上看起来很清楚,但投到会议室大屏上,浅灰色的线条几乎看不见;或者有人把图打印成黑白版,结果靠颜色区分的模块全部变成一样的灰色。这些都是可访问性没做好的表现。
diagram-design 的建议是:颜色只作为辅助,形状和文字才是主要区分手段。比如成功和失败两种状态,不能只用绿色和红色区分,还要配合不同的形状或图标。线条的粗细也要有足够差异,不能依赖细微的色差。文字大小建议不小于 12px,关键标签不小于 14px。如果图会被打印,最好提前做一次灰度测试,确保黑白模式下依然可读。
3. 实操落地:从零搭建一套 diagram-design 体系
3.1 第一步:定义你的视觉令牌
搭建体系的第一步不是画图,而是定义视觉令牌。这就像写代码之前先定命名规范一样,是基础中的基础。我通常会把令牌分成四类:
颜色令牌:包括主色、辅助色、语义色(成功、警告、错误、信息)、中性色(背景、边框、文字)。每一类定义三到五个色阶,从浅到深。比如主色可以定义primary-100到primary-900,画图时根据层级选择不同深浅。
字体令牌:定义字体族、字号阶梯、字重。建议字体族选择系统默认的无衬线字体,保证跨平台一致性。字号阶梯建议用 12、14、16、20、24 这几个档位,不要太多,否则选择困难。
间距令牌:定义节点之间的最小间距、分组框的内边距、画布边缘留白。我通常用 8 的倍数作为基础单位,比如 8、16、24、32。这样布局时容易对齐,视觉上也更整齐。
线条令牌:定义线宽、线型、箭头样式。建议只保留三种线宽:细线用于辅助关系,中线用于主要关系,粗线用于强调。线型只保留实线和虚线两种。
定义好之后,把这些令牌写成一个 JSON 或 YAML 文件,放在项目仓库的design/目录下。然后在绘图工具里创建对应的样式模板。以 draw.io 为例,可以通过“编辑样式”功能把令牌映射成样式名称,画图时直接选择样式即可。
注意:令牌一旦定下来,不要频繁修改。我见过一个团队两周改了三次主色,结果历史图全部要重做,得不偿失。建议至少稳定运行一个季度再考虑调整。
3.2 第二步:建立图形语法规则
有了视觉令牌之后,下一步是建立图形语法规则。这部分需要结合团队的实际业务场景来定。我以最常见的微服务架构为例,说明一套完整的语法规则应该包含哪些内容。
节点规则:定义什么类型的元素用什么形状。比如:
- 业务服务:矩形,主色填充,白色文字
- 网关:矩形加粗边框,辅助色填充
- 数据库:圆柱体,中性色填充
- 缓存:圆柱体加虚线边框
- 消息队列:平行四边形,辅助色填充
- 外部系统:圆角矩形,浅灰填充
连线规则:定义什么关系用什么线型。比如:
- 同步调用:实线箭头,标注接口名
- 异步消息:虚线箭头,标注消息主题
- 数据读取:实线无箭头,标注读取频率
- 数据写入:实线箭头,标注写入模式
分组规则:定义什么边界用什么框。比如:
- 部署单元:虚线框,标注部署环境
- 业务域:实线框,标注域名称
- 安全边界:红色虚线框,标注安全等级
这些规则写清楚之后,要配上一张“图例”图,放在所有架构图的开头或结尾。图例本身也是用同一套规则画的,这样新成员一看图例就能明白整张图的读法。
3.3 第三步:选择工具链并打通流程
工具链的选择直接决定了后续的维护成本。我根据团队规模和使用场景,整理了一个对比表:
| 工具类型 | 代表工具 | 适合场景 | 学习成本 | 维护成本 |
|---|---|---|---|---|
| 在线绘图 | draw.io、ProcessOn | 快速出图、多人协作 | 低 | 中 |
| 文本绘图 | Mermaid、PlantUML | 文档嵌入、版本控制 | 中 | 低 |
| 代码绘图 | diagrams、D3 | 自动化生成、精细控制 | 高 | 低 |
| 设计工具 | Figma、Sketch | 高保真视觉、交互原型 | 中 | 高 |
我的建议是组合使用:日常沟通用在线绘图,快速出图;正式文档用文本绘图,保证可维护;自动化场景用代码绘图,减少人工。关键是所有工具都读取同一套视觉令牌,保证输出一致。
打通流程的关键是自动化。我通常会在 CI 里加一个步骤,当design/目录下的图源文件发生变化时,自动重新生成图片并更新到文档目录。这样文档里的图永远不会过期。具体做法取决于用的工具,比如 Mermaid 可以用mmdc命令行工具,PlantUML 可以用plantuml命令,diagrams 库可以直接跑 Python 脚本。
3.4 第四步:制定评审与更新机制
体系搭建好之后,如果没有评审和更新机制,很快就会荒废。我见过太多团队一开始热情很高,画了几张标准图之后就不了了之。问题出在没有把图形维护纳入日常工作流。
我的做法是把图纳入代码评审。具体来说,任何涉及架构变更的提交,必须同时更新对应的架构图。评审时不仅看代码,也看图是否准确反映了变更。如果图没更新,评审不通过。这样强制一段时间后,大家就养成了习惯。
另外,我建议每季度做一次图形资产盘点。检查所有图是否还有效,是否有过期的图没有删除,是否有新的场景需要补充图。盘点时重点关注那些“孤儿图”——没有任何文档引用的图,通常意味着它们已经过时了。
实操心得:给每张图加一个元数据头,包括作者、创建时间、最后更新时间、关联的代码仓库路径。这样盘点时一目了然,也方便追溯。
4. 常见问题与排查技巧实录
4.1 图太复杂看不懂怎么办
这是最常见的问题。图太复杂通常有两个原因:一是信息量过大,二是布局混乱。排查时先看信息量,如果一张图超过 20 个节点,基本可以考虑拆分了。拆分的原则是按职责或按流程阶段,把一张大图拆成几张子图,用统一的编号关联。
如果节点数量不多但依然看不懂,那通常是布局问题。布局混乱的典型表现是连线交叉过多、节点分布不均匀、分组边界不清晰。解决方法是先用自动布局工具跑一遍,比如 Graphviz 的 dot 布局,然后再手动微调。自动布局虽然不完美,但至少能保证基本的可读性。
还有一个容易被忽略的点是视觉动线。人看图是有习惯路径的,通常是从左上到右下。所以关键节点应该放在左上区域,次要节点放在右下。如果动线混乱,读者就会频繁跳转,理解成本大增。
4.2 不同人画的图风格不一致怎么办
这个问题在多人协作时几乎必然出现。根本原因是视觉令牌没有真正落地,或者落地了但没人遵守。排查时先确认令牌文件是否存在且最新,然后检查每个人的绘图工具是否都导入了令牌。
如果令牌没问题但风格依然不一致,那通常是样式覆盖导致的。很多人画图时习惯手动调色、手动改线宽,结果覆盖了令牌定义的样式。解决方法是禁用手动样式调整,所有样式必须从预设中选择。在 draw.io 里可以通过锁定样式来实现,在代码绘图里则通过强制使用主题变量来保证。
我的经验是,前三个月要严格检查,每次评审都看样式是否符合规范。三个月后大家形成肌肉记忆,就不需要再盯了。
4.3 图更新不及时导致文档过期
这是文档维护的经典难题。图更新不及时的根本原因不是大家懒,而是更新成本太高。如果改一张图需要打开工具、手动调整、导出、替换文档里的图片,那没人愿意做。
解法就是前面提到的图即代码。当图源文件是文本时,更新图就和改代码一样简单,改完提交即可。CI 会自动重新生成图片并更新文档。这样更新成本降到最低,大家自然愿意做。
如果暂时做不到图即代码,那至少要做到图源文件集中管理。所有图的源文件放在同一个目录,命名规范统一,文档里只引用生成的图片。这样至少能找到源文件,不至于想改都找不到。
4.4 颜色在投影仪上看不清
这个问题我遇到过无数次。根本原因是颜色对比度不足。很多人在自己显示器上调的颜色,对比度刚好够看,但投影仪亮度低、色彩还原差,浅色部分就糊成一片。
解法是提高对比度标准。我通常要求文字与背景的对比度至少达到 4.5:1,关键信息达到 7:1。可以用在线对比度检查工具验证。另外,避免使用纯黑和纯白,用深灰和浅灰代替,视觉上更柔和,投影效果也更好。
还有一个技巧是加描边。给浅色填充的节点加一圈深色描边,即使填充色看不清,轮廓依然清晰。这个技巧在黑白打印时尤其有用。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 图太复杂 | 节点过多或布局混乱 | 数节点数量,检查连线交叉 | 拆分或自动布局 |
| 风格不一致 | 令牌未落地或样式覆盖 | 检查令牌文件和样式设置 | 强制使用预设样式 |
| 更新不及时 | 更新成本高 | 检查图源文件管理方式 | 图即代码,CI 自动生成 |
| 投影看不清 | 对比度不足 | 用对比度工具检查 | 提高对比度,加描边 |
| 图例缺失 | 未定义图例规范 | 检查图是否有图例 | 补充图例并纳入规范 |
| 命名混乱 | 无命名规范 | 检查节点命名 | 制定命名规范并评审 |
5. 进阶技巧:让 diagram-design 真正产生复利
5.1 用图驱动设计讨论
diagram-design 最大的价值不是产出好看的图,而是用图来驱动设计讨论。我习惯在架构评审会上,先让大家看图,然后逐节点讨论。每个节点都要回答三个问题:它的职责是什么?它的输入输出是什么?它的失败模式是什么?
这样做的好处是,讨论有焦点,不会跑题。而且图是可视的,所有人都能看到同样的信息,避免了口述理解偏差。我经历过好几次,讨论到某个节点时,有人突然发现“这个服务怎么会有两个数据源”,然后顺藤摸瓜发现了一个隐藏的架构问题。
5.2 用图做变更影响分析
当系统需要变更时,图是最好的影响分析工具。比如要修改某个服务的接口,只需要在图上找到所有指向该服务的连线,就能快速定位受影响的上下游。这比翻代码快得多,也更直观。
我通常会在变更前,把相关图打印出来,用不同颜色的笔标注变更点和影响范围。然后拿着这张图去和上下游团队沟通,效率极高。沟通完之后,这张标注过的图还可以作为变更记录的附件,后续追溯时一目了然。
5.3 用图做新人培训材料
新成员入职时,最痛苦的就是理解系统全貌。如果有一套分层清晰的图,配合图例和说明,新人可以在半天内建立起基本认知。我通常会准备一套“新人看图指南”,从上下文层开始,逐层深入,每层配一段文字说明。
这套材料的好处是标准化。不管谁来带新人,用的都是同一套图,讲的是同一套逻辑。避免了“每个人讲的都不一样”的问题。而且图是持续更新的,新人看到的永远是最新版本。
5.4 用图做自动化检查
这是进阶玩法。当图是代码生成的时候,就可以用程序来检查图的合理性。比如:
- 检查是否有孤立节点(没有任何连线的节点)
- 检查是否有循环依赖(A 调用 B,B 调用 C,C 调用 A)
- 检查是否有命名不一致(同一个服务在不同图里名字不同)
- 检查是否有层级违规(组件层直接调用了外部系统)
这些检查可以写成脚本,纳入 CI 流程。每次提交图源文件时自动运行,发现问题就报错。这样图的准确性就有了程序保障,不依赖人工评审。
我目前用 Python 写了一个简单的检查脚本,大概两百行代码,覆盖了上面提到的四类检查。运行一次不到一秒,但能发现很多人工容易忽略的问题。比如有一次就发现某个服务在两张图里名字差了一个字母,人工评审时完全没注意到。
5.5 一个实际项目的落地记录
最后分享一个我最近参与的项目落地过程。这个项目是一个中等规模的内部系统,团队八个人,之前没有任何图形规范。我用了大概三周时间,分四个阶段推进。
第一周是定义阶段。我拉着技术负责人和两个核心开发,花了一个下午定义了视觉令牌和图形语法。令牌文件大概五十行 JSON,语法规则写了两页文档。然后我用 draw.io 做了一套样式模板,发给大家导入。
第二周是试点阶段。选了一个正在开发的新模块,要求所有设计讨论必须用新规范画图。一开始大家不习惯,经常忘记用预设样式。我每天花十分钟检查,发现问题就在群里提醒。一周下来,基本都能遵守了。
第三周是推广阶段。把规范推广到所有新项目,同时开始整理历史图。历史图不要求全部重画,但新修改的图必须符合规范。我写了一个简单的检查脚本,在 CI 里跑,发现不合规的图就报错。
一个月后,团队已经形成了习惯。新画的图风格统一,评审时讨论效率明显提高。最直观的变化是,以前评审架构图要花半小时解释图例,现在五分钟就能进入正题。这个投入产出比,我觉得非常划算。
最后再分享一个小技巧:把图例做成一张独立的图,放在所有架构图的开头。图例本身也用同一套规范画,这样它既是说明,也是示范。新人一看图例,就同时学会了怎么读图和怎么画图。