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

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

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

作為 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!

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

《延伸閱讀》


蛻變敏捷開發組織並不難! AWS Amplify幫前端工程師從雲端快速建立REACT程式

台灣企業勢必需要明確轉型策略,搭配適合的雲端工具作為入場券,一來降低數位化門檻、二來減少摸索資源的浪費。
評論
shutterstock_1451794139.jpg
評論

打造敏捷開發流程、加速前後端工程師的協作效率,是許多企業在面臨疫情之後,認為亟需將彈性元素納入為企業文化當中。雲端運算服務領導業者 AWS 台灣,觀察到前端工程師主要負責處理最貼近用戶的 Web、行動應用程式,但他們往往需要與後端團隊合作過程,遭遇耗費大量討論時間,才能處理使用者介面事項。

為了降低前後端的溝通成本,有些前端工程師在掌握介面管理能力之後,開始橫跨到後端的伺服器、資料庫開發經驗,甚至進一步培養技能,成為能負責測試、安全、效能多面向的全端工程師。

有的人會透過 Side Project(利用業餘時間開發有興趣的專案)或參加 Hackathon(黑客松)方式,運用 AWS 雲端工具嘗試自行擴展後端,並建立簡單易用的工具程式。究竟,AWS 平台提供哪些資源幫助前端工程師擴展更多元的技能樹?

掌握入門教學!前端工程師如何將 REACT 程式快速上雲

前端工程師運用 AWS Amplify,快速在雲端建立 REACT 應用程式

事實上,AWS 的入門課程指出,運用 AWS Amplify 在雲端建立 React 應用程式及服務集,只需五個學習歷程,包含建立 React 應用程式、初始化本機應用程式、新增身份驗證、新增 API 和資料庫、新增儲存體。如果想快速了解 REACT 程式快速上雲的方法及示範教學,本文節錄 AWS QUICKSTART 學習資源內容,幫助前端工程師更快掌握重點。

首先,何謂 AWS Amplify?AWS Amplify 是一項全托管 Front-End Web & Mobile 服務,採取無伺服器模式,在後端建立、部署和託管單一頁面 Web 應用程式或靜態網站的 Git 型 CI/CD 工作流程,加速開發過程直接整合其他 AWS 服務。舉例來說,像是整合封裝好的 Library 資源、或運用一些 Components UI 軟體去配置後端,以及利用 Admin 的 UI 做資源上的管理。

透過 AWS 增加雲端技能 在組織發揮你的影響力

AWS Amplify加速Develop、Deliver 與 Manage流程

AWS Amplify 主要優勢展現在三大項工作階段,分別是 Develop、Deliver 和 Manage。Develop 部分可利用 CLI(Command-Line Interface)或 Admin UI 設定後端,使用 GraphQL 或 REST API 設定也是可行的,進而快速建構一個前後端專案。此外,開發者還能搭配 AWS 其他服務,例如使用 AWS Authentication 全托管認證服務,或 DataStore、Storage 等多項 Feature Categories。

到了 Deliver 階段,若是要透過 AWS Amplify 執行 Web Hosting 任務,可拆解出三個流程。首先是將 Repository 與 AWS Amplify 進行連結,這邊可整合 Amplify Console 提供的支援資源包含 Github、Bit Bucket、Gitlab、以及 AWS 的程式碼代管工具 AWS CodeCommit。一旦連結以後,開發者可透過自己的 Configuration,决定在各個不同的 Build 要執行什麽樣的指令,最後再透過 Deploy 方式,幫助工程師進行前端的 Hosting。

在最後一個 Manage 階段,開發者則可利用 AWS Amplify 的 Admin UI,以開啓瀏覽器方式,透過視覺化介面統一管理資源。例如在 Admin UI 介面左側選單,涵蓋 Content、User Management 的區塊,讓參與專案但沒有 AWS Console 權限的使用者,可利用 E-mail 方式邀請使用者進到 Admin UI,進行一些設定或觀看其他相關資源;甚至在 Set Up 區塊還有相關選項,例如要針對 Data Modeling 或 APP User 做權限管理,以及可連結到 AWS 其他服務。

運用開放資源 AWS Amplify Framework,打造高效能應用服務

AWS QUICKSTART 學習資源還介紹到另一個 AWS 提供的開放資源 Amplify Framework,一樣可利用 Amplify CLI 的方式,配置 Web 和行動應用程式的前後端,以及開發者需要用到的服務,讓應用程式更易於構建,並獲得安全、高性能的使用體驗。

Amplify CLI 一樣有支援多個不同 Category,例如較常使用的幾個 Comment Line,像是Amplify Init 指令做初始化或創建幾個不同資源;或是 Amplify Status 指令,隨時在開發過程查看各個 Category 狀態;甚至專案結束後,可利用 Amplify Delete 直接把 Amplify 所創建的資源做一次性删除。另外也可透過 AWS Amplify Client 利用比較抽象化方式,讓開發者直接利用 Component 實現想要完成的項目。

填寫表單 找到適合你的快速上雲服務與工具!

實際示範給你看,設定 React 程式可以如此簡單

假設前端工程師現在要快速部署一項有驗證功能(Authentication)還要搭配 Rest API、GraphQL、Analytics 等服務的應用,如何快速設定 React 程式?在 AWS QUICKSTART 的學習資源後半段,有詳細說明要啟動這類型專案的操作方法。

開發者可以先利用 AWS Lambda Function 結合 Amazon API Gateway 方式,創建出一個 Rest API,到了 Authentication 階段,則使用到 AWS Cognito 的服務,接著針對 GraphQL 需求,可利用 AWS AppSync 服務,以及最後如果有 Analytics 的需求,也可以串聯 Amazon Pinpoint 工具。Amazon Pinpoint 是一項彈性而可以擴展的行銷通訊服務,開發人員可利用 Amazon Pinpoint API 追蹤 Web 使用者的行爲,或是針對 APP 推送、電子郵件、簡訊點擊行為蒐集到具體的資訊。

在這整套流程示範之後,值得特別強調的是,AWS AppSync 是一項全托管的服務,能及時更新,甚至在使用者離線時仍可以持續去創建和修改數據。一旦設備連上線之後,這項應用程式就可重新連線,並接到後端同步數據,達成彈性、自動化擴展或減縮各式 API 的請求。

打造第一個你在 AWS 上的應用程式

AWS 最後強調,Amplify 是相當適合建構出一個靜態 Web、Apps 服務模式,例如說像是打造部落格,或者是一項 APP 內的代辦事項應用等;加上 Amplify 具全托管服務特色,可串聯上述 AWS 在雲端所提供的資源,都能在部署過程加以整合,加速開發流程及效率,並且有效節省開發資源。如果想用低門檻的雲端解決方案,其實前端工程師是能在開發流程更靈活配置資源,甚至為公司的商業、服務模式挖掘出創新價值。

了解更多:AWS 開發者系列