1. 从“diagram-design”这个标题能读出什么
第一次看到“diagram-design”这个标题,我脑子里蹦出来的不是某个具体工具,而是一类非常典型的需求场景:有人想把脑子里那张乱糟糟的关系图、流程图、架构图,变成一张能直接放进文档、能给别人讲清楚、还能反复修改的图。这个标题本身没有给出任何正文和关键词,信息量极少,但恰恰是这种极简标题,最考验拆解能力——它背后藏着的是一整套“图表设计”的方法论,而不是某一个软件的操作说明。
我做了十多年技术内容,见过太多人把“画图”当成一件随手就能干的事,结果画出来的图自己看得懂,别人一头雾水。diagram-design 这个词组,拆开看是“图表”加“设计”,重点其实落在“设计”上。图表只是载体,设计才是灵魂。它要解决的问题不是“怎么把方框和箭头画出来”,而是“怎么让一张图在没有人讲解的情况下,依然能准确传达信息”。适合看这篇内容的人,包括但不限于:需要写技术方案的产品经理、要画系统架构图的开发、做汇报PPT的职场人、写论文要配流程图的学生,以及任何觉得“我画的图总是不够清楚”的人。
我打算按自己的实战经验,把 diagram-design 这件事从底层逻辑到落地细节完整拆一遍。不讲空话,直接讲我踩过的坑、试过的有效方法,以及那些看起来不起眼但影响巨大的细节。全文会围绕“为什么图会画乱”“怎么选对图的形式”“布局和连线到底怎么处理”“配色和标注有哪些硬规则”这几个核心问题展开,每个部分都给出可以直接照做的操作建议。
2. 图表设计的底层逻辑:信息层级先于视觉美化
2.1 为什么大多数人画图的第一步就错了
我观察过一个很普遍的现象:很多人打开画图工具,第一反应是拖一个方框出来,然后开始往里填字,接着再拖第二个、第三个,最后用箭头连起来。这个过程看起来顺理成章,但它有一个致命问题——你在画图之前,根本没有想清楚这张图要表达的核心信息是什么。结果就是,图画到一半发现逻辑不对,开始删删改改,最后出来的东西结构混乱、重点模糊。
正确的顺序应该是反过来的。先在一张白纸或者纯文本编辑器里,用文字把这张图要讲的事情列出来。比如你要画一个系统的数据流转图,先用文字写:用户发起请求,请求经过网关,网关做鉴权,鉴权通过后转发到业务服务,业务服务读写数据库,最后返回结果。这段文字写完之后,你再去想哪些是核心节点、哪些是次要节点、哪些可以合并、哪些必须单独展示。这个“文字先行”的习惯,是我认为 diagram-design 里最重要的一条底层原则。
为什么文字先行有效?因为文字是线性的,它强迫你按顺序梳理逻辑;而图形是平面的,你很容易被视觉元素带偏,把注意力放在“这个框放哪里好看”而不是“这个框该不该存在”。我自己的做法是,任何一张图在动手画之前,至少要在备忘录里写出一段 100 到 200 字的文字描述,把节点、关系、方向、条件都写清楚。这段文字写不顺,图一定画不顺。
2.2 信息层级的三层拆解方法
文字梳理完之后,下一步是给信息分层。我习惯把一张图里的所有元素分成三层:核心层、支撑层、辅助层。核心层是这张图存在的理由,通常只有一到三个节点,比如“用户”“订单系统”“支付网关”这种;支撑层是围绕核心层展开的细节,比如“鉴权模块”“日志记录”“缓存”;辅助层是注释、图例、边界说明这类不参与主流程但帮助理解的内容。
这个分层方法的好处是,它直接决定了你后面画图时的视觉权重分配。核心层的节点应该最大、最醒目、位置最居中;支撑层次之;辅助层最小、颜色最淡、通常放在边缘。我见过很多图的问题就在于所有节点一样大、一样重,读者根本不知道先看哪里。你可以做一个简单的测试:把图缩小到 30% 大小,如果还能一眼看出核心节点是哪个,说明层级做对了;如果缩完之后一片模糊,那就是层级没拉开。
具体操作上,我建议在画图工具里先建三个图层或者三个分组,分别命名为“核心”“支撑”“辅助”。先把核心层的节点摆好位置,再往里面填支撑层,最后加辅助层。这个顺序不能乱,因为核心层的位置决定了整张图的骨架,支撑层是依附在骨架上的。如果你先画支撑层,最后会发现核心层没地方放了。
2.3 一张图只讲一件事
这是我最想强调的一条原则,也是最多人违反的一条。很多人喜欢把系统架构、数据流转、部署拓扑、业务逻辑全部塞进一张图里,觉得这样“信息量大”“一张图搞定”。但实际效果是,读者看这张图的时候,注意力被分散到四五个不同的维度上,最后什么都没记住。
我的做法是,一张图只回答一个问题。比如“这个系统的模块有哪些”是一张图,“数据从用户到数据库经过了哪些环节”是另一张图,“服务部署在几台机器上”又是另一张图。这三张图可以放在同一份文档里,但不要合并成一张。合并的后果是,你不得不用不同的颜色、线型、图标来区分不同维度的信息,而读者需要先学习你的图例才能看懂图,这本身就增加了认知负担。
如果你觉得拆成多张图太占篇幅,可以考虑用“主图加局部放大”的方式。主图只画最顶层的模块关系,然后用一个虚线框标出某个区域,旁边放一张放大图展示这个区域的内部细节。这样既保持了主图的简洁,又提供了细节。这个技巧在画复杂系统架构时特别有用,我几乎每次画超过十个节点的图都会用到。
3. 图表类型的选择:别用流程图去干时序图的活
3.1 常见图表类型的能力边界
选错图表类型,就像用螺丝刀去敲钉子,不是完全不行,但效果一定不好。我把常见的图表类型按用途分成几类,每类说清楚它擅长什么、不擅长什么。
流程图擅长表达“步骤和判断”,比如一个审批流程、一个算法逻辑。它的核心元素是方框(步骤)和菱形(判断),箭头表示流转方向。流程图不擅长表达“谁在什么时候做了什么”,因为它的横轴是步骤而不是时间。
时序图擅长表达“多个角色之间的交互顺序”,比如前端调用后端、后端调用数据库、数据库返回结果。它的核心是纵向的时间轴和横向的角色列。时序图不擅长表达复杂的条件分支,因为一旦分支多了,图会变得非常宽,阅读体验很差。
架构图擅长表达“系统的模块划分和依赖关系”,比如微服务架构里有哪些服务、它们之间怎么调用。架构图不擅长表达“运行时序”,因为它是静态的。
状态图擅长表达“一个对象在不同状态之间的迁移”,比如订单从待支付到已支付到已发货到已完成。状态图不擅长表达多个对象之间的交互。
我见过最常见的错误是用流程图去画时序,结果画出来一堆箭头交叉,根本看不出先后顺序。判断方法很简单:如果你的图里“时间顺序”比“步骤逻辑”更重要,那就用时序图;如果“条件判断”比“角色交互”更重要,那就用流程图。
3.2 选型决策树:三个问题定类型
每次画图之前,我会问自己三个问题,基本上三个问题回答完,图表类型就确定了。
第一个问题:这张图里有没有“时间”这个维度?如果有,而且时间顺序很重要,那就在时序图和状态图之间选。如果涉及多个角色的交互,选时序图;如果只涉及一个对象的状态变化,选状态图。
第二个问题:这张图里有没有“判断”和“分支”?如果有,而且分支逻辑是核心,那就选流程图。如果分支只是辅助说明,可以考虑用架构图加注释的方式。
第三个问题:这张图里有没有“层级”和“包含”关系?如果有,比如一个系统包含多个子系统,一个模块包含多个子模块,那就选架构图或者树形图。
这三个问题的顺序不能反。先看时间,再看判断,最后看层级。因为时间维度是最强的约束,一旦图里有了明确的时间顺序,其他维度都要让位。
3.3 混合图表的取舍:什么时候可以破例
严格来说,一张图应该只用一个图表类型。但实际工作中,有时候确实需要混合。比如画一个微服务的调用关系,既想展示服务之间的依赖(架构图),又想展示一次请求的调用链(时序图)。这时候我的做法是:主图用架构图,然后在某个服务节点旁边加一个小的时序图作为局部说明。主图保持单一类型,局部说明可以破例。
另一种情况是,图里既有流程又有状态。比如一个订单系统,订单状态的变化是一个状态图,但每个状态变化触发的动作是一个流程。这时候我会把状态图作为主图,然后在每个状态迁移的箭头上标注触发的动作名称,动作的详细流程放在另一张图里。这样主图依然清晰,细节也没有丢失。
破例的原则是:主图必须保持单一类型,混合元素只能出现在局部说明或者注释里。如果主图本身就混合了两种类型,读者会非常困惑。
4. 布局与连线:让图“自己会说话”的关键操作
4.1 布局的四个硬规则
布局是图表设计里最容易被忽视、但影响最大的部分。我总结了四条硬规则,每一条都是踩坑之后总结出来的。
第一条:主流程从左到右或者从上到下,不要来回折返。人的阅读习惯是线性的,如果主流程一会儿从左到右、一会儿从右到左,读者会迷失方向。我通常把主流程固定为从左到右,辅助流程从上到下。
第二条:相关节点靠近,不相关节点拉开。这条听起来简单,但很多人做不到。原因是他们在画图时是“想到一个画一个”,而不是“先分组再画”。我的做法是,在画之前先用文字把节点分组,比如“用户侧”“网关侧”“服务侧”“数据侧”,然后在画图时把同一组的节点放在相邻位置,组与组之间留出明显空隙。
第三条:连线尽量不交叉。如果两条线必须交叉,用“跳线”符号(一条线跨过另一条线时画一个小弧)来区分。完全不交叉很难做到,但可以通过调整节点位置来减少交叉。我的经验是,如果一张图里交叉超过三处,说明布局需要重新调整。
第四条:箭头方向一致。要么全部从左到右,要么全部从上到下,不要混用。混用会让读者搞不清楚数据流向。
4.2 连线的标注:什么时候标、标什么
连线上的标注是图表的“注释系统”,用得好能大幅提升可读性,用不好就是噪音。我的原则是:只标“不标就看不懂”的内容。
具体来说,以下几种情况必须标注:连线上有条件判断的,比如“鉴权通过”“余额充足”;连线上有数据格式要求的,比如“JSON”“Protobuf”;连线上有协议要求的,比如“HTTP”“gRPC”;连线上有频率或数量限制的,比如“每秒一次”“批量100条”。
以下几种情况不需要标注:连线方向已经很明显的不标;连线两端节点名称已经能说明关系的不标;标注内容超过八个字的不标(超过八个字应该放在图旁边的文字说明里)。
标注的位置也有讲究。水平连线标注在线的上方,垂直连线标注在线的右侧,斜线标注在线的右上方。标注文字不要压线,留出至少两个像素的间距。这些细节看起来微不足道,但积累起来就是“专业”和“业余”的区别。
4.3 节点内部的文字处理
节点内部的文字是最容易出问题的地方。我见过太多节点里塞了五六行字,字号小到需要放大才能看清。我的做法是:节点内只放“名称”,不放“描述”。名称控制在六个字以内,超过六个字就考虑拆分节点或者用缩写。
如果节点名称确实需要更多解释,用两种方式处理:一是在节点下方加一行小字作为副标题,字号比名称小两号;二是在图旁边用编号列表的方式统一解释,节点里只放编号。第二种方式在节点数量多的时候特别有效,可以让图保持干净。
节点内的文字对齐方式也有讲究。单行文字居中,多行文字左对齐。因为多行文字居中会导致每行起始位置不同,阅读时眼睛需要不断调整,很累。左对齐虽然看起来不如居中“整齐”,但阅读效率更高。
5. 配色与视觉规范:少即是多的硬道理
5.1 配色方案的三色原则
配色是图表设计里最容易“用力过猛”的地方。我见过用七八种颜色画一张图的,每个节点一个颜色,最后看起来像彩虹。我的原则是:一张图的主色不超过三种,加上黑白灰作为辅助。
三种主色怎么分配?第一种用于核心节点,通常是深色,比如深蓝、深灰;第二种用于支撑节点,比核心色浅一到两个色阶;第三种用于强调或警示,比如橙色、红色,只用在需要特别注意的节点或连线上。黑白灰用于文字、边框、背景。
这个三色原则的好处是,读者不需要学习图例就能通过颜色判断节点的重要性。深色的是核心,浅色的是支撑,亮色的是需要注意的。如果颜色太多,这个判断就失效了。
另外,背景色建议用白色或者极浅的灰色。深色背景虽然看起来“高级”,但打印出来或者投影时效果很差,而且长时间阅读容易疲劳。如果确实需要深色背景,确保文字和背景的对比度足够高,至少达到 4.5:1 的对比度比例。
5.2 字号与线宽的层级关系
字号和线宽是建立视觉层级的另一个重要手段。我的做法是:核心节点字号最大,支撑节点次之,辅助文字最小。具体数值上,如果核心节点字号是 16px,支撑节点用 14px,辅助文字用 12px。这个差距不能太小,否则层级拉不开;也不能太大,否则看起来不协调。
线宽同理。核心连线用 2px,支撑连线用 1.5px,辅助连线用 1px。箭头大小也要和线宽匹配,粗线配大箭头,细线配小箭头。我见过线很粗但箭头很小的图,看起来像一根管子顶着一个针尖,非常不协调。
边框的处理也有讲究。核心节点可以用实线边框,支撑节点用虚线边框或者无边框只留背景色。这样即使颜色相近,也能通过边框样式区分层级。
5.3 图例和标注的放置策略
图例是图表的“说明书”,但很多人把图例放在图的右下角,读者需要来回翻看才能理解。我的做法是:如果图例内容少(三个以内),直接放在图的左上角或者右上角,靠近主流程的起点;如果图例内容多,考虑不用图例,直接在节点或连线上标注。
标注的放置原则是“就近”。解释某个节点的文字放在该节点旁边,解释某条连线的文字放在该连线旁边。不要把所有标注集中放在图的一侧,那样读者需要不断对照编号和位置,效率很低。
如果图的内容确实复杂,需要大量文字说明,我的建议是:图归图,文字归文字。图放在文档中间,文字说明放在图的下方或者上一段。图里只保留最必要的标注,详细解释放在正文里。这样图保持干净,文字可以展开写。
6. 工具选型与实操流程:从草稿到成图的完整链路
6.1 工具选型的三个维度
选工具这件事,没有绝对的好坏,只有适不适合。我从三个维度来评估:表达力、协作性、输出质量。
表达力指的是工具能不能画出你想要的图表类型。有些工具擅长流程图,有些擅长时序图,有些擅长架构图。如果你的图类型比较单一,选一个专精的工具就行;如果类型多样,选一个通用的。
协作性指的是多人编辑和评论的便利程度。如果图需要多人评审和修改,选支持实时协作和评论的工具;如果只是自己画自己用,本地工具就够了。
输出质量指的是导出图片的清晰度和格式支持。如果图要放进文档或者打印,选支持矢量导出的工具;如果只是在屏幕上看看,位图也够用。
我自己的组合是:草稿阶段用纯文本或者白板工具,快速把节点和关系列出来;正式画图用支持矢量输出的工具;最终导出 PNG 或者 SVG 放进文档。这个流程的好处是,草稿阶段不纠结样式,正式阶段才考虑美观,效率最高。
6.2 从草稿到成图的五步流程
我把画图流程拆成五步,每一步都有明确的产出物。
第一步:文字梳理。在备忘录里写出图的文字描述,包括节点、关系、方向、条件。产出物是一段 100 到 200 字的文字。
第二步:节点分组。把文字里的节点按功能或位置分组,确定核心层、支撑层、辅助层。产出物是一个分组列表。
第三步:草图布局。在白板或者纸上快速画出节点位置和连线走向,不纠结样式。产出物是一张手绘草图或者白板截图。
第四步:正式绘制。在画图工具里按草图布局,应用配色、字号、线宽规范。产出物是一张完整的图。
第五步:审查调整。把图缩小到 30% 看层级是否清晰,打印出来看对比度是否足够,找别人看能否在不讲解的情况下理解。产出物是最终版本。
这五步里,第一步和第二步最关键,也最容易被跳过。我自己的经验是,如果第一步和第二步做扎实了,后面三步会非常快;如果跳过前两步直接画,后面会反复修改,总时间反而更长。
6.3 导出与嵌入文档的注意事项
图画出之后,导出和嵌入文档也有讲究。首先是格式选择:如果文档需要打印,导出 PDF 或者 SVG;如果只在屏幕上看,PNG 就够了,但分辨率至少 2 倍,否则在高分屏上会模糊。其次是命名规范:我习惯用“图-主题-版本”的格式命名,比如“图-订单流程-v2”,这样后续修改时不会搞混版本。
嵌入文档时,图的大小要控制。一张图占满整个页面宽度是可以的,但不要超过页面宽度,否则打印时会被裁切。如果图的内容确实很宽,考虑拆成两张,或者旋转 90 度横排。
还有一个细节:图嵌入文档后,图下方要加图注。图注的格式是“图 X:图的标题”,标题要能独立说明图的内容,不要写“系统架构图”这种太泛的,要写“订单系统从下单到支付的模块调用关系”。这样即使读者只看图注,也能知道这张图在讲什么。
7. 那些没人告诉你但一定会踩的坑
7.1 节点命名的一致性陷阱
节点命名看起来是小事,但一致性出问题会让图变得非常难读。我见过同一张图里,同一个东西一会儿叫“用户服务”,一会儿叫“用户模块”,一会儿叫“User Service”。读者会以为是三个不同的东西。
我的做法是:在画图之前,先建一个术语表,把所有节点的名称确定下来,画图时严格按术语表来。术语表里还要规定缩写规则,比如“服务”统一缩写为“Svc”,“模块”统一缩写为“Mod”。这样即使节点名称需要缩短,也有统一的规则,不会乱。
另一个一致性问题是大小写。中文节点不存在这个问题,但英文节点要注意。要么全部首字母大写,要么全部小写,不要混用。我通常用首字母大写,因为看起来更正式。
7.2 连线交叉的隐藏成本
连线交叉不仅影响美观,还有隐藏的认知成本。每多一处交叉,读者就需要多花零点几秒来追踪线的走向。如果一张图有十处交叉,读者就要多花好几秒,而且容易看错。
减少交叉的方法有几个:调整节点顺序,把有连线的节点放在相邻位置;使用“跳线”符号,让交叉变得明确;如果交叉实在太多,考虑拆图。我自己的经验是,如果调整节点位置后交叉还是超过五处,那就说明这张图的信息量太大了,应该拆成两张。
还有一个技巧是用颜色区分连线。如果两条线必须交叉,给它们不同的颜色,读者可以通过颜色追踪。但颜色不要超过三种,否则又回到“彩虹图”的问题。
7.3 版本管理的混乱现场
图是会改的,而且往往改很多版。如果没有版本管理,最后你会分不清哪张图是最新的,哪张图是给谁看的。我见过有人把图命名为“架构图-final”“架构图-final-2”“架构图-真的final”,这种命名方式在团队协作里是灾难。
我的做法是:用日期加版本号命名,比如“架构图-20250115-v3”。同时在图的右下角加一个小的版本标记,这样即使图被单独导出,也能知道是哪个版本。如果图有多个变体,比如“给领导看的简化版”和“给开发看的详细版”,在文件名里加上用途标记,比如“架构图-20250115-v3-简化版”。
还有一个细节:每次修改图之后,在文档的修改记录里写清楚改了什么。比如“v3:增加了缓存模块,调整了数据库位置”。这样即使过了几个月,你也能快速回忆起每次修改的内容。
7.4 审查清单:发布前的最后五问
图发布之前,我会问自己五个问题。这五个问题能拦住大部分低级错误。
第一问:把图缩小到 30%,还能看出核心节点吗?如果不能,层级有问题。
第二问:把图打印成黑白,还能区分不同节点吗?如果不能,配色有问题。
第三问:找一个没看过这张图的人,他能在一分钟内说出这张图在讲什么吗?如果不能,信息结构有问题。
第四问:图里的每个节点和连线,都是必要的吗?有没有可以删掉的?如果有,删掉。
第五问:图注能独立说明图的内容吗?如果不能,图注需要重写。
这五个问题花不了五分钟,但能避免很多返工。我自己的经验是,第三问最有效,因为“别人看不懂”往往就是“自己没想清楚”的直接反映。
8. 我个人在实际操作中的几点体会
画了这么多年图,我最大的体会是:图表设计的本质不是“画得好看”,而是“想得清楚”。一张图如果逻辑清晰、层级分明,即使配色普通、样式简单,也是好图;反过来,一张图如果逻辑混乱,即使配色再漂亮、样式再精致,也是废图。所以每次画图之前,我都会花至少一半的时间在“想”上,而不是在“画”上。
另一个体会是,图是改出来的,不是一次画成的。我几乎没有一张图是一次性画完就定稿的,都是画完第一版之后,放一放,过几个小时或者第二天再看,总能发现可以改进的地方。这个“放一放”的过程很重要,因为刚画完的时候,你的脑子里还有完整的逻辑,看不出问题;过一段时间再看,脑子里的逻辑淡了,图本身的缺陷就暴露出来了。
最后一个体会是,不要追求“一张图讲完所有事”。我以前也有这个执念,觉得拆成多张图显得不够“简洁”。后来发现,读者根本不在乎图有几张,只在乎每张图能不能看懂。一张图讲一件事,讲清楚,比一张图讲五件事、每件都讲不清楚,要好得多。这个道理说起来简单,但真正做到需要克服“怕麻烦”的心理。我的做法是,如果一张图超过十五个节点,就强制自己拆图。这个硬性规则帮我避免了很多“大杂烩”式的图。