爲何程序員千萬不要重寫代碼?

你所作的事情,也許暫時看不到成果,但不要灰心或焦慮,你不是沒有成長,而是在紮根。程序員

圖片來自網絡算法

0 前言編程

程序員都有一顆工程師的心,因此當他們到一片新的場地想作的第一件事就是,將舊的一切推倒重來。是的,他們決不會知足於簡單的增量勞動。數組

或許這種微妙的心理定位能夠解釋:爲何程序員進入新項目組後寧願丟掉舊代碼從新寫,也不肯意修修補補,他們認爲舊代碼簡直一團糟。網絡

可是,事實上真是這樣嗎?你之因此認爲舊代碼一團糟,實際上是由編程的一個基本定律決定的,那就是:寫代碼容易,讀代碼難。架構

1 爲何你以爲舊代碼異常混亂?由於讀代碼更難框架

這大概就是代碼Reuse難以實現的緣由,也能夠解釋爲何你組裏的每一個人都喜歡用不一樣的功能將分割的字符串轉換成一個數組。比起猜想舊的功能是怎樣實現的,從新寫一個本身的功能要簡單和有趣多了。測試

做爲這個公理的推論,你能夠問問身邊的程序員他們正在奮戰的代碼怎麼樣?「簡直是一塌糊塗!」他們確定會這樣說。「我簡直想推倒重來!」優化

爲何認爲代碼這麼糟糕呢?「額,看看這個功能,居然有兩頁長!徹底不知道這些東西爲何在這裏!徹底不知道這些API是幹什麼的。」他們會這樣回答你。視頻

漫畫:讀別人代碼是一種怎樣的體驗?

曾經,Borland的創始人 Philippe Kahn當初就是向記者們吹噓:Quattro Pro會比Microsoft Excel要好用得多,由於它是從頭開始編寫的,所有都是新的源代碼!

可是,認爲新代碼比舊代碼好簡直就是荒謬。舊代碼是已經運行過的,測試過的。無數的bug在被發現前都上線運行過,發現以後程序員們可能在花了好些日子才修復了這些bug。這種修復多是一行代碼,也多是幾個字符,無數的時間和精力都花在了這些bug修復上。

當你決定拋棄這些舊代碼從零開始的時候,你也丟掉所有前任努力的結果。

2 新代碼必定比舊代碼好?NO,重寫可能會帶來更大的風險

對技術領導者來講,重寫項目的代碼也是一個異常艱難的決定。由於從公司層面說,重現代碼甚至會威脅產品的市場競爭力。一旦決定重寫代碼,那麼與競品相比,你可能落後了2~3年——在軟件行業,這時間可夠長的。

3 你理想中的新代碼會帶來產品功能的提高

但事實上,即使重寫的新代碼能夠實現舊代碼的全部功能和需求,可是爲產品帶來的市場競爭力只有邊際提高。由於重寫用的新技術、新語言、新框架並無給產品帶來質的飛躍。

更不用說在重寫的漫長過程當中可能會遇到一些意外狀況,好比:

一、缺錢:資金鍊的斷裂

二、缺人:核心程序員離職

最終致使效果不佳:達不到原產品應有的全部功能和需求,白白浪費了時間和金錢,也丟掉了市場競爭力。

因此重寫代碼意味着,你在把本身置身於很是危險的境地,可能幾年後你也寫不出比之前更好的代碼。你只是花了一大筆錢把已經存在的代碼又寫了一遍。

4 當你以爲眼前的舊代碼很爛時,該怎麼辦?

你以爲舊代碼寫的很爛,那又怎樣呢?它們已經上線,已經在實際運行中經受住了考驗。因此當你發現前任留下的代碼亂七八糟的時候,不妨冷靜下來,從如下三個方面入手理解代碼、改善代碼:在這裏順便給你們推薦一個架構交流羣:617434785,裏面會分享一些資深架構師錄製的視頻錄像

一、代碼的結構有問題

若是一段網絡代碼忽然彈出了本身的對話框,應該是UI代碼須要被處理。這些問題能夠被解決掉,你要一次次當心地移動代碼,重構,改變接口。還須要一位細心的工程師立馬仔細地檢查這些改變是否有問題,從而不打擾到其餘人。事實上,甚至比較大的結構變化也能夠不扔掉代碼來完成。

大牛程序員Joel Spolsky回憶說,曾經在某個項目中,他和他的團隊花了好幾個月從新架構在一點上:把代碼動來動去、清理、建立有意義的基類,並建立了模塊之間的完美接口。可是他們始終很是當心翼翼,並無產生新的bug,也沒有丟掉任何舊代碼。

二、代碼的效率不高

曾經,Netscape的渲染代碼被傳很是緩慢。但事實上,這隻會影響該項目的一小部分,這部分是你能夠優化甚至重寫的。你徹底沒必要重寫所有代碼。優化速度的1%工做量,會讓你得到99%的爆炸性提升。

三、代碼寫得很醜

有些代碼真的寫的很醜,好比Joel曾參與一個項目,開始用下劃線作開始的成員變量約定,但後來改用更標準的「M_」。因此一半的功能用「_」開始,一半用「M」開始,這看起來真的很醜陋。但這個問題5分鐘就能解決,而不用從頭開始寫所有的代碼。

最後,你要記住,從頭開始再寫一遍並不意味着你會寫出比之前更好的代碼。由於你沒有參與到上一個版本的建立,因此你其實根本就不算有經驗。一旦你準備推倒重寫,你可能會再犯一遍版本一犯過的錯,甚至會產生更多的新問題。

5 面對糟糕的舊代碼,Keep Calm & Carry On!

在大型商業項目中,推倒重來是很是危險的行爲。固然,若是你是在作實驗,想到新算法能夠隨時重寫。若是你剛接手一個新項目,面對看上去異常混亂的舊代碼,請冷靜下來,忍住推倒重寫的衝動,想一想上面這些經驗之談。

相關文章
相關標籤/搜索