寫碼容易,讀碼難:工程師,千萬別重寫程式碼

在大型商業專案中,打掉重來是非常危險的行為。當然,如果你是在做實驗,想到新算法可以隨時重寫。如果你跳槽、或剛接手一個新專案,面對看上去異常混亂的舊程式碼,請冷靜下來,忍住打掉重寫的衝動,想想下面這些經驗之談。
評論
評論

本文轉自虎嗅網 《程序員,為什麼千萬不要重寫代碼?》

作為 100offer 工程師拍賣的行銷,我們常常和用戶交流討論,有一個話題經久不衰:工程師入職新公司後接手已有的程式碼,怎麼處理?

大家都有一顆工程師的心,所以當他們到一片新的場地想做的第一件事就是,將舊的一切打掉重來。是的,他們決不會滿足於簡單的增加勞動量。

或許這種微妙的心理定位可以解釋:為什麼工程師進入新專案後寧願丟掉舊程式碼重新寫,也不願意修修補補,他們認為舊程式碼簡直一團糟。

但是,事實上真是這樣嗎?你之所以認為舊程式碼一團糟,其實是由一個基本定律決定的,那就是:寫碼容易,讀碼難。

為什麼你覺得舊程式碼異常混亂?因為讀代碼更難

這大概就是程式碼 Reuse 難以實現的原因,也可以解釋為什麼你組裡的每個人都喜歡用不同的功能將分割的字符串轉換成一個數組。比起猜測舊的功能是怎樣實現的,重新寫一個自己的功能要簡單和有趣多了。

作為這個公理的推論,你可以問問身邊的工程師他們正在奮戰的程式碼怎麼樣?「簡直是一塌糊塗!」他們肯定會這樣說。「我簡直想打掉重來!」

為什麼認為程式碼這麼糟糕呢?「看看這個功能,竟然有兩頁長!完全不知道這些東西為什麼在這裡!完全不知道這些 API 是幹什麼的。」他們會這樣回答你。

 

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

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

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

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

新程式碼一定比舊程式碼好? NO,重寫可能會帶來更大的風險

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

▲你理想中的新程式碼會帶來產品功能的提升

但事實上,即便重寫的新程式碼可以實現舊程式碼的所有功能和需求,但是為產品帶來的市場競爭力只有邊際提升。因為重寫用的新技術、新語言、新框架並沒有給產品帶來質的提昇。

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

1、缺錢:資金鍊的斷裂

 

2、缺人:核心工程師離職

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

所以重寫程式碼意味著,你在把自己置身於非常危險的境地,可能幾年後你也寫不出比以前更好的代碼。你只是花了一大筆錢把已經存在的程式碼又寫了一遍。

當你覺得眼前的舊程式碼很爛時,該怎麼辦?

你覺得舊程式碼寫的很爛,那又怎樣呢?它們已經上線,已經在實際運行中承受住了考驗。所以當你發現前任留下的程式碼亂七八糟的時候,不妨冷靜下來,從以下三個方面入手理解程式碼、改善程式碼:

1、程式碼的結構有問題

如果一段網路程式碼突然彈出了自己的對話框,應該是 UI 程式碼需要被處理。這些問題可以被解決掉,你要一次次小心地移動程式碼,重構,改變接口。還需要一位細心的工程師立馬仔細地檢查這些改變是否有問題,從而不打擾到其他人。事實上,甚至比較大的結構變化也可以不扔掉代碼程式碼來完成。

大牛工程師 Joel Spolsky 回憶說,曾經在某個專案中,他和他的團隊花了好幾個月重新架構在一點上:把程式碼動來動去、清理、創建有意義的基類,並創建了模塊之間的完美接口。但是他們始終非常小心翼翼,並沒有產生新的 bug ,也沒有丟掉任何舊程式碼。

2、程式碼的效率不高

曾經, Netscape 的渲染程式碼被傳非常緩慢。但事實上,這只會影響該專案的一小部分,這部分是你可以優化甚至重寫的。你完全不必重寫全部程式碼。優化速度的 1% 工作量,會讓你獲得 99% 的爆炸性提升。

3、程式碼寫得很醜

有些程式碼真的寫的很醜,比如 Joel 曾參與一個專案,開始用下劃線做開始的成員變量協定,但後來改用更標準的「M_」。所以一半的功能用「_」開始,一半用「M」開始,這看起來真的很醜陋。但這個問題 5 分鐘就能解決,而不用從頭開始寫全部的程式碼。

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

總結

面對糟糕的舊代程式碼 Keep Calm & Carry On!

在大型商業專案中,打掉重來是非常危險的行為。當然,如果你是在做實驗,想到新算法可以隨時重寫。如果你跳槽、或剛接手一個新專案,面對看上去異常混亂的舊程式碼,請冷靜下來,忍住打掉重寫的衝動,想想上面這些經驗之談。

《延伸閱讀》


不限車款、車齡都能升級?《車管+懶人包》輕鬆加入「手機車鑰匙」的行列

笠眾實業(IVTES)開發的「車管+」系統安裝與使用教學,升級手機車鑰匙的方法,全都整理在這裡了。
評論
評論

不限車款或年份的「車管+」手機車鑰匙,近期引起許多車主的興趣。畢竟不用花大錢換名牌車,就能夠輕鬆入門享有智慧便捷的 iKey,確實是相對無負擔的高 CP 值選擇。那麼使用「車管+」手機車鑰匙是否會要大幅度改車,其實也不必。這款由笠眾實業(IVTES)開發的「車管+」系統,只需要改裝一支「原廠車鑰匙」,並在車上安裝主機、手機下載「車管+1號」App,就可擁有一系列手機車鑰匙的智慧應用。

安裝簡易:可請一般汽修保養廠代勞或自行 DIY,下載 App 萬事俱足

從官網線上訂購並收到「車管+」的主機套組後,首先第一步就是改裝遙控器,再安裝車內主機,日後即可透過手機作為汽車門鎖的備份鑰匙。其實安裝產品並不難,車主可以選擇:

  1. 如果自己對從遙控器中取出電路板與電路焊接作業有信心,可以直接自行 DIY,笠眾會隨產品提供簡易量測工具與說明手冊,若車主對汽車電系了解也能自行安裝主機與收納。
  2. 可寄送遙控器請笠眾公司代為改裝隨產品回寄後,車主再請汽車保修廠安裝主機與收納。
  3. 現場安裝地點位於新北市中和,需與笠眾公司預約安裝時段。

遙控器改裝、車內主機安裝的作業原理可以參考上圖。特別要注意的是,「手機車鑰匙」僅作為汽車門鎖控制,並非日後用手機就能直接啟動汽車引擎。如果是「一鍵啟動」的車款,與車主的手機藍牙配對連線時即會對車內改裝電路板供應 3V 電源,所以可以直接啟動汽車;若為「插鑰匙啟動」車款,一樣要插入五金鑰匙啟動才能發動引擎,建議車內可預先放置五金鑰匙。

常用功能指南:共享車機 vs 虛擬鑰匙

除了上圖直接以 App 介面為例說明常用功能之外,入門使用者較容易混淆的通常是「共享車機」和「虛擬鑰匙」這兩種功能。其實這兩者的分別很簡單,可以參考下表一目瞭然:

簡單來說,如果是長期要一起共享汽車的親朋好友或是公務用車,建議使用「共享車機」,用車時藍牙會自動傳輸資料,便於車主或公務車人員管理,掌握汽車動向;如果是單次臨時用車,則建議使用「虛擬鑰匙」,用車者會拿到一組有時效性的虛擬鑰匙連結,可作為短期用車使用,不必大費周章面交實體鑰匙,就能共享用車。

使用者常見Q&A

使用者常見 Q&A 整理如上圖。人手一機、手機不離身的時代,升級為「車管+」的手機車鑰匙,利用手機藍牙自動感應功能,就能自動上解/鎖,解決過往要開車時才發現忘記拿鑰匙、下車後又忘記鎖車的問題。如果不小心被反鎖在車外,連自己的手機也被鎖在車內時,也可以借用他人的手機下載 App,登入帳號即可以解鎖。

另外,日後如果賣車或換新車,有需要的話也可以恢復成原本的車鑰匙;而且產品拆卸簡易,要移機至新車繼續使用也是沒問題的。想要體驗手機車鑰匙的新潮與便利嗎?不限車款、車齡都能輕鬆入門!

立即安裝車管+