项目上线前一天发现关键风险,怎么办?一个项目经理的应急处理复盘
项目上线前一天下午发现关键风险,这是做项目最容易慌的时刻。这时候最容易犯的错不是技术判断失误,而是本能地想先把风险藏起来,赌它不会发生——“先上,出了事再说”。
我的处理结论很简单:把它当成一次正式的风险应对来做——先量化影响,再更新风险状态和评级,然后把选项摆到干系人面前一起做选择,最后给这次上线留一个明确的退出条件。下面复盘一次真实经历。
一、当时的情况
一个系统切换项目,计划周五晚切流量,旧系统退役。周四下午,测试同事在回归测试里发现一个历史数据转换的边界问题:老数据库里有一批记录存在重复主键,转换脚本遇到这类记录会直接跳过,不报错,也不记录日志。也就是说,这批数据在新系统里会“安静地消失”。
当时离上线不到36个小时。团队里两种声音:一种说数据量不大,先上,后续补数据;一种说要延期,风险太大。我做的第一件事,是让所有人停下来,用了四十分钟把事实摸清楚。
二、做对的三件事
第一件:先量化影响,不急着找方案。四十分钟里我们查清了四件事——重复主键的记录有多少条、涉及哪几个业务模块、会不会影响历史报表和对外查询、有没有对外接口会读到这批数据。摸完之后结论变了:数据条数确实不多,但其中一个模块的历史报表是给监管报送用的,跳过数据等于报送口径出错。这一下就把问题从“技术小瑕疵”变成了“合规风险”。
第二件:把风险登记册里那条记录的状态改回来。台账里原本有一条“历史数据质量”的风险,之前被标成已缓解,因为做过一次数据抽样清洗。发现这个边界问题后,我把它改回“识别中”,重新评估概率和影响,并写明触发条件是“存在重复主键的历史记录”。风险是动态的,台账一旦签完字就锁进抽屉,它就只是一份文档,不是管理工具。
第三件:开了一个十五分钟的站立会,只讨论三个问题。参会的是业务负责人、数据负责人和测试负责人。三个问题是:如果直接上线,最坏结果是什么?如果整体延期,代价是什么?有没有第三条路?会议时间卡得很死,因为压力大的时候,讨论越久越容易变成互相追责。
三、最后选的方案
第三条路出现了:不整体延期,但把切换拆成分批上线。先切不含重复主键的业务模块,大约占业务量的九成;受影响的那个模块继续在旧系统运行,下周一晚单独切换。同时上线一个数据核对脚本,每天比对两边数据的条数和关键字段,发现不一致立刻告警。
这本质上是一次风险缓解加部分转移:把“一次性大风险”拆成“两个可控的小风险”,代价是多维护几天旧系统、多投入两天人力做数据核对。业务部门接受这个方案,因为它保住了主要功能的上线节奏,同时又没有把报送口径的风险留下。
四、做错的地方和教训
教训一:风险识别太晚。历史数据质量这类问题,完全应该在项目启动阶段就设计成一条独立的数据核对任务,挂到进度计划里,而不是等到回归测试才靠运气撞出来。技术类项目里,数据迁移风险通常比功能开发风险更难补救。
教训二:差点做了一个错误的选择。当时有个念头是让开发连夜写个脚本,把重复主键过滤掉再转换。这个想法被否掉了——临时脚本没有测试用例、没有回滚方案,把它放到上线关键路径上,等于用一个新的、未验证的风险去换掉一个已知风险。压力之下人会本能地选择“看起来最快的那条路”,这一点必须靠机制来防,不能靠清醒。
教训三:沟通可以更早。这件事最后是靠一场现场会议讲清楚的。其实周四晚上就应该发一封简短的状态说明,把风险、影响和候选项写清楚,让业务方周末心里有数。项目里很多矛盾不是技术问题,是信息不对称——坏消息说得越晚,接收方感受到的“被隐瞒感”越强。
五、遇到类似情况,可以照着走的四步
第一步,先量化再决策。花半小时搞清楚:多少数据、哪些模块、影响谁、最坏到什么程度。没有量化的风险,讨论只会停在情绪层面。
第二步,更新风险台账。把状态、概率、影响和触发条件写清楚,让台账反映当下的真实情况。这一步花五分钟,能省掉后面很多解释成本。
第三步,把选项摆给干系人。照常上线、延期、分批上线、降级上线,每个选项都标清代价和后果,让有决策权的人做选择。项目经理的职责是把信息讲清楚、把选项做出来,而不是一个人扛着风险不说。
第四步,上线前定好退出条件。什么情况下必须回滚、谁有权拍板回滚、回滚后数据怎么还原、切换窗口的截止时间是什么。这几句话写下来放在手边,比事后解释有用一百倍。
项目里没有零风险的上线。拉开项目经理差距的,从来不是“运气好没遇到问题”,而是问题敲门的时候,有没有一套能立刻用起来的处理顺序。这次复盘的结论其实很朴素:风险台账要动态更新,坏消息要尽早说清,方案永远要留出第三条路。