你只修改了2行代碼,為什么需要兩天時(shí)間?
“你只修改了2行代碼,為什么需要兩天?”
這是程序員最常碰到的質(zhì)問,表面看這是一個(gè)非常合理的問題,但它做了一些不合適的假設(shè):
- 代碼行數(shù) = 努力
- 代碼行數(shù) = 價(jià)值
- 每一行代碼價(jià)值都相同
所幸上面這些斷言都不是真的。
一個(gè)簡單的修復(fù),為什么需要花兩天時(shí)間?下面列舉了一些常見原因。
- 因?yàn)槿绾沃噩F(xiàn)問題的描述很模糊。程序員可能需要花幾個(gè)小時(shí)才能重現(xiàn) bug。有些開發(fā)人員會立即聯(lián)系報(bào)告 bug 的用戶,要求提供更多的信息再進(jìn)行分析。有些程序員會試著用提供的信息做盡可能多的事情。我知道有些開發(fā)者不喜歡修復(fù) bug,所以會不惜一切代價(jià)來擺脫困境,聲稱問題不能重現(xiàn)是一種非常好的逃避方式,它讓你看起來很想解決問題,但又不需要真的動(dòng)手。我知道用戶報(bào)告 bug 不容易,我也很感謝這樣做的用戶。我想通過在打擾用戶詢問更多細(xì)節(jié)之前,盡量多地使用所提供的信息來表達(dá)對報(bào)告 bug 用戶的感謝。
- 因?yàn)閳?bào)告的問題與特定功能有關(guān),但程序員不熟悉這塊功能。這塊代碼不是他開發(fā)的,以前也比較少接觸。如果去修的話,需要花費(fèi)更長的時(shí)間來先了解這塊的流程,以及這個(gè)問題怎么出現(xiàn)。
- 因?yàn)榛ㄙM(fèi)了時(shí)間去分析問題的真正原因,而不僅僅是看表面現(xiàn)象。如果一些代碼拋出了錯(cuò)誤,你可以直接用 try...catch 語句把它包起來,吞下錯(cuò)誤。這樣錯(cuò)誤就不見了,對吧?抱歉,對我來說,把問題掩蓋不等于解決問題。"吞下"一個(gè)錯(cuò)誤,很容易導(dǎo)致其他意想不到的副作用。我不希望在未來某個(gè)時(shí)間點(diǎn)上不得不來處理它。
- 因?yàn)槲曳治隽耸欠裼衅渌椒梢灾噩F(xiàn)這個(gè)問題,而不僅僅局限于報(bào)告提出的重現(xiàn)步驟。某一套重現(xiàn)步驟,容易讓錯(cuò)誤出現(xiàn)在某個(gè)地方,但實(shí)際上可能是更深層次的原因?qū)е隆U业絾栴}的確切原因,并查看所有到達(dá)那里的方法,可以得到更有價(jià)值的意見。諸如代碼實(shí)際是如何使用的,其他地方可能也有需要解決的問題,或者它可能由于代碼中的使用不一致,這意味著錯(cuò)誤是只在一個(gè)代碼路徑中引起,但不會在另一個(gè)出現(xiàn)。
- 因?yàn)槲一藭r(shí)間來驗(yàn)證代碼中是否有其他部分可能受到類似的影響。如果一個(gè)錯(cuò)誤導(dǎo)致了 bug,那么同樣的錯(cuò)誤也可能在代碼庫的其他地方發(fā)生,現(xiàn)在是檢查這個(gè)問題的最好時(shí)機(jī)。
- 因?yàn)楫?dāng)我找到問題的原因時(shí),我會尋找最簡單的方法來修復(fù),并將引入副作用的風(fēng)險(xiǎn)降到最低。我不想要最快速的修復(fù)方法,我需要一個(gè)不會在未來帶來混亂或引入其他問題的修復(fù)方法。
- 因?yàn)槲覐氐椎販y試了這個(gè)變更,并驗(yàn)證了受影響的不同代碼路徑的各種情況。我不想依靠別人來測試我修改的代碼是否正確。我不想將來某一天又出現(xiàn)一個(gè) bug,在我已經(jīng)淡忘這個(gè)的時(shí)候,還要回到這段代碼中來。上下文切換是昂貴的,而且很糟心。讓一個(gè)專門的測試人員不得不再次查看同一個(gè)問題的變更,是我想盡可能避免的。
我不喜歡修 bug,部分原因是會讓人覺得是我之前的代碼質(zhì)量不好造成的。我不喜歡修 bug,另一個(gè)原因是我更愿意去研究新的東西。
有什么比修 bug 更糟心的事情?那就是反復(fù)修復(fù)同一個(gè) bug。
我花了更長時(shí)間,是需要確保任何一次遇到的 bug 都被完全修復(fù),這樣就不需要再次去面對這個(gè) bug、再次分析原因、修復(fù)和測試。
英文原文:
https://www.mrlacey.com/2020/07/youve-only-added-two-lines-why-did-that.html
本文轉(zhuǎn)載自微信公眾號「 高可用架構(gòu)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 高可用架構(gòu)公眾號。





























