
如果你和我一样经常要写方案、做评审、带新人那你一定体会过图没设计好带来的尴尬一张架构图画得密密麻麻汇报时没人看一张流程图逻辑没问题但别人一眼看不懂明明工具用得挺熟产出的图却总是显得很业余。diagram-design不是什么高深词汇它就是图与表的设计功夫——把复杂信息组织成一张能被人快速读懂的视觉作品。这篇文章我会从原则、实操、复盘到踩坑完整拆解我这些年做diagram-design攒下来的方法。不管是刚接触绘图的新手还是已经画了几年图但总觉得差点意思的老手应该都能找到能直接用的东西。1. Diagram Design到底是什么一个被低估的设计领域1.1 图和表的本质是信息契约我做了这么多年技术方案和项目复盘最大的感受是很多人把图表当成文档里的装饰品觉得图就是给文字配个插图画画框、连几条线就算完成。但图真正的本质是一份信息契约。你画一张架构图等于在向读者承诺按我这种方式去理解系统你能建立正确的心智模型。读者看图本质上是信任你提供的结构。如果一张图画完读者脑子里形成的模型跟实际系统对不上或者根本不知道从哪看起那这张图无论多漂亮都是失败品。我见过一个20多人的团队系统架构图挂在 wiki 上两年没人更新新人入职全靠老员工口口相传。问为什么没人看图答案出奇一致看了也看不懂不如直接问。这就是信息契约破裂的典型症状——画图的人没把读者当回事读者自然也不把图当回事。所以我的第一个观点是diagram-design 不是一种美术能力而是一种沟通能力。你需要先想清楚这张图到底要让谁看懂什么再考虑用什么形状什么颜色。1.2 为什么单独把diagram-design当一门功夫很多人觉得画图难在工具不熟。说实话工具从来不是核心瓶颈。一个拖拽式绘图软件正常人20分钟就能学会画框和连线真正的瓶颈在于信息怎么组织、层级怎么划分、哪些细节必须出现、哪些细节必须删掉、视觉元素怎么承载逻辑关系。同样一块业务新手画出来是一张蜘蛛网密密麻麻全是交叉线有经验的人画出来是一张分层地图读者沿着主路径走一遍就知道数据从哪来、经过哪、到哪去。差别不在工具而在设计。diagram-design 这门功夫横跨了三个领域信息架构决定放什么、不放什么、视觉设计决定怎么排布、怎么编码、领域知识决定术语和逻辑是否正确。这三者缺一不可。这也是为什么很多程序员写代码很厉害画出来的图却一塌糊涂——因为他只完成了领域知识这一层完全没有做信息架构和视觉编码。反过来设计师画的图虽然好看但如果对业务逻辑理解不深图里就会出现明显的逻辑漏洞。diagram-design 的价值恰恰是把这两种能力补全结合起来。2. 设计一张好图的四个底层原则2.1 原则一先定义读者和意图我画图之前从来不直接打开工具而是先在脑子里或者白板上回答一个问题这张图是给谁看的给刚入职的新人看你必须画出服务边界、模块职责、请求主链路把怎么理解这个系统讲清楚。给后端工程师看你可能需要画到接口级别、数据表级别、消息队列的 topic 级别。给决策层领导看你反而要减少技术细节突出成本、风险、依赖关系和关键路径。读者不同同样的业务会画出完全不同的图。我踩过的最大坑就是画了一张给所有人看的架构图结果在汇报时领导问为什么这么多框在开发评审时同事又问这个模块底层怎么实现的怎么没画。一张图承载了两批读者的诉求最后谁都没服务好。后来我总结了一个自问清单画图前必须过一遍谁在看这张图他已有的背景知识是什么他在什么场合看是汇报、评审、排障还是自学看完之后他需要做什么决定他能接受的细节深度是多少这张图里哪些信息可以暂时不出现不要小看这几个问题它们直接决定了图的类型、复杂度和抽象层级。我曾经在画一张数据流转图时默认读者都懂消息队列结果评审时发现一半人不知道 topic 和 consumer 的区别整场会议全在解释概念。后来我把图拆成两张一张画业务数据流一张专门画消息中间件的内部结构会议效率立刻上来了。2.2 原则二用层次代替平铺新手画图最常见的毛病是平铺把所有模块、所有连线、所有注释一次性堆在一个平面上一视同仁。结果就是读者完全抓不住重点。好的图一定是有层次的。所谓层次就是你有一个主叙事线其余都是支撑信息。就像看地图一样你先看到主干道再逐层放大到街道、巷子。图也需要这种缩放能力。具体做法上我习惯把图画成三层第一层是主链路核心流程、核心模块、核心数据走向。这一层是读者第一眼必须看到的。第二层是支撑依赖缓存、消息队列、定时任务、外部系统这些辅助模块用弱化方式呈现。第三层是细节标注接口名、字段名、协议、超时时间这类内容除非必要否则放到附录或者注解里。实际画图的时候这个原则体现为几种可落地的操作。第一步把图里的元素按必须现在看和以后再看分开。第二步用分组容器或者背景色块把支撑模块归拢到图的边缘而不是散落在主链路中间。第三步用线型区分关系强度主链路的连线全部是实线支撑依赖用虚线外部系统的交互可以用带箭头的浅色线。我见过一个反例有人画系统流程图把十几个微服务的调用关系全部用同一种颜色、同一种线型铺开每个服务旁边还标注了端口号和数据库表名。图倒是信息齐全但读者扫一眼只会产生一个想法这图怎么这么乱。其实只要把主流程抽出来加粗其他依赖后移图立刻就有骨架了。2.3 原则三视觉编码要一致视觉编码这个词听起来专业说白了就是你图里的形状、颜色、线型、箭头必须一以贯之有稳定含义。很多图的混乱是视觉语义冲突造成的。比如同一个颜色的框在第一张图里代表服务在第二张图里突然代表数据库读者就得不断回头猜。又比如箭头一会实线一会虚线但没有任何规律读者根本分不清哪个是强依赖、哪个是异步消息、哪个只是触发关系。我自己的默认规则是这样的矩形模块、服务、系统边界圆角矩形流程动作、处理步骤菱形判断分支平行四边形数据、文件、消息灰色框外部系统或不在本次范围内实线箭头强依赖或同步调用虚线箭头异步、弱依赖或可选路径这套规则不一定是行业标准但它足够简单、全图一致、读者容易建立心理模型。你的团队完全可以约定自己的一套但无论如何都不能今天用方形明天用圆形今天红色表示告警明天红色表示主链路。另外任何非直觉的符号都要配图例。图例放角落不占地方却能省掉读者大量猜测成本。我甚至养成了一个习惯图里颜色超过三种就必须在图例里写清楚每种颜色的语义。别相信颜色自己会说话颜色从来不会自己说话。2.4 原则四命名和注释是图的一半这个原则是我近两年感受最深的。很多图即便结构合理、层次清晰仍然让人看不懂问题大多出在命名上。图的模块名本质上就是代码里的变量名。变量名叫a1代码再精简也没人看得懂模块名叫处理模块读者依然一头雾水。我给团队做图评审时一定会问一个问题如果这个框里不写字光靠形状和连线你能猜出它是什么功能吗猜不出来说明命名没有传递信息。命名策略上我的建议是实体类模块用名词职责订单服务、库存管理、用户中心。流程动作用动词开头校验登录态、计算价格、生成支付单。避免纯技术缩写能写支付回调就不要写PayCB。控制在8到12个字太长就拆出更细的图。除了模块名箭头旁边的动词注释同样重要。两个模块之间的连线写调用是弱注释写同步查询用户信息是强注释。箭头靠标签点明关系读者就不用自己脑补了。我还有一个习惯图里出现任何领域特定术语都会在底部加一条术语说明。这不是啰嗦而是降低阅读门槛。现在很多图直接面向跨职能团队产品、测试、运维都会看你以为的常识对别人来说可能就是天书。3. 完整实操从零设计一张系统架构图3.1 第一步画前四问现在说点能直接上手的流程。我给自己定的规矩是打开绘图工具之前先完成画前四问全部写成文字答案然后才开始动笔。四问分别是给谁看明确读者群体和知识背景。看多久是汇报时的两分钟还是文档里被反复翻阅的十分钟。看完要做什么决定定位问题、评审方案、学习系统决定了图的侧重。哪些信息必须删掉主动做减法防止信息过载。举个例子。如果我要给刚加入团队的三位新同学画订单处理链路的架构图我的四问答案大概是读者是后端新人熟悉基本开发但不熟悉业务这张图会贴在项目文档里他们入职前两周会反复看看完之后他们需要知道一个订单从发起到落库经过了哪些服务可以删掉的内容包括数据库表结构、缓存淘汰策略、消息队列的 topic 明细。有了这四条答案后续所有设计决策都有据可依。别名如果后面有人质疑为什么这里没画数据库表我可以说因为对这批读者、这个观看场景来说它不是必要信息。3.2 第二步草图与模块划分画前四问写完先别急着上工具。我会找一张白纸或者打开白板软件的无限画布用最潦草的方式把模块画出来。这一步的意义是把脑子里的结构外化出来方便调整。模块划分有一些相对好用的切入角度按职责分每个模块做一件内聚的事比如鉴权、订单、支付、库存。按部署边界分不同进程、不同机器、不同团队维护的模块天然分开。按数据流分顺着一次完整流程走一遍经过哪些节点就画哪些节点。模块划完之后做一次边界数统计理想情况是一张图里3到7个主要边界。如果超过7个读者很难一次记住如果超过10个我基本会考虑拆图。这一步我的经验是草图上不追求美观只追求结构正确。该画歪就画歪该写错别字就写错别字重点是让模块之间的关系在大脑中成型。很多人在这一步就打开工具不但拖慢了速度还会因为忙着调整格式而干扰结构思考。3.3 第三步确定图表类型很多人的困惑是我该画流程图还是架构图。其实图表类型不是凭感觉选的而是由你想表达的信息结构决定的。我做了一个粗略的决策参考如果核心信息是时间顺序、流程先后选流程图或泳道图。如果核心信息是模块层级、包含关系、系统边界选架构图或分层图。如果核心信息是对象之间的消息交互选时序图或协作图。如果核心信息是数据的实体关系选 ER 图或类图。如果核心信息是状态迁移与触发条件选状态机图。注意一个系统往往需要多张图协作而不是指望一张超级图解决所有问题。架构图负责全局结构时序图负责一次具体交互ER 图负责数据模型。把多张图放在文档的同一章节各自负责一个维度比把所有维度揉进一张图清晰得多。判断标准很简单如果这张图需要加图例说明这部分去看另一个文档那它可能已经超载了。3.4 第四步选择工具并落地工具选择上我会同时考虑功能、协作、版本管理和复用成本。市面上的工具大致可以分为几类在线白板协作类适合头脑风暴、早期草图实时协作强但版本管理弱。矢量绘图软件类适合精细打磨、交付对外材料样式控制灵活但不适合频繁改动。文本绘图工具类用 DSL 脚本描述图可版本管理、可 diff适合放进代码仓库但布局控制相对受限。代码内嵌图表语言类适合生成随代码变化的图比如接口文档里的调用关系图。我个人在团队项目里越来越偏爱文本绘图。原因很简单它可以被 Git 管理每一次改动都有记录评审时可以像看代码一样看 diff。比如下面的片段就是一种文本绘图工具的示意写法描述三个组件之间的调用关系[用户端] - [接入网关] : 发起订单请求 [接入网关] - [订单服务] : RPC 创建订单 [订单服务] - [支付服务] : 生成支付单 [订单服务] - [(MySQL)] : 写订单记录 [订单服务] -- [消息队列] : 发送订单已创建事件这种写法的好处是模块名称、关系、注释全部以文本形式存在不需要手动拖拽对齐也不会出现连线怎么都对不上的情况。缺点是自动布局有时不符合你期望的阅读动线。我的应对办法是先画草图确定叙事顺序再在文本里通过分组和排序让布局引擎大概按我的思路排布。3.5 第五步细节打磨结构正确、类型选好、工具落地之后最后一步是让图看起来舒服。有些设计师会把这步叫视觉润色但对工程师来说我更愿意叫它消除阅读摩擦。配色方面我的保守建议是主色不超过三种。可以选同一个色系的不同深浅再加一个强调色。别一上来就做彩虹图那是图表大忌。颜色多不等于信息多反而把读者注意力切得粉碎。线型方面实线虚线一定要有稳定语义。我习惯把主链路全部用实线把异步通知后台同步可选路径全部用虚线。如果两类线看起来区分度不够可以把实线加粗一档或者把虚线改成点线。对齐和间距方面所有框体尽量落在同一套网格上。手动拖拽时打开对齐吸附框间距保持相对统一。箭头标签紧贴线条但不要压线字体大小分三级图标题最大模块名其次注释最小。缩小到50%再看一眼如果还能舒服地阅读说明图的基本功到位了。4. 一次完整案例的复盘同一张图的两版对比4.1 需求背景与读者分析为了让你更直观地看到设计差异我拿一个真实做过的模拟项目举例某跨平台系统的订单处理链路。需求是这样的团队最近来了三位新人需要快速理解用户从下单到订单落库这条链路。与此同时技术导师要求我画一张图用于周会汇报说明当前系统的整体架构完善度。我的分析结果是新人和导师是两类读者诉求完全不同因此不应该共用一张图。新人需要的是可反复研读的链路图导师需要的是宏观完整度和风险点。所以我把任务拆成两张图这里重点复盘给新人的那张订单处理链路图。读者画像明确之后我给自己定的目标是新人看完这张图5分钟之内能说出请求经过哪几个服务、每个服务做了什么、数据最终存在哪里。4.2 第一版信息全塞进去我的第一版画得相当失败。现在回头看那正是典型的平铺式绘图。第一版我做了什么呢我把所有相关模块全部堆上去包括用户端、接入网关、订单服务、支付服务、库存服务、积分服务、消息推送服务、定时任务、后台管理系统甚至把每个服务对应的数据库表、缓存 key、队列 topic 都写在旁边。每个模块用了不同的颜色连线有几十条箭头方向有单向有双向还有几条线交叉穿过大半个图。这一版的问题显而易见但当时身在局中没有察觉视觉噪音太多读者第一眼不知道主路径在哪需要自己从几十个框里找。没有一个明确的阅读起点图没有自上而下的叙事顺序从哪个框开始读都行但读到哪里都感到困惑。术语不一致有些模块写的是网关有些写的是API 入口同一个东西换了三个名字。后来我拿这张图给同事做测试他盯着看了两分钟第一句话是我应该从哪里开始看那一刻我就知道这张图从信息契约的角度已经失败了。4.3 第二版按阅读动线重构第二版我没有在原来的图上做修改而是推倒重画。这次我先确定了一条主轴按请求生命周期展开从上到下一次是入口 - 鉴权 - 业务处理 - 持久化 - 异步处理。第二版的核心变化是只画用户端、接入网关、订单服务、支付服务、库存服务和数据库外加一个异步消息队列。其他所有模块比如定时任务、后台管理、消息推送全部移出主图作为第二张补充图来画。视觉处理上主链路统一用一种颜色外部依赖和异步路径用灰色和虚线。每个模块下方只注一行职责说明不再堆细节。箭头旁边都用动词短语标注了关系比如校验登录态创建订单并锁库存写订单记录。第二版的结构可以用文本示意表达用户端 ↓ 提交订单HTTPS 接入网关 ↓ 校验登录态按用户维度限流 订单服务 ↓ 创建订单、预占库存、生成支付单 [库存服务] ← 同步扣减库存 [支付服务] ← 生成支付凭证 订单服务 ↓ 事务提交 订单库主库 ↓ 异步抓取 只读库供查询从结构上能看出读者沿箭头往下看整个链路一目了然。每一段箭头都有语义标签新增的只读库也解释了为什么要做读写分离。4.4 前后对比与改动理由两版图给同一批同事看反馈差异非常明显。第一版平均需要两三分钟才能理清主路径第二版基本三十秒内就能说出核心链路。我把两版的关键差异列了一张表对比维度第一版全塞版第二版动线版主要边界数量11个6个连线数量30多条12条阅读起点不明显从顶部用户端开始主确认路径需要自行搜索沿箭头直下颜色种类7种以上2种主色1种强调色命名一致性同一模块名混用全局统一逐条说改动理由第一为什么去掉定时任务和后台管理因为这两个模块跟一次订单请求的链路没有强关系。它们属于支撑系统不是请求路径上的节点。把它们留在图里只会让读者误以为主请求会经过它们。第二为什么数据库只画订单库而不画每张表因为新人的目标不是设计数据库而是理解链路。库的粒度刚好够用表的粒度放到了 ER 图里去讲。第三为什么箭头标签都要写成动词对象因为调用这个词太含糊它不告诉你调用之后发生了什么。写成创建订单并锁库存读者不需要猜测节奏就快了。我实测下来第二版用在团队评审会上讲解时间从二十分钟缩短到了十分钟而且新人后续提问的数量也明显减少。这不是我嘴皮子变利索了而是图本身把该讲的话讲完了。5. 常见问题排查与团队规范建议5.1 一张图怎么画都乱的排查路径如果你画完一张图总觉得乱但说不上来哪里有问题我建议按下面的路径排查。第一步数边界。把图里的主要分组、模块、大框数一遍如果超过7个大概率超载了。这时候不要试图精简框里的文字而是考虑拆图把图拆成主链路图和支撑依赖图两张。第二步数连线。如果连线超过20条读者很难保持清晰。可以考虑把多条细节连线汇总成一条总线箭头用注释注明具体调用关系。微服务架构里常见的网状调用尤其需要这样处理。第三步查交叉。交叉线是降低可读性的头号杀手。如果两条主连线交叉优先调整布局方向比如把A模块挪到旁边或者把连线改成正交折线。实在避免不了交叉我会用跨线跳线符号标注避免读者误以为两条线相连。第四步做阅读测试。把图给一个没参与画图的人看计时让他说出主路径。如果超过5分钟才说清楚这张图就该重构了。这个测试我几乎每次画完图都会做成本极低收益极高。5.2 用代码生图时的对齐与布局问题文本绘图工具最大的优点是可版本化但布局引擎有时候会给你惊喜明明想让A在B左边它却排到了B下面明明希望箭头从上往下它偏从左往右。我的解决办法有三条。第一在脚本里显式指定方向。多数文本绘图工具支持top to bottom或者left to right这类全局方向设置先把主方向锁定。第二用分组和隐形节点控制相对位置。如果你希望某个模块在视觉上属于某个大区就把它们放在同一个分组块里或者用一个隐藏节点固定锚点位置。第三把大图拆成多个子图。布局引擎处理大图的能力通常弱于人手动辄四五十个节点的图它排出来一定乱。与其和引擎搏斗不如拆成若干张有清晰边界的小图再用主图把子图的入口串起来。我自己踩过的坑是试图让代码自动排出一张完美的多层架构图结果花了三个小时调参不如花半小时拆成三张图。记住代码生图的真正价值不是排版而是可维护、可追踪、可复用。5.3 非技术读者看不懂图的破解方法给非技术读者画图第一条原则是术语降级。把鉴权写成登录校验把消息队列写成通知缓冲把读写分离写成主库写入、查询库读取防止慢查询拖垮主库。术语降级不是撒谎而是换一种读者能理解的编码方式。第二条是控制层级深度。给非技术读者看的图层级不要超过三层。你不需要让他们知道网关里做的是 JWT 校验还是 OAuth2只需要让他们理解所有请求先进统一的入口再分发给后面的服务。第三条是增加导读。图的上方加一句这张图告诉你……图的底部加一个图例。我甚至会在复杂图旁边写一小段阅读路线比如先看蓝色箭头再看灰色箭头。这些辅助信息看似多余实际能把读者的理解时间压缩一半。第四条是按需出多版本。同一套系统我会准备一张对外简化版和一张对内细节版。对外简化版用于汇报和产品宣讲对内细节版用于开发评审。两张图并存各司其职不会为了迁就一方而牺牲另一方的信息完整度。5.4 团队协作从个人技巧到团队规范个人会画图不算厉害团队能长期维持一致的图表语言才算厉害。我参与过的团队里图表规范做得好的普遍做对了这几件事第一统一模板。模板不是让你只改文字就算完而是规定好颜色语义、线型语义、模块命名风格。新成员照着模板画画出来的图天然和团队风格一致。第二命名规范进文档。把模块命名规则写成一条条 checklist比如实体用名词短语动作用动词短语禁止使用拼音缩写。评审图的时候逐条过保证规则被执行。第三图进版本管理。用文本绘图工具的团队图脚本跟着代码仓库走。改了代码顺手改图diff 里能看到图和代码同步变更不会出现图已经过期三个月的情况。第四图评审制度化。代码有 Code Review图也应该有 Diagram Review。评审时重点看三件事信息是否过时、读者是否能快速找到主路径、视觉编码是否一致。一套好的团队图表规范能把图从某个人画的东西变成团队共同维护的资产。这一点在跨职能协作频繁的团队里尤其明显。5.5 图表设计自查速查表最后整理一份自查速查表画完图之后对照检查基本能过滤掉八成常见问题检查项自查问题通过标准读者我是否明确知道给谁看能一句话说出读者画像意图读者看完能做什么决定主路径清晰不用猜测边界数量图里主要分组是否超过7个3到7个为宜连线数量是否超过20条超出则考虑总线或拆图颜色语义每种颜色是否有稳定含义全图一致且配有图例线型语义实线虚线是否混用有规则且读者能区分命名模块名是否自解释去掉文字也能猜出职责箭头标签是否标注了动作动词对象不写裸调用注释级别术语是否需要解释生僻术语有备注阅读测试陌生人能否快速复述主路径5分钟内能说清这张表不用背打印出来贴在工位旁边画完图对照一遍几秒钟的事能避免大多数图乱了的尴尬。我个人做 diagram-design 这几年最大的体会是好的图不是画出来的是删出来的。每次画完初稿我都会强迫自己问一句这张图再删掉什么依然成立删到不能再删图才真正能派上用场。如果你也想把图设计好不妨从下一次画图前花五分钟做读者分析开始。这五分钟看起来是慢了实际上是在帮你看图的人省下后面不知道多少个五分钟。