1. 从一张草图到一套系统:diagram-design 到底在解决什么问题
第一次听到 diagram-design 这个词,很多人会下意识以为它只是一个画图工具,或者某个设计软件的插件。但真正在项目里摸爬滚打过几年的人会明白,它更像是一套关于“如何把复杂信息变成可读图形”的方法论。我最早接触这个概念,是在给一个内部系统做架构梳理的时候。当时团队里五个人,每个人脑子里的系统结构都不一样,开会两小时,画了七八张图,结果没有一张能对齐。后来我们停下来,先不画图,而是先定义“图要表达什么、给谁看、看完要做什么决策”,这才发现问题的根子不在画图工具,而在设计图之前的那套思考流程。
diagram-design 的核心,就是把这套思考流程标准化。它不追求画出多漂亮的图,而是追求让图在特定场景下“一次说清楚”。它解决的问题很具体:信息在传递过程中失真、结构在表达过程中模糊、决策在讨论过程中跑偏。适合谁来参考?我认为三类人最需要:一是经常要写技术方案、做架构评审的工程师;二是需要把业务逻辑翻译成流程图的 product 角色;三是任何需要向非专业受众解释复杂结构的人。哪怕你用的是最普通的绘图软件,只要脑子里有 diagram-design 的框架,出来的东西也会完全不一样。
我见过太多人把 diagram-design 等同于“选模板、拖控件、调颜色”,这其实只碰到了皮毛。真正决定一张图能不能用的,是你在动手之前有没有想清楚三个问题:这张图的读者是谁、他们需要看到什么层级的信息、看完之后他们要做什么。这三个问题不解决,画得再好看也是自嗨。接下来我会把这套方法拆开,从整体设计思路到具体实操细节,再到常见坑和排查技巧,全部按我实际项目里的做法讲一遍。
2. 整体设计思路:为什么先定“信息层级”再定“图形样式”
2.1 从“画什么”倒推到“给谁看”
大部分人的画图习惯是打开工具就开始拖框,边画边想。这个习惯在个人草稿阶段没问题,但一旦进入团队协作,就会变成灾难。我现在的做法是,任何一张要给别人看的图,先不碰工具,拿一张白纸或者空白文档,写三行字:第一行写“这张图的读者是谁”,第二行写“他们看完需要知道什么”,第三行写“他们看完需要做什么”。这三行字写不出来,图就不用画了,因为画了也是白画。
这个顺序背后的逻辑很简单:图形是信息的载体,不是信息的来源。你先得知道信息是什么,才能决定用什么图形去承载。比如同样是系统架构图,给开发团队看的和给管理层看的,信息层级完全不同。给开发看的需要模块边界、接口协议、数据流向;给管理层看的只需要系统分层、关键依赖、风险点。如果你用同一张图应付两边,结果就是开发觉得太浅,管理层觉得太乱。
我试过在一个跨部门项目里,先用这套方法把“读者”分成三组:技术执行组、项目协调组、决策审批组。然后针对每组分别定义信息层级,最后出来的三张图虽然底层数据一致,但表达方式完全不同。技术组那张图里连数据库字段映射都标了,决策组那张图只有五个大块和三条关键链路。结果就是评审会开了四十分钟就结束了,因为每个人看到的都是自己需要的那一层,没有人在会上问“这个框是什么意思”。
2.2 信息层级的三层模型:骨架、肌肉、皮肤
我把 diagram-design 里的信息层级分成三层,分别叫骨架层、肌肉层、皮肤层。骨架层回答“系统由哪几块组成、块与块之间是什么关系”;肌肉层回答“每块内部的关键机制和流转逻辑是什么”;皮肤层回答“具体的参数、命名、边界条件是什么”。一张图通常只承载一层或两层信息,三层全塞进去必然糊。
为什么这么分?因为人的短期记忆容量有限,一张图里同时出现超过七个信息组块,理解成本就会指数上升。骨架层通常控制在三到七个块,肌肉层在每个块内部再展开两到四个关键点,皮肤层只在需要精确对齐的时候才出现。我见过最离谱的一张图,一个框里塞了二十多个小框,连线像蜘蛛网,作者自己讲的时候都要用激光笔找半天。这种图的问题不是画得不好,而是信息层级没有做减法。
实际操作中,我会先画骨架层,确认大结构没问题,再决定哪些块需要展开肌肉层。如果某个块的肌肉层特别复杂,就单独抽出来做一张子图,用引用编号关联。这样主图保持清爽,子图承载细节,读者可以按需深入。这个做法借鉴了地图的分层逻辑:你先看全国地图,再看省地图,再看城市地图,每一层只显示当前层级需要的信息。
2.3 图形语法的统一:让读者一次学习、处处适用
diagram-design 里有一个容易被忽略但极其重要的原则:同一套图里,图形语法必须统一。什么叫图形语法?就是什么形状代表什么类型的实体、什么线型代表什么类型的关系、什么颜色代表什么状态。这些规则一旦定下来,整份文档里所有图都要遵守。我见过一个项目,第一张图里矩形代表服务、圆角矩形代表数据库,第二张图里反过来了,读者看到第三张图的时候已经彻底晕了。
统一图形语法的好处是降低读者的学习成本。读者只需要在第一张图里花三十秒理解你的图例,后面所有图都可以直接读。这就像学一门语言,语法固定了,词汇量再大也能读懂。我通常会在一份文档的开头放一个“图例说明”小节,把形状、线型、颜色的含义列清楚,后面所有图都不再重复解释。这个做法在跨团队评审时特别有用,因为不同团队的人可能第一次看你的图,图例就是他们的入口。
具体怎么定图形语法?我的经验是:形状不超过四种,线型不超过三种,颜色不超过五种。形状用来区分实体类型,比如矩形代表业务模块、圆角矩形代表数据存储、菱形代表决策节点、圆柱代表外部依赖。线型用来区分关系类型,比如实线代表同步调用、虚线代表异步消息、点划线代表数据流向。颜色用来区分状态或归属,比如蓝色代表核心链路、灰色代表辅助功能、橙色代表风险点。这套规则定下来之后,画图就变成了填空题,效率反而更高。
3. 核心细节解析:从信息梳理到图形落地的关键环节
3.1 信息梳理阶段的“三遍过滤法”
在动手画图之前,我会对收集到的信息做三遍过滤。第一遍叫“去重”,把不同来源但表达同一件事的信息合并。比如业务方说“用户下单后要通知库存”,技术方说“订单服务调用库存服务扣减接口”,这两条信息本质是一件事,只是表述角度不同。去重之后,信息量通常会减少三成左右。
第二遍叫“分层”,把信息按骨架、肌肉、皮肤三层归类。骨架层的信息通常是名词性的,比如“订单服务”“库存服务”“支付网关”;肌肉层的信息通常是动词性的,比如“扣减库存”“生成支付单”“发送通知”;皮肤层的信息通常是参数性的,比如“超时时间三秒”“重试两次”“幂等键为订单号”。分层之后,你就知道哪些信息进主图、哪些进子图、哪些进备注。
第三遍叫“排序”,把同一层级的信息按重要性或流程顺序排列。骨架层通常按数据流向排,从入口到出口;肌肉层通常按执行顺序排,从触发到完成;皮肤层通常按使用频率排,高频参数放前面。排序的目的是让读者读图时有明确的路径,而不是东看一眼西看一眼。我试过不做排序直接画,结果读者第一眼看到的是最不重要的模块,注意力被带偏了。
3.2 图形映射的“最小惊讶原则”
信息梳理完之后,下一步是把信息映射到图形上。这里有一个核心原则叫“最小惊讶原则”:读者看到某个图形时,第一反应应该和你想表达的意思一致。比如你想表达“这是一个决策点”,用菱形就比用矩形好,因为大多数人在其他图里看到的决策点都是菱形。你想表达“这是一个外部系统”,用虚线框就比用实线框好,因为虚线天然带有“边界之外”的暗示。
这个原则听起来简单,但实际操作中很容易违反。我见过有人用红色表示“正常状态”,用绿色表示“异常状态”,理由是“红色代表热情”。这种映射会让读者产生认知冲突,读图效率大幅下降。我的做法是,在定图形语法的时候,先问自己:这个形状/颜色/线型在大多数人的认知里默认代表什么?如果默认含义和我想表达的一致,就用;如果不一致,就换一个。实在找不到合适的,就在图例里明确说明,但这种情况越少越好。
还有一个细节是连线的走向。人眼习惯从左到右、从上到下阅读,所以主流程的连线尽量遵循这个方向。如果出现反向连线或交叉连线,读者需要额外花时间追踪。我通常会把反向连线改成环形或折线,把交叉连线改成桥接或分层,虽然画起来麻烦一点,但读起来顺畅很多。实测下来,一张没有交叉连线的图,理解时间能缩短一半以上。
3.3 标注与注释的“就近原则”
图里的标注和注释,位置比内容更重要。我见过很多图,注释写在图例区,读者看到某个框不明白,要来回翻图例。正确的做法是“就近原则”:注释尽量靠近被注释的对象,最好用引线直接连过去。如果空间不够,用编号关联,编号放在对象旁边,注释放在图下方的注释区,但编号要足够醒目。
注释的内容也要控制。我通常只写三类注释:第一类是“这是什么”,用于读者可能不熟悉的术语;第二类是“为什么这样”,用于解释非直觉的设计决策;第三类是“注意什么”,用于提示边界条件或风险点。其他信息一律不写,因为图不是文档,图的作用是建立结构认知,细节应该放在正文里。
还有一个经验是:能用图例解决的,不用注释;能用注释解决的,不用正文。图例是全局性的,注释是局部性的,正文是补充性的。三者各司其职,不要混用。我见过一张图里既有图例又有注释还有正文引用,读者根本不知道先看哪个。后来我把它拆成三张图,每张图只承载一个层级的信息,问题就解决了。
4. 实操过程:从零开始设计一张可用的架构图
4.1 第一步:定义读者与决策场景
假设我现在要为一个模拟的订单处理系统设计架构图。第一步不是打开工具,而是定义读者和决策场景。这个项目的读者有三类:开发团队需要理解模块划分和接口关系,运维团队需要理解部署单元和依赖关系,产品团队需要理解业务流程和异常处理。决策场景是:开发团队要据此拆分任务,运维团队要据此准备资源,产品团队要据此确认需求覆盖。
定义清楚之后,我就知道这张图不能只画一张。开发团队需要的是模块架构图,运维团队需要的是部署架构图,产品团队需要的是流程图。三张图共享同一套底层信息,但表达层级不同。如果我只画一张“大而全”的图,三类读者都会觉得不够用。这个判断很关键,因为很多人失败的原因就是试图用一张图满足所有人。
4.2 第二步:搭建骨架层信息结构
骨架层的信息结构通常用“块+关系”来表达。对于订单处理系统,我先把核心块列出来:订单服务、库存服务、支付服务、通知服务、数据库、消息队列。然后定义块与块之间的关系:订单服务调用库存服务扣减库存,订单服务调用支付服务生成支付单,支付服务通过消息队列通知订单服务支付结果,订单服务通过消息队列通知通知服务发送消息,所有服务读写各自的数据库。
这个结构定下来之后,我会检查两件事:第一,块的粒度是否一致。如果“订单服务”是一个块,“数据库”也是一个块,那“消息队列”也应该是一个块,不能有的块是服务、有的块是组件。第二,关系的方向是否清晰。如果出现双向箭头,就要问自己:是真的双向依赖,还是两个单向依赖画在了一起?大多数情况下,双向依赖都可以拆成两个单向依赖,这样图会更清晰。
4.3 第三步:选择图形语法并绘制草图
骨架层确定后,我开始选图形语法。对于这个系统,我定下的规则是:矩形代表业务服务,圆柱代表数据存储,菱形代表消息队列,实线箭头代表同步调用,虚线箭头代表异步消息。颜色方面,蓝色代表核心链路,灰色代表辅助功能,橙色代表外部依赖。这套规则定下来之后,我拿纸笔先画草图,不追求好看,只追求结构正确。
草图阶段我会反复问自己:如果我是第一次看这张图的人,能不能在三分钟内说出系统由哪几块组成、主流程是什么、关键依赖在哪里?如果说不出来,就说明结构还有问题。我试过一张草图改了七遍,前六遍都是因为“自己觉得清楚但别人看不懂”。后来我找了一个没参与项目的同事来看,他花了五分钟才找到主流程,我就知道问题出在连线走向上,把几条交叉线改成折线之后就顺畅了。
4.4 第四步:补充肌肉层信息并拆分子图
骨架层确认后,我开始补充肌肉层信息。比如“订单服务”这个块,内部有关键机制:订单创建、订单状态机、订单查询、订单取消。这些机制如果全画在主图里,主图会变得很臃肿。我的做法是,在主图里只保留“订单服务”这个块,然后用一个编号标注“详见子图A”。子图A里再展开订单服务的内部结构,包括状态机的流转逻辑、关键接口的输入输出、异常处理分支。
子图的设计原则是:一张子图只展开一个块,子图内部的信息层级不超过两层。如果某个块的内部结构特别复杂,就再拆一层子图,用编号关联。这样主图保持清爽,读者可以按需深入。我见过有人把所有子图都画在主图里,结果主图变成了“蜘蛛网”,读者根本找不到入口。拆分子图虽然增加了图的数量,但降低了每张图的复杂度,总体理解成本反而更低。
4.5 第五步:统一视觉规范并输出
最后一步是统一视觉规范。包括字体大小、线条粗细、颜色饱和度、对齐方式、间距。这些细节看起来不重要,但直接影响读图体验。我的经验是:字体不小于十号,线条粗细不超过三种,颜色饱和度不要太高,对齐方式统一用网格对齐,间距保持一致。这些规范定下来之后,整份文档的图看起来会像一套东西,而不是拼凑出来的。
输出格式也有讲究。如果是放在文档里,我通常导出为矢量图,保证放大不模糊;如果是放在演示文稿里,我导出为高分辨率位图,保证投影清晰;如果是放在协作平台里,我保留源文件,方便后续修改。我试过只导出位图,结果后来要改一个标签,只能重新画一遍,浪费了大量时间。所以源文件一定要保留,而且命名要规范,比如“订单系统-架构图-骨架层-v3”,这样找起来方便。
5. 常见问题与排查技巧实录
5.1 图太乱:先做减法,再做加法
图太乱是最常见的问题。大多数人遇到图太乱的第一反应是“再加一个图例”或者“再加一段注释”,这其实是做加法,只会让图更乱。正确的做法是先做减法:把非核心的信息删掉,把可以合并的块合并,把可以简化的关系简化。我通常会把图里的信息分成“必须”“重要”“有用”三档,只保留“必须”和“重要”,“有用”的全部删掉。删完之后如果还乱,就继续删,直到图能一眼看懂为止。
减法做完之后,如果确实需要补充信息,再做加法。但加的时候要遵循“分层”原则:主图只放骨架层,肌肉层放子图,皮肤层放正文。不要把所有信息都塞进一张图。我见过一张图里既有架构又有流程还有数据模型,作者说“这样一张图就够了”,但读者看完之后什么也没记住。图的作用是建立认知框架,不是传递所有细节。
5.2 读者看不懂:换位思考,找“小白”测试
读者看不懂的原因通常有两个:一是图形语法不统一,二是信息层级不清晰。排查方法是找一个没参与项目的“小白”来看图,让他在三分钟内说出图的内容。如果他说不出来,就问他“你第一眼看到的是什么”“你找不到什么”“你觉得哪里奇怪”。他的回答就是排查线索。我试过让一个非技术同事看架构图,他第一眼看到的是最上面的标题,然后视线被一条交叉线带到了右下角,完全错过了主流程。后来我把主流程加粗、交叉线改成折线,他就能在三分钟内说出主流程了。
还有一个技巧是“遮住图例测试”:把图例遮住,看读者能不能猜出图形含义。如果猜不出来,说明图形语法不够直觉,需要调整。比如用菱形代表数据库,大多数人会猜“决策点”,这就是不直觉。换成圆柱之后,大多数人能猜出“存储”,这就是直觉。图形语法的目标是“不看图例也能猜个八九不离十”,图例只是确认,不是必需。
5.3 评审时被挑战:提前准备“为什么这样画”
评审时被挑战是好事,说明有人在认真看。但如果你回答不了“为什么这样画”,就会显得不专业。我的做法是,在评审之前,把图里每一个设计决策的“为什么”写下来,包括为什么用这个形状、为什么用这个颜色、为什么这样分层、为什么这样连线。评审时如果被问到,直接回答;如果没被问到,也可以主动说“这里我特意这样处理,原因是……”。这样既展示了思考深度,也引导了评审方向。
我试过一次评审,有人挑战“为什么库存服务和支付服务之间没有直接连线”,我回答“因为它们之间没有直接调用关系,库存扣减由订单服务编排,支付结果通过消息队列异步通知”。这个回答让评审人意识到图是准确的,而不是漏画了。如果我没有提前准备,可能会被问住,然后现场解释,效果就差很多。所以评审前的“为什么”清单,是提高评审效率的关键。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决技巧 |
|---|---|---|---|
| 图太乱,找不到重点 | 信息层级未分层 | 问读者第一眼看到什么 | 删掉非必须信息,主图只留骨架层 |
| 读者理解不一致 | 图形语法不统一 | 遮住图例让读者猜含义 | 统一形状、线型、颜色的含义 |
| 评审时被问住 | 设计决策未记录 | 提前写“为什么这样画”清单 | 评审前自问自答一遍 |
| 图改起来很麻烦 | 源文件未保留 | 检查是否有可编辑源文件 | 保留源文件,命名规范 |
| 子图太多找不到 | 编号关联不清晰 | 问读者能否按编号找到子图 | 主图标注编号,子图标注对应编号 |
| 连线交叉太多 | 布局未优化 | 数一数交叉点数量 | 改折线、分层、环形布局 |
| 颜色太花 | 颜色使用超过五种 | 数一数颜色数量 | 控制在五种以内,同色系区分深浅 |
| 字体太小 | 字号小于十号 | 打印出来看是否清晰 | 字号不小于十号,重要信息加粗 |
5.5 独家避坑技巧:三个“不要”
第一个不要:不要用颜色作为唯一区分手段。有些人习惯用颜色区分模块,但打印出来是黑白的,或者读者有色觉差异,就会丢失信息。我的做法是颜色搭配形状或线型一起用,比如蓝色矩形代表核心服务,灰色圆角矩形代表辅助服务,这样即使没有颜色也能区分。
第二个不要:不要在图上写大段文字。图是视觉化的,文字多了就变成文档了。我见过有人在图里写了一段三百字的说明,读者根本不会看。正确的做法是把文字放在正文里,图上只留关键词或编号。如果确实需要在图上说明,用短句,不超过十个字。
第三个不要:不要追求“一张图搞定所有事”。这是最常见的误区。一张图能说清楚一件事就很好了,说清楚三件事的图通常一件事都说不清楚。我现在的习惯是,一个决策场景配一张图,图与图之间用引用关联。这样每张图都有明确的用途,读者也知道什么时候该看哪张图。
6. 工具选型与协作流程的实战建议
6.1 工具选型的三个维度
选工具的时候,我通常看三个维度:表达力、协作性、可维护性。表达力是指工具能不能画出我需要的图形语法,比如是否支持自定义形状、是否支持图层、是否支持矢量导出。协作性是指多人能不能同时编辑、能不能评论、能不能版本对比。可维护性是指源文件是否容易修改、是否容易复用、是否容易迁移。
这三个维度很难同时满足,所以要根据场景取舍。如果是个人快速草图,表达力优先,用最简单的工具就行;如果是团队协作,协作性优先,用支持多人编辑的工具;如果是长期维护的文档,可维护性优先,用源文件格式开放的工具。我试过用不同工具画同一张图,发现工具之间的迁移成本很高,所以现在尽量统一工具,减少切换。
6.2 协作流程的四个角色
在团队协作里,diagram-design 通常涉及四个角色:信息提供者、图设计者、图评审者、图使用者。信息提供者负责提供准确的信息,图设计者负责把信息映射成图形,图评审者负责检查图是否准确和可读,图使用者是最终读者。这四个角色可以是同一个人,也可以是不同的人,但职责要分清。
我见过很多团队把四个角色混在一起,结果信息提供者直接画图,画出来的图只有他自己看得懂;或者图设计者不参与信息收集,画出来的图信息不准确。我的做法是,信息提供者先写文字版的信息梳理,图设计者据此画草图,图评审者找“小白”测试,图使用者反馈是否好用。这个流程走一遍,图的可用性会大幅提升。
6.3 版本管理与迭代节奏
图是需要迭代的,所以版本管理很重要。我的做法是,每次修改都保留一个版本,命名规则是“项目名-图名-层级-版本号”,比如“订单系统-架构图-骨架层-v3”。版本号用整数递增,不要用日期,因为日期不好排序。每次修改记录变更内容,比如“v3:把库存服务从辅助链路改为核心链路”。这样回溯的时候一目了然。
迭代节奏方面,我通常分三个阶段:草图阶段快速迭代,每天可能改好几版;评审阶段稳定迭代,每次评审后改一版;发布阶段冻结迭代,除非有重大错误,否则不改。草图阶段不要追求完美,先画出来再说;评审阶段要仔细,每个细节都要确认;发布阶段要克制,不要因为“觉得不好看”就改,因为改图是有成本的,而且可能引入新错误。
6.4 从单张图到图体系的扩展
当项目变大之后,单张图就不够用了,需要扩展成图体系。图体系的核心是“索引图+子图”的结构。索引图展示全局骨架,每个块标注子图编号;子图展示局部细节,每个子图标注对应的索引图编号。这样读者可以从索引图进入,按需深入子图,也可以从子图返回索引图,不会迷路。
图体系的维护成本比单张图高,所以要有规范。我的规范是:索引图不超过七个块,子图不超过三层,每张图都有唯一编号,编号规则统一。图与图之间的引用关系要双向标注,比如索引图里写“详见子图A”,子图A里写“返回索引图”。这样即使图的数量多了,读者也能找到路径。我试过没有规范地扩展图体系,结果图越来越多,最后连自己都找不到哪张图在哪里,只能重新整理一遍。
6.5 一个完整的实操检查清单
最后分享一个我每次画图前都会过一遍的检查清单,一共十条:
- 读者是谁?他们看完需要知道什么?需要做什么?
- 信息分了几层?骨架层、肌肉层、皮肤层分别是什么?
- 图形语法定了吗?形状、线型、颜色的含义统一吗?
- 主图里有没有超过七个块?有没有交叉连线?
- 注释是否就近?是否只写了“是什么”“为什么”“注意什么”?
- 子图是否按需拆分?编号是否清晰?引用是否双向?
- 视觉规范是否统一?字体、线条、颜色、对齐是否一致?
- 源文件是否保留?命名是否规范?版本是否记录?
- 有没有找“小白”测试?他能不能在三分钟内说出图的内容?
- 评审前有没有准备“为什么这样画”清单?
这个清单过一遍,图的可用性基本就有保障了。我试过跳过其中几条,结果都在评审时被问住了,后来老老实实按清单走,评审效率高了很多。画图这件事,看起来是手上功夫,其实是脑子里功夫。diagram-design 的价值,就是把这套脑子里的功夫变成可复用的流程,让每个人都能画出“一次说清楚”的图。