程序員,為什么千萬不要重寫代碼?
當(dāng)前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
我們常常和用戶交流討論,有一個話題經(jīng)久不衰:程序員入職新公司后接手已有的代碼,怎么處理? 程序員都有一顆工程師的心,所以當(dāng)他們到一片新的場地想做的第一件事就是,將舊的一切推倒重來。是的,他們決不會滿足于簡單的增量勞動。 或許這種微妙的心理定位可以解釋:為什么程序員進入新項目組后寧愿丟掉舊代碼重新寫,也不愿意修修補補,他們認為舊代碼簡直一團糟。 但是,事實上真是這樣嗎?你之所以認為舊代碼一團糟,其實是由編程的一個基本定律決定的,那就是:寫代碼容易,讀代碼難。 為什么你覺得舊代碼異常混亂?因為讀代碼更難 這大概就是代碼 Reuse 難以實現(xiàn)的原因,也可以解釋為什么你組里的每個人都喜歡用不同的功能將分割的字符串轉(zhuǎn)換成一個數(shù)組。比起猜測舊的功能是怎樣實現(xiàn)的,重新寫一個自己的功能要簡單和有趣多了。 作為這個公理的推論,你可以問問身邊的程序員他們正在奮戰(zhàn)的代碼怎么樣?" 簡直是一塌糊涂!" 他們肯定會這樣說。" 我簡直想推倒重來!" 為什么認為代碼這么糟糕呢?" 額,看看這個功能,竟然有兩頁長!完全不知道這些東西為什么在這里!完全不知道這些 API 是干什么的。" 他們會這樣回答你。 漫畫:讀別人代碼是一種怎樣的體驗? 曾經(jīng),Borland 的創(chuàng)始人 Philippe Kahn 當(dāng)初就是向記者們吹噓:Quattro Pro 會比 Microsoft Excel 要好用得多,因為它是從頭開始編寫的,全部都是新的源代碼! 但是,認為新代碼比舊代碼好簡直就是荒謬。舊代碼是已經(jīng)運行過的,測試過的。無數(shù)的 bug 在被發(fā)現(xiàn)前都上線運行過,發(fā)現(xiàn)之后程序員們可能在花了好些日子才修復(fù)了這些 bug。這種修復(fù)可能是一行代碼,也可能是幾個字符,無數(shù)的時間和精力都花在了這些 bug 修復(fù)上。 當(dāng)你決定拋棄這些舊代碼從零開始的時候,你也丟掉全部前任努力的結(jié)果。 新代碼一定比舊代碼好?NO,重寫可能會帶來更大的風(fēng)險 對技術(shù)領(lǐng)導(dǎo)者來說,重寫項目的代碼也是一個異常艱難的決定。因為從公司層面說,重現(xiàn)代碼甚至?xí){產(chǎn)品的市場競爭力。一旦決定重寫代碼,那么與競品相比,你可能落后了 2~3 年——在軟件行業(yè),這時間可夠長的。 你理想中的新代碼會帶來產(chǎn)品功能的提升▼ 但事實上,即便重寫的新代碼可以實現(xiàn)舊代碼的所有功能和需求,但是為產(chǎn)品帶來的市場競爭力只有邊際提升。因為重寫用的新技術(shù)、新語言、新框架并沒有給產(chǎn)品帶來質(zhì)的飛躍。 更不用說在重寫的漫長過程中可能會遇到一些意外情況,比如: 1、缺錢:資金鏈的斷裂 2、缺人:核心程序員離職 最終導(dǎo)致效果不佳:達不到原產(chǎn)品應(yīng)有的所有功能和需求,白白浪費了時間和金錢,也丟掉了市場競爭力。 所以重寫代碼意味著,你在把自己置身于非常危險的境地,可能幾年后你也寫不出比以前更好的代碼。你只是花了一大筆錢把已經(jīng)存在的代碼又寫了一遍。 當(dāng)你覺得眼前的舊代碼很爛時,該怎么辦? 你覺得舊代碼寫的很爛,那又怎樣呢?它們已經(jīng)上線,已經(jīng)在實際運行中經(jīng)受住了考驗。所以當(dāng)你發(fā)現(xiàn)前任留下的代碼亂七八糟的時候,不妨冷靜下來,從以下三個方面入手理解代碼、改善代碼: 1、代碼的結(jié)構(gòu)有問題 如果一段網(wǎng)絡(luò)代碼突然彈出了自己的對話框,應(yīng)該是 UI 代碼需要被處理。這些問題可以被解決掉,你要一次次小心地移動代碼,重構(gòu),改變接口。還需要一位細心的工程師立馬仔細地檢查這些改變是否有問題,從而不打擾到其他人。事實上,甚至比較大的結(jié)構(gòu)變化也可以不扔掉代碼來完成。 大牛程序員 Joel Spolsky 回憶說,曾經(jīng)在某個項目中,他和他的團隊花了好幾個月重新架構(gòu)在一點上:把代碼動來動去、清理、創(chuàng)建有意義的基類,并創(chuàng)建了模塊之間的完美接口。但是他們始終非常小心翼翼,并沒有產(chǎn)生新的 bug,也沒有丟掉任何舊代碼。 2、代碼的效率不高 曾經(jīng),Netscape 的渲染代碼被傳非常緩慢。但事實上,這只會影響該項目的一小部分,這部分是你可以優(yōu)化甚至重寫的。你完全不必重寫全部代碼。優(yōu)化速度的 1%工作量,會讓你獲得 99%的爆炸性提高。 3、代碼寫得很丑 有些代碼真的寫的很丑,比如 Joel 曾參與一個項目,開始用下劃線做開始的成員變量約定,但后來改用更標(biāo)準(zhǔn)的 "M_"。所以一半的功能用 "_" 開始,一半用 "M" 開始,這看起來真的很丑陋。但這個問題 5 分鐘就能解決,而不用從頭開始寫全部的代碼。 最后,你要記住,從頭開始再寫一遍并不意味著你會寫出比以前更好的代碼。因為你沒有參與到上一個版本的創(chuàng)建,所以你其實根本就不算有經(jīng)驗。一旦你準(zhǔn)備推倒重寫,你可能會再犯一遍版本一犯過的錯,甚至?xí)a(chǎn)生更多的新問題。 總結(jié) 面對糟糕的舊代碼,Keep Calm & Carry On! 在大型商業(yè)項目中,推倒重來是非常危險的行為。當(dāng)然,如果你是在做實驗,想到新算法可以隨時重寫。如果你跳槽、或剛接手一個新項目,面對看上去異?;靵y的舊代碼,請冷靜下來,忍住推倒重寫的沖動,想想上面這些經(jīng)驗之談。 該文章在 2023/11/10 11:46:04 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |