跳到主要內容

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.

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


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

留言

這個網誌中的熱門文章

COC 通報處理說明公告 - 20240811 通報事件

各位好, COSCUP COC 服務小組於 2024 年 8 月 11 日接獲一件通報,內容涉及在會期干擾議程進行;並於會後持續發送私訊予會中結識的講者;同時,該行為人亦被紀錄於活動當日干擾志工執行勤務。 有關此事件的處理過程,詳如下述: COC 服務小組接到通報後,於 8 月 15 日正式成立專案小組進行討論與檢視相關資料。經查,通報內容與 COC 條款「持續干擾議程或活動的正常進行,無視工作人員或與會者的制止」相符。同一行為人於大會期間,另有兩位會眾通報類似事件,COC 服務小組皆已明確指正其行為並重申 COC 規範和界線。綜合此次會後通報,行為人經提醒仍多次抵觸 COC 條例。 有鑒於上述行徑已明確影響 COSCUP 其他會眾之權益,COC 服務小組將依照 COSCUP COC 之辦法記錄事件處理過程及結果、行為人資料等,於籌備團隊組長群資料夾建立文件,以俾後續籌備團隊審慎思量該名行為人未來的參與形式與程度。 在此,感謝會眾願意信任 COC 和 COSCUP 團隊並且將其所遇到的事件於會後彙整提供予我們。另本次通報中,通報人所提及之部分事項,因非屬 COSCUP 大會參與期間和相關行為,已建議通報人另行循其他正規途徑處理。在此聲明, COSCUP 的 COC 落實並非要拒任何人於門外,而是希冀透過針對行為本身的評估,為無論志工、社群協調人、講者、廠商與所有會眾營造舒適與安全的交流環境。 我們在乎所有人於 COSCUP 大會的各種參與體驗與感受,如果您在大會和籌組期間有相關困擾,籌備團隊志工將會竭力協助釐清,希望一同打造友善的 COSCUP 與會環境。 COSCUP 2024 COC 服務小組

COSCUP 2024 財務報告

COSCUP 2024 年度財務收支摘要 COSCUP 2024 Annual Income and Expenditure Summary For the period 2024/01/01~2024/12/31 收入 Revenues 金額 總計 企業贊助收入 NT$1,644,863 個人贊助收入 129,099 義賣收入 141,555 利息收入 6,199 周邊活動收入 59,200 總收入 Total Revenues NT$1,980,916 支出 Expenses 金額 總計 場地費 NT$714,338 義務工作人員費用 592,639 擺攤出訪費用 471,205 行銷費 353,631 餐飲費用 230,079 議程交流費用 229,525 設備與器材費 220,106 周邊活動費用 75,500 倉儲及物流費用 45,510 線上系統費用 41,728 保險費 15,228 雜支 3,017 捐贈開源社群 43,000 金流手續費 6,412 稅費與金流服務費 174,693 總支出 Total Expenses NT$3,216,611 期間淨收支 Net Income 2024/01/01~2024/12/31 -NT$1,235,695 支出科目 歷年結餘 歷年結餘 2006/2008~2018 結餘 NT$5,146,663 2019 結餘 NT$1,128,514 2020 結餘 NT$86,842 2021 結餘 NT$744,271 2022 結餘 NT$1,015,462 2023 結餘 -NT$198,240 2024 結餘 -NT$1,235,695 結餘款總計 NT$6,806,648

Early Guide to Joining COSCUP 2025 

Many people in the community are excited to find out how to participate in COSCUP 2025. We’ll share more updates soon, but here’s what we can share so far! You can join as a speaker, host a booth, organize a track, or become a sponsor. If you’re new to COSCUP, take a look at the article " COSCUP Unveiled " to learn more. Date and Location To be decided: The event may take place on a weekend in either August (2-3) or August (9-10). The planned venue is NTUST in Taipei, Taiwan. Be a Speaker Our early bird Call for Proposals (CfP) is going to open in the following few days. If you have a presentation about open culture or open-source technology, we want to hear from you. Submitting early means you’ll hear back sooner about your proposal. Host a Booth Open-source communities can set up booths to display their work and interact with attendees. This is a great way to share your community’s projects and connect with others. Businesses that support open-source can also host a booth ...