跳到主要內容

Crescendo Lab: 如何在團隊成功導入 DDD 開發方式

 

2017 年成立的漸強實驗室,以打造世界級的 B2B 軟體服務公司為目標,專注於透過導入各種軟體服務來協助企業數位轉型,成立不滿兩年就已獲得跨國 AI 集團 iKala 的投資,在今年成立滿五週年前,漸強實驗室已是 LINE 唯一金級技術合作夥伴,同時也是全台橫跨最多垂直生態鏈,服務超過 400 家品牌商的 Martech 生態圈重要領頭羊。


前言

大家可能都遇過公司想要導入一些新技術或是新方法來解決團隊的問題,不論是公司驅動或是內部成員發起,導入的過程通常會面對重重關卡,而且失敗的例子也是時有所聞。本篇文章是漸強實驗室工程團隊成功導入 Clean Architecture 與 DDD 的架構,改善程式碼品質並提升開發效率的經驗分享:從發現問題、尋找解法、導入技術、到成功執行解決問題的過程。

先打預防針:本篇文章不會提到技術相關的深入內容,主要在探討如何導入一個新技術方法的過程,有哪些步驟? 效果如何? 以及學習到的經驗!

起因

時間回到 2021 年初,公司的產品 MAAC (https://cresclab.com) 已經在台灣市場上站穩龍頭位置,但是快速成長的代價,免不了技術債的堆積。隨之而來的是越來越多我們想推出的新功能,會因為技術債而需要被妥協的情況,另外團隊開發速度也越來越慢、工程師們開始對估算開發時程缺少信心,當時這是一個走了兩年左右的專案,工程團隊開始對於產品上日趨複雜的商業邏輯感到頭痛。

定義問題

產品上由於功能的開發與各種第三方串接甚至是客製化功能,商業邏輯越來越複雜,過去開發規範除了遵守框架規範外,其餘的規範比較鬆散,主要透過 code review 來達成共識。且過去有許多嘗試性的需求,商業邏輯堆疊越來越猖狂,各種程式碼片段東插西插,導致單元測試變得難以撰寫;越大範圍的改動,受影響範圍的評估變得相當困難。面對技術債當然是每個團隊的課題,當時我們認為應該要有一個更適合的 codebase 開發架構,幫助大家有效的梳理商業邏輯,讓新的部份不要再重蹈覆徹,舊的部份也能夠有系統地還上債務,所以定義了兩個要解決的問題:

1. Codebase 的管理架構要能夠支撐更大更複雜的擴張
2. 如何有效地維護以及管理複雜的商業邏輯

如何解決

關於解決這兩件事情我們開始了一些研究,最後我們認為在原本的框架中,透過 Clean Architecture 分層的概念來重新架構 codebase,然後結合 DDD 的概念來對複雜的商業邏輯建模,應該是條正確的道路。

於是我從最熟悉且邏輯最複雜的後端服務開始嘗試,公司後端使用的技術棧主要是透過 python 的 Django + Celery 框架,我們開始建立空白專案在本地環境嘗試,參考許多的網路文章,試著建立一個可相容現在專案且可擴展的分層架構。當時我們認為在團隊沒有相關經驗的情況下,直接整套 DDD 導入的成功機率應該是零。所以如何務實的,在框架上結合 Clean Architecture 配上 DDD 的概念有效的解決問題,是我們著眼的重點。

有了初步的結論後就開始導入的旅程~

導入的過程

大致上可以把導入過程分成四個階段:

1. 研究解決方法:

如上述,最初兩個月我們開始定義問題,且研究如何解決,重點在降低上手門檻,以及務實解決問題。

2. 種下導入的種子:

之後,開始跟團隊部分成員討論導入這些概念的構想,並且給了整個團隊幾場相關知識概念的分享並附上簡單的 demo 來幫助理解。在這個過程中,可以跟已經知道這些概念的成員做知識上的對齊,也讓沒聽過這些知識的成員有一個初始的概念。這是非常重要的一步,導入這種偏重心法的東西,重點要讓團隊理解方法帶來的好處,比起給方法先照著做,讓團隊成員能理解導入後的好處,會有驅動力上的不同。

3. 技術導入也需要的 MVP:

接下來開始對某一個後端的小專案,切了一個 branch,直接將整個專案試著改寫成新架構的樣子,來當成實際情境上的 demo,並且撰寫文件跟大家討論如何運用這些概念,並且擴展實作到現在的專案上,同時跟部分有興趣的成員在大專案上的小功能上也嘗試使用。這個時期是碰撞最多火花的,也是導入成敗的關鍵,透過 MVP 的概念來搜集團隊的回饋,然後在提出的架構上持續做調整。

這些調整非常重要,有提到務實的運用方法解決問題才是關鍵。所以在整個過程中,必須解釋為何把架構這樣設計、好處跟壞處是什麼,同時集合團隊成員的意見,根據大家過去開發上的經驗來討論。可能有當初沒考慮到的使用情境,也可能是大家認為還可以再簡化的做法,這是一個開始讓成員們體驗跟形成共識的過程,集合大家意見且在方法上做調整,可以讓這個架構更符合團隊的需求。

4. 實行與迭代:

開始有累積一些使用心得與共識後,開始在後端專案上全面實行,並且持續對遇到沒定義好的狀況做討論跟解決,同時訂了一些重構上的方案,基本上新架構在原本的 codebase 上是完全跟舊的 code 隔離的,所以當開發上遇到會影響到舊的 code 的時候,就將舊的 code 部分重構成新的設計,一開始實際執行的時候,因為有上手跟學習的成本,而影響一些開發進度,但大概在大家都執行過一次開發後,速度上基本就恢復正常。

結果與影響

結果

  • 分層架構對測試的幫助非常顯著,新架構有九成左右的測試覆蓋率。
  • 在新架構上的開發,工程師們普遍覺得開發體驗上有所提升,不管是測試或是商業邏輯的組織,都有正面的回饋。
  • 遇到舊 code 的部分 refactor 成效不如想像好,主要是 refactor 的時間與開發時程上的取捨。
  • 架構設計最後寫成 guideline,讓新加入的人可以學習。
  • 就目前來看,不論是擴展性跟商業邏輯的組織,當初定義的問題都有獲得很大的改善。

影響

  • 新加入的工程師需要花多一點力氣入門,直接影響新人上手開發的時間,需要再多花時間在這方面的知識上做同步。
  • 開始使用學習了之後,驅動大家接觸這方面的知識,團隊成員都會持續在這些方法上學習跟鑽研,有效的提升團隊軟體架構能力。

心得分享

當時是八人小團隊,且大家都有一定的開發經驗,溝通成本並沒有太高,再者當時向上負責的對象是 CEO ,但 CEO 並不管技術細節,沒有向上溝通的成本,這點是大家要注意的,因為向上溝通這件事情會直接影響導入新方法的成敗。

導入的過程其實蠻冗長的,一方面是有原本的事情要做,一方面是規劃上有種下種子讓知識發酵的過程,就結果來看,因為知識發酵的過程,兩三個禮拜就會看得到,主要還是要調節原本開發的節奏,讓成員有時間心力來接觸新知跟理解,這點時間的規劃上並沒有做得很好,不能期待所有人都會在工作外的時間接觸這些東西。

會特別利用種子讓知識發酵是這次導入會成功的一大原因,先用散播知識的方式,讓大家接觸這項技術,知道它的用途與好處,不只對日後導入有減少排斥的幫助,還會讓團隊在先理解之後帶來更多知識上的碰撞,加大導入過程的回饋進而提高成功率。

導入技術或是流程的時候,追求的是讓團隊成員自動自發地發展起來,重點首先放在要讓團隊理解這個技術跟流程到底在幹嘛,然後是讓團隊成員參與去做一些回饋跟決定,這樣可以提高成員的 ownership,同時保持彈性接收回饋持續調整跟優化,讓導入的東西是活的可變的,這樣大家才有心力去發展它。

當然還是有遇到阻力,新的方法的推動意味著開發習慣上的改變,可能是開發上要遵守的事情變多,或是寫 code 的習慣要重新調整等等,基本上這方面的阻力還是靠溝通,確保大家對遇到的問題有共識,並且對解決的方法有信心。

最後

導入的過程中,我從 Clean Architecture 書中截了兩段話,跟團隊成員分享,我覺得非常深刻,這邊也跟大家來分享:

The primary purpose of architecture is to support the life cycle of the system. Good architecture makes the system easy to understand, easy to develop, easy to maintain, and easy to deploy. The ultimate goal is to minimize the lifetime cost of the system and to maximize programmer productivity.

以及

Just remember: If architecture comes last, then the system will become ever more costly to develop, and eventually change will become practically impossible for part or all of the system. If that is allowed to happen, it means the software development team did not fight hard enough for what they knew was necessary.

身為開發者的你是不是也心有戚戚焉呢?


最後,感謝你的閱讀。
若你看完我們的分享,對我們的工作文化有興趣的話,🙌 一起加入漸強實驗室 🙌 成為我們未來的工作夥伴吧!

留言

這個網誌中的熱門文章

Kronos 如何做到世界級的成績

  由資深華爾街投資人領軍於 2018 年成立,Kronos Research 結合人工智慧、機器學習、高速網路等先進技術,透過進階的資料分析開發出獨家的量化交易預測模型,並使用全自動的交易策略自營,同時作為加密貨幣造市商,提供全球加密貨幣商品的即時報價。至今四年的時間,便擠身全球前五大的加密貨幣量交易團隊,創下 2021 年每日平均交易額 50 億美金,單日最高交易額 230 億美金的記錄。 人才和技術是 Kronos 最重要的兩大要素,團隊採開放式合作、解決問題導向、美式工作風格,Kronos 期許任何職位的夥伴,都能信任彼此、安心發問、共同快速解決問題。主管的管理策略,不同於傳統上對下的管理,而是以幫助者的角色,解決不同的需求,放大每個職位的生產力。我們希望這個產業在台灣能夠茁壯,讓台灣的技術人才知道有這個國際舞台可以發揮。 一窺量化交易技術及團隊 高頻交易跟一般大家熟知的交易最大的差距在於自動化。我們熟知的交易模式多半透過人工,由交易員綜合市場資訊後向交易所下單;高頻交易則是由程式自動判斷市場資訊並且下單。高頻交易多半關注短時間的市場波動,在收到市場報價後,在極短時間透過預先訓練的統計模型做出買賣決策。在高額報酬的背後,結合了不同專業:包括資料科學、統計與機器學習、底層系統優化、以及分散式系統。 高頻交易的流程,從 Market Data Parser 作為源頭持續搜集來自交易所的歷史資料,交由 Alpha Modeling 訓練出可預測未來短時間市場變動的模型。接著交易團隊撰寫策略程式,並依據策略需要套用選擇合適的 Alpha 模型,由極低延遲的交易程式向交易所下單。以下是各模塊的介紹: Market Data Parser(Data Team):高頻交易是一個資料驅動的行業,全面且高正確率的資料對於後續訓練很重要。Kronos Research 在全球十多個機房內有數百台服務器,每天 24 小時不間斷錄製來自交易所的報價單。面對每天 10TB+ 的巨量資料,data team 大量使用雲端分散技術以及自動化技術確保資料流的穩定。 Alpha Modeling(Alpha Team):在投資市場中,Alpha 代表著高於大盤的超額收益,Alpha Model 則代表預測將來市場的數學模型。Alpha Team 透過統計以及機器學習,以敏銳的邏輯跟觀...

實戰 Vibe Coding:利用 Amazon Q Developer CLI 打造經典平台跳躍遊戲

本篇文章將介紹如何透過 Amazon Q Developer CLI 建構一款完整的 2D 平台跳躍遊戲,從初始生成、功能增強,到最終打造出具備多關卡、多樣互動元素的遊戲體驗。特別的是,過程中開發者並未撰寫任何一行程式碼,僅透過自然語言指令與 CLI 對話完成所有工作,實踐「Vibe Coding」( 氛圍編碼 )。 本文作者為 Haowen Huang, AWS Senior Developer Advocate. 擁有 20 年以上電信、互聯網以及雲端運算等行業架構設計、技術及創業管理等豐富經驗,曾任職於 Microsoft、Sun Microsystems 等企業,專注為遊戲、電商、媒體和廣告等企業客戶提供 AI/ML、數據分析和企業數字化轉型等解決方案諮詢服務。 引言 本篇文章 ( English Version ) 將介紹如何使用 Amazon Q Developer CLI ,以 無需撰寫任何程式碼 的方式,打造一款經典的 2D 平台跳躍遊戲。透過「Vibe Coding」( 氛圍編碼 ) 的開發流程,開發者可以藉由簡單的語言提示詞 (prompt),逐步完成從遊戲雛型、功能擴充到完整關卡設計的開發流程。 整體開發流程將分為三個步驟: 1. 生成遊戲雛型 2. 功能擴充強化與畫面調整 3. 導入參考架構建立完整遊戲 環境建置 使用者需先安裝並設定 Amazon Q Developer CLI 。對於 macOS 使用者,可透過下列步驟完成安裝: 下載並安裝 Amazon Q Developer CLI 登入 Builder ID 完成認證 開啟終端機控制與無障礙設定 執行 q doctor 指令檢查 Amazon Q Developer CLI 是否安裝成功: 遊戲開發方面,建議使用 Python 語言與 Pygame 套件,可透過下列指令完成安裝;Pygame 提供以下功能支援: 畫面與動畫渲染 音效播放 鍵盤與搖桿輸入控制 物理模擬與碰撞偵測 多種媒體格式支援(圖片與音效) $ q doctor $ pip install pygame 第一步驟:初步生成遊戲雛型 透過簡單的一句 prompt,Amazon Q Developer CLI 結合 Pyg...

Navicat 17:AI 驅動資料管理的未來

在快速變化的資料管理領域,Navicat 始終站在創新與效率的最前沿。作為領先的資料庫管理與開發解決方案提供商,Navicat 再次以其最新版本 Navicat 17.2 展現了其在業界的卓越實力,讓使用者在資料管理中更具競爭優勢。 Navicat 17 推出標誌著資料庫管理技術的一次重要飛躍。該版本引入了一系列人工智慧 (AI) 驅動的功能,旨在進一步簡化操作流程並提升工作效率。這些功能讓使用者能夠輕鬆處理複雜的資料分析,並實現更智能的商業決策。 Navicat Premium 一直以來都是資料庫管理的佼佼者,該工具支援多達九種資料庫,包括 MySQL、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle、SQLite、Redis,以及 Snowflake。這樣的綜合性設計不僅消除了多平台切換帶來的困擾,還極大化了使用者的工作效率。 為提供更高效的協作工具,Navicat 雲端功能 (Navicat Cloud) 進一步提升了團隊合作的靈活性。使用者可以在雲端實現即時協作,讓團隊成員無論身處何地,都能共同編輯與管理項目,從而實現更高效的工作流程。 自創立以來,Navicat 已累積超過 500 萬次下載,並擁有超過 18 萬名使用者,包括多家知名的 Fortune 500 公司,如 Apple、Google、JP Morgan 等。這些成就不僅體現出 Navicat 的產品實力,更說明其在業界的深厚信譽。 Navicat 始終秉持創新與使用者導向的理念,致力於為資料管理提供最可靠、高效的解決方案。未來,我們將持續推出更多令人興奮的新功能,幫助使用者應對不斷變化的商業需求。 現在就探索 Navicat 17.2,感受 AI 技術帶來的全新資料管理體驗吧!欲了解更多資訊,歡迎造訪我們的官方網站: https://www.navicat.com.tw