资讯详情

资讯详情

diagram-design:从图形类型选择到系统化设计的完整指南

1. 从“diagram-design”这个标题能读出什么第一次看到“diagram-design”这个标题我的直觉是这不是一个单纯的绘图工具也不是一个纯粹的UI组件库它更像是一套关于“如何把复杂信息用图形讲清楚”的方法论集合。项目正文和关键词都是空的这反而给了我更大的拆解空间——因为一个只有标题的项目往往意味着它要么是一个正在酝酿中的概念要么是一个已经被反复讨论但缺少系统梳理的领域。“diagram”这个词在技术圈里出现的频率极高但大多数人把它等同于“画流程图”。实际上diagram的覆盖面远比流程图宽泛架构图、时序图、状态机图、ER图、思维导图、甘特图、网络拓扑图、数据流图甚至包括手绘风格的草图都属于diagram的范畴。而“design”这个词放在后面说明重点不在“画”这个动作上而在“设计”这个决策上——也就是说它关心的不是你怎么拖拽图形而是你为什么这样组织信息、为什么选择这种图形类型、为什么用这个布局而不是那个布局。我之所以对这个标题感兴趣是因为在实际工作中见过太多“图画得很漂亮但没人看得懂”的案例。一个架构图里塞了三十个方框和五十条连线颜色五花八门箭头方向混乱最后连作者自己过两个月都看不懂。这不是工具的问题而是设计思维缺位的问题。diagram-design这个标题指向的正是这块被大多数人忽略的能力把图形当作一种信息压缩和传递的媒介来设计而不是当作装饰品来堆砌。这篇文章适合谁看如果你是一名开发者需要画架构图、时序图来跟团队对齐方案如果你是一名产品经理需要用流程图、状态图来梳理业务逻辑如果你是一名技术写作者需要用图表来辅助文档表达甚至如果你只是一名需要做汇报的职场人需要用图表来呈现数据关系——那么这篇内容都值得你花时间读完。我会从图形类型的选择逻辑、布局的底层原则、工具链的取舍、以及实际项目中容易踩的坑这几个维度把diagram-design这件事拆开来讲。2. 图形类型的选择为什么你总是选错图2.1 图形类型与信息结构的对应关系大多数人选图形类型的方式是“我会画什么就画什么”而不是“信息适合什么就画什么”。这是一个根本性的错误。每种图形类型都有它擅长表达的信息结构选错了类型信息就会变形读者理解的成本会成倍增加。我习惯把常见图形类型按“信息结构”来分类而不是按“视觉形态”来分类。下面这张表是我自己在实际工作中反复使用的对照表信息结构推荐图形类型典型场景常见误用线性步骤与分支流程图审批流程、算法逻辑用架构图表达流程对象之间的交互时序时序图接口调用、消息传递用流程图表达异步交互状态与迁移条件状态机图订单状态、连接状态用流程图表达状态循环实体与关系ER图数据库设计、领域模型用类图表达数据关系层级与从属树形图、思维导图组织架构、分类体系用网络图表达层级并行与依赖甘特图、依赖图项目排期、构建依赖用流程图表达时间跨度数据流向与处理数据流图管道处理、ETL流程用架构图表达数据变换网络与拓扑拓扑图服务部署、网络结构用层级图表达网状关系这张表的核心逻辑是先识别信息的结构特征再选择对应的图形类型。比如当你需要表达“用户下单后系统先扣库存扣库存失败则回滚成功则进入支付”这样的逻辑时信息结构是“线性步骤条件分支”流程图是正确选择。但如果你要表达“订单服务调用库存服务库存服务返回结果后订单服务再调用支付服务”信息结构是“对象之间的交互时序”时序图才是正确选择。我见过一个典型的误用案例某团队用架构图来表达一个异步消息处理流程结果图上画了十几个服务方框和箭头但完全看不出消息的先后顺序和并发关系。后来改成时序图同样的信息量读者理解时间从十分钟降到了两分钟。这就是图形类型选择的价值。2.2 一个反直觉的建议先写文字再画图我自己的习惯是在打开任何绘图工具之前先用纯文字把要表达的内容写一遍。这个习惯看起来多余但实际上极其有效。因为文字是线性的它会强迫你把逻辑顺序理清楚。如果你用文字都写不清楚用图形只会更混乱。具体做法是用“首先、然后、接着、如果、否则、同时、最后”这些连接词把信息写成一段话或一个列表。写完之后你再回头看这段话的结构特征——它是线性的还是网状的是有明确时序的还是并行的是有层级关系的还是平级的根据这些特征去对照上面的表格图形类型自然就出来了。这个方法还有一个好处当你把文字写完之后你会发现有些信息其实不需要画进图里。图形不是越全越好而是越精准越好。文字阶段帮你做了一次信息筛选画图阶段就只需要关注那些真正需要可视化表达的部分。2.3 混合图形类型的处理原则实际项目中信息结构往往不是单一的。一个系统设计文档里可能既有架构层级关系又有服务间的调用时序还有数据的状态迁移。这时候有两种处理方式一种是拆成多张图每张图只表达一种信息结构另一种是在一张图里用视觉分区来区分不同的信息结构。我个人的原则是如果信息量不大且不同结构之间有明确的边界可以用一张图加视觉分区的方式。比如上半部分画架构层级下半部分画时序中间用一条明显的分隔线隔开。但如果信息量较大或者不同结构之间交织在一起就果断拆成多张图。一张图只讲一件事这是diagram-design里最重要的纪律之一。拆图的时候要注意图与图之间的引用关系。比如架构图里的某个服务在时序图里再次出现时命名和视觉样式要保持一致。这样读者在不同图之间切换时认知负担会小很多。3. 布局的底层原则为什么你的图看起来“乱”3.1 视觉动线与阅读顺序的设计一张图看起来乱十有八九是因为视觉动线没有设计好。视觉动线就是读者的眼睛在图上移动的路径。好的图读者的眼睛会自然地沿着一条清晰的路径移动不需要来回跳跃差的图读者的眼睛会在图上乱撞找不到起点和终点。设计视觉动线的基本原则是让信息的逻辑顺序和视觉的阅读顺序保持一致。大多数人的阅读习惯是从左到右、从上到下所以图的布局也应该遵循这个方向。流程图的步骤从左到右排列时序图的对象从上到下排列层级图的根节点在上方、子节点在下方——这些都是符合阅读习惯的布局。但这里有一个常见的误区很多人为了“节省空间”把图排成正方形甚至竖长条形导致视觉动线变成“Z字形”或“螺旋形”。这种布局在信息量小的时候还能接受一旦信息量增大读者就会迷失方向。我的建议是宁可让图变长也不要让视觉动线变复杂。一张横向很长的流程图比一张挤成方块的流程图要好读得多。还有一个细节箭头的方向要统一。如果一张图里既有从左到右的箭头又有从右到左的箭头还有从上到下的箭头读者的眼睛就会不断调整方向疲劳感会急剧上升。统一箭头方向本质上是在降低读者的认知负荷。3.2 分组与留白的节奏控制分组是diagram-design里最被低估的技巧。人脑处理信息时会自动把靠近的元素归为一组把远离的元素视为不同组。利用这个认知特性你可以通过调整元素之间的距离来暗示信息之间的亲疏关系。具体做法是把同一模块或同一层级的元素放得近一些把不同模块或不同层级的元素放得远一些。这个“近”和“远”的差距要足够明显否则读者感知不到。我通常会用至少两倍于元素间距的空白来分隔不同的组。留白同样重要。很多人画图时恨不得把每一寸空间都填满结果图看起来密不透风读者连呼吸的空间都没有。留白不是浪费而是给读者的大脑留出处理信息的时间。一张图里元素之间的间距、组与组之间的间距、图与边框之间的间距都应该有意识地控制。我自己的经验法则是元素之间的最小间距不小于元素本身宽度的四分之一组与组之间的间距不小于元素本身宽度的二分之一。这个比例不是绝对的但可以作为起点来调整。3.3 颜色与样式的克制使用颜色是diagram-design里最容易滥用的元素。我见过太多图用了七八种颜色每种颜色代表什么却没有说明最后读者只能靠猜。颜色应该用来编码信息而不是用来装饰。我的原则是一张图里的颜色不超过四种不包括黑白灰。每种颜色都要有明确的语义比如蓝色代表前端、绿色代表后端、橙色代表外部依赖、红色代表异常路径。而且这个语义要在图例里写清楚不能默认读者能猜到。样式的使用也是同样的逻辑。实线、虚线、粗线、细线每一种样式都应该有明确的含义。比如实线代表同步调用、虚线代表异步消息、粗线代表主流程、细线代表异常流程。如果一张图里出现了三种以上的线型而你没有图例说明那这些线型就是在制造混乱。还有一个容易被忽略的细节字体的统一。同一张图里标题、标签、注释的字体大小和字重应该有明确的层级关系。标题最大最粗标签次之注释最小最细。如果所有文字都一样大读者就分不清主次。4. 工具链的取舍从手绘到代码化4.1 手绘、拖拽式工具与代码化工具的分界diagram-design的工具选择本质上是在“表达速度”和“维护成本”之间做权衡。我把它分成三类第一类是手绘包括纸笔和白板。手绘的优势是速度极快想到什么画什么没有任何工具学习成本。劣势是无法版本管理修改困难而且不适合正式文档。手绘最适合的场景是头脑风暴和早期讨论这个阶段重要的是快速捕捉想法而不是追求美观。第二类是拖拽式工具比如各种在线绘图平台。这类工具的优势是上手快视觉效果可控适合制作正式文档中的插图。劣势是修改成本高尤其是当图的结构发生较大变化时你需要手动调整大量元素的位置。而且拖拽式工具产出的图很难做版本对比每次修改都是覆盖式的。第三类是代码化工具比如用文本描述来生成图形的方案。这类工具的优势是版本管理友好修改成本低适合需要频繁迭代的图。劣势是学习曲线较陡而且对布局的控制不如拖拽式工具直观。代码化工具最适合的场景是架构图、时序图这类结构相对固定、但需要频繁更新的图。我的建议是不要试图用一种工具解决所有问题。头脑风暴用手绘正式文档插图用拖拽式工具需要频繁迭代的架构图用时序图用代码化工具。根据场景切换工具而不是强迫自己只用一种。4.2 代码化绘图的实际操作细节代码化绘图的核心思路是你用文本描述图的结构和关系工具负责计算布局和渲染。这种方式的好处是你只需要关注“画什么”不需要关注“怎么摆”。布局的事情交给工具你只需要把逻辑关系写清楚。以时序图为例代码化描述通常包含几个部分参与者声明、消息传递、条件分支、循环、注释。你按照顺序把这些写出来工具会自动生成标准的时序图。修改的时候你只需要改文本布局会自动重新计算。这里有一个实操细节代码化工具的布局算法虽然自动化但并不是万能的。当图的结构比较复杂时自动布局可能会产生交叉线或者不合理的间距。这时候你需要通过调整元素的声明顺序、添加分组标记、或者手动指定某些布局参数来干预。我的经验是先让工具自动布局然后针对不理想的地方做局部调整而不是一开始就试图手动控制所有细节。另一个细节是代码化绘图的文本描述本身也需要版本管理。我习惯把图的描述文本和代码放在同一个仓库里这样代码变更时相关的图也能同步更新。而且通过版本对比你能清楚地看到图的结构在不同版本之间发生了什么变化。4.3 工具选型的决策清单在实际项目中选工具时我会问自己几个问题这张图需要频繁更新吗如果答案是“是”优先考虑代码化工具。这张图需要嵌入到文档里吗如果答案是“是”优先考虑能导出矢量格式的工具。这张图需要多人协作编辑吗如果答案是“是”优先考虑支持实时协作的在线工具。这张图的受众是谁如果是给非技术人员看优先考虑视觉效果更友好的拖拽式工具。这张图的生命周期有多长如果是一次性的讨论稿手绘就够了。这些问题没有标准答案但问一遍之后工具的选择范围会大大缩小。5. 实际项目中容易踩的坑5.1 信息过载一张图想讲太多事这是最常见的坑没有之一。一张图里塞了太多信息读者第一眼看到就放弃了。我见过一张“系统架构图”上面画了四十多个方框、六十多条连线还有各种颜色和图标最后连作者自己都说不清楚每个元素是干什么的。解决这个问题的办法只有一个拆图。一张图只讲一件事。如果你觉得拆完之后图太多了那说明你的信息本身就需要分层表达。可以先画一张总览图只展示最顶层的模块和关系然后每个模块再单独画一张详细图。总览图的作用是给读者一个全局视角详细图的作用是深入具体细节。读者可以先看总览图建立框架再按需查看详细图。拆图的时候要注意保持命名和视觉样式的一致性。总览图里的“订单服务”在详细图里也应该叫“订单服务”用同样的颜色和图标。这样读者在不同图之间切换时不会产生认知断裂。5.2 语义不一致同样的样式表达不同的含义这个坑比较隐蔽但杀伤力很大。比如你在第一张图里用红色代表“异常路径”在第二张图里用红色代表“核心模块”在第三张图里用红色代表“外部依赖”。读者如果连续看这三张图就会对红色的含义产生混淆。解决这个问题的办法是建立一套视觉规范并在所有图中统一使用。这套规范不需要很复杂但需要明确每种颜色代表什么、每种线型代表什么、每种形状代表什么。规范一旦建立就要严格执行。如果某张图确实需要引入新的视觉元素要么在图中加图例说明要么调整规范并同步更新所有图。我自己的做法是在项目开始时就定义一套简单的视觉规范写在文档的附录里。每次画新图时先对照规范检查一遍。这个习惯看起来麻烦但长期来看节省了大量沟通成本。5.3 忽略读者背景用作者的语言而不是读者的语言这个坑的本质是“知识的诅咒”——你对自己画的图太熟悉了以至于忘记了读者是第一次看。你用的缩写、你省略的步骤、你默认的上下文读者可能完全不知道。解决这个问题的办法是在画完图之后找一个不了解这个项目的人来看一遍让他说出他理解的内容。如果他理解的和你想表达的不一致那就说明图里有信息缺失或者表达歧义。这个“小白测试”非常有效我几乎每次画完重要的图都会做一遍。另一个办法是在图的旁边加一段简短的文字说明解释这张图要表达的核心信息是什么、读者应该按什么顺序看、有哪些需要特别注意的地方。这段文字不需要很长但能大大降低读者的理解门槛。5.4 过度追求美观而牺牲可读性这个坑在设计师背景的人身上比较常见。他们倾向于把图做得非常精致用了大量的渐变、阴影、圆角、图标结果图看起来很漂亮但信息传达效率反而下降了。因为那些装饰性的元素会分散读者的注意力让读者花更多时间在“看”上而不是在“理解”上。我的原则是美观服务于可读性而不是反过来。一张好的diagram应该是读者第一眼看到的是信息结构而不是视觉装饰。颜色、线条、形状的使用都应该以“帮助读者理解信息”为目的而不是以“让图看起来好看”为目的。当然这不是说图就应该丑。整洁、对齐、间距合理、字体统一这些基本的美观要求还是要满足的。但在此之上不要再加多余的装饰。克制是diagram-design里最重要的美学原则。6. 从一张图到一套图系统化设计的思路6.1 建立图的层级体系单个图设计得再好如果一套图之间没有关系读者还是会在图与图之间迷失。系统化设计的第一步是建立图的层级体系。我通常会把一套图分成三个层级总览层、模块层、细节层。总览层只有一张图展示系统的顶层结构和主要模块之间的关系。模块层有若干张图每张图对应总览层里的一个模块展示该模块内部的子模块和关系。细节层有若干张图每张图对应模块层里的一个关键流程或关键对象展示具体的交互细节或状态迁移。这个三层结构的好处是读者可以根据自己的需要选择查看的深度。只想了解全局的人看总览层就够了需要深入某个模块的人看模块层需要了解具体实现细节的人看细节层。每一层都有明确的入口和出口读者不会迷路。6.2 命名与编号的一致性一套图里的命名和编号必须保持一致。总览图里的“模块A”在模块层里应该对应一张标题为“模块A”的图在细节层里如果涉及到模块A的内容也应该用“模块A”这个名称。编号也是同样的逻辑如果总览图里给模块编了号后续所有图都应该沿用这个编号。这个要求看起来很简单但在实际项目中经常被忽略。原因往往是图是由不同的人在不同时间画的没有统一的命名规范。解决这个问题的办法是在项目开始时就定义好命名规范并且指定一个人负责维护这套规范。每次新增图时都要检查命名是否符合规范。6.3 图与文档的配合图不是孤立存在的它通常嵌入在文档里和文字配合使用。图与文档的配合有两个原则第一图应该放在相关文字附近而不是全部堆在文档末尾第二图应该和文字有明确的引用关系比如文字里写“如图3所示”图3的标题就应该明确写“图3XXX”。还有一个细节图的尺寸要适配文档的排版。如果图太宽在文档里会被缩小导致文字看不清如果图太高会占用太多页面空间。我的做法是在导出图之前先确认文档的排版宽度然后按照这个宽度来调整图的尺寸和比例。6.4 图的维护与更新图是需要维护的。代码变了图也要跟着变。如果图长期不更新它就会从“帮助理解的工具”变成“误导理解的障碍”。维护图的关键是降低更新成本。这就是为什么我推荐代码化工具的原因——修改文本比修改图形元素要快得多。另外我习惯在图的描述文本里加注释说明这张图对应的代码模块或文档章节。这样当代码或文档变更时我能快速定位到需要更新的图。还有一个习惯每次更新图时在图的标题或注释里加上更新日期和更新人。这样读者能知道这张图是什么时候更新的是否还反映当前的状态。7. 我个人的几条实操心得第一条心得画图之前先问自己“这张图要回答什么问题”。如果回答不了这个问题说明你还没想清楚要画什么。一张图只回答一个问题这是最有效的防混乱策略。第二条心得不要追求一次画好。我画图的流程通常是先用手绘快速勾勒结构确认逻辑没问题之后再用工具正式画。手绘阶段可以随便涂改正式画的时候就已经胸有成竹了。第三条心得图的标题比图本身更重要。一个好的标题能让读者在打开图之前就知道这张图讲什么。我习惯用“XXX流程图”“XXX架构图”“XXX状态迁移图”这样的格式让读者一眼就知道图的类型和主题。第四条心得定期回顾和清理旧图。项目进行过程中会产生很多临时图这些图在讨论阶段有用但讨论结束后就应该清理掉否则会干扰读者。我通常会在项目里程碑节点做一次图的清理把过时的图归档或删除。第五条心得不要害怕重画。如果一张图改了三次还是觉得别扭那就果断重画。重画的成本远低于在一张别扭的图上反复修补的成本。而且重画的过程往往能让你发现之前没想清楚的地方。第六条心得多看图多模仿。我平时会收集一些画得好的图分析它们的布局、配色、分组方式。看得多了自己画的时候自然就有感觉了。这跟写代码要多读优秀开源项目是一个道理。第七条心得图是给人看的不是给机器看的。所有的设计决策都应该以“读者能否快速准确理解”为最终标准。如果一个设计决策让图看起来更“专业”但增加了理解成本那就应该放弃这个决策。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →