diagram-design 这个词,我研究了很久,最终把它定义为:一张图从最初的想法到最终可交付物的整个设计过程。技术圈里,我们每天都要画各种图:系统架构图、业务流程图、数据流转图、部署拓扑图……可真正能把图画得让人一眼看懂的人,其实不多。我自己前期也画废过无数张图,后来才摸到一套相对稳定的方法。这篇文章就是我这些年画图踩坑、总结、再实践的完整记录,适合做技术方案、写文档、做汇报、带新人的同学参考,哪怕你只负责整理周报里的流程图,也能从中找到立即能用的细节。
1. 为什么说 diagram-design 是技术表达里的"硬通货"
看代码的时候最怕什么?我最怕一上来就是三百行的if else嵌套,没有注释,没有文档。与之类似,我拿到一份技术方案,如果半小时之后还没看明白系统是怎么拼起来的,那基本就是 diagram-design 出了问题。图不是装饰品,它是技术表达的核心载体。你写的架构设计、实施方案、复盘报告,别人第一眼看的不是文字,而是图。
1.1 一张图能解决什么问题
比如你要解释一个"订单支付后异步通知商家"的流程。用文字写,要写五六行,中间还容易漏掉各种分支。用图,一条泳道图拉下来,用户、订单中心、支付网关、商家系统各自负责什么,一清二楚。这背后的设计过程,才是 diagram-design 的关键:不是打开工具画个框加个箭头,而是先搞清楚这个图给谁看、要回答什么问题、信息密度放到多大。
我见过太多图,问题根本不在工具,而在设计。有人用 Word 画了一整天,结果导出图片放大后全是毛边。有人把系统里所有组件全塞进一张图,结果屏幕都装不下。还有人配色像迪厅,红黄蓝绿全招呼。这些都不是工具问题,是脑袋里缺了一套 diagram-design 的方法论。
1.2 我见过的几种"灾难级"画图
我把这些年看到的"翻车现场"总结成四类,如果你发现自己中招,那这篇内容正好可以继续看下去。
第一类是"俄罗斯套娃图"。一个大方块套一堆中框,中框里再塞小组件,层层嵌套,看的人根本分不清边界在哪。乍一看很厉害,仔细一看全是容器套容器,层次关系表达得一塌糊涂。
第二类是"贪吃蛇图"。箭头绕来绕去,从右下角绕到左上角,横跨整个画面,不画跳线根本走不通。这种图往往是因为一开始没规划布局,想到哪画到哪,最后只能靠长长的连线硬接。
第三类是"文字地狱图"。每个框里都塞进三大段话,字号还调到 6pt,美其名曰信息完整,实际没人看得清。一旦导出成图,字、线、框糊成一团。
第四类是"五彩斑斓图"。每个组件一种颜色,背景再铺上渐变,像幼儿园涂鸦。这种图第一眼很热闹,第二眼就不知道该聚焦哪里。
这些图都有一个共同点:设计者把"图"当成了"文字的压缩包",把所有信息堆进去,却不考虑读者如何读取信息。diagram-design 的前提,是你得承认图是一件需要刻意设计的作品,而不是草稿的截图。
2. 动手之前:先想清楚三件事
很多人打开画图工具就动手,画到一半又推翻重来,就是因为跳过了"设计前思考"这一步。我现在的习惯是,先花十分钟想清楚三件事,再打开工具。这三件事,直接决定这张图是清晰还是混乱。
2.1 明确读者是谁
同一个系统的架构,给程序员看和给老板看,完全是两张图。给程序员看,可以聊服务粒度、协议类型、数据流向、故障边界;给老板看,重点应该是业务模块、用户价值、团队分工、项目节点。如果你不分对象,把给老板看的那版画成了技术细节大合集,那对方大概率只关心四件事:系统稳定吗、用户量大吗、要花多少钱、什么时候上线。
我做过一个典型的调整:同样是一张权限中心示意图,给研发组的版本里我画了 token 校验、缓存策略、DB 表关系;给产品侧的版本里我只画了"登录 → 鉴权 → 授权 → 审计"四个模块,每个模块配一句话职责说明。两张图画了不到一小时,效果却天差地别。所以,diagram-design 的第一步永远是:明确这张图是给谁看的,他需要从中获取什么。
2.2 确定图的类型
很多人把流程图、架构图、时序图混着画,一会儿流程一会儿结构一会儿时序,结果变成四不像。我建议拿到需求后先对号入座,选一种主导图型:
| 图型 | 表达核心 | 适合场景 | 典型布局 |
|---|---|---|---|
| 架构图 | 系统模块与关系 | 系统设计、方案评审 | 分层或拓扑式 |
| 流程图 | 步骤与分支 | 业务流程、状态流转 | 纵向泳道或线性 |
| 时序图 | 消息先后顺序 | 接口交互、日志排查 | 横向生命线 |
| 组织关系图 | 层级与归属 | 团队结构、权限树 | 自上而下树状 |
| 思维导图 | 发散与归类 | 头脑风暴、需求梳理 | 中心向外扩散 |
每一种图型都有自己最适合的布局逻辑。有人画架构图,非要用泳道;有人画流程图,非要搞成树状结构。这些不是说完全不行,而是容易误导阅读者。读者对图表有天然的语义预期:看到泳道就认为是职责划分,看到箭头就认为是数据流或控制流。一旦你的表达不符合预期,解读成本立刻上升。
2.3 画一个明确的信息边界
这是我最想强调的一点。很多人一张图想容纳所有信息,恨不得把整个公司的系统都画进来。结果图越画越大,信息越堆越多,最后谁也没看懂。正确做法是:给这张图划定一个严格的信息边界,只展示与当前主题强相关的内容。
打个比方,你看地图 App 的时候,它不会把全中国所有 POI 一次全显示,而是根据你的缩放级别,只展示当前屏幕上有价值的内容。diagram-design 也一样:你要像缩放地图一样控制信息密度。比如画"支付链路"架构图,那 Redis 缓存、消息队列、数据库就必须出现;但如果你把"客户关怀系统"也塞进来,那就不合理了,除非它们真的在同一条链路上承担职责。
我的经验是,每次准备加一个框之前,先问自己三个问题:它跟当前核心主题有直接关系吗?如果不画它,读者会不会产生误解?它占的位置要不要超过画面面积的 10%?如果这三个问题都没通过,就先不放。等图的主体结构清晰了,再用"附录"或"引用另一张图"的方式补充。
3. 核心细节拆解:布局、连线、配色与图标
把这些"想清楚"的事情做完之后,才进入真正动笔的阶段。diagram-design 的核心细节,我总结为四件事:布局、连线、配色、文字图标。这四件事环环相扣,任何一个做不好,整张图都会别扭。
3.1 布局:确定主方向、层级和留白
布局是一张图的骨架。我一般按"主方向 → 层级 → 留白"三步来搭。
主方向优先。如果一个流程是从用户触发开始的,我习惯从上到下布局,因为阅读习惯是从左上角开始。如果是展示系统模块间的依赖关系,我习惯从左到右布局,主调用方在左,被依赖方在右。架构分层图则反过来,从上到下是接入层、应用层、数据层,一层一层往下走。
层级要清晰。同一层级的节点,视觉上必须对齐。不同层级的节点,要通过间距或分组明确区分。比如画一个三层的微服务架构,网关层、业务层、数据层各自放在一个横向区域内,区域之间留出明显的空白带。这样读者一眼就能感知到"这是分层结构",而不是一坨节点堆在一起。
留白是被严重低估的设计元素。我见过太多图把节点挤得严严实实,每个框之间只有几个像素的距离,看起来像一块布料。好的做法是:相邻节点之间至少留出等宽于 1/3 节点宽度的间距;不同分组之间留出更大的空白。留白不是浪费,它是在帮读者的眼睛做缓冲。
3.2 连线的语义:箭头不是随便画的
箭头是 diagram-design 里最容易出错的地方。很多人从头到尾只用一种箭头,语义完全混乱。实际上,箭头至少有几种常见语义:
- 实线箭头:数据流或控制流,表示一个组件向另一个组件发起请求或传递数据。
- 虚线箭头:异步通知、回调、非强制依赖。
- 无箭头直线:静态关联、配置关系。
- 双箭头:双向依赖,此时要警惕是否真的合理。
我早期画图时,不管什么关系都画一个实线三角箭头,结果评审会上被架构师追问"这个箭头到底是 HTTP 调用还是消息投递",当场答不上来。后来我给自己定了一个规则:每条连线都要能说清楚它代表什么,并且同一张图里,相同含义必须用相同的线型。
还有一个细节是连线的走向。尽量让主线方向保持一致。如果主体流程是"从左到右",那就不要在中途突然出现一条"从右到左"的箭头,除非它是明确的回环或异常分支。对于不可避免的交叉线,我一般采取两种处理方式:一是调整节点位置,让交叉消失;二是用"跳线"小圆弧表示交叉,让读者知道这两条线没有实际连接。
3.3 配色:克制是第一原则
配色是最容易看出一个图"专不专业"的地方。我在 diagram-design 里遵循一条铁律:一张图里最多出现 3 个主色,其余只能作为灰阶辅助。这 3 个主色通常承担不同职责,比如一个主色用于核心组件,一个主色用于辅助组件,一个主色用于强调异常或重点。
你可以用同色系的不同深浅来区分层级。例如,整个架构图以蓝色为主色,核心服务用深蓝填充,接入层用浅蓝填充,数据库层用中蓝,再配一点橙色用来标出"本次改造新增"的节点。这样整张图既有统一感,又有重点。
我之前犯过一个典型错误:所有组件都用一个颜色,结果图是统一了,但信息层级全没了。后来改为:默认组件用白色底+深灰边框,核心组件用浅蓝底+深蓝边框,异常组件用浅红底+红边框。这样读者扫一眼就能抓住重点。一个额外技巧是,如果你要把图投到深色背景的会议室大屏,不要直接用黑底白字导出,而是调亮所有颜色,否则后排根本看不清。
3.4 图形元素与文字标注
图形元素要少而精。我建议大家先建立一个"图形词汇表":矩形表示服务/模块,圆角矩形表示外部系统,菱形表示判断分支,圆柱体表示存储,人形图标表示用户角色。这个词汇表要全项目统一,不要今天用矩形表示服务,明天用圆形表示服务。
文字标注我倾向于遵循三个原则。第一,框内文字尽量不超过 8 个字,能表达清楚职责即可。第二,连接线上要加必要的关键词,例如"HTTP"、"异步回调"、"binlog 同步",这些标签能极大降低阅读成本。第三,字号要足够大,我一般把最小字号设置在 9pt 以上,如果字号小于 8pt 还放不下,那就说明这个框承载了太多信息,应该拆开。
有一个常见的误区是,总想用图标代替文字,觉得画个数据库圆柱体就够了,旁边不写任何标注。这种图看起来简洁,但遇到英语不好的、业务背景不同的读者,就会产生理解偏差。正确做法是图标为主、文字辅助,图标表达形,文字表达义。
4. 实操过程:从空白画布到可交付图
理论讲完,下面进入实操环节。我把自己画一张图的完整过程写出来,从工具选型到最终交付,每一步都拆开说,方便直接照着做。
4.1 工具选型:没有万能工具,只有合适工具
先解决"用什么画"的问题。我这些年用过的工具不少,各自定位差异很大:
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| draw.io(diagrams.net) | 免费、开箱即用、图库丰富 | 界面略土 | 通用架构图/流程图 |
| Figma | 协作实时、样式能力极强 | 需要设计基础 | 高质量方案配图 |
| Excalidraw | 手绘风格、上手极快 | 不适合画严谨架构 | 线上脑暴、快速记录 |
| Visio | 企业级、图形标准库全 | 收费、协作弱 | 传统企业交付 |
| Mermaid/Graphviz | 文本驱动、版本可控 | 排版不够自由 | 文档内嵌图、自动生成 |
以我个人经验,如果你只准备用一个工具,首选 draw.io。理由很简单:免费、不需要学设计、基本上什么图都能画,而且它支持把源文件保存为 XML 文本,可以直接放进 Git 仓库做版本管理。Figma 适合需要高度定制样式的场景,比如给客户做售前材料、给高层做视觉汇报,但它的学习曲线比 draw.io 长不少。至于 Visio,除非你所在的公司有统一的交付规范,否则我建议先用 draw.io 画内容,最后再考虑是否要移植。
4.2 动笔顺序:先搭骨架,再填细节
很多人打开新画布就开始画第一个框,然后一个接一个地连箭头,这是完全错误的第一步。我的习惯是四步走。
第一步,先在画布边缘用文本框写下这张图的标题、版本号、创建日期。这不是为了形式,而是防止后续修改时找不到对应版本。
第二步,画"占位框架"。把页面按布局规划分成几个大区域,先用最淡的色块或辅助矩形把区域框出来。比如我画系统架构图时,会先拉一个纵向的"应用层"区域,再拉一个"数据层"区域,然后在区域内放节点。这样做的优势是,节点不至于画到画布之外。
第三步,按主流程把核心节点先用简单的矩形放上去,只考虑位置,不考虑样式。这个过程只关注逻辑关系是否完整。我经常在第一步和第三步之间反复调整顺序,直到确认主链路顺畅。
第四步,才是调整样式、填充文字、设置配色。
如果你跳过第二步,直接画节点、连线,大概率会出现"画到一半发现画布不够放"的问题。很多人这时候就会把整个图形拖来拖去,越拖越乱。用占位框架至少能保证视觉上的整体感先存在。
4.3 图层管理、对齐与间距
当我画的图超过 20 个节点时,图层管理就成了刚需。draw.io 里的分层功能虽然不够强,但我有一个变通方案:给不同分区的节点上不同的边框颜色,并把同一个分区的节点用Ctrl+G放进同一个组。这样临时移动某个分区时,组内相对位置不会变。
对齐和间距,我几乎全靠工具快捷键。在 draw.io 里,选中多个节点,使用排列功能里的"水平均匀分布"和"垂直居中对齐",可以一键把杂乱的节点变得整齐。别相信自己的鼠标,手动目测对齐几乎总会差那么几个像素。间距方面我习惯设置统一的网格大小,draw.io 默认网格吸附是打开的,建议保持开启,这样所有节点都会自动落到网格上,导出后看起来特别整齐。
分布式的图如果节点距离不统一,视觉上会显得非常乱。我给自己的标准是:同一层的节点间距尽量保持相等,误差不超过 10 个像素。这个标准不用尺子量,靠"看着匀称"基本就够了。
4.4 导出与交付:选对格式,别让图毁在最后一步
图设计得再好,导出设置不对也会白费。我常用的导出格式有四种:
- PNG:最通用,适合贴到文档、PPT 里。注意分辨率要设置到 2x 或 3x,否则在 Retina 屏幕上会发虚。draw.io 导出时可以直接设置缩放比例,我一般选 200% 或 300%。
- SVG:矢量格式,适合嵌入网页、再次编辑。缺点是部分在线文档系统不支持 SVG 上传,需要预览确认。
- PDF:适合打印、归档,信息保真度高,且可以被文字识别索引。
- XML(源文件):一定要保留这份,它是你后续修改的底稿。很多同事向我抱怨"上次那张图找不到了",就是因为保存成了 PNG 后把源文件删了。
我给自己定的交付规则是:每一个交付出去的图,必须同时给出 PNG 和源文件。如果是在线工具,我会把源文件链接附在文档注释里。这样别人要修改的时候,不需要对着 PNG 重画一遍。
5. 常见问题与排查技巧实录
画图这件事实操性很强,很多问题不亲手踩一遍很难意识到。我把自己和周围同事最常遇到的 5 类问题整理出来,附上排查思路,遇到类似情况可以直接对号入座。
5.1 图太空或太挤,怎么调整
图太空通常是因为信息量不足,或者节点间距设得太大。我的建议是:先检查是不是遗漏了关键层级。比如画架构图,如果接入层只有 1 个节点,应用层只有 1 个节点,那这张图肯定不会饱满,可以考虑把相关组件展开到二级细节。
图太挤则相反,往往是节点文字太多、信息层级不分明造成的。排查思路是:把每个框里的核心词提取出来,只保留不超过 8 个汉字,把描述性文字移到连线标签或图例中。如果这样还是挤,就考虑把一张图拆成两张:一张总览图,一张详细图。
5.2 连线交叉太多,怎么理顺
交叉线是流程图和架构图的重灾区。我遇到交叉线时,不会手动一根根去拖,而是先重新审视布局方向。例如,如果主体是"从左到右"的流程,却被画成了"既从上到下,又从左到右"的混合方向,那大概率交叉在混合边界处。
另一个实用技巧是"重新给节点排座次"。你可以在草稿纸上把节点名字按优先级列出来,按照主线顺序重新排列节点,而不是在画布上试图通过拉长连线来绕开交叉。主线节点放在同一行或同一列,分支节点退到外层,交叉率就会大幅下降。如果还有少量绕不开的交叉,用跳线符号明确标注,不要留两条线在视觉上交叠。
5.3 颜色太多,如何快速收敛
配色失控几乎是所有新手必经的坑。我之前看某位同学的图,一个模块用了 7 种颜色,原因是"每种颜色的边框代表一种协议"。
这里有一个快速收敛的方法:把所有颜色先全部变成灰阶,只保留一个强调色。具体操作是:先选中所有图形,把填充色设为白色、边框色设为深灰色;然后对需要强调的核心节点,涂上你选定的那个强调色,比如深蓝。如果你觉得还要至少两种强调色,那就控制在"一个主强调色+一个警示色"以内。最后,用图例说明每一种颜色的含义。这样做完,整张图的"色彩噪音"立刻下降。
5.4 导出图片模糊、字体丢失
导出模糊基本都是分辨率设置问题。修订方案是:优先导出 SVG,如果必须要 PNG,就设置缩放 200% 以上。字体丢失往往发生在跨平台打开时,你的源文件里用了本机自带字体,而对方电脑没有。最稳妥的办法是:线条、形状尽量保持默认字体(通常在 draw.io 里是 Helvetica 或 Arial),除非万不得已不要用特殊字体。
如果你发现导出后的图片里文字出现"方框",说明字体完全没嵌入到目标环境中。此时可以把所有文字转成路径,draw.io 里没有一键转路径的功能,但你可以选择导出为 PDF 再转成图片,通常可以保留文字轮廓。最省心的方案还是统一用通用字体。
5.5 后来者维护困难,命名混乱
这个问题很少被提起,但实际影响非常大。一张图交付之后,三个月后要改一个节点,命名混乱的源文件会让维护人彻底崩溃。
我自己的命名规范是:每个节点必须用有意义的 ID,而不是默认的默认节点名。比如order-service、payment-gateway、user-db。分组名也遵循group: engine-layer这样的格式。画布图层如果有,分层名要体现逻辑,比如"背景"、"主流程"、"标注区",而不是"图层 1"、"图层 2"。
另外一个习惯是,在源文件的第一页放一个"图例说明"小块,写清楚这张图的适用读者、核心主题、改动历史和当前版本。这样后来者打开时,能在 10 秒内知道这张图在讲什么,而不是对着节点一个个猜。
最后再分享一个小技巧,这也是我踩过不少坑之后总结出来的:每次画完图,不要立刻交付,先把它放到"缩小到合适大小"状态下看一眼。具体做法是把画布缩放到 50% 左右,模拟读者在屏幕上或纸上的阅读状态。如果在这个缩放级别下,文字还能看清、连线没有乱缠、重点颜色一眼能定位,那这张图的 diagram-design 基本就过关了。如果是自己画了太久已经看不出问题,那就发给一个完全不了解背景的同事,让他花 30 秒描述这张图讲了什么。对方能说出来,说明图真的会说话;如果他说不出来,问题通常不在于他的理解能力,而在图本身——回去重新调整布局和信息层级,比继续在原图上修补要省时间得多。