影刀RPA工程实战:自动化团队的工程文化建设与持续交付能力打磨

影刀RPA工程实战:自动化团队的工程文化建设与持续交付能力打磨

工具可以买,框架可以学,但一支能持续交付高质量自动化系统的团队,只能靠时间和文化慢慢养出来。

专栏写到这里,已经二十多篇了。我们聊遍了浏览器池、调度引擎、规则引擎、混合执行、合规体系这些硬核技术。但有一个话题一直没有专门展开——

自动化系统是人建的,也是人运维的,更是人迭代的。技术架构再精妙,如果团队没有与之匹配的工程文化和交付能力,系统会在持续演进中逐渐腐化。相反,一支有工程纪律的团队,即使起步时技术选型不完美,也能在迭代中把系统越做越好。

这篇文章是我对团队建设的一些真实总结。不讲大道理,只还原我们在店群自动化这条路上,是怎么从三五个人的野路子开发,逐步打磨出一套可工程化运转的团队协作体系的。


一、从“脚本作者”到“自动化工程师”

团队成立之初,大家对RPA的认知就是“拖拽影刀写脚本”。没有代码审查,没有版本管理,没有文档,没有测试。谁写的流程谁自己维护,出了问题全靠那个人的记忆。

这种模式在店铺数不超过10个时还能凑合。但规模一上去,单点依赖立刻变成瓶颈。某个核心流程的维护者请假,流程改不动也查不了。人一走,知识全带走。

我们做的第一个改变,是重新定义角色

  • 自动化开发工程师不只是拖拽影刀,还要理解浏览器底层、懂Python插件开发、会设计流程状态机。
  • 自动化运维工程师不只是看监控,还要理解调度系统、懂代理网络、能做容量规划。
  • 流程设计者不只要知道业务操作步骤,还要遵守设计规范、写文档、参与评审。

这个角色升级伴随着技能培训。每周一次的内部分享,从Python异常处理讲到Chromium内存管理,从Redis数据结构讲到分布式锁。知识在团队里流动起来,单点依赖开始消解。

脚本作者关心的是“流程能不能跑通”。
自动化工程师关心的是“流程能不能在100个店铺上稳定跑一年”。


二、代码审查:不只是找Bug

代码审查在传统软件开发中是标配,但在RPA领域很少有人做。流程文件难以diff是客观困难,但这不是不做审查的理由。

我们的做法是:审查流程设计文档,而不是审查流程文件本身。

每个流程在开发前,需要提交一份轻量设计文档,包含:

  • 流程目标和使用场景
  • 状态机设计(正常路径、异常路径、断点恢复路径)
  • 依赖的外部资源(页面元素、配置项、数据表)
  • 风险评估(哪些步骤可能失败,失败后如何处理)

picture.image

  • Checkpoint定义和恢复策略

这份文档是审查的核心对象。审查由另一位工程师来做,关注点不是“选择器写得对不对”,而是“异常处理是否完整”、“是否有遗漏的边界条件”、“和已有流程是否有冲突”。

审查通过后才进入开发。开发完成后再做一次“走查”——开发者在沙箱环境里跑一遍流程,审查者在旁边看,随时提问。

这套制度刚推行时阻力不小,团队觉得“写个RPA流程还要写设计文档,太重了”。坚持了三个月后,线上事故率明显下降,大家才慢慢接受。现在新成员入职,这套流程已经成了天经地义的事情。

picture.image

picture.image

picture.image

三、设计规范:让每个人写的流程长一个样

picture.image 一个团队里三个工程师,写出来的流程风格可能完全不同。变量命名、错误处理方式、日志输出格式、Checkpoint粒度,各搞各的。这种差异在规模小的时候是个性,规模大了就是维护地狱。

我们沉淀了一套自动化流程设计规范,不是挂在墙上的空口号,而是落实到代码审查和CI门禁里的强制约束。

部分规范摘录:

  • 命名规范:流程名使用平台_店铺范围_操作类型格式,如temu_all_order_collect。Python插件函数名使用动词_名词格式。
  • 异常处理规范:所有Python插件入口函数必须使用@plugin_entry装饰器,统一异常捕获和日志输出。
  • 日志规范:禁止使用print,统一使用plugin_logger。日志消息必须包含task_idshop_id
  • 选择器规范:禁止使用//*[contains(text(),'xxx')]全局文本模糊匹配。优先使用ID和data-testid。
  • 等待规范:禁止使用固定时长sleep等待页面加载。必须使用wait_for_element,并设置超时时间。

规范不是一纸空文。CI流水线里集成了一个规范检查脚本,能自动扫描流程文件里Python节点的代码,检查是否违反命名和日志规范。违反的构建直接标红,不修不能发布。

def lint_flow_python_code(flow_file_path):
    issues = []
    code_blocks = extract_python_nodes(flow_file_path)
    for block in code_blocks:
        if "print(" in block.code and "plugin_logger" not in block.code:
            issues.append(f"禁止使用print,请使用plugin_logger: {block.node_name}")
        if "@plugin_entry" not in block.code:
            issues.append(f"Python节点缺少@plugin_entry装饰器: {block.node_name}")
    return issues

规范让代码变得可预期。任何人接手别人的流程,都不需要从头猜逻辑和习惯。这一点在人员变动时体现得尤其明显。


四、文档:不被逼着写,永远写不出来

文档是工程师最不爱干的事,但也是团队最需要的事。

我们的文档策略是分层+工具自动化

第一层:设计文档。 如上所述,每个流程开发前写,审查时用,归档到Git仓库。设计文档里包含了流程的“为什么这样设计”,是后来者理解历史决策的关键依据。

第二层:API文档。 Python插件库的函数签名、参数、返回值、异常,通过docstring自动生成HTML文档,发布到内网。代码改了文档自动更新,不用额外维护。

第三层:运维手册。 每个系统模块的启动、停止、常见故障处理步骤。由模块负责人写,放在统一的Wiki里,每月巡检一次是否过期。

第四层:复盘文档。 每次线上事故的经过、根因、修复、改进措施。复盘文档是团队最宝贵的知识资产——每一篇都是用真金白银的损失换来的。

文档不追求完美,追求“够用”。够用的标准是:一个入职三个月的新人,能根据文档独立完成一次灰度发布。


五、开发与运维的值班轮转

在传统IT里,开发写好代码扔给运维,出了事运维背锅。这种模式在自动化系统里完全行不通——自动化系统的运维需要理解流程逻辑、调度机制、浏览器行为,纯运维背景的人根本搞不定。

我们的做法是开发人员参与值班

所有开发工程师轮流值班,每人一周。值班期间职责包括:

  • 响应告警和工单
  • 处理线上异常和自愈失败的case
  • 维护运维手册(发现问题及时更新文档)

让开发值班有两个好处。一是反馈闭环极短——开发者白天写的流程,晚上如果崩了,自己会被叫起来修。这比任何Code Review都更能让人写出稳健的代码。二是知识扩散——每个开发者都会接触到系统的各个模块,不再只懂自己写的那一小块。

值班制度坚持了一年后,团队里不再有“这个模块只有他懂”的情况。


六、发布纪律:对线上保持敬畏

发布上线是事故最高发的环节。我们定了几条发布纪律,严格执行。

禁止周五发布:周五下午和节假日前一天不安排任何发布。出问题没人值班修,整个假期都提心吊胆。

灰度必须观察满一个业务周期:订单采集流程的灰度,必须观察满24小时(覆盖一天的订单生成周期)。不能灰度跑了两小时没报错就全量。

发布窗口内禁止并行操作:一次只发布一个流程。前一个全量确认稳定后,再发下一个。同时发多个流程,出了问题分不清是谁的锅。

发布必须在团队群内同步:开始灰度、灰度结果、全量上线、线上观察结果,每一步都在群里通报。让所有人都知道当前线上在发生什么变化。

这些纪律看起来保守,但每一次线上事故复盘,根源几乎都指向“发布太急”、“并行太多”、“观察不够”。保守的发布纪律,是团队用事故换来的敬畏心。


七、知识传承:让经验不再依赖口口相传

团队里最危险的话是“这个我知道,到时候我来说”。这种口头经验是团队最脆弱的资产——说的人走了,听的人忘了,经验就消失了。

我们强制要求:任何一次线上异常、一次流程优化、一次架构调整,都必须有文字记录。

复盘文档是硬性要求,不写完复盘不能关工单。设计决策记录是另一个硬性要求——当一个架构决策被做出时(比如“选择中心调度而非对等自治”),必须记录当时考虑的因素、备选方案、决策理由。这个记录不追求长篇大论,几段话说清楚就行。

半年后回头看,这些记录成了新成员最好的学习材料。他们能看到系统是怎么一步步演进的,每个设计决策背后的上下文是什么。


八、技术债务的透明化管理

自动化系统在快速迭代中,一定会积累技术债务。忽视债务的后果是系统越来越难改,最终变成无人敢碰的遗留系统。

我们的做法是把技术债务显性化

Git仓库的Issue列表就是技术债务清单。每一条债务被明确标记:

  • 影响范围(哪些模块、哪些流程)
  • 严重程度(高/中/低)
  • 预计修复成本
  • 不修复的风险

每月一次的迭代规划里,必须安排至少20%的产能用于偿还技术债务。这个比例不是固定的——如果债务积累严重,就调高;如果系统健康,可以适当调低。但绝不允许连续两个月零债务修复。

债务管理的目标不是“零债务”,而是“债务可控”。就像贷款一样,合理的债务是发展的杠杆,失控的债务才会压垮系统。


九、庆祝与复盘并存

自动化工程是压力很大的工作。流程崩了、告警炸了、半夜被叫起来,这些事消耗士气。

我们刻意保持了一个节奏:每次重大事故复盘后,紧接着找一件最近做得好的事情庆祝。

庆祝不一定是大张旗鼓的团建,可能只是一次聚餐、一封全员表扬邮件、或者一张手写的感谢卡片。重要的是让团队在压力之外能感受到正向反馈,而不是永远在救火、永远在被问责。

工程文化不是高压锅,而是一片能让工程师既有纪律又有热情的土壤。
纪律让人把事做对,热情让人想把事做得更好。


十、写在专栏的最后

从第一篇浏览器实例池,到这一篇团队文化建设,这个专栏已经写了二十多篇。回头看去,一年半的工程化历程,我们从一个蹩脚的单机脚本,走到了一套能支撑百店矩阵稳定运行的自动化平台。

技术上的收获已经在各篇文章里讲透了。最后想说的,是技术之外的事。

自动化的本质不是让机器替代人。而是通过工程的思维,把经验变成系统,把不确定性变成确定性,把个人英雄主义变成团队协作能力。这条路走下去,技术会更新,工具会换代,但工程纪律、团队文化和持续交付的习惯,才是真正能带走的财富。

如果这个专栏能让你在做自动化系统的路上少踩几个坑、少熬几个夜,那这一年半的经历就有了超出我们团队之外的价值。

自动化的路还很长,愿每一个在这条路上的工程师,都能守得住技术底线,带得出靠谱团队,做得出让自己安心的系统。

作者:林焱
一个在自动化工程路上持续打磨技术、也打磨团队的工程师


本专栏完。

0
0
0
0
评论
未登录
暂无评论