Image

從技術選擇到技術負債:選擇框架的隱藏成本

「所以,你想要用A框架,但又覺得B框架也不錯?」David挑眉問道,一臉的疑惑和一絲不易察覺的笑意。

「呃…對啊,我知道我現在比較熟悉A框架,但我總覺得B也很有潛力,未來也許能更好。」Lisa有些無奈地說。她剛進公司沒多久,還在摸索各種技術選擇的路上。

「讓我猜猜,」David假裝思索了一下,「你是不是也有想過要不乾脆兩個都用?或是,呃…混搭一下?」

「其實…我真的有這麼想過。」Lisa尷尬地笑了笑。

「哈哈,不用太糾結,」David給了一個爽朗的笑容,語氣中帶著一點玩笑,「這些困惑啊,都是新手入職的必經之路。我當年還比你更糟呢,連三個框架都想一起用,結果搞得自己焦頭爛額。」

「所以你怎麼選的?」Lisa好奇地問。

David神秘地笑了笑,「技術選擇可不是簡單的喜好問題,它牽扯到技術轉移的成本、技術負債的累積,還有整個團隊的長期發展。先來聽聽我的想法吧。」後頓了頓,開始解釋起來。他的語氣逐漸變得正經,像是打算揭示某個深藏多年的秘密一樣。「技術的迭代,是讓系統更完善的過程。隨著技術的進步,新框架、新工具層出不窮,但選擇什麼技術,卻不是一件隨便的事。」

技術的迭代往往被視為讓系統更完善的一個過程,這在開發者的職業生涯中屢見不鮮。隨著技術不斷更新,新的框架、工具和最佳實踐層出不窮。然而,在這一過程中,如何合理選擇技術,並考慮到「技術轉移與技術負債」所需的成本,成為了每個技術領導者和開發者必須面對的課題。這不僅影響到產品的最終交付,更關乎系統的長期可維護性和企業的競爭力。

技術轉移的成本與風險

技術轉移,無論是在一個新專案中導入新技術,還是將現有系統遷移至另一種技術堆棧,都存在著相當的風險和成本。這些風險和成本主要體現在以下幾個方面:

  1. 技術負債的累積:隨著技術的不斷更新,原本穩定運行的系統可能因為新技術的引入而變得不穩定。每次技術轉移都可能導致技術負債的累積,這些負債不僅體現在程式碼的複雜性增加,還包括對於舊系統的兼容性問題以及新技術的學習曲線。某位同事在公司內部曾經推動過一次從AngularJS到React的技術轉移,原本的系統在轉移過程中暴露出不少隱藏的技術負債,這些問題最終使得項目進度延遲了將近半年多,成本也比預期高出兩倍。
  2. 時間與人力成本的疊加:當一個團隊在面對技術轉移時,除了要理解新技術的結構和流程,還需要同時兼顧原有商業邏輯的實現。在這個過程中,學習曲線、維護成本以及系統中斷的風險都會成為需要重點考量的因素。如果我們將原有系統的重寫或大規模改動與新技術的學習成本疊加,實際上所需的時間和人力成本可能不止是「N倍」的簡單放大。這是一個非線性的增長過程,尤其是在一個持續營運的商業系統中,這種成本和風險是不可忽視的。

框架的選擇與技術的可持續性

選擇一個合適的技術框架是開發過程中的關鍵決策之一。當我們開始一個新專案時,必須要有一個長遠的眼光,從系統的持續運營和可擴展性的角度來評估技術的選擇。舉例來說,如果一開始用原生的JavaScript撰寫項目,後續要擴展到框架中進行開發,可能還有部分代碼可以沿用或改寫。但是,若是直接從一個框架跳到另一個框架,那麼這樣的轉移過程將會非常痛苦,因為這不僅僅是代碼重寫的問題,更涉及到團隊能力的再培養和商業邏輯的再實現。

某同事在前述的技術轉移中,也曾經探討過這樣的問題。在最初選擇框架時,他認為React相較於AngularJS有更好的發展前景和更活躍的社群支持,然而當時整個團隊已經對AngularJS的使用非常熟練,轉換至React意味著重新學習、重寫代碼、適應新的開發流程,這對於一個處於持續運營中的項目來說無疑是一個巨大的挑戰。最終,他們選擇保留現有框架,並逐步引入React的部分功能,從而減少了技術轉移的衝擊,維持了系統的…穩定性。但就結果來講,也只是引入了部分功能的「概念」…

技術選擇的策略:商業專案 vs. Side Project

技術選擇的策略應該根據項目的性質來做出不同的決策。在Side Project的情境下,選擇新技術進行嘗試往往是無可厚非的,這是一個鍛鍊技術能力並理解不同框架差異的好機會。然而

對於商業專案來說,技術選擇則需要更加謹慎和戰略性。商業專案的技術選擇往往不僅僅考慮技術本身的優劣,更重要的是要考慮技術的長期發展性、團隊的技術能力、以及最終對商業目標的達成度。

在這種情況下,技術的更新和轉移不僅僅是一個技術問題,更是一個商業決策問題。技術的選擇必須要服務於商業目標,如果一個框架或技術的轉換不能顯著提高系統的穩定性、可擴展性或開發效率,那麼這樣的轉換可能並不值得。除非現有的技術框架已經遇到瓶頸,無法有效擴展,否則技術轉移往往是一個風險極高的決策。

案例分析:某同事的經驗教訓

某同事曾經面對過一個類似的技術選擇困境。當時,他所在的團隊已經基於一個特定的框架(AngularJS)構建了大量的業務邏輯和前端頁面。隨著React在業界的崛起,他們也考慮過是否應該轉移到React,以期望在未來的開發中獲得更多的靈活性和更強的社群支持。然而,在評估了技術轉移的成本、學習曲線、現有系統的技術負債以及商業邏輯的兼容性後,他們最終決定保持現有的技術框架,同時在新功能的開發中引入React 部分的開發概念,以逐步過渡,這樣既保持了系統的穩定性,又在技術層面上獲得了創新。

這個案例說明了技術選擇與技術轉移的複雜性。在商業專案中,選擇一個框架或技術堆棧不僅僅是因為它『更好』或『更流行』,而是要考慮它是否適合當前的商業需求和技術能力,是否能夠在合理的成本和風險下達成既定的商業目標。

技術選擇的平衡藝術

技術選擇和技術轉移是一門需要平衡的藝術。它涉及到對技術本身的理解、對商業目標的清晰認知以及對團隊能力和長期維護性的深刻思考。無論是面對新技術的引入,還是考慮現有系統的技術轉移,都需要在短期效益和長期影響之間找到最佳的平衡點。

對於商業專案來說,技術選擇必須考慮技術轉移的成本、學習曲線、系統穩定性和長期維護性。在技術轉移的過程中,應該做好充分的準備,包括系統的評估、技術可行性分析以及對轉移過程中可能遇到的風險的預估。只有這樣,才能確保技術轉移不會成為技術負債的來源,反而能夠為系統的長期發展注入新的活力。

最終,技術的迭代應該是為了讓系統更加完善,而非累積新的問題。因此,在技術選擇的過程中,時刻保持對長期可維護性和系統穩定性的關注,是每一個技術領導者和開發者應該具備的基本素質。希望這樣的經驗能夠為我們在未來的技術選擇中提供一些參考和啟發。

技術負債是可以接受的,但你必須要還清它,否則它會積累並最終拖垮你的專案。
Martin Fowler - 重構|改善既有程式的設計

後記:

故事中的某同事,最後真的使用React 已經是在另外一個專案上面了…