工具可以买,框架可以学,但一支能持续交付高质量自动化系统的团队,只能靠时间和文化慢慢养出来。
专栏写到这里,已经二十多篇了。我们聊遍了浏览器池、调度引擎、规则引擎、混合执行、合规体系这些硬核技术。但有一个话题一直没有专门展开——人。
自动化系统是人建的,也是人运维的,更是人迭代的。技术架构再精妙,如果团队没有与之匹配的工程文化和交付能力,系统会在持续演进中逐渐腐化。相反,一支有工程纪律的团队,即使起步时技术选型不完美,也能在迭代中把系统越做越好。
这篇文章是我对团队建设的一些真实总结。不讲大道理,只还原我们在店群自动化这条路上,是怎么从三五个人的野路子开发,逐步打磨出一套可工程化运转的团队协作体系的。
一、从“脚本作者”到“自动化工程师”
团队成立之初,大家对RPA的认知就是“拖拽影刀写脚本”。没有代码审查,没有版本管理,没有文档,没有测试。谁写的流程谁自己维护,出了问题全靠那个人的记忆。
这种模式在店铺数不超过10个时还能凑合。但规模一上去,单点依赖立刻变成瓶颈。某个核心流程的维护者请假,流程改不动也查不了。人一走,知识全带走。
我们做的第一个改变,是重新定义角色。
- 自动化开发工程师不只是拖拽影刀,还要理解浏览器底层、懂Python插件开发、会设计流程状态机。
- 自动化运维工程师不只是看监控,还要理解调度系统、懂代理网络、能做容量规划。
- 流程设计者不只要知道业务操作步骤,还要遵守设计规范、写文档、参与评审。
这个角色升级伴随着技能培训。每周一次的内部分享,从Python异常处理讲到Chromium内存管理,从Redis数据结构讲到分布式锁。知识在团队里流动起来,单点依赖开始消解。
脚本作者关心的是“流程能不能跑通”。
自动化工程师关心的是“流程能不能在100个店铺上稳定跑一年”。
二、代码审查:不只是找Bug
代码审查在传统软件开发中是标配,但在RPA领域很少有人做。流程文件难以diff是客观困难,但这不是不做审查的理由。
我们的做法是:审查流程设计文档,而不是审查流程文件本身。
每个流程在开发前,需要提交一份轻量设计文档,包含:
- 流程目标和使用场景
- 状态机设计(正常路径、异常路径、断点恢复路径)
- 依赖的外部资源(页面元素、配置项、数据表)
- 风险评估(哪些步骤可能失败,失败后如何处理)
- Checkpoint定义和恢复策略
这份文档是审查的核心对象。审查由另一位工程师来做,关注点不是“选择器写得对不对”,而是“异常处理是否完整”、“是否有遗漏的边界条件”、“和已有流程是否有冲突”。
审查通过后才进入开发。开发完成后再做一次“走查”——开发者在沙箱环境里跑一遍流程,审查者在旁边看,随时提问。
这套制度刚推行时阻力不小,团队觉得“写个RPA流程还要写设计文档,太重了”。坚持了三个月后,线上事故率明显下降,大家才慢慢接受。现在新成员入职,这套流程已经成了天经地义的事情。
三、设计规范:让每个人写的流程长一个样
一个团队里三个工程师,写出来的流程风格可能完全不同。变量命名、错误处理方式、日志输出格式、Checkpoint粒度,各搞各的。这种差异在规模小的时候是个性,规模大了就是维护地狱。
我们沉淀了一套自动化流程设计规范,不是挂在墙上的空口号,而是落实到代码审查和CI门禁里的强制约束。
部分规范摘录:
- 命名规范:流程名使用
平台_店铺范围_操作类型格式,如temu_all_order_collect。Python插件函数名使用动词_名词格式。 - 异常处理规范:所有Python插件入口函数必须使用
@plugin_entry装饰器,统一异常捕获和日志输出。 - 日志规范:禁止使用
print,统一使用plugin_logger。日志消息必须包含task_id和shop_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%的产能用于偿还技术债务。这个比例不是固定的——如果债务积累严重,就调高;如果系统健康,可以适当调低。但绝不允许连续两个月零债务修复。
债务管理的目标不是“零债务”,而是“债务可控”。就像贷款一样,合理的债务是发展的杠杆,失控的债务才会压垮系统。
九、庆祝与复盘并存
自动化工程是压力很大的工作。流程崩了、告警炸了、半夜被叫起来,这些事消耗士气。
我们刻意保持了一个节奏:每次重大事故复盘后,紧接着找一件最近做得好的事情庆祝。
庆祝不一定是大张旗鼓的团建,可能只是一次聚餐、一封全员表扬邮件、或者一张手写的感谢卡片。重要的是让团队在压力之外能感受到正向反馈,而不是永远在救火、永远在被问责。
工程文化不是高压锅,而是一片能让工程师既有纪律又有热情的土壤。
纪律让人把事做对,热情让人想把事做得更好。
十、写在专栏的最后
从第一篇浏览器实例池,到这一篇团队文化建设,这个专栏已经写了二十多篇。回头看去,一年半的工程化历程,我们从一个蹩脚的单机脚本,走到了一套能支撑百店矩阵稳定运行的自动化平台。
技术上的收获已经在各篇文章里讲透了。最后想说的,是技术之外的事。
自动化的本质不是让机器替代人。而是通过工程的思维,把经验变成系统,把不确定性变成确定性,把个人英雄主义变成团队协作能力。这条路走下去,技术会更新,工具会换代,但工程纪律、团队文化和持续交付的习惯,才是真正能带走的财富。
如果这个专栏能让你在做自动化系统的路上少踩几个坑、少熬几个夜,那这一年半的经历就有了超出我们团队之外的价值。
自动化的路还很长,愿每一个在这条路上的工程师,都能守得住技术底线,带得出靠谱团队,做得出让自己安心的系统。
作者:林焱
一个在自动化工程路上持续打磨技术、也打磨团队的工程师
本专栏完。
