02 | Bug引发事故,该不该追究责任?

“人非圣贤,孰能无过?”技术人员也是人,因此编程过程中难免出 Bug,出了 Bug 系统就会出问题,出了问题系统就会宕机。那么,Bug 引发的一连串事故,该不该追究责任,又如何去追责呢?

今天我就和你聊聊 Bug 和责任的问题。

记得有一次,一个国内的访问团来公司参观。在交流的过程中,有人问:“在你们的工作中,工程师的 Bug 或者失误引发的问题,会不会被追究责任,会不会扣工资,会不会被开除?”

当时我很诚实地按照实际情况回答说:“不会。”

这个人又继续问:“那出了事故没有任何惩罚,不会有问题吗?”当时,我围绕着员工的素质、自觉性和责任心进行了回答。后来再次思考这个问题,我越想越觉得有意思。

我在 Airbnb 负责支付和交易业务,这意味着大部分的错误都等价于真金白银。无论是从用户那少收钱,导致公司亏损,还是从用户那多收钱引起法律或者合约的纠纷,只要跟钱沾了边,都不是小事情。

俗话说 “常在河边走,哪有不湿鞋”,各种因为代码问题引起的麻烦也是屡见不鲜。那么,在Bug引发问题的情况下,怎样处理才能最大程度上保持团队的主动性、责任感和执行力呢?

我们先来假想两种极端的情况:如果每个错误都会受到惩罚,会怎样;如果所有的错误都没有任何追究和跟进,又会怎样?

假如每个错误都会受到惩罚,不难想象,以下情况一定难以避免。

  1. 大家都怕闯祸,所以风险高的事没人做,或者总是那几个靠谱的“老司机”做。没有机会处理这种复杂情况的人,永远得不到锻炼,也无法积累这样的经验。
  2. 如果有人搞砸了什么事情,会因为担心承担后果而推卸责任,从而尽可能掩盖错误的坏影响,不让人知道。
  3. 如果别人犯了错,会觉得不关自己的事。
  4. 指出别人的错误就会导致别人被追究责任,因此看到有问题也会犹豫要不要指出。

反之,如果无论发生什么错误,都不需要承担后果或进行反省,没有任何担当,那可能又会出现以下情况。

  1. 同样的错误可能会一再发生。
  2. 小错没有被及时制止,或者没有引起足够重视,最终导致酿成大错。
  3. 做事仔细的人会觉得不公平。自己为了安全起见,每次代码改动都写很多单元测试,每个项目都反复测试和预防问题;但是别人的草草而就导致错误百出,却因为显得进度更快,反而被认为更有效率。

那么,对于工作中的错误,尤其是 Bug 导致的错误,我们应该采取什么态度和措施呢?

第一,追究责任,但不是惩罚。“知其然,并知其所以然”,搞清楚在什么场景下,什么样的 Bug 引发了什么样的错误。相关人员应该尽最大的可能去做好善后工作,并思考如何避免下次犯同样的错误。

第二,对事儿不对人。在这个追究的过程中,重点在于怎么改善流程、改进制度,来避免同样的错误,而不是指责员工不应该怎么样。如果相关人员已经那么做了,为什么这个错误仍然没有及时被发现和制止?

第三,反复问“为什么”,从根本上发现问题。错误为什么会发生?有些 Bug 可能只是显露出来的冰山一角。

举一个假设的例子,因为小王的代码改动影响了小李的代码,让小李之前实现的功能不对了。在这种情况下,我们首先要问:

  1. 为什么小李代码功能不对没有立马被发现?
    答:因为小李当时的测试用例没有覆盖这种情况。
  2. 为什么小李的测试例不完整?
    答:因为这个地方的测试需要 mock 一个服务的返回值,但是这个 mock 的值并不是真的服务器端的返回值,所以测也测不出来。
  3. 为什么要去 mock?
    答:因为我们的测试系统框架不够完善。

这样反复问,反复想,就能找出根本上值得改进的问题,而这样的结果和受益,比惩罚犯错儿的人要好得多。

第四,员工关系的建立也很关键。我们需要培养的是大家相互信任、互帮互助,为了共同的目标努力的氛围,而不是一种不安全感。这种不安全感可能是自己不够自信,害怕犯错;也可能是对他人漫不关心,或是对其代码质量有怀疑。只有大家都相信,找出问题的根本目的是解决问题,避免问题再发生,才能建立一个不断反思、不断学习、不断进步的良性循环。

最后给你留一个思考题, 这也是现实生活中我多次听说的事故。如果你是一家公司的技术主管,团队里的一位工程师因为误操作删除了线上的用户数据,这时候你又发现,上个月数据的自动备份因为某些故障停止了,现在你该怎么办呢?

精选留言

  • kilo

    2017-11-16 19:38:20

    大家好,我是极客时间《朱赟的技术管理课》运营负责人小原 ,收到短信加不上我的用户,请关注公众号"极客时间“,回复你的微信号,我会拉你进群。
  • ibrothergang

    2017-11-15 09:16:22

    “如果你是一家公司的技术主管,团队里的一位工程师因为误操作删除了线上的用户数据,这时候你又发现,上个月数据的自动备份因为某些故障停止了,现在你该怎么办呢?”

    首先,解决问题。
    对外的事情永远应该放在首位解决,首先要考虑的是用户数据没有了怎么做补救。如果实在没有办法挽回数据了,考虑如何将损失降到最低。或者以某种方式补偿用户。用户的利益永远是第一位的。

    其次,追究责任。
    误操作也好,没有自动备份也罢,肯定需要有人来承担责任。没有责任人的事故很难挖掘到深层次的原因。错了就是错了,就是需要承担起这份错误带来的事故责任。

    最后,流程优化。
    人和机器最大的不同是人是具有主管能懂性的。机器可以严格按照程序执行,没有喜怒哀乐,但是人不行。谁都会有心情沮丧的阶段,也会有狂喜的时候,这种情况往往就容易犯错。所以如何规避,是不是可以从流程上去杜绝错误出现就是事后需要思考的。那前面的例子,如果删除操作是高危操作,是不是可以制定需要授权,是不是可以规定同时需要多人确定。自动备份是不是可以制定一些预警机制?

    个人一些想法,抛个砖,引玉。
  • 金鹏

    2017-11-15 17:34:34

    支持朱赟开直播答疑的赞我
  • 朱显杰

    2018-04-27 11:32:19

    我作为公司运维主管,真真切切的碰到过数据被运维删除的场景,分享下我的一线经验:
    首先,先想办法把损失降到最低,是否有其它备份,是否有其它途径重新生成数据等。
    其次,作为技术主管,对外主动承担首要责任,不要把责任推给下属。
    第三,用why-why法去找深层次原因,就是不断的问为什么,找出根本原因。
    第四,针对上述的原因,一个个找解决方案,每个解决方案都要有责任人和时间点,避免重复再犯。
    第五,针对事故进行复盘总结,对事不对人,重点不在于惩罚,而是在于吸取经验,总结教训。
  • rembau

    2018-02-27 11:33:44

    所以答案就是不惩罚吗?
    我有两个疑问:
    1,例子中最后推敲到是测试系统不完善,可是如果要完善测试系统需要大量的资源,公司目前资源紧张,协调资源很难,是不是应该在这种情况下顶着压力申请资源改进测试系统呢,是不是每次代码合并都进行一次review更简单有效一点
    2,留的题目中,我们继续使用上面例子中追问自己的思路,数据为什么没有备份,没有备份,为什么没有发告警信息呢,因为运维系统不完善。假设运维系统完善了,发告警了,可是运维同事忽略了呢。

    所以我觉得有时候人与系统或者流程之间有个均衡,资源充足的公司不断完善系统,让每个人都成为螺丝钉,资源不充足的公司,要培养人的习惯,管理者要把更多的精力放在人身上。
    作者回复

    是的,一切都是平衡,理论结合实际,知行合一

    2018-02-28 23:08:08

  • _fenghao_

    2017-11-15 19:06:53

    苹果支付实在是问题颇多...终于搞定了,先支持安姐,big fan!

    以前创业碰到很多这种问题,重大事故大都是有流程,不执行,偷懒所致,因为越是不确定的东西反而自己更重视,反而熟悉的问题总错,所以还是要细心。个人非常不容易罚款,当时CEO逼着订下罚款的细节,我说👌,权责利要匹配,也一并订下奖赏的条款,不说话了……

  • Rachel_fang

    2017-11-16 23:26:50

    现在在的团队,感觉每个人都没有安全感~问题发生后大家想的不是如何解决而是先说是谁的责任~解决问题找到问题根本比追责带来的正向结果会好
  • 刘剑

    2017-11-16 17:44:38

    对于朱老师提出的这个问题,我通过2个角度去看;
    1.自身角度,这种问题不会同步出现。首先能够操作正式服务器后台数据的都是经验丰富的主程级别,出现概率极低。就算出现了,我们通过数据库日志也可以恢复数据,把损失降到最小。如果日志损坏了我们还可以通过最多24小时自动备份数据恢复。我相信不会同时都出问题。
    还有就是需要及时上报让运营考虑应急预案,让客服做好疏导和安抚工作。必要时候给予出现问题用户一定补偿。

    2.如果是很不规范创业公司,开发人员误删了用户数据(我们按最坏的考虑数据清空了),又没有备份,立刻停止任何操作,及时上报问题,立刻切断外网用户的访问,如果数据价值非常大可以请专业数据恢复公司恢复数据,运营、客服都要协调动起来,讨论出善后方案并高效执行。

    对于第一种造成损失较少,但需要误删者解释清楚操作细节和原因,这种一般是操作规范的问题,以后严格按规范操作数据,然后需要向公司公开道歉,特别是增加了运营和客服工作量
    对于第二种造成损失很大,是操作的问题,也是数据库冗灾没有做好,更是管理上的问题。需要深刻反思反省,加强冗灾能力同时让公司加人手和资源吧。通过这件事老板也不会不舍得投入了(曾见到过创业公司不重视服务器资源投入的问题,还有就是找靠谱的开发人员和技术主管)。
  • 愤毛阿青

    2017-11-15 08:49:32

    前几个月删掉测试环境用户表的飘过
  • 亚伦碎语

    2017-11-15 12:36:08

    日常code diff 一定迭代后 retro看看有什么可以改进的,制定action改进
  • jayxhj

    2017-11-15 09:12:04

    出现线上问题第一件事肯定是先解决这个 bug 或者问题,所以尝试修补数据并安抚用户肯定是首要的事情。

    不过针对丢失用户数据这件事,很有可能数据追不回来了,这时候给用户相应的补偿很重要(包括但不限于发优惠券,送套餐,营销召回等方式),一方面达到挽救损失,另一方面直面问题,让用户降低对平台的不信任。当然,最重要的是,得解决数据丢失的问题,定期检查,灾备演练,防止这数据丢失的事情再次发生。
  • Hills录

    2017-11-15 12:01:56

    昨天差点把测试代码上生产。。。
  • 禾子先生

    2017-11-15 09:18:37

    您好,既然事故已经发生,眼前第一件事就是救火了。第一,我会先分析此次误删了多少用户数据,并使用最近备份的数据;第二,试试恢复数据,找专业公司来对磁盘数据进行恢复;第三,汇报上级领导;
    做完这些,就要开始“追责”了,为什么发生,怎么发生的。比如,是不是权限管理有疏漏,是不是生产安全操作原则没有普及,技术人员是否疲劳工作等。
  • Mindy

    2017-11-30 16:02:27

    首先,解决问题。
    其次,组织复盘。从组织结构、工具、流程规范等方面思考,找到根本原因进行解决。另外,如果出现人员方面的责任心问题,需要追求责任,给予惩罚。
  • 金鹏

    2017-11-15 10:41:12

    看到这个问题菊花一紧。个人觉得先从技术的角度尝试,有没有trick的方式可以恢复,如果没有用上上个月的,尽量减少损失。然后复盘,是谁的责任,并找到问题,完善流程。为什么程序猿有数据库删除权限?是否要分权限?是否要专人负责?设立Dba?为什么数据备份出错?是否有云备份?分布式数据?为什么一个月都没人知道?出问题为什么无预警信息?最后,主管是否有很大的责任?

    朱赟可否每周做一次复盘?回答一些大家的问题,另外也让大家知道你看问题的视角,强化记忆和学习。帮助一起提升。
    当然,如果直播就更赞。(色)(色)
  • 波知所云

    2020-03-13 23:11:06

    如果你是一家公司的技术主管,团队里的一位工程师因为误操作删除了线上的用户数据,这时候你又发现,上个月数据的自动备份因为某些故障停止了,现在你该怎么办呢?
    首先分析定位故障后,想办法恢复对外服务,含技术修复及业务应急,通过双活系统、灾难备份系统、最近一次可用的数据备份、其他关联系统的数据、大数据平台(或数据仓库等二线数据)、本系统的日志等方式、业务操作打印流水等想办法恢复数据。如果造成了数据丢失,需要配合业务方面协商业务应急处置办法,出具公告。在再次对外服务前,对当前的数据副本做好完整的备份;当恢复后的数据从业务逻辑、数据逻辑等方面进行充分检验,避免脏数据造成二次事故。
    其次关注修复数据的实际运行,抢修期间即便采取了很多防范二次事故的措施,但由于时间非常紧急,很可能万中漏一,发生抢修数据不完整,或者约束关系检查不完整,或者其他各种问题,需要及时关注系统运行尤其是数据一致性等问题。
    再次,系统性分析事故原因分析,例如为何会发生误删数据,是否没有严格执行权限控制和双人会同要求? 相关维护方案是否没有经过审批?删除数据的高危操作是否没有被有效拦截?变更操作之前是否没有按规定执行备份?数据备份失效为何没有告警?是否缺失必要的异构备份机制?
    最后充分吸取教训,围绕生产运行、变更维护、数据备份等工作的流程机制、系统配置等进行优化,通过测试环境实战模拟演练检验有效性,从机制上保障生产,尤其是数据的安全性。
  • 章洁

    2018-02-26 10:15:02

    发现留言很有意思。
  • nanjishidu

    2017-11-15 18:45:57

    首先进行数据恢复减少损失。
    然后完善自动备份程序和操作流程,杜绝类似问题的发生。
    最后问题追责。技术主管是第一责任人,操作数据之前未进行数据备份,未定时检查数据备份是否正常。运维人员是第二责任人,未定时检查自动备份程序的稳定性。工程师是第三责任人。
  • 怀揣梦想的学渣

    2022-03-18 21:35:36

    我个人经历过的公司里,就有文中提到的类型。
    1、不做就不会错。大家都怕处罚,每次处罚都是涉及钱,很多人不敢去做改动,能轻微处理就轻微处理,有事情就要各种管理升级,没人愿意去主导事情,都在等着上面领导决策,没有人主动推动流程优化,一有问题就把“领导说的”抬出来。标准铁饭碗模式。领导做错了,就没多少影响,如果员工做错了,一定会被大范围当作典型案例批斗,并且扣钱。
    2、问题追溯并改进。我曾服务过一个做Linux下软件开发的公司,遇到某个软件bug,就会根据影响的优先级,决定是分配多少人参与问题排查和处理,处理后会反过来思考优化团队内的平台和工具,优化团队内流程方案,让流程规范落地到代码工具,减少人的错误。比较可惜,他们公司销售人员太少,已有的很强的销售人员也被大企业挖走了,在我们本地没能活下去,现在被外包公司打包收购了。
    3、员工关系。互相帮扶的我见到的挺少,为了绩效考核,为了个人不被替代,为了让自己的技术看起来更强,有的同事会把经验留存在自己的脑子里,不做分享,也不愿帮同事,还能找出各种看起来很合适的理由。团队看似是团队,实际是各自为营,互相是传递数据的黑盒子,离职率也是没低过。
  • 郑奥学

    2019-08-12 18:13:24

    事中:应急,第一时间毛估影响及止损方案,降低业务影响(协调公关、客服、运营等对外发文安抚)
    事后:复盘,输出后续优化改进,避免下次类似问题