diagram-design这个词,我最早是在整理架构文档时意识到的。当时某项目上线后需要做技术交底,面对一张画得满满当当、却谁都看不懂的网络拓扑图,我才发现:会画图是一回事,把图设计得让读者一眼抓住重点,是另一回事。所谓diagram-design,本质上不是“用工具画图”,而是“用视觉语言做信息传达设计”。这张图要表达什么、给谁看、在哪里被阅读,每一个决定都直接影响沟通效率。这篇文章我会从原则、工具、实操到踩坑完整走一遍,适合正在写技术文档、做架构评审材料、或者准备产品说明的人参考。
1. 先聊聊diagram-design:为什么“画图”这件事值得当成一门设计来做
1.1 图表不是配图,而是信息传达的“第一落点”
我见过太多团队,文档里塞了十几张图,评审会上却没人愿意翻开。问题往往不在内容,而在图本身没有“说话能力”。文字是线性的,读者必须从头读到尾才能建立整体认知;图表是空间性的,读者扫一眼就能捕捉结构、边界、流向和异常点。一张合格的图,应该在三秒内让读者回答四个问题:这是什么系统?分几层?核心链路是什么?哪里可能会出问题?
比如同样画一张服务调用关系图,新手会把所有服务画成一片圆角矩形,然后拉几十条线,整个画面像一碗面条。而有diagram-design意识的人,会先确定阅读顺序——是从左到右、从上到下,还是从核心向外扩散;再确定视觉焦点——把网关放在中心,把数据存储放在底层,把外部依赖用虚线隔离出来。这样读者不需要你解释,就能看出“流量从左边进来,经过中间的业务逻辑,最终落到右边数据库”。这种能力不是天生的,是可以通过刻意练习获得的。
1.2 从“能用”到“好用”的差距在哪里
“能用”的图表,元素齐全,关系没画错,但读者需要自己找重点。“好用”的图表,有一套完整的视觉引导机制。这个差距可以拆解成几层:信息结构是否清晰、视觉层级是否分明、连线是否干净、标注是否适时出现。这些听起来像平面设计的词,应用到图表上正是diagram-design要解决的问题。
我举个具体场景。某次评审会上,A同学画了一张微服务架构图,每个模块都用了不同的颜色,边框粗细也不统一。从远处看,读者根本分不清哪些是核心服务、哪些是基础设施。后来我们只做了两个改动:把核心业务链路统一用深色底+白色文字,把基础设施全部改成浅灰色圆角矩形;把同类型服务放在一个虚线容器里,外面标上“订单域”“用户域”。改完以后,评审会上再也没有出现“这个框是什么意思”的提问。这就是设计带来的沟通成本下降。
所以我的建议是:别把diagram-design当成画图的辅助技巧,它是信息架构能力的一部分。谁能用一张图说清楚复杂系统,谁就在降低整个团队的认知负担。
2. 图表设计打磨的第一步:想清楚这张图到底要说什么
2.1 先定叙事主线,再动笔画框
几乎所有人画图翻车,都是因为跳过了“叙事设计”直接进入了“元素摆放”。画图之前,必须回答三个问题:这张图的读者是谁?读者需要从中带走什么结论?读者会在什么介质上阅读它?
打个比方,给研发同事看的技术架构图,可以画得详细,包含类名、接口、协议,因为读者有耐心逐行看;但给业务管理层看的系统说明图,必须省略技术细节,只保留系统边界、核心模块、数据流向、决策点。介质也很关键:同样一张流程图,打印到A4纸上是黑白灰的,你在电脑上用的区别色可能完全失效;投屏到会议室,字号低于24px就等于看不见。这些限制应该在动笔前就确定,而不是画完再调整。
我的习惯是先在纸上写一句话描述这张图的“主旨”。比如“这张图说明支付请求从APP到账务系统的完整链路,以及每一步的失败分支”。这句话后来会成为我画图时判断取舍的标准:凡是跟这条链路无关的模块,一律不画;凡是这条链路上的关键节点,必须突出。这就是叙事主线。
2.2 按场景选择“视觉体裁”
很多图表设计不专业,不是因为画得不好,而是体裁本身就选错了。图表也分体裁,就像文章分小说、散文、论文一样。流程类信息适合用流程图,用带箭头的有向图表达时间或因果顺序;结构类信息适合用架构图,用嵌套容器和分组表达层次和归属;状态转换和消息交互适合用时序图;数据模型之间的关系适合用ER图;头脑风暴和知识整理适合用思维导图。
我把常用场景整理成一张速查表,方便自己快速选型:
| 表达目标 | 推荐体裁 | 核心视觉元素 | 典型场景 |
|---|---|---|---|
| 流程、步骤、分支 | 流程图 | 箭头、判断菱形、泳道 | 业务审批、请求处理、故障排查 |
| 系统分层与模块归属 | 架构图 | 容器、分组、边界 | 技术选型、评审汇报、文档首页 |
| 对象间的消息交互 | 时序图 | 生命线、激活条、消息箭头 | 接口设计、协议说明 |
| 数据实体及关系 | ER图 | 实体框、关系连线、基数标注 | 建表设计、数据模型评审 |
| 概念拆解与发散 | 思维导图 | 中心主题、分支、关键词 | 头脑风暴、需求整理 |
一旦选错体裁,无论画得多精细,读者都会觉得“别扭”。比如有人用思维导图标箭头表达依赖关系,读者根本看不出先后顺序;有人用流程图嵌套表达模块边界,图画到一半,容器和判断框已经分不清。先定体裁,再填充内容,这是diagram-design的第一步。
3. 四组让图表“变专业”的视觉原则
3.1 层次:一个页面只能有一个视觉焦点
信息层次,是diagram-design和普通画图的分水岭。一张图里所有元素如果同等重要,就等于没有重点。想让读者三秒内抓住核心,必须人为制造“焦点-次焦点-环境”的金字塔结构。
具体操作上,我会把整张图的内容分成三级。一级是核心链路或核心模块,用最重的颜色和最大的容器,通常是深色底或粗边框,放在页面几何中心偏左上的位置;二级是支撑模块和主要分支,用中灰底、常规边框;三级是外部依赖、备注、图例,用浅色、虚线、小字号。这样设计之后,读者哪怕不读任何文字,也能从视觉重量上感知到“这条链路是主角”。
我做过的某跨平台系统的架构图就是这么处理的:最上层是统一入口层,用深蓝色块;中间是业务服务层,用白色圆角矩形加细边框;底层是数据层,用浅灰底。整套图只用了一组蓝色系。但评审会上所有人都先看入口层,因为它的视觉重量最重。这就是层次的作用。
3.2 对齐与间距:混乱的第一来源
读者觉得一张图“业余”,通常说不出具体原因,其实多半是元素之间的间距和对齐出了问题。间距忽大忽小、元素上下左右没有对齐,大脑会自动判断为“随手画的”。
想要专业感,最笨也最有效的办法是:全图只使用一套间距基准。我习惯把基准间距设为20px或8px的倍数。比如统一规定:容器内边距20px,模块间距15px,同层模块之间最少留足40px。连线穿过文字时必须预留足够的间距。另一条准则是:能对齐就对齐。同层模块底部对齐,同类图标中心线对齐,循环回路尽量不穿模。很多绘图工具都有“对齐”快捷键,画完以后我会全选,把水平间距和垂直间距统一过一遍,通常三分钟就能让图的观感提升一个档。
3.3 色彩:少即是多的配色策略
图表配色最怕“想表达什么就加什么颜色”。一个模块一个颜色,结果整张图像RGB跑马灯。色彩在图表里是语义级的工具,不能只当装饰。我的配色习惯是三色原则:一个主色用于视觉焦点,一个中性色用于背景和容器,一个功能色用于警示、异常和外部依赖。
举个例子,画系统拓扑结构时,我会把正常流量链路全部用同一种颜色,只在故障切换路径上用橙红色。这样读者一眼就能识别“哪些是平时跑着的,哪些是备用路径”。相比之下,有人用红蓝绿紫给每个微服务分别上色,表面上区分度很高,实际上没有任何语义逻辑,读者还得看图例才能理解颜色代表什么——纯属增加认知负担。
还有一个经常被忽略的细节:配色要做到灰度友好。把图打印成黑白时,如果信息仍然可读,说明配色是合格的。我经常在导出前把图转成灰度预览一遍,凡是靠颜色才能区分的元素,都改成用形状、线型或文字标签来区分。
3.4 文字与标注:信息密度和可读性的平衡
图上文字是双刃剑。写得太少,读者看不懂;写得太满,又没人看。我的经验是:图上的文字永远只承担“辅助识别”功能,完整说明放进正文或图注。
每个模块框里的文字控制在五六个字以内,用短语而不是句子。比如“订单服务”比“基于分布式事务的订单综合处理服务”更合适,后者适合放进文档正文。需要补充说明的内容,用编号代替:框里写①②③,图下方对应列出说明。这样做还有一个好处:图上的文字变少,字号就可以统一加大,投影和打印时更清晰。
连接线上的标注需要格外克制。一个箭头只标注一个关键词,比如“调用”“异步消息”“数据流”。如果必须在连线上写两句话,我会把内容拆成注释编号,而不是挤在箭头上。图例、版本号、更新日期这三样东西,永远放在图的右下角或底部。我遇到过太多图,画得很好,但忘了标版本,后来改了三次,团队根本不知道哪张是最新的。这属于典型的图表设计忽略了生命周期管理。
4. 工具选型:不同团队、不同阶段怎么选最合适
4.1 代码派:Mermaid 和 PlantUML 的适用场景
如果你所在的团队把技术文档放在代码仓库里,图表的版本管理就会成为一个痛点。图片文件没法diff,改动了两行字,整个图只能重新截图,评审时根本看不出哪里变了。代码驱动的图表工具能从根本上解决这个问题。
Mermaid是我用得最多的工具,因为它语法简单、能直接内嵌在Markdown里,主流代码托管平台基本都原生支持渲染。画时序图和流程图是它的强项。举个例子,画一张用户登录的时序图,用Mermaid写出来大概只要二十几行:
sequenceDiagram participant U as 用户 participant A as 认证服务 participant D as 用户库 U->>A: 提交账号密码 A->>D: 查询用户信息 D-->>A: 返回用户数据 A->>A: 校验密码哈希 A-->>U: 返回登录凭证代码的好处是支持Code Review。团队里任何成员都能通过阅读代码提出修改意见,而不是打开图片戳来戳去。PlantUML在画UML类图和部署图上更细致,适合对规范要求比较高的场景。但这类工具有一个共同限制:自动布局算法经常不够聪明,复杂图表最后还是会落到手动调整阶段。
4.2 图形化工具:draw.io、Excalidraw、Figma 怎么搭配
图形化工具适合快速讨论、手绘风表达、以及与设计团队协作的场景。我平时会按照使用场景切换工具,不一定只用一个。
draw.io(也叫diagrams.net)是我推荐给大多数人的第一选择。免费、浏览器可用、能保存源文件到本地或者网盘,画架构图、网络拓扑图、ER图都够用,导出SVG、PNG都很方便。Excalidraw则更适合早期设计和讨论阶段,它的手绘风格能降低读者对“完美感”的预期,让人更愿意提出修改意见。相比之下,Figma更偏交互和视觉设计,如果图表需要和UI稿放在一起评审,直接用Figma画会更顺手。
工具搭配的思路是:草稿阶段用Excalidraw,正式文档用draw.io,需要和界面原型统一风格时用Figma。没有一种工具能覆盖所有场景,强行用一个工具画所有图,最后往往是在跟工具较劲而不是在表达信息。
4.3 一组对比表帮你快速做决定
| 工具 | 核心优势 | 主要限制 | 典型场景 |
|---|---|---|---|
| Mermaid | 文本即图表、版本可控、内嵌Markdown | 复杂布局难控制 | 技术文档、README、内部Wiki |
| PlantUML | UML规范完整、时序图支持好 | 布局风格较单一 | 类图、部署图、组件图 |
| draw.io | 免费、功能全面、支持本地存储 | 实时协作稍弱 | 架构图、网络图、ER图 |
| Excalidraw | 手绘风格、低心理门槛 | 视觉不够正式 | 方案讨论、白板替代 |
| Figma | 设计能力强、可多人实时协作 | 有学习曲线 | 与UI稿统一评审、交互示意图 |
工具选型没有标准答案,我建议按团队现状来。文档都放在Git仓库,优先Mermaid;文档是Word和PDF,优先draw.io;大量图需要跟设计稿一起出,优先Figma。选定工具以后,坚持三个月以上,让团队形成统一的制图习惯,比反复换工具重要得多。
5. 实操:一张架构图从草稿到成图的全过程
5.1 用十分钟画一张潦草草图
很多人画图失败,是因为直接在工具里从头开始。正确做法是先离开电脑,在纸上或者白板上画草图。草图不需要好看,只需要确定两件事:布局结构和连线方向。
我画某跨平台系统的架构图时,先在一张A4纸上画了三个大区块:顶部写“统一入口”,中间写“业务服务”,底部写“数据层”。然后从左侧引入外部调用方,在入口层和服务层之间画了一条主链路。保存这一步是因为:草图让我把注意力集中在信息结构上,而不是工具操作上。等结构确定下来,再打开draw.io,照着草图把每个矩形放上去。
5.2 把草图“翻译”成电子图
到了工具里,我的操作顺序是:先搭大容器,再放小模块,最后连线。先画三个大的分组容器,分别标注“接入层”“服务层”“存储层”,容器的底色统一用浅灰,这样读者一眼就能看出系统分三层。
接下来在每个容器里放模块。接入层放网关和限流器;服务层放订单服务、用户服务、商品服务;存储层放业务库、缓存、消息队列。每个模块都是一个圆角矩形,边框细,文字居中,模块间距统一。放模块的时候我习惯按住对齐辅助线观察,让同层模块保持在同一水平线上。
连线是整个画图过程中最需要耐心的环节。我的原则是:先连主链路,再连次要链路,最后连外部依赖。主链路用实线加粗箭头,表示主要调用方向;异步消息用虚线箭头;外部依赖放在独立区域,用更浅的颜色和不通往主容器的连线表达。连线之间尽量不要交叉,如果不得不交叉,优先保证主链路垂直贯通。画完以后我还会在右下角加一个图例:实线代表同步调用,虚线代表异步消息,橙色代表异常路径。
5.3 导出与交付:别让成品毁在最后一步
图的内容画得再好,导出这一关出错也会前功尽弃。最常见的坑是分辨率:直接截图存成PNG,放进文档里放大就模糊;拖进PPT缩放,字体发虚。我的经验是:能导出SVG就导出SVG,矢量格式永不失真;如果只能用位图,导出PNG时把缩放倍率拉到200%以上,保证图片宽度在1600像素以上。PPT里插入SVG的方式需要看版本,如果导入后空白,就把SVG转成高分辨率PNG再放进去。
交付时还有一个我吃过亏的细节:给图片的配套源文件命名。我见过太多“未命名图表.drawio”这样的文件,半年后根本分辨不出是哪张图。我习惯给每个图表工程文件加上项目代号和日期,比如“某跨平台系统架构图-20250512.drawio”。这样即使图片版本过期,也能从源文件快速恢复。
6. 实际踩过的坑:图表设计容易翻车的五个细节
6.1 文字溢出与截断
最常见的问题是容器宽度没给文字留够空间。比如模块名叫做“用户权限管理服务”,容器只有三厘米宽,文字被压缩到两行,或者直接被截断。这个问题在Mermaid里尤其突出,因为自动布局不会根据文字长度自动调整容器宽度。
我的处理办法:模块名称尽量用缩略词,比如“用户权限管理服务”写成“权限服务”;如果必须写全名,就先手动调整容器宽度,让文字至少留出上下20%的呼吸空间。再检查一遍有没有英文单词被中途截断,这是英文和中文混排时最容易出现的低级错误。
6.2 自动布局的“随机性”
代码化图表工具最气人的地方在于,同一个文件,加一个节点以后,整个布局可能瞬间变化:原本对齐的模块全部散架,连线绕了一个大圈。这是自动布局算法的典型问题,不是你的错,但你必须接受并处理。
我的对策是把经常变动的图拆分成多个小的子图,而不是把所有内容放在一张大图里。如果确实需要一张完整图,就在Mermaid里关闭自动布局或者显式指定节点顺序,让结构尽量稳定。PlantUML也有类似问题,我的经验是复杂UML图宁可多花半小时调整坐标,也别指望自动布局一次性到位。
6.3 版本失控的图片文件
图片文件在团队协作中是出了名的难管理。同事发给你一张截图,你根本不知道它是哪一版;你想提修改意见,只能“在图上圈一下再发回去”;最终版本经常存在每个人的本地电脑上。
解决思路有两个。第一,能用文本表示就用文本表示,Mermaid和PlantUML天然支持版本管理,每次修改都有历史记录可以追溯。第二,如果只能用图片工具,保存源文件之后,在导出图右下角强制加上版本号和日期。我见过一个团队在每次评审前都生成一张带日期后缀的新图,三个月后文档里全是图,但没有一张标注了当前有效版本,最后只能花半天时间重新对照代码画图。这个问题完全可以通过一个简单的命名规范避免。
6.4 多人在线协作的样式不统一
多人同时编辑同一张图时,经常出现“每个人按自己的习惯画”的情况。有的模块用圆角矩形,有的用直角;有的一层容器有底色,有的没有;线条粗细也不一致。最后合成一张图,杂乱无章。
我的建议是:团队内制定一份简易的制图规范,不需要很长,几条就行。比如模块统一圆角矩形、主链路实线加粗、异步消息用虚线、异常路径用红色、容器底色只用两种灰度。把规范贴在团队文档里,画图前先看一遍,比事后反复调整高效得多。
6.5 图表内容的“过期”问题
图表最容易被忽视的成本,是维护成本。代码会迭代,模块会改名,数据存储会替换,但图一旦画完就没人管了。三个月后,这张图就成了“历史文物”,新同事照着图排查问题,不仅找不到,反而会被误导。
我的体会是:图表必须和代码、文档放在同一个维护节奏里。凡是代码变更、接口调整,都要顺手检查关联图是否需要更新。这个动作最好成为开发流程里的一个默认步骤,否则你永远在给旧图“打补丁”。如果团队能接受代码化图表,让图表和代码一起走MR流程,就是最理想的状态。
说到维护,我还有一个个人习惯:每张正式发布的图,在容器外标注“最后更新日期”。这个日期不仅提醒自己及时维护,也让读者能评估图的时效性。有一次我拿着标注两年前更新日期的旧图去开会,被当场指出模块已经下线了大半,那种尴尬让我彻底记住了这个教训。画图的最后一步不是导出,而是写清楚它是什么时间、为哪个版本画的。diagram-design的核心,从来不只是漂亮,而是能在正确的时间,把正确的信息,以最省力的方式传递给正确的人。