上周与同事们闲谈,回顾了我们在工作中遭遇的失误。现在回想起来,那些曾经的错误显得颇为滑稽,但当时它们却让我们深受其困。正是这些错误让我们获益匪浅。
分享个人的失败经验至关重要,为他人提供警示,或许还能助他们少走弯路。最近,我记录下了自己犯的几条错误,在此分享其中的两个。
为何生产数据库会被误删?
几个月前,我在Reddit上看到一篇初级开发者上班第一天误删生产数据库的帖子。这种故事让人心生恐惧,仿佛错误随时可能降临到自己头上。就在前不久,我也犯了一个类似的错误。
我刚入职时,有一位高级数据库管理员在第一天就误删了生产数据库。这种例子屡见不鲜。幸运的是,团队用一周前的数据库备份帮他恢复了数据,才使他得以保住工作。如今十年过去了,这件事仍被大家拿来取笑。
今年年初的一个早晨,我被紧急召唤去调查一个客户生产环境中的故障。原计划是针对一小部分用户进行产品的Beta测试,但网站首页却突然无法访问。我猜想可能是系统存在bug或漏洞。
当我登录生产服务器查看数据库时,发现articles表竟然空了。这证实了网站显示空白的现象。奇怪的是,用户表仍然包含用户信息。这意味着我们丢失了所有文章,但测试用户的账号还在。尽管可以解释这是测试版的问题,但这种事故仍然令人头疼。
接下来我陷入了困惑。我不记得自己在控制台窗口输入了什么指令,竟然删除了用户表。现在既没有articles表,也没有用户表。我坐在那里,感到震惊和困惑。
我的大脑迅速运转,开始寻找解决方案。是否真的删除了用户表?有没有运行过备份数据库?该如何向客户解释?
我找到项目经理,坐在她旁边解释了情况。没有articles数据,网站看起来是空的,而且我还误删了用户表。现在需要重新邀请所有用户——如果他们能想起有哪些用户的话。我感到非常沮丧。
但有一个细节让我觉得事情有些蹊跷:我们怎么可能一开始就丢失了所有的articles表呢?于是我开始深入调查,一方面是难以接受的现实,另一方面是想挽回颜面。过了一会儿,我注意到了关键问题。
服务器上还有另外5个数据库,其中一个的名字与我现在查看的数据库非常相似。检查后发现,articles和用户表都存在于那个数据库中。原来是因为配置变更导致网站指向了新的数据库。那些用户数据呢?只是种子数据而已。
真是如释重负!整个早上都神经紧绷、胃酸翻涌,但现在我们“恢复”了所有数据,并找到了问题的真正原因,没有提前宣布误删数据库的坏消息。
这次小插曲让我们学到很多,其中最简单的一点就是:现在我们会定期备份数据库。这可能是我们开发人员最有效的“胃药”。
另一个我犯的错误没有那么戏剧化,但却是由一系列小错误累积造成的麻烦。
我们项目的一大挑战是时间紧迫(但也不一定)。初次会议时,我们一致认为项目所需的时间是我们所能提供的时间的两倍。从项目开始之初,截止日期就不断逼近,因此我们匆忙通过认证环节,以便进入客户关心的功能部分。
我之前在一个单页应用中实现过一次认证,但并没有完全理解各部分之间的协调方式。急于求成,以最快的速度推出应用,结果忽略了重要细节。
用户在登录后是通过cookie加载的,但我的应用没有为加载提供等待时间,而是根据事件顺序来决定先后。因此服务器会回复说用户没有权限。这种错误虽然罕见,但一旦发生,就会让用户感到困扰。认证环节从不检查用户令牌是否失效,如果不常访问网站,可能需要重新登录。令牌应该在每次发起请求时都进行更新,但我却没时间去理解这些规则。时间问题再次产生:如果我们同时发出多种请求,收到的回复取决于它们的到达顺序,那么将来使用的令牌可能是错误的。我们虽然卯足了劲赶进度,但最终仍发现所需的时间比预计的要长一倍。遗憾的是,我们的开发的app中漏洞频现,修复这些漏洞又耗费了大量时间。
工作中的失误让我尴尬万分,在众人面前颜面扫地,仿佛一切努力都付诸东流。
正是从那之后,我意识到了学习的重要性。我开始投入时间研究认证机制,如今已深入理解了OAuth、JWT、刷新令牌和失效等概念。我仔细研读了众多库中的认证代码,并基于多种语言和框架建立了认证流程。
一句老话说的好,“失败是成功之母”。每次失败的经历都为我带来了宝贵的启示。只要你愿意学习,几乎每次这样的经历都会让你有所收获。
我相信人可以在错误中吸取教训,从而实现进步。对于第一次犯错的人,我会尽量保持宽容,因为他们通常已经意识到自己的失误。
我也努力不去苛责那些屡教不改的人,因为他们可能也需要一些同情。
面对错误,如果你能做到以下四点,那么你将不断进步:
1. 坦然面对曾犯的错误,甚至自嘲一番。
2. 从中吸取教训。
3. 之后努力弥补错误,为自己正名。
4. 与他人分享你的经历,让他人也能从中受益。
关于犯错的宝贵价值,有一个名人轶事值得一提:20世纪初期,IBM的总裁托马斯·J·沃森面对一位因多次决策错误给公司带来重大损失的员工。当被问及是否要开除这名员工时,沃森回答道:“不,我刚刚花了60万美元培训了他,我怎么会让其他人雇佣他来获得他的经历呢?”
那么,你又曾经犯过哪些有趣的错误呢?不妨一起分享出来吧!
作者:Java高级架构师。想了解更多内容,请访问其链接: |