误泄露公司代码、疫情期间被裁,一个“菜鸟”程序员的生存日记
作者 | Adam Hughes
譯者 | Sambodhi
策劃 | Tina
編輯|燕珊
“我是如何從每一次失敗中成長起來的。”
身為程序員,我們往往都了解大神級程序員的故事。比如很小就開始編程,在 11 歲時就創建了第一家能盈利的網站,16 歲上大學、17 歲成立公司、23 歲成為億萬富翁。我們喜歡這些故事,喜歡這些英雄。他們以高產的編程項目和引領潮流的方式激勵著我們。從解決復雜的 NP 問題到籌集數百萬的 A 輪融資,他們似乎從來不會失誤。
不過,事實是這樣的:每一個開發者,甚至是這些超牛逼的大神級開發者,都會把事情搞砸,然后克服挫折。不同之處只在于規模:如果我們搞砸了,數據庫記錄就會被破壞;如果他們搞砸了,可能就是一個價值數十億美元的錯誤。為什么我們總是如此害怕錯誤?犯錯是件好事,沒有什么比失敗更好的老師了。但是,它也帶來了某種恥辱,沒有人愿意討論錯誤,因為沒有人愿意被看作是天才堆中的蠢貨。
但這樣的壓制是有后果的。當開發者犯錯時,經常會被認為是個人的失敗然后被指責。“Mike 忘記更新發布文檔”或者“Bill 選錯了分支”,這樣做其實適得其反。失敗通常是系統性的,是發現和糾正業務缺陷的好機會。沒有比失敗更好的老師了,我們不應該害怕談論失敗。本著這種精神,我坦白地指出作為一名初出茅廬的軟件開發者,我所犯下的三個最嚴重的失誤。接著,我將繼續解釋,我是如何從每一次的失敗中成長起來的,并且我感謝這每一次的失敗。
?
1 刪除了上千個網址
當我在一家大型金融機構工作時,我開發了一套清理 F5 網絡層中未使用路由的系統。在阻塞之前,F5 路由池只能支持大約 5000 個 URL。系統會自動監控這些 URL 流量,通知未使用的資源的擁有者,并清理掉它們,這樣 F5 系統就不會崩潰,不間斷的人工手動操作也能被解放出來。
該系統一直運行良好,但是,在某個星期天,我醒來后看到一封電子郵件,它說前一晚有 1000 條路由被刪除了,用戶抱怨說這些都是活動 / 實時 URL!
大家的周末就這樣被毀掉了,我們的團隊立刻行動起來。原來,一個舊的 .yaml 配置文件與應用容器部署在一起,它刪除了 1 周內而不是 1 個月內的非活動路由。慶幸的是,我設置了故障保護以防止刪除生產資源,但是問題仍然很嚴重,如果我的程序確實刪除了活動的資源,全公司范圍內高使用率的應用程序可能會因此中斷。
而結果發現,大多數資源若在一個星期內不活躍,那么一個月內仍然如此。換句話說,重要的應用不會在一個星期內都不活躍。因此,最終的損失是可控的:在被刪除的 1000 個 URL 中,只有幾個遭遇了投訴。但對我和我的經理來說,這也是巨大的指責和壓力,特別是在損失還不清楚的早期階段。所以我們建立了一個“作戰室”,把整個團隊的資源轉移到手工重建這些丟失的資源上。
為什么會這樣?
一開始,我認為這都是我的錯。但是,事后看來,這也是一種系統性失敗。第一,現有的 F5 路由管理系統不能滿足業務需求,而且沒有明確的備份 / 回滾策略,這是個大問題。另外,由于不必要的復雜部署過程,舊配置文件還掛在那里。這太官僚化了,很容易出問題。最終,這項關鍵任務交給了我一個人(也就是說,沒有代碼審查 / 團隊參與),并且 deadline 很寬松,這簡直是災難的“配方”。我們從未將這事看得有多重要。現在,隨著經驗的積累再回顧過去,可以看出這一結果似乎是不可避免的。
我是如何成長的?
我很感激那些站出來把我們從這場混亂中解救出來的同事們。而我的經理和最資深的開發者告訴我,他們對我這個工程師失去了信心,不讓我繼續參與重要項目時,我感到前所未有的職業壓力。換句話說,他們不相信我做了如此愚蠢的事,也不相信我可以繼續從事這個項目或者其他重要項目(他們最終撤回了)。
雖然很尷尬,但我承認我還是為此哭了。后來一位隊友帶我去喝啤酒,當我把談話內容轉述給他后,他說這很不公平,并且告訴我他和其他隊友都非常欣賞我。這一周我一直被壓得喘不過氣來,聽到有人這么說的時候,我終于忍不住了。另外主管還帶我去吃午餐,幫我度過難關。所有這些都讓我記憶猶新。
它使我了解到,盡管代碼有良好的控制,但基礎設施和數據卻常常沒有得到良好的把控。通過 DBMate 和 Terraform 等數據庫遷移工具管理系統中的這些組件,并將其與應用程序代碼的重要性同等對待,這一點非常關鍵。
對于生產環境,限制訪問也是至關重要的。例如,我甚至不會在 IDE 上保留一個本地主分支,而是傾向于鎖定團隊范圍內對非特性分支的所有直接推送。默認情況下,數據庫和云賬戶應該是只讀的,應該有明確的備份和恢復策略。例如,在我接下來的工作中,一個開發者意外地刪除了 prod S3 存儲桶中的文件。要不是我在一周前就設置好 S3 的版本控制策略(默認是關閉的 —— 亞馬遜太坑爹了!),我們可能會永久丟失。
最后,我上了最后一課,也是最重要的一課,那就是同理心。最近我的一位隊友也遇到了類似的情況:他將錯誤的代碼投入生產,而我們不得不手工修改一些數據。他對自己的所作所為感到內疚。借此機會,我明確地解釋,這是因為我們的部署數據遷移流程還不夠完善,這是我們團隊的失敗,而不是他的失敗,都是注定要發生的。與此同時,我還要提醒他,他所創造的偉大的功能,對我們和公司來說是多么重要。其錯誤只是提醒我們重新檢查我們的工具 / 流程,這也是促使他對解決方案做出貢獻。錯誤就是機會。
??
2 將代碼通過電子郵件發到公司外部
在離職之前,我把代碼通過電子郵件發給了自己。在對 Spring 庫進行了近一年的研究后,我創造了一些非常好的測試模式。我不想忘記這些好的想法,并打算在 Medium 博客上撰寫關于這些想法的系列文章。
約一個月后,在我新入職的第一天,我收到了令我臉色煞白的短信。“哥們,我們團隊出事了。有人把代碼通過電子郵件發到了公司外部,這涉及到法律問題。你知道是誰干了這事嗎?”
我立刻打電話給以前的經理,沒有人接。打電話給我的同事,無人接聽。法律部門已經介入,讓他們與我斷絕聯系。這真是太可怕了。新經理覺得不對勁,就問起我這件事。他過去是個律師,所以他讓我請律師以防萬一。我急切地給妻子的家庭律師打電話,討論了各種情況。由于牽涉到的是實用程序代碼,因此他們不太可能會“找我麻煩”,但可能性還是存在的。
那天妻子來接我時,心情很好。她問我第一天過得怎么樣,我回答說:“我想我搞砸了”,她臉色也變了。當我說完這件事的經過后,她像吃了定心丸一樣,告訴我,雖然真的很蠢,但是我們能挺過去。接下來的一個星期,我一直生活在迷霧中,直到我前公司的法務團隊找到我,告訴我,如果我簽署立即刪除那段代碼的協議,他們就不會起訴我。
為什么會這樣?
舊有觀念把我束縛住了,就這么簡單。盡管它看起來像一個邪惡的陰謀,但一個簡單的事實是,我對我創建的模式和實用程序感到非常自豪,我認為如果我失去了它們,我就會失去一些作為開發者的東西。我有一些宏偉的想法,那就是這樣可以產生一些有趣的博文,不知何故,我滿腦子只想這件事,利益超過了風險。
時至今日,我依然為這次事件給我的前隊友帶來的影響感到難過。這個錯誤百分之百是我造成的,但是他們肯定要處理掉這些后果。團隊的聲譽可能會受損,而處理審核問題則會給大家帶來很大的麻煩。這有損于我的職業聲譽,并令人遺憾地中斷了許多關系。
我是如何成長的?
最重要的是,此后我對公司郵件和內部交流變得非常謹慎。由于在 Slack 私信中的談話不當,在我新工作不到一周的時間里,就有幾個員工被解雇了。這是一件相當混亂的事情:他們都被解雇了,而我們其他人最終也不得不參加關于工作場所騷擾的強制性人力資源培訓。雖然你們公司的技術人員很不稱職,但是你要永遠相信他們對你的私信是完全可視的。
還有一點很重要,就是妻子和父母是如何在我身邊支持我的。面對這樣的局面,我感到很沮喪,頭腦一片空白,是他們的冷靜和理解使我回到現實。那時候,我處在生存危機的邊緣:我怎么能有博士學位,同時又那么粗心大意,還那么愚蠢呢?這樣會不會毀掉自己的未來?如果沒有家人的支持,我可能會走火入魔,使整個局面更加糟糕。他們的建議和指導讓我請來了律師,使我的處境不再那么糟糕。
YAGNI(you ain't gonna need it,你不需要它),它不僅僅是軟件的一個原則。這段代碼真的要再看一遍嗎?即便這會帶來多篇博文,也值得去冒險嗎?肯定不行。如果你已經離開了一份工作,或者為了重新開始生活,那就離開吧。不要帶走任何東西,別往后看,只往前看。
?
3 在新冠肺炎疫情期間失業
2019 年,我在一家比較成功的初創公司工作,致力于使路面的維護流程現代化。地方政府是我們的主要收入來源,我們還有風投的支持。這兩個來源都在 2020 年 3 月突然消失殆盡。我們的公司成功地在新冠肺炎疫情爆發中度過了幾個月,迅速轉向應對客戶需求的變化,并通過小企業救濟基金獲得了部分資金。
然而到了 7 月,我們顯然需要收縮。CEO 親自在 11 點半時在 Slack 上給我發了私信,讓我在 12 點打個電話,這讓我有種不祥之感。到 12 點 15 分的時候,我就被炒魷魚了。套用一句話:“Adam,我們讓你走,立刻生效。我們認為你做得很好;但是,由于目前的環境,我們打算裁員”。當天,我是 15 個被無情解雇的人之一,沒有任何警告,沒有離職費,甚至沒有 5 分鐘的時間向我的團隊道別(通話時 Slack 賬戶被禁用)。
半年前,我和妻子剛剛搬進我們的第一所房子,如果沒有穩定的收入,我們的財務狀況無法維持很長時間。
接下來的幾個月很殘酷,我哪兒也找不到工作。同病相憐的質量工程師充斥著市場。見鬼,我沒有辦法得到失業補償,這讓我很沮喪,于是我寫了一整篇博客文章。
怎么會這樣?
新冠肺炎疫情的爆發,直接導致了裁員和就業市場的低迷。但是這是一個慘痛的教訓:我被解雇了,因為我不是必不可少的。企業沒有我,生意也能順利進行。他們保留的工程師技術實力很強,但更重要的是,他們在核心業務系統上工作。讓他們走,可能會導致業務徹底崩潰。這就是我最大的錯誤。
作為一個新員工,他們將我安排在很酷的綠地項目(指的是一項不被先前工作限制的項目)上。我在 Jupyter 中從事機器學習管道和數據分析工作。但是我們的核心系統是普通的 Flask 應用。沒有人真的把我推到這個系統里,所以我保持距離。當它們出現錯誤時,我沒有解決它們。我沒有在他們慢下來時支持他們,也沒有人叫我這么做,所以我就沒有這樣做。我做的是很酷的新東西,事關公司的未來!但事實證明,這些系統,以及構建并支持它們的工程師,對公司來說,比我的價值更大。回想起來,現在已經很清晰了。反思 CEO 不得不做出的艱難決定,他還是做出了正確的讓我走人的決定。
我是如何成長的?
7 月至 9 月是艱難的,我在一個又一個的工作機會中被淘汰。尤其是我幾乎可以在一家影音公司找到我夢寐以求的工作,但是在最后一步被拒絕了(連續兩年),這讓我很沮喪。最后,我接受了一份無聊的 Java 工作。我意識到,無聊的軟件有直接的需求和專門的使用者,類似“這個按鍵不可用”之類的事情很容易解決,不需要博士學位也不需要多年的規劃。
干一些無聊的事情也能讓你變得更重要。從建立基礎設施到處理硬功能,我自愿做了很多核心工作。盡管我的目標不是成為系統本身的一部分(也就是說,我仍然希望實現自我控制),但這將使我更難離開。
同時,我也不再擔心面試和失業問題。我們只能盡力而為,努力做到最好,其他的我們都無法控制。你沒得到這份工作,或許是因為另一個人在某項技術上更有經驗,或許他們已經給出去了 Offer。又或者,你不像下一個候選人那樣好。丟掉你的自負,坦然接受所有的理由,恐懼就會消失。意識到自己可能不是、也永遠不會成為一名大神級的開發者,也沒什么關系。
最終我學到的最后一點就是不斷地尋求反饋。我做得怎么樣?為什么我要做 X 工作?X 對公司成功至關重要嗎?如果不重要,那是什么呢?別太執著于自己的工作。有時候,我們害怕反饋,因為它會挫傷我們的自尊心,但是接受反饋就是快速前進的道路。此外,如果你是拒絕給求職者反饋信息的眾多公司之一,那你應該為此感到羞恥。
這一切表明,失敗和障礙不僅是不可避免的,而且是必然的。個人的失敗很少是個人的過錯。失敗是一個機會——了解自己和身邊人的機會。你老板是想拆你的臺,還是拉你上來?朋友和家人是否支持你?這是一個多么好的時機,讓我們暫停、反思并修正方向。
作者介紹:
Adam Hughes,軟件開發者,泰拳愛好者。
原文鏈接:
https://levelup.gitconnected.com/my-3-biggest-failures-as-software-developer-6c16a171eaaf
往期推薦“搏一搏,單車變摩托!”華為天才少年耗時四個月,將自行車強勢升級為自動駕駛
強制雙休!傳騰訊光子調整加班機制,21 點前必須離開工位
那些對程序員來說傷害性不高但是侮辱性極強的瞬間…
?
直面Java第360期:如何使用樂觀鎖提升高并發的吞吐率并且不會超賣
深入并發第015期:多線程代碼如何Debug?
如果你喜歡本文,
請長按二維碼,關注?Hollis.
轉發至朋友圈,是對我最大的支持。
點個?在看?
喜歡是一種感覺
在看是一種支持
↘↘↘
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的误泄露公司代码、疫情期间被裁,一个“菜鸟”程序员的生存日记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 授于某个用户有写作业和调度作业的权限
- 下一篇: Codeforces Global Ro