干了这么多年流程设计和代码评审,我发现自己最怕的从来不是把流程图画出来,而是把画好的流程图改掉。尤其是一个项目跑到中期,业务规则开始膨胀,产品今天说“采购审批要多加一个分支”,明天说“销售节点要提前”——你永远在拖节点、拉连线、重新对齐布局,每改一次,整个图的排版就崩一次。后来我接触到了Skill这个概念,准确说是AI编程工具里的那一套Skill机制(Claude Code Skill、Cursor Skill都算),猛然反应过来一件事:流程图的修改,其实应该回到文字里。这不是文艺说法,是真正的解法:把流程图当成一段有结构的文本,用文字描述去驱动AI重新生成图,而不是在画布上手工做几何变换。这篇文章我就把这个思路完整拆开讲,从“为什么会崩溃”到“Skill怎么写、怎么用”,一次性说透。
1. 为什么流程图会让你改到崩溃
1.1 流程图的"连锁爆炸"困境
先说一个我自己踩过无数次的坑。你画一张业务流程图的初版,可能只需要半下午。节点不多,主线清晰,画完还很整洁。但真实项目里的流程图,永远不会停留在初版。
举个例子,我接手过一个采购到销售的系统流程梳理。最初的结构很简单:采购申请 → 供应商确认 → 生成采购订单 → 入库 → 销售出库。五六个节点,一条直线下来,画完感觉神清气爽。
然后需求开始变化。采购要区分“普通采购”和“紧急采购”,于是第一个节点后分出一条分支。紧接着销售侧说,出库前要加一道“信用额度检查”,不通过要退回销售经理确认。再后来,财务要求在所有环节后记录“资金占用标记”。每一次改动,表面上只是“加一个节点”或“加一条连线”,实际上整张图的布局逻辑都被打乱了:分支位置不对、连线交叉、节点间距失衡、泳道错位。
我算过一笔账:一张包含30个节点的流程描述图,在传统图形化工具里做一次“插入分支型”修改,至少要移动或重连10到15个元素。“改图一小时,移动半小时”不是段子,是每一位流程设计者的日常。
传统流程图工具还有一个让人抓狂的隐藏问题:文本信息与图形元素脱节。你在Visio或Draw.io里画一个“审批节点”,节点的名称、描述、负责人、规则说明都散落在不同的属性面板里。别人拿到这张图,只能看到方块和箭头,看不到背后的逻辑判断依据。而当你需要把这些信息汇总给开发团队或评审会时,只能重新对着图一个个抄,低效且容易漏。
1.2 传统工具为什么越改越乱
刨根问底的话,“越改越乱”的根源可以归结为三个词:布局算法缺失、逻辑与视觉耦合、版本对比困难。
先看布局。大多数图形化工具并没有像Graphviz那样成熟的自动布局引擎,用户需要手工安排每个节点的坐标。你加了一个分支,就必须自己决定这个分支往哪儿画、怎么绕过已有节点。手一抖,全图就乱了。就算做对齐操作,也只能基于“视觉规整”而不是“语义层级”,改着改着,图的阅读顺序就和真实流程顺序脱节了。
再看逻辑与视觉耦合。图形化编辑的本质是“所见即所得”,但这也意味着,你的每一次逻辑调整,都必须同时完成视觉调整。你能优雅地描述“如果订单金额大于一万,则进入财务复核”,但你在画布上不光要写这句话,还要画出一个判断菱形、两条出口连线、两个子流程块。逻辑一句话,视觉三分钟,这种一倍的逻辑成本被放大了很多倍。
最后是版本对比。工程团队用Git管理代码天经地义,但流程图文件呢?Draw.io的XML文件倒是能进Git,可两个版本的diff基本不可读。你只知道“供应商确认”这个节点变了,至于它从普通方框变成了带超时处理的子流程,光靠肉眼diff,根本看不出来。代码里,一行文字变更可以精确定位;图里,一次逻辑变更淹没在几十个坐标改动里。
2. 把流程图"变成文字":从根源解决问题
2.1 文字描述流程图的底层思路
既然图形化的问题出在“视觉修改”和“逻辑修改”绑死在了一起,那解法就很清晰了:把逻辑从视觉里剥离出来,先用文字把流程定义清楚,再用程序把文字渲染成图。这个思路专业一点叫“文本化流程描述”,散步在Mermaid、PlantUML、Graphviz DSL这些工具里,也藏在BPMN 2.0 XML规范里。
用文字描述流程图,本质上是在做三件事:给每个节点一个可标记的身份,给每条连线一个明确的语义,给每个分支一个可计算的判断条件。举个例子,用Mermaid描述“判断一个数n能否同时被3和5整除”:
flowchart TD A([开始]) --> B[输入n] B --> C{n % 3 == 0?} C -- 否 --> F([输出:不能被3和5同时整除]) C -- 是 --> D{n % 5 == 0?} D -- 否 --> F D -- 是 --> E([输出:能被3和5同时整除]) E --> G([结束]) F --> G这段文字里,每个节点都有代号(A、B、C、D、E、F、G),每一条箭头都对应一个转移条件。改逻辑的时候,你只需要改箭头指向、改判断表达式,剩下的排版渲染全部交给工具去做。这就是“修改回到文字里”的真实含义:你改的是逻辑文本,而不是画布坐标。
同样的思路可以套用到算法流程图上。比如“依次输入10个数,输出其中最大数”这道经典题目,它的文本化形式是这样的:循环变量i从1到10,每次读入一个数x,与当前最大值max比较,如果x > max则更新max。如果你需要把它转换成N-S流程图,也完全用文字表达:初始化max为第一个数 → 循环九次比较 → 输出max。N-S图恰恰是为了消除传统流程图的“随意跳转”而生的,它的结构化特点,和文本化表达天然契合。
再比如“求两个数m和n的最大公约数”,用辗转相除法描述,文字三行就能写完:
输入 m, n 当 n ≠ 0 时:r = m mod n, m = n, n = r 输出 m这段文字怎么看都比一张后退箭头乱飞的图形更接近算法本质。BPMN流程设计里同样如此,采购、生产、销售的全链路流程,早就有BPMN 2.0的XML文本形式。网关(Gateway)在BPMN图上是菱形,但在XML里只是一个带type属性的节点。你改网关类型,从“排他网关”改成“并行网关”,在图形工具里要删掉旧连线重画,在XML/text里就是一个属性值的替换。
2.2 从算法题到业务系统:文本化表达的通用价值
有人可能会说,算法流程图结构简单,当然可以用文字描述,但真实业务系统里的流程图复杂得多,节点有角色、有超时、有回调,文字能表达吗?
答案是能,而且BPMN 2.0本身就是干这件事的。
拿采购到销售的全链路来说,传统画法是一张巨大的泳道图:采购员、供应商、仓库、生产计划、销售五个泳道,每个泳道里塞一堆节点。改一次流程,光是拖动泳道边界就能让人崩溃。换成文本化描述后,每个环节对应的“责任人”“触发条件”“后续动作”都变成了结构化字段。比如:
节点:采购订单审批 负责人:采购经理 条件:订单金额 > 50000 通过后:生成采购订单 → 同步生产计划 拒绝时:退回采购员修改这里没有坐标、没有连线,但流程的所有信息都在。渲染成图是几秒钟的事,更重要的是,它能直接进入代码评审环节:评审人员直接看这段文字,检查条件是否完备、流转逻辑是否有漏洞,比围着图猜语义高效得多。
还有一个很常见的痛点:代码评审流程图。传统方式是从代码里提取调用关系,然后手工排布成图。代码每次改动,图就得重新排一次。文本化之后,生成逻辑直接绑定到代码解析结果上——只要代码结构变了,重新跑一遍解析脚本,新的流程图文本自动生成,再渲染成图。整个过程的重点始终是代码本身,而不是图。
3. Skill是什么?它如何让修改回到文字里
3.1 Skill的本质:给AI一套可复用的流程设计规范
到这里,读者大概已经认同“文字描述流程图”的思路了。但光有Mermaid和BPMN还不够——你依然需要自己把复杂的业务逻辑翻译成规范的文本语法。这一步的熟练度门槛,把很多业务人员挡在了门外。而Skill的出现,恰恰解决了“翻译”的问题。
Skill这个词,近一年在AI编程工具里频繁出现。Claude Code有Skill,Cursor有Skill,OpenAI的Codex也有Skill机制。它本质上是一个“预定义的提示词包”:一堆规则文件 + 示例文件 + 指令文件,告诉AI在某些任务下应该如何思考、应该遵守什么格式、应该输出什么结构。
用一个生活类比:Skill就像你给实习生写的工作手册。你没时间每次都重新讲一遍“流程图的标准应该是什么样”,于是把手册丢给实习生,说“按这个来”。手册里写了节点怎么命名、分支怎么表示、特殊情况怎么处理、输出格式是什么。实习生看到手册,就能产出和你期望一致的结果。
关于Skill和Agent的区别,我见过不少困惑。其实可以这么理解:Agent是“自行决策要做什么、怎么做”的执行体,面向目标;Skill是“某个特定任务应该怎么做”的约束集合,面向规范。Skill不决定“要不要画流程图”,它决定“一旦开始画流程图,就应该用这套标准来画”。所以Skill和Agent是配合关系:Agent调度任务,Skill约束执行细节。
3.2 从"书到技能"到“仓颉Skill”:Skill机制的落地形态
顺着热搜词里“book to skill”“仓颉skill”这类概念走一圈,你会发现Skill的形态正在变得越来越丰富。 “book to skill”代表一种思路:把已有的文档、规范、“书”转化为AI可复用的技能规则,本质上是知识的结构化沉淀。“仓颉skill”则反映出把某种领域专用语言或符号体系封装成Skill的尝试——仓颉造字是“给事物命名”,Skill做的就是“给流程命名、给规则命名”。
放在流程图场景里,一个流程设计Skill应该包含哪些东西?我总结为四层:
第一层,语法规范层。定义用哪种文本格式描述流程(Mermaid、PlantUML、BPMN XML,还是自定义DSL)。如果有自定义DSL,需要给出完整的语法说明和关键词表。
第二层,结构模板层。针对常见流程类型给出可直接套用的模板。业务审批流程、算法流程、系统架构流程、N-S结构化流程,各有各的模板。
第三层,转换规则层。定义如何把一段口语化需求翻译成规范文本,以及如何把文本还原成可读的业务描述。这一步决定了“文字→图”和“图→文字”能否双向打通。
第四层,质量校验层。规定流程图的基本正确性标准:节点是否有唯一的ID、分支是否有明确的出口条件、循环是否有终止条件、是否存在不可达节点。AI在输出图之前,先用这套规则自检一遍。
这四层一旦封装成Skill,你的流程图修改就彻底摆脱了视觉排版噩梦。改流程时,只描述“把节点C和D之间的判断条件从A改成B”,AI根据Skill规则重新生成整段文本,再渲染成图。你从头到尾都没有碰过画布。
4. 实操:从零构建一个“流程设计Skill”
4.1 第一步:定义你的文本流程图语法
我建议先以一个简单但完整的语法起步,而不是一上来就上BPMN XML。参考Mermaid flowchart和PlantUML的语法,我常用的一种“轻量DSL”长这样:
节点定义:N1[描述文本], N2[描述文本] 连接关系:N1 -> N2 条件分支:N1 -> N2 {条件:金额>50000} 并行网关:N1 -> N2 & N3 循环结构:loop(次数或条件) { ... } 结束标记:END这套语法的设计原则有三个。一是“一行一个关系”,保证每条边都可追踪。二是“条件写在箭头旁”,保证分支语义和图形语义不分离。三是“层级用缩进表示”,对应子流程或泳道的嵌套关系。
你完全可以按自己的项目习惯扩展。比如增加泳道标识[部门:采购],增加节点类型标记(审批|执行|网关),增加异常出口标记(超时|拒绝)。语法不追求一次到位,先满足当前项目的表达需要,再逐步扩充。
4.2 第二步:编写Skill的规则文件
确定了语法,接着把它封装成Skill。以Claude Code的Skill目录结构为例,一个流程设计Skill的典型结构是:
flow-design-skill/ ├── SKILL.md ├── syntax.mdc ├── templates/ │ ├── approval-flow.md │ ├── algorithm-flow.md │ └── system-flow.md └── examples/ ├── purchase-to-sales.bpmn └── max-number.flow骨架里最关键的是SKILL.md,它负责告诉AI“什么时候该启用这个Skill、输出什么、注意什么”。一个示意版本的SKILL.md可以写成这样:
# 流程设计技能 在任何涉及绘制、修改或评审流程图的对话中启用本技能。 ## 输入约定 - 用户可能提供口语化流程描述、现有图的文本、BPMN XML或代码调用关系。 - 当用户说“画一下流程图”“加一个分支”“改成并行网关”时,按本规则执行。 ## 输出约定 - 默认输出轻量DSL文本,并在代码块后给出对应的Mermaid渲染代码。 - 禁止直接输出坐标或布局信息。 - 每个节点必须有唯一ID和明确的描述文本。 - 每个分支必须写明判断条件,禁止无条件的模糊箭头。 ## 流程 1. 解析用户的流程需求,提取节点、分支、循环、参与角色。 2. 选用合适的模板(审批流/算法流/系统流)。 3. 生成DSL文本,调用自检规则检查结构完整性。 4. 输出可渲染代码和一段“变更说明”,解释本次改了什么。SKILL.md越具体,AI的表现越稳定。你甚至可以加入一个“错误示例”区块,列几条AI常犯的错误写法,比如“分支条件写在节点内部”“节点ID重复”“输出纯图没有文本”。这比单纯说“注意质量”有效得多。
4.3 第三步:完整实操一个“修改需求”
理论说再多,不如直接跑一遍真实场景。我拿最初提到的“采购到销售”流程,演示一次用Skill完成修改的完整链路。
原始流程的DSL文本是:
S1[接收采购申请] -> A1[供应商确认] -> A2[生成采购订单] -> A3[入库] -> A4[销售出库] -> END现在业务方提出:采购申请需要区分普通采购和紧急采购,紧急采购要跳过供应商确认,直接进入生成采购订单;同时,销售出库前增加“信用额度检查”,检查不过则退回销售经理确认,确认后仍可出库。
在传统工具里,这又是一次“连线大挪移”。但使用Skill,我只需要以口语形式描述需求,AI会根据SKILL.md自动把新DSL文本生成出来:
S1[接收采购申请] S1 -> A0{是否紧急采购?} A0 -->|否| A1[供应商确认] A0 -->|是| A2[生成采购订单] A1 -> A2 A2 -> A3[入库] A3 -> A4{信用额度检查} A4 -->|通过| A5[销售出库] -> END A4 -->|不通过| A6[销售经理确认] A6 -> A5 A6 -->|确认失败| END(流程终止)这段文本的变化一目了然:新增了A0判断节点、A4判断节点、A6处理节点。用Mermaid渲染后,生成一张结构紧凑的新图,不需要手工拖拽任何东西。更重要的是,评审团队拿着这份DSL去和业务方确认时,双方讨论的是“判断条件写得对不对”,而不是“这条线有没有跨过那个框”。
我再补充一个复用场景:算法流程图。用Skill处理“依次输入10个数输出最大数”的需求时,启用algorithm-flow模板,AI按模板输出:
INIT: max = 第一个输入数, i = 2 LOOP: i <= 10 READ: x IF: x > max THEN: max = x i = i + 1 END_LOOP OUTPUT: max渲染成传统流程图或N-S图都只需要一条渲染命令。代码结构和算法逻辑完全一致,评审者可以直接把这个文本和实际代码做逐行对照。
5. 常见问题与排查技巧实录
5.1 文字到底在什么时候会“卡脖子”
任何方案都有边界。我自己用了这套“文字化流程 + Skill”的组合一段时间后,遇到的第一个典型问题是:当流程图的复杂度超过某个阈值时,纯文本变得极难阅读。一张包含80个节点、十几条交叉分支的业务流程图,文字描述排出来可能有一千多行。人眼在纯文本里找一条跨泳道的连线的效率,未必比在图上找要高。
我的建议是,用文字驱动流程设计,但并不排斥出图。Skill的定位应该是“保证文字和图形随时可互相转换”,而不是“消灭图形”。复杂流程的评审阶段,还是要把DSL渲染成图来看;修改阶段,再回到文字操作。把两者当成同一份流程描述的两种视图,才是最佳状态。
第二个常见问题:AI生成的DSL里,分支条件偶尔会丢失。表现为图上两个节点之间有一条没有条件的箭头,但业务逻辑实际是有条件的。我排查后发现,问题往往出在用户描述需求时漏掉了条件信息。所以我在SKILL.md里加了一条强制规则:如果一条连线缺少明确条件,AI必须追问“这条连线是否有隐含条件”,宁可多问一次,不要输出残缺逻辑。
第三个问题来自团队协作:团队成员对DSL的熟练度不一致,有人会用,有人习惯拖图形。我的落地经验是,在项目初期安排一次30分钟的DSL语法培训,把“轻量DSL + Mermaid渲染”讲透。培训结束后,绝大多数成员能接受这种模式,因为修改效率的提升是即时可见的。真正坚持“必须用鼠标画图”的成员极少,他们担心的只是“文字描述是否准确”,而准确性问题恰恰是Skill的校验规则可以兜底的。
5.2 问题速查表与避坑心得
| 常见现象 | 排查方向 | 推荐解法 |
|---|---|---|
| DSL能渲染,但图的分支顺序不对 | 检查生成规则是否按“先发现则”排序分支 | 在SKILL.md里规定:左侧分支先列,条件书写统一“满足条件→出口” |
| 节点编号混乱,评审对不上号 | 检查ID分配规则 | 用“前缀+序号”强制规则:A表示业务活动,G表示网关,S表示开始/结束 |
| 修改后旧分支仍在图上 | 检查AI是否基于“全量重写”而非“增量修改” | 调高输出完整度要求:每次都输出全量DSL,不输出“只改一处”的描述 |
| BPMN网关类型转换失败 | 检查网关语义是否清晰 | 排他网关用“每次只走一条线”,并行网关用“多条线同时执行”,在DSL中显式标注 |
| 多人协作时DSL风格不统一 | 缺少统一的Skill规则 | 建立团队级SKILL.md,强制缩进、命名、条件写法规范 |
| 图渲染出来太宽,横向滚动 | 布局算法自动换行失效 | 用Mermaid的LR或TB方向参数控制,或拆分子流图 |
避坑心得里,我最想强调的一条是:不要把Skill写成“一套万能的流程生成咒语”。Skill的规则文件越简单越好,重点在于边界清晰:什么归DSL语法管,什么归业务规则管,什么归渲染展示管,各司其职。我在早期往SKILL.md里塞了一堆“业务审批的人事规范”,结果AI在生成算法流程图时也开始输出审批节点,闹出不少笑话。后来把所有业务字段移到模板层,SKILL.md只保留生成规则和校验规则,问题立刻消失。
6. 我个人后来越用越顺的几个小技巧
回到开头那个结论:流程图修改回到文字里,不是一种情怀,而是一种工程效率上的必然。我之后在项目里又摸索出了一些让这套机制更顺手的细节。
第一,把“变更说明”和“DSL变更”绑定输出。每次让AI改流程时,要求它不仅输出新DSL,还必须列出“相对上一版改了哪些节点、哪些连线”。这样代码评审时,大家先看变更说明,再核对新DSL,最后看渲染图,全程信息是分层的,不会淹没在图形堆里。
第二,让Skill顺带生成“流程校验清单”。比如检查是否每个分支都有出口、是否存在等价条件合并的空间、循环是否能终止。这些检查项在传统流程图中很难自动完成,但在文本层用规则扫描很容易实现。我甚至把ALNS算法这种带启发式搜索的复杂逻辑画成流程图后,用校验清单扫描了一遍,还真找出一个“重复更新解导致的死循环分支”。
第三,给流程图加“语义锚点”。一个节点在DSL中的ID不要用纯数字,用“业务代号+序号”,比如PO-APPROVE-01。这样即使流程图改了几十版,评审人员依然能从ID的字面含义里快速定位到业务环节。这招在大型跨部门评审时尤其好用。
第四,遇到特别复杂的系统流程图,别把整个图塞进一个DSL文件。拆成“主流程文件 + 子流程文件”,主流程引用子流程的编号。这个思路和代码工程里的“模块化”一脉相承:主图保持简洁,子图按需展开渲染。
最后,再分享一个团队协作层面的经验。我和团队花了两周时间,用这套“流程Skill + 文字驱动”方案,把我们手里的一个采购到销售全链路流程重构了一遍,生成的DSL总共两千多行。两周后,业务方提了一次涉及三个节点的流程变更——这次我们只花了不到半天就完成多版调整加多轮评审。换作以前用纯图形工具,一次这样的改动至少要一到两天。
流程设计的未来方向,大概率不是“画的图更多”,而是“画的图更少,但更准”。文字承载逻辑,图承载呈现,Skill承载规则,三者各干各的专长。如果你也正被流程图的新版本折磨得焦头烂额,不妨按我上面的步骤,从定义一个轻量DSL开始,给自己的AI配一个流程设计Skill。先用一个小流程图练手,跑通“文字→图→改文字→再改图”的循环,你会发现,流程图修改这件事,原来可以这么清爽。