誤刪了公司數(shù)據(jù)庫,但我還是活下來了
上周我與同事們進(jìn)行了一次關(guān)于職業(yè)生涯中搞砸了一些事情的簡短談話。這確實會淪為他人笑柄,卻更給我們帶來了珍貴的教訓(xùn)。重要的是,我們應(yīng)該分享那些曾經(jīng)的錯誤,這樣其他人就可以從其中學(xué)習(xí)。下文是最近在我身上發(fā)生的例子。
為什么有如此多誤刪生產(chǎn)數(shù)據(jù)庫的事情發(fā)生?
幾個月前,Reddit上有一篇文章,講了一名初級開發(fā)人員在上班的第一天就刪除了生產(chǎn)數(shù)據(jù)庫的事。我們都很憷于讀到這類犯了這類無法讓人忘卻的大錯誤的文章。因為我們離這些也不遠(yuǎn),而大多數(shù)人都是“死里逃生”。
在我的第一份工作中,一位高級數(shù)據(jù)庫管理員在上班第一天就誤刪了生產(chǎn)數(shù)據(jù)庫。這類故事情節(jié)比比皆是。這個團隊從一個星期的備份中恢復(fù)了他導(dǎo)致的錯誤,并讓他繼續(xù)工作。十年后,他們依然將其作為笑點。
今年早些時候,我被派去檢查一個客戶的生產(chǎn)數(shù)據(jù)上的問題。他們進(jìn)行了小范圍的非公開測試,結(jié)果網(wǎng)站上沒有顯示任何內(nèi)容。我想查查是否是存在漏洞或是易損性問題導(dǎo)致了這一結(jié)果。
我通過了生產(chǎn)機器上的簽名環(huán)節(jié),然后打開了數(shù)據(jù)庫。內(nèi)容庫(articles table)內(nèi)空空如也。這證實了我們在網(wǎng)站上看到的情況是真實的。
用戶庫(users table)內(nèi)依然有用戶數(shù)據(jù)存在。真讓人奇怪。所以情況是我們丟失了所有內(nèi)容,但是至少測試用戶的信息依然存在。我們給出的解釋是這是一個測試行為,所以這些事情有可能發(fā)生。
接下來的幾分鐘一片混亂。我不記得自己做了什么。我不認(rèn)為自己笨到在控制臺上執(zhí)行了刪除用戶庫的操作。但是事實就是這么發(fā)生了,現(xiàn)在后臺既沒有了內(nèi)容庫,也沒有了用戶庫。這真實下了我一大跳。
然后我的大腦就開始轉(zhuǎn)動起來思考如何解決這個問題。我真的把用戶庫給刪掉了嗎?是的。我們存?zhèn)浞萘藛?沒有。我們應(yīng)該如何告訴客戶這個事情?不知道。
我猶記得自己走向項目經(jīng)理那里,坐在她身邊,向她解釋了發(fā)生了什么事情時的場面。因為我們的內(nèi)容庫中沒有內(nèi)容,這就是為什么網(wǎng)站上空空如也的原因。同時,我還刪除了用戶庫。他們現(xiàn)在需要重新邀請所有的用戶,如果他們能夠弄清楚誰是誰。
我回到了自己的辦公室,垂頭喪氣。
不過,我還是沒有接受這件事。我們一開始是如何失去這些東西的?
我開始不停地往深處想。半是為了否認(rèn)這件事,半是想要挽回面子。不久,我注意到了一些重要事情。
在服務(wù)器上還存在著其他5個數(shù)據(jù)庫。其中一個數(shù)據(jù)庫的名字和我剛才看到的數(shù)據(jù)庫名字很像。
當(dāng)我查看這個數(shù)據(jù)庫的時候,發(fā)現(xiàn)所有的內(nèi)容都在里面。用戶庫也安然無恙。結(jié)果證明,是一個配置變動無意中改變了生產(chǎn)設(shè)置,使站點指向了一個全新的數(shù)據(jù)庫。我之前所看的用戶信息是什么?種子數(shù)據(jù)。
真是謝天謝地。早上的神經(jīng)緊張和胃酸讓我覺得很不舒服,但是我們“恢復(fù)”了數(shù)據(jù),并在壞消息傳開之前找到了真正的問題。
從這件事中可以吸取很多教訓(xùn)。其中一點是關(guān)于最簡單原則:我們總是在做的備份,也許是開發(fā)人員最有成效的挽救藥。
繼續(xù)前進(jìn)但不要沖得過前
我最近犯的一個錯誤不太引人注目。事實上,這是一個經(jīng)由小錯誤所引起的小錯誤最終導(dǎo)致了一場混亂的故事。
我們面臨的是一個時間緊迫的項目。
在初次會議上,我們團隊一致認(rèn)為完成它會花費比預(yù)定時間多一倍的時間。這個最后期限一開始就對我們產(chǎn)生影響,讓我寬松地通過了身份認(rèn)證部分而留有更多時間去關(guān)注客戶所實際關(guān)注的功能設(shè)計。
我只是在一個單一頁面測試了身份驗證測試,但是當(dāng)時還不了解它們將如何被組合在一起。
把它單列出來是我做的一個錯誤決定。我忽略了一些重要事情:
用戶在登陸之后會從cookie中加載內(nèi)容,但是這個頁面卻試圖在沒有任何等待的情況下進(jìn)行加載。根據(jù)事件的發(fā)生順序,用戶會得到帶來服務(wù)器的反映,說其是未經(jīng)授權(quán)的。
身份驗證也未檢查令牌是否過期。如果用戶不經(jīng)常訪問這個網(wǎng)站。那么當(dāng)其再一次訪問時,網(wǎng)站需要用戶登出再登入才會運行。
令牌應(yīng)該基于每個請求進(jìn)行更新,但是我從未花費時間去理解其發(fā)生前后的規(guī)則。所以,這又產(chǎn)生了一個時間問題。如果我們同時發(fā)送了幾個請求,根據(jù)它們返回的順序,用戶會得到那個在后來的請求中無法使用的令牌。
我們匆匆忙忙地趕著項目,卻仍花費了比規(guī)定多一倍的時間。區(qū)別之處在于有更多的漏洞,并需要花更多時間去跟蹤并修復(fù)這些漏洞。
這使我感到窘迫。之后因為整件事情變得比較糟糕哦而讓我在公眾場合感到羞愧。
我想說的是:在此之后,我花費了時間去學(xué)習(xí)認(rèn)證程序。我現(xiàn)在了解了OAuth、JWT、刷新令牌和到期行為。我仔細(xì)研究了其他人所編寫的身份驗證代碼。我能夠在不同的語言和框架中建構(gòu)身份驗證程序。
將失敗轉(zhuǎn)化為未來的成功
這是我從那些表現(xiàn)糟糕的事情中所獲得的經(jīng)驗。如果你愿意,那么幾乎所有好的結(jié)果都會由此而來。
如果有人能從自己的錯誤中汲取教訓(xùn),那么他就會比現(xiàn)在更優(yōu)秀。我試著不去打擊那些第一次犯錯誤的隊友。他們通常都知道自己把事情搞的一團糟。
我也正嘗試不對那些不斷犯同樣錯誤的人施加壓力。他們?nèi)匀恢档猛椤?/p>
如果在錯誤中做到這4點,那么你就會不斷成長:
嘲笑自己。
從中汲取經(jīng)驗教訓(xùn)。
改正錯誤。
分享自己的錯誤,讓其他人也有所收獲。
最后,我想講一個關(guān)于錯誤價值的軼事。20世紀(jì)初,IBM的首席執(zhí)行官托馬斯·J·沃森曾遇到過一名員工,這名員工的一系列糟糕決策讓公司付出了巨大代價。當(dāng)沃森被問到是否會解雇這名員工時,他回應(yīng)道:
“不,我剛在他身上花了60萬美元的培訓(xùn)費。為什么要讓別人白白撿去這個便宜?”