程序員應(yīng)不應(yīng)該背鍋?

上半年績(jī)效考核終于接近尾聲,我也有機(jī)會(huì)靜下心來(lái)回顧過(guò)去半年的經(jīng)歷。

來(lái) FB 工作雖然已半年多,但我骨子里依然是從畢業(yè)起就耳濡目染的那一套價(jià)值體系,任何在 FB 所經(jīng)歷的公司文化或者工程文化上的差異,都會(huì)帶給我強(qiáng)烈的體驗(yàn)沖擊和后續(xù)的思考,比如說(shuō)最近在腦子里揮之不去的程序員背鍋話題。

FB 曾經(jīng)有一句名噪一時(shí)的口號(hào):“Move fast and break things”。鼓勵(lì)員工快速大膽的去實(shí)踐自己的想法,而不需要過(guò)分擔(dān)心風(fēng)險(xiǎn)。我這半年的經(jīng)歷可以印證這句話所言不虛,這種精神確實(shí)是 FB 工程文化的一部分,就我所在的部門,就經(jīng)歷了大大小小的工程事故。但這并不表明 FB 在產(chǎn)品質(zhì)量的把控上存在明顯問(wèn)題,相反在我看來(lái), FB 的這套持續(xù)交付質(zhì)量控制系統(tǒng)非常有效,并不遜色于國(guó)內(nèi)的做法,這個(gè)話題可以再起一篇文章另談。

有一個(gè)線上事故印象特別深刻,據(jù)同事說(shuō),應(yīng)該是部門成立有史以來(lái)發(fā)生過(guò)的最嚴(yán)重的問(wèn)題,我全程參與事故的調(diào)試,修復(fù)以及復(fù)盤。在事故剛出現(xiàn),后臺(tái)數(shù)據(jù)狂飆的那一瞬間,我著實(shí)跟著緊張了一把,因?yàn)槟莻€(gè)版本里有我最大的一次代碼提交,在找出真正的事故原因之后我松了口氣,然后開(kāi)始持續(xù)高度密切關(guān)注背鍋的問(wèn)題。這么大的故障,這口鍋得多大多沉。后續(xù)發(fā)生的事每一件都偏離了我的預(yù)想。

修復(fù)

剛確認(rèn)事故的那一刻起,先是幾個(gè)人在一個(gè)群里討論事故細(xì)節(jié),之后越來(lái)越多的 Engineer 和 Manager 加入進(jìn)來(lái),討論很熱烈,鑒于影響規(guī)模之大這點(diǎn)倒不難想象。沒(méi)多久就確認(rèn)了原因以及提出好幾個(gè)解決思路,有幾個(gè) Engineer 主動(dòng)領(lǐng)了任務(wù)分頭并行。

整個(gè)過(guò)程中有幾個(gè)細(xì)節(jié)讓我很在意。

想象一下,如果支付寶線上版本全面 crash,后臺(tái)收到海量的用戶反饋,一星評(píng)價(jià),然后上了科技新聞,而所有的討論和處理僅僅發(fā)生在一個(gè)二十多人的群里,除此之外,感覺(jué)不到任何異樣,部門里其他團(tuán)隊(duì)依舊是在忙自己的活,好像什么都沒(méi)發(fā)生,這種氣氛是不是有些反常。我中途還和另一個(gè)團(tuán)隊(duì)哥們聊了一會(huì),他簡(jiǎn)單詢問(wèn)了下過(guò)程,嘿嘿一笑后就轉(zhuǎn)身和別人討論自己的需求去了。

群聊里,部門老大出現(xiàn)了一次,確認(rèn)事故原因已找到,修復(fù)方案已在執(zhí)行之后就消失了。下午五點(diǎn)多,熱鬧的群聊突然冷清了下來(lái),我知道這是因?yàn)橄掳嗟臅r(shí)間點(diǎn)到了。有個(gè)哥們還在群里留言,嘿,我要趕回家的巴士先撤了,等我到家再看下有什么我可以幫忙的。我第一反應(yīng)是黑人問(wèn)號(hào)臉,哥們膽子真肥,問(wèn)題還沒(méi)最終修復(fù),老大還在群里呆著,你就準(zhǔn)點(diǎn)下班了,還在群里高調(diào)宣布,幾個(gè)意思?我以前在國(guó)內(nèi)不是沒(méi)經(jīng)歷過(guò)這么大的事故,現(xiàn)在能記起來(lái)的是每個(gè)人臉上的凝重,和部門老大漲紅了臉的咆哮,而且我知道,誰(shuí)要是在那個(gè)時(shí)候準(zhǔn)點(diǎn)下班,一定會(huì)遭遇老板最炙熱的目光拷問(wèn)。

期間,還有個(gè)非常資深的哥們?cè)谌豪镩_(kāi)玩笑:“this review is gonna be so exciting!(emoji 笑臉)”,心情看著不錯(cuò)呀你!

當(dāng)天晚上十一點(diǎn)的時(shí)候,問(wèn)題還在,修復(fù)并沒(méi)有那么快。群聊里突然沒(méi)了一點(diǎn)動(dòng)靜,我知道這是因?yàn)樗X(jué)的時(shí)間到了。最后一條留言是,有個(gè)哥們說(shuō)自己晚上會(huì)再測(cè)試一把,確認(rèn)問(wèn)題真正修復(fù),還順帶解釋道,正好自己晚上要喝啤酒通宵看球。我覺(jué)得他這后面一句不說(shuō)會(huì)更好。

事后我回想起整個(gè)過(guò)程,也問(wèn)自己,如果大家在處理時(shí)都更嚴(yán)肅,更緊張,甚至部門老大當(dāng)眾發(fā)一頓脾氣,會(huì)不會(huì)問(wèn)題就解決的更快一點(diǎn)。好像并不會(huì),我認(rèn)為處理的核心在于,是否在積極尋找事故原因和修復(fù)方案,如果這條主線在高效的往前走,除此之外的方式和手段都于事無(wú)補(bǔ),都是多余的或者出于其他考量的。

復(fù)盤

我期待已久的復(fù)盤會(huì)議發(fā)生在大概一周之后,我知道事故一定由于一個(gè) Engineer 的代碼改動(dòng)導(dǎo)致的,期待見(jiàn)到這位背鍋俠。遺憾的是,在一個(gè)二十多人的會(huì)議室里,我確信這位大俠一定就在現(xiàn)場(chǎng),但就是不知道是哪一位。奇不奇怪?

會(huì)議的全程都在討論事故是如果繞過(guò)系統(tǒng)流程進(jìn)入線上的,在討論后續(xù)可能的方案來(lái)避免類似的故障。簡(jiǎn)單提到事故的原因是由于某某團(tuán)隊(duì)的某次改動(dòng)導(dǎo)致的,但僅此而已,只有團(tuán)隊(duì)的名字,不知道具體是誰(shuí),好像也沒(méi)人關(guān)心,會(huì)議的主要討論都集中在解決方案。部門的終極老大坐在一個(gè)角落的桌子上,如果不是看過(guò)照片,還真不知道他是哪位。老大主要的發(fā)言是: “我們確信某某團(tuán)隊(duì)的項(xiàng)目對(duì)我們是必須的,所以不該因?yàn)轫?xiàng)目的風(fēng)險(xiǎn)而質(zhì)疑,應(yīng)該想辦法來(lái)規(guī)避風(fēng)險(xiǎn)”。

后來(lái)我找機(jī)會(huì)和一位資深員工又聊了這個(gè)話題。他說(shuō)他經(jīng)歷過(guò)很多個(gè)復(fù)盤會(huì)議,會(huì)議的目的都不是去指責(zé)誰(shuí),而是如何避免類似的風(fēng)險(xiǎn)。有一次他參加的時(shí)候,有位苦主可能過(guò)于緊張,慢慢進(jìn)入了狀態(tài),說(shuō)自己不該這樣不該那樣,應(yīng)該怎樣怎樣,然后他就被大家集體制止了,說(shuō),hey,hey,stop!我們開(kāi)會(huì)不是來(lái)責(zé)怪你,別跑題了,我們還是繼續(xù)討論解決方案吧,然后哈哈哈的把尷尬帶過(guò)去了。

該不該背鍋?

就我以前經(jīng)歷而言,最高級(jí)別的線上故障肯定會(huì)有一個(gè)責(zé)任人,而且這位兄臺(tái)的年底績(jī)效考核基本上是完蛋了,沒(méi)有獎(jiǎng)金,沒(méi)有股票,更別提升值機(jī)會(huì)了。這種直接關(guān)聯(lián),事故與責(zé)任人一對(duì)一的懲罰機(jī)制意義在哪?它是否能有效降低程序員因?yàn)榇中亩鴮?dǎo)致故障的概率?

我明白所有程序員都會(huì)寫 bug,早些年的時(shí)候,我認(rèn)為 bug 雖然是無(wú)法避免的,但程序員可以憑借經(jīng)驗(yàn)的累積和技藝的提升來(lái)完全規(guī)避大的故障。隨著代碼越寫越多,經(jīng)歷也多了之后,我徹底否定了這一想法。我現(xiàn)在認(rèn)為,無(wú)論你多么資深,在某個(gè)領(lǐng)域沉浸了多少年,你始終有一定概率會(huì)寫出大 bug。來(lái) FB 之前和之后,我都見(jiàn)過(guò)我認(rèn)識(shí)的非常厲害的程序員,寫過(guò)因?yàn)榇中亩鴮?dǎo)致的大故障。當(dāng)然粗心的對(duì)象并不一樣,剛畢業(yè)的新手是在寫一個(gè)排序函數(shù)時(shí)粗心,經(jīng)驗(yàn)老道的程序員則可能是在重構(gòu)一個(gè)系統(tǒng)時(shí)粗心。

通過(guò)績(jī)效考核的懲罰能不能降低粗心的概率呢?能,在一天,一個(gè)星期或者一個(gè)月里絕對(duì)能,但長(zhǎng)期來(lái)看,這種壓力總會(huì)有松懈的時(shí)候,是人就會(huì)犯錯(cuò)。在關(guān)鍵的時(shí)候,我們更應(yīng)該依賴不斷打磨日漸成熟的系統(tǒng)和工具來(lái)檢測(cè)杜絕錯(cuò)誤,而不是依靠人的神經(jīng)系統(tǒng)。

因?yàn)橐淮蔚墓收隙穸硞€(gè)程序員一年的努力,顯得太不人道。

那事故的責(zé)任人是不是就可以高枕無(wú)憂,在事故之后依然可以沒(méi)事人一樣逍遙法外呢?這是絕無(wú)可能的,每個(gè)人都不是孤立的個(gè)體,所有的行為都會(huì)有其群體效應(yīng),每一個(gè)醒目的大 bug 都會(huì)在潛移默化中削弱你在團(tuán)隊(duì)里的影響力和認(rèn)可度,我們完全可以把事故的責(zé)任交給成熟的工程文化去消化,而且在這種文化里,一旦犯了錯(cuò),至少還有機(jī)會(huì)去彌補(bǔ),可以促使責(zé)任人用更大的成績(jī)來(lái)抵消過(guò)錯(cuò)。

事故的真正價(jià)值在于對(duì)現(xiàn)有系統(tǒng)漏洞的補(bǔ)充,從而規(guī)避未來(lái)風(fēng)險(xiǎn)。

最后值得一提的是,F(xiàn)B 很早前就將口號(hào)換成了“Move fast with stable infra”,意思是要穩(wěn)中求快。

程序員之路長(zhǎng)且遠(yuǎn),路上多荊棘,諸君還是應(yīng)該通過(guò)持續(xù)學(xué)習(xí)來(lái)提高自身姿勢(shì)水平,要穩(wěn)不要皮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ——讀禪小語(yǔ) 印度佛教與魏晉玄學(xué)的撞擊,產(chǎn)生了中國(guó)禪宗,禪是印度佛教中國(guó)化的終極產(chǎn)物。 對(duì)于宗教...
    正藍(lán)閱讀 704評(píng)論 1 2
  • 文/葉老巫 || 每天絮絮叨叨,堅(jiān)持日更, 第163篇 1、 不會(huì)寫,根本原因在哪?是你沒(méi)有材料,倉(cāng)庫(kù)是空的。沒(méi)有...
    葉兩步閱讀 1,226評(píng)論 8 41
  • 是我偏離了自己的初心, 還是一直在努力變成你想要的模樣。
    子卿的花期閱讀 175評(píng)論 0 0

友情鏈接更多精彩內(nèi)容