誤刪了公司數據庫,但我還是活下來了

專欄 | 九章算法

網址 | www.jiuzhang.com

上周我與同事們進行了一次關于職業生涯中搞砸了一些事情的簡短談話。這確實會淪為他人笑柄,卻更給我們帶來了珍貴的教訓。重要的是,我們應該分享那些曾經的錯誤,這樣其他人就可以從其中學習。下文是最近在我身上發生的例子。

1.為什么有如此多誤刪生產數據庫的事情發生?

幾個月前,Reddit上有一篇文章,講了一名初級開發人員在上班的第一天就刪除了生產數據庫的事。我們都很憷于讀到這類犯了這類無法讓人忘卻的大錯誤的文章。因為我們離這些也不遠,而大多數人都是“死里逃生”。

在我的第一份工作中,一位高級數據庫管理員在上班第一天就誤刪了生產數據庫。這類故事情節比比皆是。這個團隊從一個星期的備份中恢復了他導致的錯誤,并讓他繼續工作。十年后,他們依然將其作為笑點。

今年早些時候,我被派去檢查一個客戶的生產數據上的問題。他們進行了小范圍的非公開測試,結果網站上沒有顯示任何內容。我想查查是否是存在漏洞或是易損性問題導致了這一結果。

我通過了生產機器上的簽名環節,然后打開了數據庫。內容庫(articles table)內空空如也。這證實了我們在網站上看到的情況是真實的。

用戶庫(users table)內依然有用戶數據存在。真讓人奇怪。所以情況是我們丟失了所有內容,但是至少測試用戶的信息依然存在。我們給出的解釋是這是一個測試行為,所以這些事情有可能發生。

接下來的幾分鐘一片混亂。我不記得自己做了什么。我不認為自己笨到在控制臺上執行了刪除用戶庫的操作。但是事實就是這么發生了,現在后臺既沒有了內容庫,也沒有了用戶庫。這真實下了我一大跳。

然后我的大腦就開始轉動起來思考如何解決這個問題。我真的把用戶庫給刪掉了嗎?是的。我們存備份了嗎?沒有。我們應該如何告訴客戶這個事情?不知道。

我猶記得自己走向項目經理那里,坐在她身邊,向她解釋了發生了什么事情時的場面。因為我們的內容庫中沒有內容,這就是為什么網站上空空如也的原因。同時,我還刪除了用戶庫。他們現在需要重新邀請所有的用戶,如果他們能夠弄清楚誰是誰。

我回到了自己的辦公室,垂頭喪氣。

不過,我還是沒有接受這件事。我們一開始是如何失去這些東西的?

我開始不停地往深處想。半是為了否認這件事,半是想要挽回面子。不久,我注意到了一些重要事情。

在服務器上還存在著其他5個數據庫。其中一個數據庫的名字和我剛才看到的數據庫名字很像。

當我查看這個數據庫的時候,發現所有的內容都在里面。用戶庫也安然無恙。結果證明,是一個配置變動無意中改變了生產設置,使站點指向了一個全新的數據庫。我之前所看的用戶信息是什么?種子數據。

真是謝天謝地。早上的神經緊張和胃酸讓我覺得很不舒服,但是我們“恢復”了數據,并在壞消息傳開之前找到了真正的問題。

從這件事中可以吸取很多教訓。其中一點是關于最簡單原則:我們總是在做的備份,也許是開發人員最有成效的挽救藥。

2.繼續前進但不要沖得過前

我最近犯的一個錯誤不太引人注目。事實上,這是一個經由小錯誤所引起的小錯誤最終導致了一場混亂的故事。

我們面臨的是一個時間緊迫的項目。

在初次會議上,我們團隊一致認為完成它會花費比預定時間多一倍的時間。這個最后期限一開始就對我們產生影響,讓我寬松地通過了身份認證部分而留有更多時間去關注客戶所實際關注的功能設計。

我只是在一個單一頁面測試了身份驗證測試,但是當時還不了解它們將如何被組合在一起。

把它單列出來是我做的一個錯誤決定。我忽略了一些重要事情:

用戶在登陸之后會從cookie中加載內容,但是這個頁面卻試圖在沒有任何等待的情況下進行加載。根據事件的發生順序,用戶會得到帶來服務器的反映,說其是未經授權的。身份驗證也未檢查令牌是否過期。如果用戶不經常訪問這個網站。那么當其再一次訪問時,網站需要用戶登出再登入才會運行。令牌應該基于每個請求進行更新,但是我從未花費時間去理解其發生前后的規則。所以,這又產生了一個時間問題。如果我們同時發送了幾個請求,根據它們返回的順序,用戶會得到那個在后來的請求中無法使用的令牌。
復制代碼

我們匆匆忙忙地趕著項目,卻仍花費了比規定多一倍的時間。區別之處在于有更多的漏洞,并需要花更多時間去跟蹤并修復這些漏洞。

這使我感到窘迫。之后因為整件事情變得比較糟糕哦而讓我在公眾場合感到羞愧。

我想說的是:在此之后,我花費了時間去學習認證程序。我現在了解了OAuth、JWT、刷新令牌和到期行為。我仔細研究了其他人所編寫的身份驗證代碼。我能夠在不同的語言和框架中建構身份驗證程序。

3.將失敗轉化為未來的成功

這是我從那些表現糟糕的事情中所獲得的經驗。如果你愿意,那么幾乎所有好的結果都會由此而來。

如果有人能從自己的錯誤中汲取教訓,那么他就會比現在更優秀。我試著不去打擊那些第一次犯錯誤的隊友。他們通常都知道自己把事情搞的一團糟。

我也正嘗試不對那些不斷犯同樣錯誤的人施加壓力。他們仍然值得同情。

如果在錯誤中做到這4點,那么你就會不斷成長:

  • 嘲笑自己。

  • 從中汲取經驗教訓。

  • 改正錯誤。

  • 分享自己的錯誤,讓其他人也有所收獲。

最后,我想講一個關于錯誤價值的軼事。20世紀初,IBM的首席執行官托馬斯·J·沃森曾遇到過一名員工,這名員工的一系列糟糕決策讓公司付出了巨大代價。當沃森被問到是否會解雇這名員工時,他回應道:

“不,我剛在他身上花了60萬美元的培訓費。為什么要讓別人白白撿去這個便宜?”

-THE END-

歡迎關注我的微信公眾號:九章算法(ninechapter)。
精英程序員交流社區,定期發布面試題、面試技巧、求職信息等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449909.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449909.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449909.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

改良程序的11技巧

有很多理由都能說明為什么我們應該寫出清晰、可讀性好的程序。最重要的一點,程序你只寫一次,但以后會無數次的閱讀。當你第二天回頭來看你的代碼時,你就要開始閱讀它了。當你把代碼拿給其他人看時,他必須閱讀你的代碼。因此&#…

歷時四年,給Google提交的Android Framework Bug終于被Fixed了

歷時四年,Google終于修復了一個我發現的Android Framework Bug 2014年在做一個Android終端設備開發過程中,發現了一個Android Framework層的Bug,給Google提交了issue和解決方案,和外界傳言一致Google一般不太在意個人開發者提交的…

Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux ping命令用于檢測主機。 執行ping指令會使用ICMP傳輸協議,發出要求回應的信息,若遠端主機的網絡功能沒有…

前端布局神器display:flex

2009年,W3C提出了一種新的方案--Flex布局,可以簡便、完整、響應式地實現各種頁面布局。目前已得到所有現在瀏覽器的支持。 flex瀏覽器支持一、Flex布局是什么? Flex是Flexible Box的縮寫,翻譯成中文就是“彈性盒子”,用…

bind簡單轉發實驗

2019獨角獸企業重金招聘Python工程師標準>>> *主配置文件內容// [rootlocalhost /]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a local…

數據結構:塊狀鏈表

一、概述 有時候我們需要設計這樣一種數據結構:它能快速在要求位置插入或者刪除一段數據。先考慮兩種簡單的數據結構:數組和鏈表。數組的優點是能夠在O(1)的時間內找到所要執行操作的位置,但其缺點是無論是插入或刪除都要移動之后的所有數據&…

記賬本開發小計(四)

今天處理的是記賬本小軟件中的查詢功能,由于賬目的要求就是準確性,所以對于記賬本程序來說,模糊查詢并不適用,所以在這里只能是按照指定的條件來進行查詢所以我做的事按照時間進行查詢,為了方便進行處理,這…

Linux ps命令、Linux top命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux ps命令用于顯示當前進程 (process) 的狀態。 語法 ps [options] [--help][options] [--help] 參數: ps 的參數非常…

Prime Distance POJ - 2689 線性篩

一個數 $n$ 必有一個不超過 $\sqrt n$ 的質因子。 打表處理出 $1$ 到 $\sqrt n$ 的質因子后去篩掉屬于 $L$ 到 $R$ 區間的素數即可。 Code: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const…

給定a和n,計算a+aa+aaa+a...a(n個a)的和(大數據處理)

題目描述&#xff1a;給定a和n&#xff0c;計算aaaaaaa...a(n個a)的和。 輸入&#xff1a;測試數據有多組&#xff0c;輸入a&#xff0c;n&#xff08;1<a<9,1<n<100&#xff09;。 輸出&#xff1a;對于每組輸入,請輸出結果。 樣例輸入&#xff1a;1 10 樣例輸出&…

ssh和rsh的區別、Linux rsh命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ssh 和 rsh的區別主要有: 1 安全級別不同, 主要是ssh的密碼等都是加密傳輸,而且還有密鑰認證的機制, rsh明文傳輸. 而且沒有密鑰的機制.…

Java并發編程(多線程)中的相關概念

眾所周知&#xff0c;在Java的知識體系中&#xff0c;并發編程是非常重要的一環&#xff0c;也是面試中必問的題&#xff0c;一個好的Java程序員是必須對并發編程這塊有所了解的。 并發必須知道的概念 在深入學習并發編程之前&#xff0c;我們需要了解幾個基本的概念。 同步和異…

4、容器虛擬化網絡概述

Docker 網絡 Docker 的網絡實現其實就是利用了 Linux 上的網絡名稱空間和虛擬網絡設備&#xff08;特別是 veth pair&#xff09;。 Linux 網絡命名空間&#xff1a;https://www.jianshu.com/p/369e50201bce Linux虛擬網絡設備之veth&#xff1a; https://segmentfault.com/a/1…

Linux whoami命令、Linux su命令、Linux w命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux whoami命令用于顯示自身用戶名稱。 顯示自身的用戶名稱&#xff0c;本指令相當于執行"id -un"指令。 語法 whoami […

Weekly 10

Algorithm 1.Remove Element What 移除數組中的指定元素,返回處理后的長度sum,并且數組前sum長度的元素為處理后的元素,不用額外數組&#xff0c;O(1)。How 用快慢指針,快指針遍歷,遇到不等于指定元素的替換掉慢指針,然后慢指針前進一位即可。Key Codesclass Solution {public …

大數據計算:如何僅用1.5KB內存為十億對象計數

摘要&#xff1a;AddThis的數據分析副總監Matt Abrams在High Scalability上發表了一篇文章&#xff0c;介紹了他們公司如何應對大數據。Matt Abrams表示&#xff0c;AddThis僅僅用了1.5KB內存的內存就計算了十億個不同的對象&#xff0c;這與他們所使用的計算方法分不開的。 A…

C#關鍵字的個人理解與注釋

C#關鍵字注釋&#xff1a;abstract&#xff1a;抽象as&#xff1a;類型轉換&#xff08;返回轉換結果&#xff09;base&#xff1a;基類bool&#xff1a;布爾類型break&#xff1a;條件中斷語句byte&#xff1a;字節case&#xff1a;條件語句catch&#xff1a;異常捕獲后執行ch…

Linux declare命令、Linux tail 命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux declare命令用于聲明 shell 變量。 declare為shell指令&#xff0c;在第一種語法中可用來聲明變量并設置變量的屬性([rix]即為變…

詳解Nagios配置文件的邏輯關系

1.主配置文件/usr/local/nagios/etc/nagios.cfg a.定義了用戶和組 b.定義了某些具體參數 c.定義了配置文件和可以存放配置文件的文件夾 d.通過開頭的#號去注釋選項以達到關閉配置的效果 e.更改配置后&#xff0c;可以通過命令 /usr/local/nagios/bin/nagios –v /usr/local/na…

10 步讓你成為更優秀的程序員

這篇文章要介紹的&#xff0c;是我作為專業程序員這些年來學到的能真正提高我的代碼質量和整體工作效率的10件事情。 1. 永遠不要復制代碼 不惜任何代價避免重復的代碼。如果一個常用的代碼片段出現在了程序中的幾個不同地方&#xff0c;重構它&#xff0c;把它放到一個自己的函…