事情保持得越簡單,越有機會成功。
這次是我職業生涯中首次負責規劃複雜的專案架構。有趣的是,一位來自 Java 開發背景(App)的同事試圖將他的經驗套用在這個專案上。儘管他的意圖可能是好的,但這次經驗讓我更加確信,每個技術領域都有其獨特性,而簡單和清晰仍然是我們應該追求的目標。
在 Day17、Day18 中,我詳細描述了如何在前端開發領域進行各種優化和改進。這些努力不僅提升了開發流程,也讓遺留代碼(legacy code)獲得了更長的壽命。隨著公司的規劃,也希望有個新產品,所以我被賦予了這項任務。因此,接下來的篇章將著重於新專案所帶來的挑戰。
某一天,主管找到我,讓我參與一個全新的專案。他還找來了另一名前端工程師和這個專案的 PM。
當 PM 第一次見到我們時,似乎有些猶豫。主管隨即對 PM 說:「不用擔心, 最強的都給你了 。我更擔心我們原來的產品因為人手不足而無法維護。」聽到這話,我深感自己已經贏得了主管和團隊認可,這讓我非常高興。
整題而言,針對這個新產品,有兩個前端工程師(包含我),跟一個 PM,然後是一個 app team 的成員(他們使用 Java, Swift) 來協助我們。
我們公司規劃的新產品是一個 web 應用程式,旨在讓各大企業會員,如麥當勞、王品等,能夠透過手機瀏覽器查詢會員點數和明細,而無需下載專門的應用程式。
由於我們公司是一家接案型企業,因此我們的客戶來自多個不同的行業,包括餐飲、百貨、民生用品等。這就要求我們必須能夠快速、靈活地滿足各種不同的客戶需求。
基於可能將來會有高達十幾家,甚至上百家客戶的理由,實在不可能採用一個客戶一個 repo 的做法,那這樣可能改會員系統的一個字,就要花非常多的時間,這樣可能要去一個一個翻著改,非常的不經濟。
所以為了達到這一目標,我們需要採用一種更靈活的專案管理模式。
後來那位 app team 的成員,正式來跟我們接觸了,他也貼了一篇文章,就是在介紹 Monorepo。以我來說是第一次遇到種 repo 的形式,還滿特別的。
在這裡就不詳細展開介紹,而只是簡單的介紹一下。
Monolith:將所有的功能放在單一 repo。這就是我們最常見的 repo 形式,開發時會把所有的東西都放在下面。
Multi-Repo:將個別功能放在不同 repo。相較前者有更多一點的優化,會把可以共用的部分抽出,做成獨立的 repo,以方便之後的專案共用。
Monorepo:將個別功能放在同一 repo 的不同 package。類似結合前兩者的優點,只要管理一個 repo 就好,其他共用的部分則是可以做成內部 library 以供共用。
更多資料:該用 Monorepo 嗎?比較 Monolith vs Multi-Repo vs Monorepo
一個專案不僅有一個層面要注意,遇到 Monorepo 是的很有趣的東西,我也嘗試找找,找到了很多解決方案,像是 Lerna、nxjs,我最後是比較喜歡 nxjs,畢竟它提供了非常完整的官方文件以及解決方案。
我原本是抱持著有機會的話想要採用 Nextjs(React 為基底的框架)來作為開發選擇以及還有著非常多的想法想做。
不過這個專案並不是只有我一個人在做,也要考量到另外一名同事的能力,而該名同事,就我觀察他對於 React 也不是這麼熟悉。
這些技術都會非常需要時間去研究,花的時間我相信非常值得,但是公司是接案公司,我想他們會希望專案可以盡快上線,不可能讓我們花這麼多時間去研究套件的用法等等。
而且即便研究完,還要讓另外一名同事理解,並且會使用,這樣才有辦法傳承下去,所以我決定要盡量越簡單越好,不要徒增難度。
最後,在幾多考量之下,我們最終討論後,還是使用 Mutil-repo 來作為這次開發的方式。
事情越簡單越好,這句話我覺得很重要,到現在經驗也已經超過三年,會覺得開發這種事情越簡單越好。越是多人協作,反而這件事情更重要。
當時規劃這次的新專案時,會那樣思考,最主要是在之前的經驗中,修改了公司原本的後台系統時,發現了非常多「炫技」般的寫法,雖然很厲害,但是卻會造成後續接手的人,出現閱讀困難的問題,需要花很多時間去理解。
所以在這次新專案時,我也考量到這點,不希望專案太複雜,會造成同事上手的困難以及未來有人要接手專案時的難度。
我也相信「每一次的機遇都是好的機遇,在未來為你帶來好處。」所以這次的 Monorepo 的機遇,也幫助到我更快上手我現職公司的新專案。甚至他們還在選擇解決方案時,我就按照我的經驗推薦 nxjs 給公司,最後也是採用 nxjs。
希望你會喜歡這篇文章,接下來會講講這個新專案的後續。
文章就說到這,有什麼想法或問題,歡迎隨時找我聊聊!
這篇文章也會同步發在 medium 上,如果有興趣歡迎追蹤我。
medium: https://medium.com/@hugh-program-learning-diary-js
email: u88803494@gmail.com