---
# System prepended metadata

title: Experience

---

[TOC]



## 精簡版自我介紹

嗨，我是吳家宏，在成為後端領域專家這條路上，不斷努力精進中。

在上一份工作中，我們團隊負責開發維護擁有數百萬會員的多個系統。
主要是運用Laravel、Koa (Node.js) 和 React框架開發會員系統，
搭配使用MySQL、PostgreSQL、MongoDB、Redis 和 RabbitMQ作為資料庫、快取和佇列管理伺服器。
我們利用Docker進行服務的容器化，並在AWS上配置伺服器，
我們代碼主要利用Github託管
API的文件主要工具是Postman，
在團隊中，我主要負責的工作有4個
1. 產品經理討論產品功能實作方向
2. 功能重構
3. 技術問題處理
4. 系統優化
一般狀況下，我會獨立開發，但也曾組織兩位初級工程師共同進行模組開發。

我原本是土木工程學系，但大學三年級的Web GIS系統課程，發現了自己對寫程式的熱忱。
因此加入了研究資訊科技應用於土木工程的研究室。
我的碩士論文聚焦於使用C++和RabbitMQ去輔助進行大型數值模型分析。
在這期間，我還負責升級和優化系所的網站，成功將網站的TTFB減少了90%，這經驗促使我成為後端工程師。

在踏入後端工程師的道路的三年間，我遇到的開發團隊氛圍都非常好。
團隊成員都會積極參與團隊技術分享與工作流上的改善。
在這樣的環境下，我在專業上獲得很大得進步。
像是第一份工作中，我除了自學Docker解決大家版本一致性外，還將伺服器更新時間從5分鐘縮短到15秒。
第二份工作中，我參與改造的就更多了。包括版本控制、容器化、文件生成、測試、套件化等開發者會遇到的小事，特別是把整個前端打包時間減少60%以上。

除了整個開發團隊都會彼此分享技術、協助處理問題。
在這種持續的正面反饋中也讓我獲得滿滿的成就感
所以我期待在未來的工作中，也能繼續在一個注重程式碼品質與團隊合作的環境中持續進步。

## 精簡版英文

Hi, I'm Chia-Hong Wu, and I'm working hard to become an expert in the back-end field.

In my last job, our team developed and maintained several systems with millions of members. We mainly used Laravel, Koa (Node.js), and React frameworks for membership systems, along with MySQL, PostgreSQL, MongoDB, Redis, and RabbitMQ for database, caching, and queue management. 
We containerized services using Docker and set up servers on AWS. 
Our code was mainly hosted on GitHub, and we used Postman for API documentation. 
In the team, my main responsibilities were:
1. Discussing product implementation directions with product managers.
2. Refactoring features.
3. Handling technical issues like Optimizing systems permoce.
Usually, I worked independently but also had to organize two junior engineers for module development.

Originally, I studied civil engineering, but a Web GIS systems course in my third year of college led me to discover my passion for programming. 
So, I joined a lab researching IT applications in civil engineering. My master's thesis focused on using C++ and RabbitMQ to assist in large-scale numerical model analysis. During this time, I also upgraded our department's website, reducing its TTFB by 90%, which led me to become a back-end engineer.

In the three years I've been a back-end engineer, I've enjoyed in great teamwork. Team members actively participate in sharing technical knowledge and improving workflows. In such environments, I cintributed some professional achievement. For example, in my first job, I self-learned Docker to resolve version consistency issues and reduced server update time from 5 minutes to 15 seconds. In my second job, I participated in more transformations, including version control, containerization, documentation, testing, and packaging - notably reducing front-end packaging time by over 60%.

Besides, the entire development team shared technology, helped solve problems, and provided continuous positive feedback, which gave me a lot of satisfaction. So, I look forward to continuing to work in an environment that values code quality and teamwork in the future.


## 自我介紹

嗨，我是吳家宏，在成為後端領域專家這條路上，不斷努力精進中。

在我上一份工作中，我們團隊負責開發維護擁有數百萬會員的多個系統。
主要是運用Laravel、Koa (Node.js) 和 React框架開發會員系統，搭配使用MySQL、PostgreSQL、MongoDB、Redis 和 RabbitMQ作為資料庫、快取和佇列管理伺服器。
我們利用Docker進行服務的容器化，並在AWS上配置伺服器，
我們使用GitHub和GitLab進行代碼審核和合併，
產品經理透過Jira管理專案，並用Postman管理API文件。
我在團隊中主要負責跟PM討論產品功能實作方向、進行功能重構迭代、處理技術問題，以及系統的改善與優化。比較少處理除錯、維運相關的內容。
一般狀況下，我會獨立開發，但也曾組織兩位初級工程師共同進行模組開發。


我的程式設計之旅始於大學三年級。
當時，我參與了Web GIS系統的相關課程，教授的教學方式讓我發現了我對程式設計的熱情。
隨後，參與民生公共物聯網相關的研發工作，我發現自己在基礎知識上有所不足。因此，我加入了一個專注於探索資訊科技在土木工程應用的研究室，學習了物件導向、資料結構、演算法以及作業系統等相關基礎知識。
像是我的碩士論文使用C++編寫了一套最佳化演算法，並利用RabbitMQ進行大型數值分析的動態分散式計算。
在這期間，我還負責升級和優化系所的網站，成功將網站的TTFB減少了90%，這一經驗促使我踏上後端工程師的道路。


在踏入後端工程師的道路的三年間，我遇到的開發團隊氛圍都非常好。
我的主管都偏向美式管理風格，給予開發團隊充分的信任與彈性，也讓我在履歷上可以有一些開發之外的特別的貢獻。
比如說:第一份工作的時候。因為一些部屬上的問題，導致我們跨年加班。
為了避免這種事情再度發生，所以我自己開始學習Docker。
學了兩個禮拜後，我就向主管提交改善計畫。
我這時候工作還不到一個月，但主管還是給了我時間與授權讓我對整個伺服器進行容器化。
最後成功地對伺服器進行了容器化，整合了版本控制和部署 shell 腳本，將更新時間從 5 分鐘以上減少到 15 秒以下。
我的主管之後甚至舉辦一場會議讓我分享整套學習與實作的流程。
我非常享受整個團隊的給我的正面回饋，滿滿的成就感
所以在我的下一份工作中，我繼續積極參與團隊技術與工作流上的改善。包括:版本控制、容器化、文件生成、測試等開發流程。
比如說:我改寫React 預設Webpack打包文件導入esbuild-loader, 降低60%打包時間。


在之前待過的開發團隊中，我們會共享技術知識、彼此互相協助解決技術難題。整個開發團隊的程式碼品質與工作流程不斷完善。
尤其彼此之間的的正面反饋中讓我獲得巨大的成就感。
未來，我還是期待繼續在一個同樣氛圍良好、重視程式碼品質、不斷改善進步的環境中工作，成為一名更卓越的工程師。


## 英文版

Hi, I'm Chia-Hong Wu, and I'm currently working hard to become an expert in back-end development.

our team was responsible for developing and maintaining several systems with millions of members. 
We mainly used Laravel, Koa (Node.js), and React frameworks for developing membership systems with MySQL, PostgreSQL, MongoDB, Redis, and RabbitMQ as our database, caching, andd queue systems. 
We used Docker for service containerization and configured servers on AWS. 
We used GitHub and GitLab for code review and pull request merges, and worked with product managers using Jira and Postman to manage projects and API documentation. 
My role mainly involved 
1. discussing product functionality implementation with project managers
2. refactoring some old features, 
3. handling technical issues,
4. optimizing systems performace. 
Typically, I worked independently but also had experience leading two junior engineers in module development.


At that time, I participated in courses related to Web GIS systems, and the professor's teaching methods made me discover my passion for programming.
Later, while working on the project called "Civil IoT Taiwan," I realized I needed to learn more foundational knowledge about computer science. 
So, I joined a lab focused on applying information technology in civil engineering, where I learned about something like object-oriented programming, data structures, algorithms, and operating systems. 
For my master's thesis, I wrote an optimization algorithm in C++ and used RabbitMQ for dynamic distributed computing of large-scale numerical analyses. 
During this time, I also upgraded and optimized our department's website, improving its TTFB by 90%, which led me to a career as a back-end engineer.

In the three years since I started working as a back-end engineer, the atmosphere of the development teams I have encountered has been very good. 
My managers leaned towards an Visionary  management style
I was motivated by their manager, then allowed the freedom to achieve my tasks with minimal interference. Managers will check in from time to time, but they trust that their shared vision will keep employees on track and produce good results.

I grew rapidly during my employment, which allowed me to make some special contributions beyond development. 

For example, in my first job, we had to work overtime during New Year's due to some deployment issues. 
To prevent this from happening again, I started learning Docker. 
After two weeks, I submitted an improvement plan to my manager. 
Although I had been working there for less than a month, my manager gave me time and authority to try to containerize the entire servers.
Eventually, I successfully containerized the server, integrated version control, and deployment shell scripts, reducing the update time from over 5 minutes to under 15 seconds.

My manager even set up a meeting for me to share the entire learning and implementation process. Thanks to the entire team for the very positive feedback
I was very enjoyed of that. 

So in my next job, I continued to help the team improve our version control, containerization, documentation generation, testing, and package developing processes. For example, I rewrote the default Webpack file of React to esbuild-loader, reducing the building time by 60%. 

In the past teams, we shared technical knowledge and helped each other solve technical challenges. The code quality and workflow of the entire development team continually improved. Particularly, the positive feedback from each other gave me a great sense of achievement.  I am looking forward to continuing to work in such environment that has great teamwork, where I can become an even better engineer.


## 威許移動股份有限公司 工作回顧

日期: 2021/08 - 2023/09 
### 新功能開發分析與設計

- 組合商品
    - 特色：百貨業特化版組合商品
    - 功能：櫃台銷售人員可自行新增專櫃商品進行組合販售，藉由產生獨立代碼及連結分享給線下之熟客，達成銷售目的
    - 困難：綑綁包內容更新對顧客權益問題，如同傳統電商結帳單會儲存當下購物車訊息，但因為這是同梱包
    - 解決方案與優勢：以版本控制的概念進行系統的設計，為綑綁包進行版本控制，將整個綑綁包的異動紀錄完整保存下來，結帳單者需要紀錄綑綁包之ID與版號 

- 事件行銷 
    - 功能：當會員發生預約、交易、生日等事件時，根據特定的會員標籤發放行銷訊息或獎勵
    - 困難：如何應付未來多種不同行銷事件的發生
    - 解決方案與優勢：前台傳輸的資料內容使用visual programming（rete.js）的套件轉換成執行圖儲存，圖中的節點所要使用的功能可以呼叫既有函式。除了可以讓未來擴充更容易外，還可以讓PM更清楚事件行銷邏輯

- 第三方系統票券
    - 功能：客戶希望透過會員可以透過系統活動取得第三方系統的票券（鼎新）
    - 困難：因應未來不同的第三方系統相容性
    - 解決方案與優勢：對於主系統而言第三方票券的內容，是由客製化專案反向註冊回主系統其參數，對於主系統而言只需維護其介面，無須因任何第三方系統內容掛勾。因此之後所有第三方系統票券，在主系統層面完全無須進行任何加工，亦有利於第三方票券串接之套件化。


### 功能重構迭代

- 累積型任務
    - 功能：原系統無累積型任務回饋用戶的機制，擴充架構完成累積型任務的需求
    - 困難點：由於任務本身是主系統中相當重要且商業邏輯極為複雜的一塊，如何在不破壞其原本功能性下嵌入累積性的規則，該規則與原先一次性消費金額有概念上的差別
    - 如何克服：我們先補充測試覆蓋幾個簡單應用場景，重構部份程式碼邏輯。切割出邏輯分割點，既將累積當作一次性止於判斷點回覆內容改為呼叫新邏輯，運用TDD技巧開發將分割點下的新邏輯，確保邏輯正確性。
    - 額外成果：在重構的過程中，發現了一個無法重現的bug，這個bug來自任務獎勵事件機制觸發回呼會可能導致交易死鎖。

- 第三方訂單支付系統
    - 功能：可接受客製化的訂單，提供其他電商會員平台進行支付
    - 困難點：說服管理人員接受我們開發人員建立完整架構
    - 如何克服：我們分成兩階段進行，第一階段是在串接藍新時，重構並統一內部各支付串接介面(藍新、綠界、TapPay)，第二階段建立交易事件監聽介面，所有客製化專案在第三方交易通知去接交易事件監聽介面。

- 匯出任務鍊化
    - 功能: 在系統中會員數量超過三十萬的情況下，會產生在匯出時，該執行程序可能發生timeout, oom等情況，且一次性對伺服器造成重荷，在這種情況將其鍊化可以有效避免上述情況，也有立後續進度顯示功能開發
    - 困難點：雖然文件上沒說但是直接應用Laravel Job Chaining會有payload過大的問題，且現有部份匯出功能仰賴前期資料處理結果
    - 如何克服：透過再觸發與匯出內容定位的方式進行，在繼承該匯出鏈式方法上可以選擇不執行鏈式

### 系統改善優化

- 統一後台搜尋資料介面並完成後台搜尋優化
    - 問題: 後台分頁搜尋時太慢
    - 如何克服: 第一步是先重構整個後台的搜尋介面，統一以表作為基礎的包裝資料格式，並解決未定義排序的問題，以利後續的優化。部分SQL與表的索引修改。由於搜尋介面會執行一個分頁count跟取資料兩個SQL，遇到大資料處理的時候，並行化(pcntl_fork搭配unix_socket回收結果)，成功降低最大50%的搜尋時間。

- Database Queue 動態Worker數量
    - 問題: SAAS商家與會員數不斷上升的情況下，要如何解決排程或事件日益擴張。我們希望可以在沒有排程或是見的狀況下，無須占用計算資源。
    - 如何克服: 可以透過Queue來指定Worker數量，只需透過單一排程去檢查Queue數量，啟動相對應微服務Worker去處理。

- 提升前端開發者體驗
    - 問題: 由於後台專案日益臃腫打包時間逐步上升超過5分鐘，嚴重影響開發者體驗
    - 如何克服: 改寫React預設Webpack打包文件導入esbuild-loader, 降低60%打包時間

### 系統維運

- 開發環境部屬文件
    - 問題: 在套件化開發的模式下，同事反映套件更新與GitFlow無法很好搭配。且當前部分升版至PHP 8狀態下，環境管理不易
    - 如何克服: 更新開發環境部屬文件，提供套件化開發部屬方式建議與環境切換簡易指令。

- 建立 UAT與DEV環境 (夢時代)
    - 問題:從其他外包公司接手的專案，產品橫跨多種較為不常見之架構(比如 Yii+ hhvm)，部分框架老舊且代碼品質不高，環境變數未暴露，維護性非常低
    - 如何克服: 整理原先架構撰寫相關docker部屬檔、整理API文件與重構程式碼成可部屬維護的程式碼

- 協助建立版本控制、Migration、開發文件規範、單元測試
    - 問題: 公司新收購的部門原來是屬於1人開發狀態，因此一些協作的基本流程尚未建立
    - 如何克服: 一一去討論版本控制的部分於DevOps討論，去符合CI/CD的作業流程。Migration定義該於CI/CD上哪個步驟。開發文件應隨同版號整理。微服務與主系統單元測試粒度等等


## 國立清華大學 服務創新與分析研究中心 工作回顧
日期: 2020/12 - 2021/07 
- 程式碼更新機制
    - 問題: 原先透過rsync同步程式碼，不僅耗時而且
    - 困難點: 為什麼原先會使用rsync，原因就是受到資源檔案夾,Config設定卡死，必須要回頭透過rsync同步範本
    - 如何克服:透過Shell + Git指令只更新異動，將5~7分鐘的程式更新機制降至15秒內執行完畢。並提供維護指令集給後續人員。

- 容器化
    - 問題: 由於沒有統一環境，導致因PHP版本開發者與線上環境不同，導致服務停擺
    - 困難與突破：當時我還不會使用Docker，花了兩個禮拜下班自學，與主管的協助下，完成整個開發容器化。

## Github SideProject說明

- syncman(https://github.com/JhomeWu/syncman)
為了要在拆Postman免費帳戶中實現Git版控, 並且在IDE中使用Github Copilot等AI協助編輯Pre-Script與Test, 同步與分拆Postman Collection至指定資料夾。

## 碩士 工作回顧

### 論文

- 問題: 在大地工程反算分析中，數值模擬對於不同材料參數的計算佔據了相當大的時間。為了提高分析效率
- 解決方案:
    1. 最佳化演算法
    2. 克利金法代理模型
    3. 基於RabbitMQ動態的分散式計算系統

- 成果: 在使用了12個節點下加速了實際案例的反算速度約10倍。
![image](https://hackmd.io/_uploads/rJjw3AFVa.png)



根據LINE Messaging API製作聊天機器人，負責以Node.js爬取NCDR天氣與氣候偵測網定量降雨資訊。撰寫工地排程小幫手之功能，當工地主任登錄工作地點與排程時間，會根據降雨資訊，排程管理與停工建議。

Demo:https://youtu.be/o6GlbWTerCI