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