事情经过
前几天,线上系统出现了一个结算的缺陷,该缺陷源于我编写的代码。出问题的时候是周日晚上,那时我接到了大领导的电话,问我具体的财务损失细节。
最后调查发现有两个用户利用了系统漏洞,导致87笔订单出现了多结算的问题,薅了大概 2.6 w。其中一个人已经跑路了,另一名用户账户余额只有几百块钱。
发现问题后,我们立即停止了提现功能,其他应对措施则安排到明天上班后处理。
然而,那个晚上我辗转难眠,内心承受着巨大的压力。
作为项目的唯一开发者,我不仅要完成编程任务,还要像项目负责人一样承担风险与责任。这或许是普通开发与项目负责人之间最大的差异。
周一早上去上班,前一天晚上也没睡,精神状态可想而知,浑浑噩噩的,先把问题和场景分析清楚,最终发现是用户在加价的时候回写了订单状态,导致重复结算。紧急加上各种校验,然后把所有相关的接口全部加强校验。
代码还没写完,我就被召去会议室接受批评了。直属领导和大领导怼着我一顿骂,诸如“身为高级开发,竟然范这种错误”等。我试图解释原因,结果被骂的更凶了。
这次经历让我深刻认识到,犯错后被批评时,最好先认错,再给出解决时间,而不是解释出错原因。
我的心情更加沉重,压力山大。我花了一整天时间,直到凌晨才完成修复并上线。
然而,几天后问题再次重现。
经过仔细排查,我发现底层架构的分布式锁存在缺陷,未能有效锁定请求。在finally块中使用了redisson的forceunlock方法,导致并发场景下当前线程的锁被其他线程释放。
于是,我再次被召至会议室接受批评。这次批评简短而直接:“今天必须修复完毕,再出问题就自行离职。”
回到工位后,我先修复了分布式锁的问题,又在资金流水处理中增加了数据库锁。我又一次工作到凌晨,期间还处理了一个紧急需求,有几次甚至工作到凌晨一两点。
到现在这件事已经过去近一周了。
回想起那几天的经历,我几乎彻夜未眠,承受着巨大的身心压力。凌晨三四点才入睡成了常态,这对我的身体和精神都造成了极大的伤害,辞职的念头不断在我脑海中闪现。那次事件让我对bug产生了严重的心理阴影。
昨晚,商务同事告诉我,已经追回了1.5万元,预计能追回2.4万元,剩余部分将分批追回。
真心感谢商务同事,也给别人造成了不少麻烦。
心理感悟
不知道你如果遇到我经历的情况有什么感受。希望你不要有我这么大的压力。不过这次压力也让我更深刻的体会到了一些事。
就一份工作而已
工作嘛,不过就是人生路上的一段经历,实在不行,拍拍**走人就是了,别让自己被压力压得喘不过气,最后身体垮了,公司可不会心疼你,吃亏的还是自己。
人有时候得自私一点,多替自己考虑考虑,别太纠结那些集体荣誉啊责任心之类的,毕竟每份工作都是咱们成长路上的一块垫脚石。
要成为工作的主人,别让工作反过来牵着咱们鼻子走。
以前我总觉得公司给我发薪水,我就得好好为它卖命。
现在想想,这些年我开发的系统,今年已经帮公司带来了600多万的GMV,虽然这也有商务、运营同事们的功劳,但我的那点薪水跟这比起来,简直是九牛一毛。这么看来,公司其实应该感激我这些年的辛勤付出才对。
最重要永远是身体、亲人和朋友
人生说长不长,说短不短。大家都是几十年时间,身外之物,生不带来,死不带走。
自己的身体健康才是最重要的,不要等身体垮了再追悔莫及,一旦失去,再想挽回可就难了,因为很多健康问题都是不可逆的,医学并非万能。
其次是家人、伴侣、朋友。想想自己出生和去世的时候,身边会有哪些人?这时候工作在哪里呢?
以前我对家人很不耐烦,但现在我学会了耐心倾听,连老婆都觉得我 “好欺负” 了哈哈哈。或许说再多都不会有用,直到自己刻骨铭心的经历一波。
要知道,业务、公司乃至整个地球,离了谁都能继续运转,但亲人、爱人和朋友失去了你,他们的世界将会充满悲伤。
心态非常重要
就算出了再大的bug,业务依旧能够维持,公司也不会因此关门大吉,天也不会塌,地球不会停止自转,太阳不会熄灭,更重要的是,写 bug 的人不会死。
其实,过度的压力和焦虑并不能提升我的工作效率,特别是我这种因为bug连续几晚失眠的人,勉强去修复,效果反而不如先睡个好觉再来处理。
现在想来,那时候给自己的巨大压力,简直是自找苦吃,有点自虐的味道。人还是要对自己宽容点,别给自己太大压力。
至于领导那些“自己提离职”、“这么低级的错误”之类的责备,听听就算了,别太往心里去。他可能就是一时气急,需要找个出口发泄一下,或者想强调这件事的重要性,让你务必处理好。这不过是情绪的一种释放方式。
你就当他是在对空气发泄,等他骂完了,你只需要表态你会解决问题,并给出一个明确的时间点就行。
给他点情绪价值。毕竟,领导也有自己的上级要汇报,到时候说不定他也会被骂得更惨呢,哈哈。
付出行动
在调整了认知和心态之后,关键还是要落实到行动上,从失败中汲取教训,确保类似情况不再发生。
经历了这次结算风波后,我对结算的每一个环节和关键点都有了深刻的理解,相信以后再接手任何项目,结算部分都不会再成为我的软肋。
对结算系统设计感兴趣的朋友,可以回顾一下我之前的两篇分享,里面有详细的文档介绍。接下来,我还会通过模拟订单场景,结合具体的建表语句,深入剖析结算架构的设计。
对我来说,事情解决才会让我安心。
我必须亲自把系统中涉及结算的场景和代码重新梳理一遍,确保每一个细节都了然于胸,这样才能保证下次绝不会再犯同样的错误,我心中的大石也才能落地。
我希望你能明白,调整心态固然重要,但如果不付诸行动去真正解决问题,那么下次问题依然会出现,甚至会让你时刻生活在不知何时会再次爆发的恐惧之中。
解决问题需要付出精力和行动,这可能更难,但这才是人成长和进步的原因。
加油,共勉。
<顺便吆喝一句,民族企业大厂,前后端测试捞人,感兴趣的来!>