Bug Fix 之后的隨筆
或許,Zero-Bug 不是一個(gè)目標(biāo),而是一種奢望。Bug fix 成為了程序員工作中的日?;顒?dòng),有人說(shuō),bug 的堆積導(dǎo)致了經(jīng)驗(yàn)的積累,真的是這樣么?
當(dāng)然,在bug fix 之后,回顧并不新鮮,至少在軟件開(kāi)發(fā)中是這樣的。在過(guò)去的十幾年里,這樣或那樣的敏捷開(kāi)發(fā)方法一直在贊揚(yáng)每個(gè)開(kāi)發(fā)沖刺階段結(jié)束時(shí)固定反思的優(yōu)點(diǎn)。實(shí)際上,這些是否真的發(fā)生在實(shí)施敏捷的組織中仍然是一個(gè)有待解決的問(wèn)題。影響服務(wù)的bug經(jīng)常輕易地轉(zhuǎn)化為令人瞠目結(jié)舌的損失或SLA罰款,Bug fix 之后的談話(huà)可能會(huì)趨向于緊張,在某種程度上,要么是為了平息混亂的局面,要么就是為了改變一個(gè)沒(méi)有人愿意深入討論的話(huà)題,討論轉(zhuǎn)移到補(bǔ)救措施上。
這種模式可能我們彼此都很熟悉。技術(shù)公司中的大多數(shù)事件分析流程看起來(lái)或多或少是類(lèi)似的。這就引出了一個(gè)重要的問(wèn)題: 是不是忽略了這個(gè)反饋循環(huán)中的一些東西,即如何處理可能有幫助的事件?

學(xué)習(xí)的問(wèn)題
如何學(xué)習(xí)個(gè)人的、單一的經(jīng)驗(yàn)教訓(xùn)?也就是說(shuō),什么構(gòu)成了一個(gè)事件,如何發(fā)現(xiàn)自己身處其中,以及這些事件究竟如何成為了個(gè)人或整個(gè)組織學(xué)習(xí)的素材。既然可以確定輸入是什么樣子的, 那么從事故中學(xué)習(xí)的過(guò)程是什么樣子的呢?學(xué)習(xí)的重點(diǎn)大多集中特定的方面,它涉及到如何確定需要學(xué)習(xí)的經(jīng)驗(yàn)教訓(xùn)。
本質(zhì)上, 需要明確促進(jìn)學(xué)習(xí)的因素,或者通常是抑制學(xué)習(xí)的障礙。對(duì)組織而言,也是如此。
洞見(jiàn)的類(lèi)型
洞見(jiàn)或許植根于心理學(xué)/認(rèn)知學(xué)的觀點(diǎn),而社會(huì)洞察力發(fā)生在團(tuán)隊(duì)和公司范圍內(nèi),當(dāng)我們更多地關(guān)注試圖理解事件和如何解決問(wèn)題的群體時(shí),會(huì)需要一些社會(huì)洞察力。還有所謂的“政治洞察力”,無(wú)論是在事件發(fā)生的前后。必須承認(rèn),在任何系統(tǒng)中,有人的地方就有江湖。

事故的分析
事件驗(yàn)證過(guò)程也會(huì)產(chǎn)生輸出,常見(jiàn)的事故報(bào)告、與軟件或基礎(chǔ)設(shè)施相關(guān)的補(bǔ)救措施、更新的文檔,或其他的團(tuán)體間通信。事件的其他所有細(xì)節(jié)都可能被認(rèn)為是一個(gè)黑匣子。事故是嚴(yán)重的Bug, 事故的分析在技術(shù)團(tuán)隊(duì)有著各自的方式, 在百度叫做case study。
開(kāi)發(fā)人員傾向于使用日志來(lái)幫助確定事件的“根本原因”,以及為bug fix 和架構(gòu)重構(gòu)生成需求規(guī)范。但隨著時(shí)間的推移,個(gè)別工程師已經(jīng)忘記了程序中的具體細(xì)節(jié)。復(fù)雜的技術(shù)系統(tǒng)通常不僅是代碼、計(jì)算、網(wǎng)絡(luò)和存儲(chǔ)的混合體,也是人和團(tuán)隊(duì)的混合體。很多時(shí)候,我們必須在極端的時(shí)間和壓力下作出關(guān)鍵的決定,權(quán)衡自己的行動(dòng)。事故分析的流程可以幫助我們創(chuàng)建和更新心理地圖。復(fù)雜軟件和基礎(chǔ)設(shè)施系統(tǒng)不斷發(fā)展,無(wú)論是在技術(shù)方面,還是在技術(shù)背后的團(tuán)隊(duì)方面,甚至是組織關(guān)于系統(tǒng)如何工作,都會(huì)隨著時(shí)間的推移而退化。任何一個(gè)在內(nèi)部 wiki 上找到四個(gè)架構(gòu)圖而感到沮喪的人,都經(jīng)歷過(guò)這種情況。
復(fù)雜技術(shù)系統(tǒng)中看起來(lái)互不相干、互不相連的組件之間存在聯(lián)系,人與團(tuán)隊(duì)之間的聯(lián)系存在未知和缺失,需要建立一個(gè)持續(xù)的溝通渠道。很多時(shí)候,大型事故可以表明組織已經(jīng)忽視了需要投入更多的領(lǐng)域,因?yàn)閺?fù)雜系統(tǒng)以某種不成熟的方式進(jìn)化了。

動(dòng)態(tài)修復(fù)
如果我們專(zhuān)注于收集、理解和分享一個(gè)子系統(tǒng)的技術(shù)狀態(tài),以及負(fù)責(zé)運(yùn)營(yíng)和維護(hù)它的優(yōu)先級(jí)、偏好、激勵(lì)和約束,對(duì)補(bǔ)救項(xiàng)目的靜態(tài)清單就讓位于這種豐富背景的搜索和發(fā)布。動(dòng)態(tài)修復(fù)的重點(diǎn)在于:
個(gè)人和團(tuán)隊(duì)如何處理事件以及如何協(xié)調(diào)
對(duì)系統(tǒng)的心理模型是什么,包括代碼的狀態(tài)、基礎(chǔ)設(shè)施和其他團(tuán)隊(duì)的期望,以及這些心理模型如何對(duì)決策做出貢獻(xiàn)
思維模式的分歧在事件中的影響
導(dǎo)致事件發(fā)生的因素有什么樣的背景,也就是說(shuō),面臨的其他壓力、激勵(lì)或環(huán)境可能更容易促進(jìn)與事件相關(guān)的因素。
在事故后分析之前已經(jīng)確定了負(fù)責(zé)決定這些修復(fù)的優(yōu)先級(jí)。在另一些情況下,需要進(jìn)一步的討論來(lái)獲得進(jìn)一步的背景,來(lái)充分理解所有潛在的補(bǔ)救措施以及它們?cè)诟鼜V泛背景下的相對(duì)優(yōu)先級(jí)。開(kāi)發(fā)、運(yùn)營(yíng)和安全團(tuán)隊(duì)與系統(tǒng)最為接近,從而推動(dòng)更具彈性、更靈活的解決方案,即戰(zhàn)略責(zé)任多于戰(zhàn)術(shù)責(zé)任。我們不僅關(guān)注零敲碎打的修復(fù),還要改善工作方式、相互之間及其設(shè)備之間的互動(dòng),以及對(duì)其復(fù)雜技術(shù)環(huán)境中的變化進(jìn)行有效溝通,這是一個(gè)可以產(chǎn)生最大勝利的地方。

小結(jié)
分析和理解Bug和故障的認(rèn)知模型和社會(huì)模型在業(yè)務(wù)中很少得到鞏固,而事后分析不只是側(cè)重于補(bǔ)救和預(yù)防,但事實(shí)并非如此,事后分析的唯一價(jià)值并非在于補(bǔ)救的列表。推動(dòng)事后分析的過(guò)程從專(zhuān)注于每個(gè)具體事件,發(fā)展為揭示我們的實(shí)踐、過(guò)程、激勵(lì)、局部環(huán)境以及復(fù)雜系統(tǒng)的真正本質(zhì)。
【關(guān)聯(lián)閱讀】
