1. 从一张草图到一套系统:diagram-design 到底在解决什么问题
第一次看到 “diagram-design” 这个标题,很多人会以为它只是教你怎么画流程图、时序图或者架构图。但真正做过技术方案、写过设计文档、给团队做过评审的人都知道,画图这件事从来不是“画得好看”那么简单。它背后牵扯的是一整套信息表达体系:用什么图表达什么信息、图的层级怎么组织、颜色和形状如何承载语义、不同角色看图时能不能快速抓到重点、图能不能随着系统演进而低成本维护。这些才是 diagram-design 真正要解决的核心问题。
我做了十多年一线研发和方案设计,画过的图少说也有几千张。早期我也走过弯路,觉得图嘛,能看懂就行,于是各种箭头乱飞、颜色随心所欲、一张图里塞了十几个模块和二十几条连线。结果就是:自己过两周再看都要愣半天,同事评审时反复问“这条线是什么意思”,新人接手时更是直接说“这图我看不懂”。后来我才慢慢意识到,图不是文档的装饰品,图本身就是一种高密度的信息载体。一张设计得好的图,能顶三千字说明;一张设计得差的图,反而会增加沟通成本,甚至误导决策。
diagram-design 这个主题,适合所有需要跟“图”打交道的人:研发工程师要画架构图和时序图,产品经理要画流程图和状态图,技术写作者要画概念图和关系图,团队负责人要画组织图和演进路线图。哪怕你只是偶尔写写博客、做做分享,只要涉及“把复杂信息讲清楚”,diagram-design 的思维都能直接用上。它不挑工具,不挑领域,核心是一套可复用的设计原则和实操方法。
这篇文章我会从整体设计思路、核心细节解析、完整实操过程、常见问题排查四个大块展开,中间穿插我踩过的坑和总结出来的技巧。你不需要有设计背景,也不需要会什么专业绘图软件,只要跟着思路走,就能把 diagram-design 这套方法落到自己的项目里。
2. 内容整体设计与思路拆解
2.1 为什么“先想清楚再画”比“先画再改”效率高十倍
我见过太多人打开绘图工具就开始拖方块、拉箭头,画到一半发现逻辑不对,又回头删掉重来。这种“边画边想”的方式,在画简单图时还能应付,一旦涉及多层级的系统架构或者复杂业务流程,就会陷入反复返工的泥潭。diagram-design 的第一个核心思路就是:图是思考的产物,不是思考的替代品。在动手画之前,你必须先完成三件事:明确图的受众、明确图要回答的核心问题、明确信息的层级关系。
明确受众这件事,很多人会忽略。给老板看的图,重点在业务价值和整体结构,细节可以折叠;给开发看的图,重点在模块边界、数据流向和接口定义,业务背景可以简化;给运维看的图,重点在部署单元、网络分区和故障域,代码结构反而不重要。同一套系统,面向不同受众,图的画法应该完全不同。我试过用一张“万能图”应付所有场景,结果就是谁都不满意——老板觉得太细,开发觉得太粗,运维觉得缺关键信息。后来我学乖了,一张图只服务一类受众,只回答一类问题,反而效率更高,沟通也更顺畅。
明确核心问题,指的是这张图到底要说明什么。是说明“系统由哪些部分组成”,还是说明“一次请求经过了哪些环节”,还是说明“数据在不同存储之间怎么流转”?这三个问题的答案,对应的是三种完全不同的图:结构图、时序图、数据流图。很多人画图时把这三者混在一起,结果就是一张图里既有静态模块,又有动态调用,还有数据存储,信息密度过高,读者根本抓不住重点。diagram-design 的做法是:一张图只表达一个核心问题,其他信息要么省略,要么用注释补充。
明确层级关系,指的是信息应该分层呈现。第一层是概览,让读者三秒内知道这张图在讲什么;第二层是主体,展示核心模块和主要关系;第三层是细节,用局部放大或者附注的方式补充关键参数和边界条件。这种“总-分-细”的结构,跟写文章是一个道理。我习惯在画图前先用文字列出三层内容,确认逻辑通顺后再动手,这样画出来的图天然就有层次感,读者也能按自己的需要选择看哪一层。
2.2 工具选型:别被工具绑架,先看场景再看功能
说到绘图工具,市面上的选择太多了。有人喜欢用代码生成图,有人喜欢用拖拽式界面,有人干脆用表格和文本框手搓。我的观点很明确:工具没有优劣,只有适不适合当前场景。diagram-design 在工具选型上的原则是:优先选择“修改成本低”的工具,其次才是“画出来好看”的工具。
什么叫修改成本低?就是当系统演进、模块增减、关系变化时,你改一张图需要花多少时间。如果你用纯手工拖拽的工具,改一个模块位置可能导致十几条连线全部错位,调整一次至少半小时;如果你用代码描述图,改几行文本就能重新生成,可能只要两分钟。对于长期维护的设计文档,我强烈建议用“图即代码”的方式,把图的定义写成结构化文本,跟代码一起纳入版本管理。这样每次系统变更,图的更新就跟改代码一样自然,不会出现“文档落后于实现”的尴尬。
当然,如果是临时评审、快速沟通,拖拽式工具反而更快。我通常的做法是:探索阶段用拖拽工具快速出草图,确认思路后再用代码工具生成正式图。草图阶段追求的是速度,不用在意对齐和配色;正式图阶段追求的是准确和可维护,必须用结构化方式描述。这个“先草后正”的流程,帮我省下了大量返工时间。
还有一个容易被忽略的点:图的存储格式。很多人画完图导出成图片就完事了,结果后面想改的时候发现源文件找不到了,或者源文件跟导出图片不一致。我的经验是,永远保留可编辑的源文件,并且把源文件放在团队共享的位置,命名规则统一,比如“系统架构图-v2.3-20240115”。图片只是导出产物,源文件才是资产。这一点在团队协作中尤其重要,否则一个人离职,他画的图就彻底成了“黑盒”。
2.3 视觉语义化:颜色、形状、线条不是装饰,是语言
diagram-design 最核心的设计理念,是把视觉元素当成一种语言来用。颜色、形状、线条粗细、箭头样式,每一个选择都应该有明确的语义,而不是凭个人喜好随便选。我见过很多图,颜色五花八门,红的蓝的绿的黄的都有,但问作者“红色代表什么”,他自己也说不清楚。这种图看起来热闹,实际上增加了读者的认知负担。
我的做法是:在画图前先定义一套视觉规范,就像写代码前先定义命名规范一样。比如:蓝色代表核心服务,灰色代表外部依赖,绿色代表数据存储,橙色代表异步任务;实线代表同步调用,虚线代表异步消息,粗线代表主流程,细线代表辅助流程。这套规范一旦定下来,所有图都遵循,读者看第一张图时可能需要适应,看第二张图时就能快速理解,看第三张图时已经形成条件反射了。这就是视觉语义化的价值:降低重复学习的成本。
形状也有语义。矩形通常代表模块或服务,圆角矩形代表外部系统或用户,圆柱体代表数据库,菱形代表判断节点,平行四边形代表输入输出。这些约定俗成的形状,读者一看就能猜到大概含义,不需要额外解释。我有时候会看到有人用三角形代表服务、用五角星代表数据库,虽然作者自己觉得“很有创意”,但读者每次都要重新理解,沟通效率反而降低了。diagram-design 的原则是:在约定俗成的基础上做微调,而不是完全另起炉灶。
线条的语义同样重要。箭头方向代表数据流向或调用方向,这个大家都知道。但线条的粗细、虚实、颜色,很多人就随意了。我的经验是:主流程用粗实线,辅助流程用细实线,异步或可选流程用虚线,异常流程用红色虚线。这样读者一眼就能看出哪些是核心路径,哪些是边缘情况。还有一点:尽量减少线条交叉,如果两条线必须交叉,用“跳线”符号表示,避免读者误以为它们相连。这些细节看起来琐碎,但积累起来就是专业度的体现。
3. 核心细节解析与实操要点
3.1 结构图:怎么把系统拆得既清楚又不琐碎
结构图是 diagram-design 里最常用的图型,用来展示系统的静态组成。很多人画结构图时容易走两个极端:要么拆得太粗,一张图只有三四个大块,读者不知道里面具体有什么;要么拆得太细,一张图塞了三十个模块,读者看得眼花缭乱。我的经验是:结构图的粒度应该控制在“一个模块对应一个团队或一个独立部署单元”。如果一个模块由同一个团队维护、一起部署、一起发布,那它就应该是一个方块;如果两个模块虽然逻辑上相关,但由不同团队维护、独立部署,那就应该拆成两个方块。
拆分的依据不是代码目录结构,而是组织边界和部署边界。我见过有人严格按照代码包结构画架构图,结果一张图里出现了十几个“service”和“controller”,读者根本看不出系统实际是怎么运行的。正确的做法是:先问“这个系统上线时会有几个独立进程”,再问“每个进程由谁负责”,最后问“进程之间怎么通信”。这三个问题的答案,就是结构图的基本骨架。
结构图的分层也很关键。我通常把结构图分为三层:接入层、业务层、数据层。接入层负责协议转换和流量分发,业务层负责核心逻辑,数据层负责持久化。每一层内部再按模块拆分,层与层之间用箭头表示调用关系。这种分层方式的好处是,读者可以快速定位自己关心的部分:运维看接入层和数据层,开发看业务层,架构师看层间关系。如果系统比较复杂,还可以在每一层内部再分子层,但一般不超过三层,否则图会变得过于复杂。
还有一个实操要点:结构图里不要画调用时序。结构图是静态的,只展示“谁存在、谁依赖谁”,不展示“谁先调用谁、调用几次”。我见过有人在结构图里用数字标注调用顺序,结果图变得又乱又难维护。调用顺序应该放在时序图里表达,结构图只负责静态关系。这个边界一定要清晰,否则两种信息混在一起,读者理解成本会急剧上升。
3.2 时序图:怎么把一次请求讲得既完整又不啰嗦
时序图用来展示一次交互的完整过程,比如一次用户请求从发起到返回经过了哪些环节。时序图的核心是参与者和消息:参与者是交互的双方,消息是它们之间的通信。画时序图最容易犯的错误是“什么都画”,把日志、监控、缓存刷新、异步通知全部塞进去,结果一张图几十条消息,读者根本抓不住主流程。
我的做法是:先画主流程,再画异常流程,最后画辅助流程。主流程用一张图,只包含最核心的参与者,消息不超过十条;异常流程单独一张图,展示超时、重试、降级等分支;辅助流程再单独一张图,展示日志、监控、异步任务等。这样每张图都只回答一个问题,读者看起来轻松,维护起来也方便。我试过把主流程和异常流程画在一起,结果图变得又长又复杂,评审时大家都在问“这条线是什么情况”,反而耽误了时间。
时序图的另一个要点是消息的命名。很多人写消息时只写“调用接口”,不写具体是什么接口、传了什么参数、返回什么结果。这种消息等于没写。我的习惯是:消息名称用“动词+名词”的结构,比如“查询用户信息”“创建订单”“发送通知”,必要时在消息下方用小字标注关键参数和返回值。这样读者不用去翻代码,就能知道这次交互的具体内容。当然,参数不能写太多,只写最关键的,否则图会变得很臃肿。
还有一个细节:时序图的生命线。生命线代表参与者的存活时间,如果某个参与者在交互中途才被创建,生命线应该从创建点开始;如果某个参与者在交互中途被销毁,生命线应该在销毁点结束。这个细节很多人忽略,导致读者误以为所有参与者都是全程存在的。我见过一张图,数据库连接池在请求开始前就存在,但图中画成了请求时才创建,结果读者对连接池的生命周期产生了误解。这种细节虽然小,但在关键场景下可能导致严重的理解偏差。
3.3 流程图:怎么把分支和循环画得既严谨又不混乱
流程图用来展示业务逻辑或算法流程,核心是节点和连线。流程图最容易出现的问题是“面条图”:各种判断分支和循环交织在一起,线条交叉严重,读者根本跟不下来。我的经验是:流程图的主干应该是一条从上到下的直线,分支尽量向右展开,循环用回环箭头表示。如果分支太多,可以考虑拆成多个子流程图,用“子流程”节点引用。
判断节点的命名也很关键。很多人写判断条件时只写“是否满足条件”,不写具体是什么条件。这种判断节点等于没写。我的习惯是:判断条件用明确的布尔表达式或业务规则,比如“库存是否充足”“用户是否已登录”“金额是否超过阈值”。这样读者不用猜,就能知道分支的依据是什么。如果条件比较复杂,可以在判断节点旁边加注释,但注释不能太长,否则图会变得很臃肿。
流程图的另一个要点是异常分支的处理。很多人画流程图只画正常流程,异常情况要么省略,要么用一句“处理异常”带过。这种图在实际使用时价值很低,因为异常处理往往才是逻辑最复杂的部分。我的做法是:正常流程用主图,异常流程用子图,主图里用“异常处理”节点引用子图。这样既保证了主图的简洁,又不会遗漏异常逻辑。我试过把异常处理全部展开在主图里,结果图变得又大又乱,评审时大家都在问“这个异常分支什么时候触发”,反而忽略了主流程。
还有一点:流程图的起止节点要明确。开始节点和结束节点应该清晰标注,如果有多个结束节点,应该说明每个结束节点的含义。我见过一张图,有五个结束节点,但没有任何说明,读者不知道这五个结束有什么区别。后来我问作者,他说分别是“成功”“失败”“超时”“取消”“部分成功”,但这些信息在图里完全没有体现。这种图看起来完整,实际上信息缺失严重。
3.4 视觉规范:一套让团队协作效率翻倍的约定
前面提到了视觉语义化的重要性,这里展开讲讲怎么落地。diagram-design 的视觉规范应该包含以下几个部分:颜色规范、形状规范、线条规范、字体规范、布局规范。这套规范不需要很复杂,但必须团队统一,并且写进文档模板里。
颜色规范方面,我建议主色不超过五种,每种颜色对应一类语义。比如:蓝色代表核心业务,绿色代表数据存储,橙色代表外部依赖,灰色代表辅助模块,红色代表异常或警告。颜色不要用太鲜艳的,否则读者看久了会疲劳;也不要用太接近的,否则读者分不清。我试过用深蓝和浅蓝分别代表两种服务,结果打印出来根本分不清,后来改成了蓝色和绿色,问题就解决了。
形状规范方面,前面已经提到了一些约定俗成的形状。这里补充一点:同一个图里,相同语义的模块必须用相同形状。我见过一张图,有的服务用矩形,有的服务用圆角矩形,问作者为什么,他说“随手选的”。这种不一致会让读者产生困惑:这两个形状是不是代表不同的东西?如果代表相同的东西,为什么要用不同形状?diagram-design 的原则是:一致性优先于美观性,宁可所有模块都用矩形,也不要为了好看而混用形状。
线条规范方面,除了前面提到的粗细和虚实,还有一点:箭头的样式要统一。有的图里箭头是实心三角,有的是空心三角,有的是开口箭头,读者会误以为它们代表不同的关系。我的做法是:所有箭头统一用实心三角,如果需要区分关系类型,用线条颜色或虚实来区分,而不是用箭头样式。这样读者只需要关注一种视觉维度,认知负担更小。
字体规范方面,我建议:标题用粗体,正文用常规体,注释用斜体或小字号。字号不要太小,否则打印或投屏时看不清;也不要太大,否则图会显得很空。我通常用 14px 作为正文,12px 作为注释,18px 作为标题。这个尺寸在大多数场景下都够用。还有一点:中英文混排时注意字体兼容性,有些字体不支持中文,会导致显示异常。我一般用系统默认的无衬线字体,兼容性最好。
4. 实操过程与核心环节实现
4.1 从零开始画一张系统架构图:完整步骤拆解
假设你要为一个中等规模的 Web 系统画一张架构图,系统包含前端、网关、若干业务服务、数据库、缓存、消息队列。下面是完整的实操步骤。
第一步,明确受众和核心问题。这张图是给开发团队看的,核心问题是“系统由哪些部分组成,它们之间怎么调用”。受众决定了细节程度:开发需要知道每个服务的职责和接口,但不需要知道具体的部署参数。
第二步,列出所有模块。在白板或纸上先列出所有模块:前端应用、API 网关、用户服务、订单服务、支付服务、商品服务、MySQL 数据库、Redis 缓存、消息队列。这一步不要考虑布局,先把模块列全。
第三步,确定分层。把模块按接入层、业务层、数据层分组。接入层:前端应用、API 网关;业务层:用户服务、订单服务、支付服务、商品服务;数据层:MySQL、Redis、消息队列。
第四步,确定模块间关系。前端调用网关,网关调用各业务服务,业务服务读写数据库和缓存,业务服务之间通过消息队列异步通信。把这些关系用箭头表示出来,注意区分同步调用和异步消息。
第五步,选择工具并绘制。如果用代码工具,可以用类似 Graphviz 或 PlantUML 的语法描述;如果用拖拽工具,按分层布局,接入层在上,业务层在中,数据层在下。注意对齐和间距,模块之间留出足够空间,避免线条交叉。
第六步,添加视觉语义。按前面定义的规范,给不同层的模块上色,给不同类型的连线设置样式。同步调用用实线箭头,异步消息用虚线箭头,数据读写用带圆柱体的连线。
第七步,审查和优化。画完后自己先看一遍,问三个问题:三秒内能不能看出系统的大致结构?主流程能不能一眼跟下来?有没有多余的线条或模块?如果答案是否定的,就继续调整。
第八步,导出和归档。导出成 PNG 或 SVG 格式,源文件保留可编辑版本,命名规范统一,放到团队共享位置。如果系统后续有变更,记得同步更新源文件和导出图。
4.2 参数计算:图的大小、间距、字号怎么定
很多人画图时凭感觉设置画布大小和模块间距,结果图要么太挤,要么太空。diagram-design 建议用一套简单的计算方法来确定这些参数。
画布宽度方面,如果模块数量在 10 个以内,画布宽度设为 1200px 左右比较合适;如果模块数量在 10 到 20 个之间,宽度设为 1600px;超过 20 个,建议拆图,而不是继续加宽。画布高度根据层数来定,每层高度约 200px,三层就是 600px,加上标题和边距,总高度约 800px。
模块间距方面,同一层内模块之间的水平间距建议为 80px 到 120px,层与层之间的垂直间距建议为 150px 到 200px。这个间距既能保证线条不拥挤,又不会让图显得太散。我试过用 50px 的间距,结果线条交叉严重;也试过用 200px 的间距,结果图看起来空荡荡的。后来固定在 100px 和 180px,效果比较稳定。
字号方面,模块名称用 14px 到 16px,模块内的说明文字用 12px,连线标签用 12px,标题用 18px 到 20px。这个字号在 100% 缩放时清晰可读,在 75% 缩放时也能勉强看清。如果图要投屏,建议整体放大 1.5 倍,或者直接用矢量格式,投屏时无损缩放。
线条粗细方面,主流程用 2px,辅助流程用 1px,边框用 1px。箭头大小与线条粗细匹配,2px 线条配 10px 箭头,1px 线条配 8px 箭头。这些参数不是绝对的,但可以作为起点,根据实际效果微调。
4.3 实操现场:一次架构评审图的迭代记录
我最近参与了一个模拟项目的架构评审,需要画一张系统架构图。第一版我按常规分层画了,接入层、业务层、数据层各三个模块,总共九个模块。评审时,有同事提出“消息队列的位置不清楚”,因为我把消息队列放在了数据层,但它实际上也跟业务层有交互。第二版我把消息队列单独拿出来,放在业务层和数据层之间,用虚线连接业务服务和消息队列,表示异步通信。评审时又有同事提出“缓存和数据库的关系不清楚”,因为有些服务直接读缓存,有些服务先读数据库再写缓存。第三版我在缓存和数据库之间加了箭头,并标注了“缓存更新策略”,同时把直接读缓存的服务用不同颜色的连线标出来。第四版评审通过。
这次迭代让我意识到:架构图不是一次画完的,而是随着评审逐步完善的。每一轮评审都会暴露新的理解偏差,这些偏差正是图需要补充的信息。我的建议是:不要追求一次画到完美,先画一版能表达核心结构的图,然后在评审中逐步迭代。每次迭代只解决一个问题,不要一次性改太多,否则评审者很难判断改动是否合理。
还有一个实操心得:评审时让不同角色的人分别看图。开发关注模块职责和接口,运维关注部署单元和网络分区,测试关注异常流程和边界条件。如果一张图能让这三类人都找到自己关心的信息,说明图的层次设计是成功的。如果某一类人反复问“这个部分在哪里”,说明图的信息层级需要调整。
5. 常见问题与排查技巧实录
5.1 图太乱怎么办:从信息密度入手的排查思路
图太乱是最常见的问题,表现为线条交叉严重、模块拥挤、颜色杂乱。排查思路应该从信息密度入手,而不是从视觉调整入手。先问:这张图是不是塞了太多信息?如果是,拆图。拆图的原则是:一张图只回答一个问题,如果一张图试图回答三个问题,就拆成三张图。
拆图之后,如果单张图还是乱,再检查模块数量。模块超过 15 个,考虑合并同类项;模块少于 5 个,考虑是否需要拆得更细。然后检查线条数量,线条超过 20 条,考虑用“总线”或“分组”的方式简化。最后检查颜色数量,颜色超过 5 种,考虑合并语义相近的颜色。
我试过一张图有 30 个模块和 50 条连线,怎么调都乱。后来拆成三张图:一张总览图,只画大模块和主流程;一张业务层详图,画业务模块和它们之间的关系;一张数据层详图,画数据存储和读写关系。拆完之后每张图都很清晰,评审效率也提高了。
5.2 读者看不懂怎么办:从受众视角做验证
读者看不懂,通常不是图的问题,而是图与读者之间的“信息差”问题。排查方法是:找一个没参与画图的同事,让他看图并复述图的内容。如果他复述的内容跟你的设计意图一致,说明图是清楚的;如果不一致,问他哪里看不懂,那个地方就是需要改进的。
常见的“看不懂”原因有:模块命名太抽象,比如“服务 A”“模块 B”,读者不知道它们是干什么的;连线没有标签,读者不知道这条线代表什么关系;颜色没有图例,读者不知道红色代表什么;层级不清晰,读者不知道从哪里开始看。针对这些问题,分别补充业务命名、连线标签、颜色图例、层级编号,通常就能解决。
我还有一个习惯:在图的角落加一个“阅读指引”,用一两句话说明这张图的阅读顺序和重点。比如“从左到右依次为接入层、业务层、数据层,重点关注业务层中订单服务和支付服务的交互”。这个指引看起来简单,但能帮读者快速建立心理模型,减少理解成本。
5.3 图维护成本高怎么办:用“图即代码”降低更新成本
图维护成本高,通常是因为用了纯手工拖拽的工具,改一个地方要动全身。解决方法是转向“图即代码”的方式,用结构化文本描述图,用工具自动生成图片。这样修改时只需要改文本,重新生成即可,不需要手动调整布局。
常用的“图即代码”工具有多种选择,核心思路都是用文本描述节点和关系,工具自动布局。比如描述一个节点可以用“节点名称 [形状=矩形, 颜色=蓝色]”,描述一条连线可以用“节点 A -> 节点 B [标签=调用]”。这种描述方式跟写代码很像,容易纳入版本管理,也容易做代码审查。
我试过把一张手工维护的架构图改成代码描述,原来改一次要半小时,现在改一次只要五分钟。而且代码描述可以跟代码一起提交,每次代码变更时顺便更新图,不会出现“文档落后于实现”的问题。这个转变的初期成本是学习语法,但长期收益非常大,尤其是对于频繁迭代的系统。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决建议 |
|---|---|---|---|
| 图太乱,线条交叉严重 | 信息密度过高 | 数模块数量和连线数量 | 拆图,一张图只回答一个问题 |
| 读者看不懂模块含义 | 命名太抽象 | 让未参与画图的人复述 | 用业务命名,加图例和阅读指引 |
| 颜色杂乱,语义不清 | 颜色规范缺失 | 问作者每种颜色的含义 | 定义不超过五种颜色,写进规范 |
| 图更新成本高 | 工具选择不当 | 评估改一次图需要多久 | 转向“图即代码”,纳入版本管理 |
| 评审时反复被问同一问题 | 信息层级不清晰 | 记录被问最多的问题 | 调整层级,补充缺失的图例或注释 |
| 打印或投屏看不清 | 字号或对比度不足 | 按实际输出尺寸检查 | 放大字号,提高对比度,用矢量格式 |
| 模块关系不明确 | 连线缺少标签 | 检查每条连线是否有说明 | 给连线加标签,区分同步和异步 |
| 异常流程被忽略 | 只画了正常流程 | 问“如果失败会怎样” | 单独画异常流程图,或用子图引用 |
5.5 独家避坑技巧:我踩过的那些坑
第一个坑:过早追求美观。我早期画图时喜欢花大量时间调整对齐、配色、阴影,结果图是好看了,但逻辑没理清楚,评审时被问得哑口无言。后来我学乖了,先用最简陋的方式把逻辑画出来,确认逻辑没问题后再美化。逻辑是骨架,美观是皮肤,骨架不对,皮肤再好看也没用。
第二个坑:忽略图的版本管理。我试过一张图改了十几版,但没有版本记录,结果想回退到某一版时发现找不到了。后来我养成了习惯:每次大改前先保存一个版本,命名带日期和版本号,重要版本加备注说明改了什么。这样即使改错了,也能快速回退。
第三个坑:用图代替文档。我曾经觉得一张图能说明一切,结果图里省略了很多边界条件和异常情况,开发实现时反复来问。后来我明白了:图是索引,文档是正文。图负责让读者快速建立整体认知,文档负责补充细节和边界。两者配合使用,效果最好。
第四个坑:不考虑输出场景。我试过在电脑上画了一张很宽的图,结果投屏时两边被裁掉了,关键信息看不到。后来我养成了习惯:画图时先想清楚这张图会在什么场景下使用,是电脑上看、打印出来看、还是投屏看。不同场景对画布比例、字号、颜色的要求不同,提前考虑能避免很多返工。
第五个坑:一个人闷头画。我早期画图喜欢自己闷头画完再给别人看,结果经常出现“我理解的”和“别人理解的”不一致。后来我改成边画边沟通,画完草图就先找一两个同事看一眼,确认方向没问题再细化。这样虽然前期多花了几分钟,但后期省下了大量返工时间。
6. 从单张图到图体系:diagram-design 的进阶思路
6.1 图与图之间怎么关联:建立图体系而不是画孤图
当你画的图越来越多,就会发现一个问题:每张图单独看都清楚,但图与图之间的关系不清楚。比如架构图里有一个“订单服务”,时序图里也有一个“订单服务”,但它们之间的对应关系没有体现。读者看完架构图再看时序图,需要自己在大脑里做映射,这个映射过程容易出错。
diagram-design 的进阶思路是:建立图体系,而不是画孤图。图体系的核心是“统一的命名”和“统一的视觉规范”。所有图中出现的同一个模块,必须用同一个名称、同一个颜色、同一个形状。这样读者在不同图之间切换时,不需要重新学习,直接就能对应上。
更进一步,可以在图与图之间建立引用关系。比如架构图里的“订单服务”模块,可以标注“详见时序图-创建订单流程”;时序图里的“订单服务”,可以标注“详见架构图-业务层”。这种交叉引用能让读者在图体系里自由导航,而不是孤立地看某一张图。
我试过为一个模拟项目建立图体系,包含一张总览架构图、三张业务时序图、两张数据流图、一张部署图。所有图共用一套命名和视觉规范,图与图之间用编号引用。结果新同事入职时,按图体系的顺序看一遍,半天就能理解系统的大致结构,比看纯文字文档快得多。
6.2 图体系怎么维护:跟代码一样做版本管理
图体系建立起来后,维护就成了关键问题。我的做法是:把图体系当成代码来管理。所有图的源文件放在一个目录里,用版本控制工具管理,每次修改都有记录。图的命名规则统一,比如“架构图-总览-v2.3”“时序图-创建订单-v1.5”。图的更新跟代码更新绑定,每次代码合并时检查相关图是否需要更新。
具体操作上,我建议:在代码仓库里建一个“docs/diagrams”目录,存放所有图的源文件;在合并请求的模板里加一条检查项“相关图是否已更新”;定期(比如每月)审查一次图体系,清理过时的图,合并重复的图,补充缺失的图。这样图体系就能跟系统保持同步,不会变成“历史遗迹”。
还有一个技巧:给每张图加一个“最后更新时间”和“负责人”。这样读者知道这张图是不是最新的,有问题时也知道找谁。我见过很多图没有这些信息,读者不知道图是不是过时了,也不敢用,最后图就变成了摆设。
6.3 团队协作:怎么让所有人都按规范画图
团队协作中最大的挑战是:每个人都有自己的画图习惯,怎么让所有人都按统一规范来?我的经验是:规范要简单,工具要顺手,审查要严格。规范太复杂,大家记不住;工具不顺手,大家不愿意用;审查不严格,规范就形同虚设。
规范方面,我建议只定义最核心的几条:颜色语义、形状语义、命名规则、连线样式。其他细节可以灵活。工具方面,选择团队大多数人觉得顺手的工具,如果可能,用“图即代码”的方式,把规范写进模板里,大家照着模板改就行。审查方面,在代码评审或文档评审时,把图的质量也纳入评审范围,发现不符合规范的图就提出来,慢慢就形成习惯了。
我试过在团队里推行一套视觉规范,初期大家觉得麻烦,但坚持一个月后,大家都感受到了好处:看图时不需要反复问“这个颜色是什么意思”,评审效率明显提高。后来新同事入职时,看到大家都按规范画图,自然就跟着学了。规范的推行,关键在坚持,而不是在完美。
6.4 工具链整合:让画图成为开发流程的一部分
最后聊聊工具链整合。diagram-design 的终极目标是:让画图成为开发流程的自然组成部分,而不是额外的负担。具体来说,就是把图的生成和更新嵌入到现有的开发流程里。
比如:用代码描述图,图的源文件跟代码放在同一个仓库;在持续集成流程里加一步,自动从源文件生成图片并发布到文档站点;在代码评审时,如果代码变更影响了系统结构,自动提醒更新相关图。这样画图就不再是“额外的工作”,而是开发流程的一部分,大家做起来也更自然。
我试过在一个模拟项目里做这种整合:用文本描述图,提交代码时自动生成图片,合并请求里自动展示图的变化。结果大家发现,更新图只需要改几行文本,比手工拖拽快多了,而且不会忘记更新。这个流程跑顺之后,图体系的维护成本大幅降低,图的质量也明显提高。
说到底,diagram-design 不只是一套画图技巧,更是一种信息表达的思维方式。它要求你在画图前想清楚受众和问题,在画图中遵循统一的视觉语义,在画图后持续维护和迭代。这套方法我用了很多年,踩过不少坑,也总结了不少经验。希望这些内容能帮你少走弯路,把 diagram-design 真正用到自己的项目里。