ShopBack 離職禮物——記事本、咖啡、襪子和個人卡片

在 ShopBack 的六個月:後端實習的尾聲

昨天是我在 ShopBack 的特別一天——Town Hall 日,六個月旅程的句點。帶著滿滿的感謝、回憶,和對接下來的期待。 在後端核心體驗團隊擔任軟體工程師實習生的這半年,我有機會參與各種有影響力的專案——從客服和 Watchlist Service,到 Notification Service,最後是 Travel 專案。能夠在高流量的真實系統中貢獻,留下第一個工程師的實際足跡,是非常難得的經歷。 剛開始的時候,我一邊摸索一邊學習,有時候會卡關,但一直都在進步,一直都很享受這個過程。即使只是觸及了大規模系統設計的皮毛,我很慶幸能成為這個充滿熱情、樂於合作的團隊的一部分。 透過這些經歷,我也深化了解決問題的方式——尤其是善用 AI 工具,做到從分析、Spec Review,到實作和報告的端到端流程。 感謝我的主管 George Lee,他的智慧和對「Work Smarter」的示範讓我獲益良多。也感謝 Shih-Yuan Chen 和林一豪在客服服務的帶領,Hao-Ping Shih 在 Notification Service 的支持,以及 Nick Chen 和 Tim Pei 在 Travel 專案的指導——還有所有在這段旅程中給予幫助和協作的人。 在 ShopBack 工作既鼓舞人心又令人興奮——置身於一個快速成長的公司和鼓勵主人翁精神與好奇心的文化中。 這一章結束了,但所有的學習、友誼和能量,都會帶著往下走。 向前,繼續前行。

November 20, 2025 · 1 分鐘 · Yi-Wei Lien
TypeScript monorepo 架構圖——微服務共享單一 repo

整個團隊都沒做過的那次遷移

背景 Shopback 的後端跑在一組微服務上——每個服務各自管理一個領域,透過網路溝通,各自擴縮容。這個架構有清楚的好處,也有顯而易見的成本:閒置的 container 仍然佔用分配的資源,就算當下沒在處理任何流量,機器費照算。 遷移到 monorepo 架構的動機之一就在這裡。TypeScript monorepo 讓多個服務可以共享同一個 process 和資源池,閒置的開銷縮小,機器費也跟著縮小。 我的子任務很具體:兩個服務原本透過網路互相呼叫 API,遷移之後改為在 monorepo 裡直接呼叫函式。聽起來是個重構。實際做起來,變成我實習期間最困難的一件事。 為什麼這件事很難 第一層困難是技術面。Shopback 的 TypeScript monorepo 結構主要是為 library 和共用套件設計的——這是 monorepo 最常見的使用情境。在這個結構裡跑真正的後端服務是另一回事。服務有自己的啟動生命週期、自己的 framework 相依、自己的 runtime 問題。Library 沒有這些。 團隊裡已經有工程師實作了部分 monorepo,但針對的是 library 使用情境。他們的程式碼我看得到,但沒辦法直接套用——他們設計時的假設對 running services 不成立,尤其是不同後端 framework(我們跨服務用了不只一種)在 monorepo 的依賴解析機制下如何互動。 還有版本相容性的問題。TypeScript monorepo 在 workspace 層級管理套件版本,而某些跨服務依賴有寫死的版本假設,合在一起跑就會出現衝突。這不是能用 grep 找到的 bug,而是跑起來才會炸、而且 stack trace 看不出所以然的那種問題。 Mentor 也沒有答案 第二層困難是:我的 mentor 也沒做過這件事。 這不是批評,就是事實。他有自己的工作,能幫的地方他都幫了。但針對我在解的這個遷移問題,他跟我一樣是從零開始。 所以我在一個技術問題上獨立工作,沒有團隊裡的前例,codebase 夠大、搞清楚相關部分要花真正的時間,而 framework 設定在內部也缺乏文件記錄。 兩三個 Sprint,我進度緩慢。我能看出需要做什麼,但真的讓實作跑起來是另一回事。 那條 Slack 訊息 最後我做了一件我一直猶豫要不要做的事:主動傳訊息給另一個團隊的資深工程師,他是我知道曾碰過 codebase 相鄰部分的人。 ...

November 1, 2025 · 1 分鐘 · Yi-Wei Lien
Shopback app 選擇面板 — 列表中的商家圖示

讓我重新理解「有影響力」的那個小功能

在 Shopback 有一個功能,我當時幾乎沒多想。 需求很單純:PM 有一個 app 內選擇面板的設計——一個讓用戶從列表中選取項目的小 UI 元件。設計稿上要在每個項目旁加上商家圖示。我的部分是跟前端團隊協作,確保後端整合正確接上。沒有什麼技術難度,純粹是協調工作:PM 有想法,設計有 spec,我幫忙把兩端串起來讓功能可以上線。 就這樣。 上線後,stakeholder 分享了數據。那個面板的進入率——看到頁面後實際點進選擇面板的用戶比例——從大約 10% 跳到 40% 以上,提升超過 30%。 我記得看到這個數字的時候,停頓了一下。 我原本隱隱持有的模型 在這之前,我對軟體工作的影響力有一個安靜的假設:影響力跟難度成正比。問題越難,就越重要。系統遷移、效能重構、不直觀的演算法——那才是「真正的工作」。UI 調整?清單上加幾個圖示?那幾乎算不上工程。 但數據不同意。 那個面板的改動影響了大量用戶的操作。它改變了人們打開 app 之後做的事。而我花了更多時間做的那些工作——跨服務 API 遷移、錯誤率降低——固然重要,但它們對用戶的可見影響是比較安靜的。基礎設施工作通常都是如此。 圖示是半天的協調工作,換來 30% 的行為轉變。 為什麼好設計是真正的工作 圖示真正做到的事,是給面板裡每個項目一個身份。加圖示之前,列表項目大概只是文字或通用條目。加了之後,每一行都有視覺錨點——一個在說「這是一個真實的東西、一個可辨識的東西、值得你注意的東西」的信號。用戶對這個信號做出了回應。 這不是新觀念。但「知道設計很重要」和「看著設計在一個你指得出來的指標上發揮作用」,是兩件不同的事。 我更新的東西是「工程貢獻」的範圍。讓後端整合正確接上,讓圖示在對的時間載入,又不破壞面板原本的行為——這是真實的貢獻。不性感,但它是讓 PM 願景可以上線的那個東西,而能上線的東西是推動數字的那個東西。 關於驕傲這件事 有一件事我沒有完全預期到:看到數字的時候,我的感受是什麼。 那種驕傲不是來自技術難度,而是來自效果。我碰過的東西改變了大量用戶打開 app 之後的行為。這和乾淨解決一個困難問題的滿足感不太一樣——沒那麼智識性,但更連接到真實的人。 我覺得這是軟體業值得追求的那種驕傲形式。不是「我解決了一件很難的事」,而是「我做的東西現在已經是某些人移動世界方式的一部分了」。即使那個移動很小——多點了一個按鈕,看到了之前沒看到的東西。 有影響力的工作不一定是房間裡最難的問題。有時候,它看起來就像一排圖示。

October 10, 2025 · 1 分鐘 · Yi-Wei Lien