John Wu

R&D Team Lead · 全端工程師 · AI Code Review 與 LLM 工具鏈 · ESG SaaS

十年來我寫的都是要真的上線的系統:政府、IoT、醫療、SaaS。這兩年重心放在 AI code review 與 LLM 工具鏈。我到現在最常提起的還是 WiSide:2020 年跨年夜,它的 15 台掃描器(scanner)數出 113,000 人走過台北街頭。

About

十年下來,我在政府、IoT、醫療、SaaS 都寫過系統。最讓我有感的是 WiSide:一個應用層與輸出層由我從零單獨寫出來的群眾流量平台,到 2021 年跑在全台 314+ 台掃描器上。有兩次,我是被共事多年的人拉進新創的核心團隊(Taiwan Data Science Co.、Cedars Digital),這比履歷上任何一行都可信。現在的重心在 AI 與工程流程的交界:公司內那套跑在 CI 上的 AI code review 平台由我建置,也一直由我一個人維護;對外則把 agent 調度框架與周邊工具鏈開源。

0
2020 跨年夜偵測人次
0+
WiSide 部署的掃描器
0
團隊人數高點(重組期間 5–12 人)
0+
年上線系統開發經驗

Technical Skills

後端

Node.js (NestJS)TypeScriptRESTful APIMicroservicesPHP (Laravel)ASP.NET (C#)PostgreSQLMySQLRedis

AI / LLM

LLM IntegrationPrompt EngineeringRAG / Hybrid RetrievalAgent OrchestrationClaude CodeAI Code ReviewSDD

前端

JavaScriptTypeScriptHTML5CSS3Tailwind CSSAstro

DevOps / Cloud

DockerKubernetes (K8s/K9s operations)Terraform (IaC)GitLab CI/CDGitHub ActionsGCPAWSAzure

工具與實踐

GitCode ReviewAgile/ScrumSystem DesignOpenAPI v3.0Cross-functional Collaboration

Experience

  1. R&D Team Lead

    Cedars Digital 2024-05 → Present
    • 帶研發團隊進行公司 v2.0 平台重寫(進行中)。團隊經過幾次組織重整,規模在 5–12 人之間浮動(前端、後端、Singapore remote)。每次重整都等於把團隊的協作節奏重建一次,而交付從來沒有斷過。現在我在把每個成員帶向能獨立承擔全端的範圍。
    • v2.0 重寫裡,供應鏈管理系統的後端由我負責:跟 PO 排 milestone,再用 OpenAPI v3.0 的介面契約跟團隊前端以及另外兩條產品線整合。我和軟體開發經理共同導入規格驅動開發(SDD,Specification-Driven Development),並實作了 spec-kit → contract → 介接這條流程,撐住一次架構級的重新設計。跨產品線的 contract 層是我一個人建起來、也還在維護的,40 份以上的介面 YAML。
    • 2025-08 · AI code review v1.0 上線,做進 GitLab CI/CD。一開始就是 config-driven:共用的與各系統專屬的 review 標準組合成 prompt,新服務只要在設定檔登記就能上線,一行程式碼都不必改;LLM 放在可替換的 provider 層後面。
    • 2026-04 · v2.0 加了 self-reflection 這一關,鋪到前端和後端的微服務 repo。兩輪內部問卷的結果是,多數工程師會照它的建議在合併前改 code,而且依賴程度每一次迭代都再高一點。
    • 2026-08 · v2.1 補上正式環境的檢索層:自建的嵌入式向量庫,用 BM25 加 embedding 的混合排序。
    • 2026-08 · 幾個月前建好的標準知識庫,第一次在團隊懸案上兌現:HCFC-22 冷媒的排放分類問題,我派 AI agent 進去翻 GHG Protocol Corporate Standard 第 4 章與第 9 章的原文,答案是它挖出來的——算出真值、依標準排除在總量之外、另行揭露。標準的同一句話本來就同時要求算出來與不入總量。
    • 2026-07 · 升級後端技術棧:NestJS 9→11、Node 24、TypeScript 與 Jest 30,順手把跨 repo 的版本鎖定問題一併解掉。
    • 2026-06 · 選定並推行團隊的前端技術設計文件規範,10 個章節的模板配 4 種標準圖,用 validator 強制檢核。
    • 2025 · 年度 IaC(基礎設施即程式碼)計畫由我召集,把現行的 GCP 架構寫成 Terraform,納進 GitLab 版控。
    • 2024–現在 · 建了一個內部工程知識庫,onboarding、系統架構、環境設定、內部技術分享都收在同一個地方。起因只是不想同一個問題回答兩次。現在新進工程師真的會去翻它。
  2. Sr. R&D Engineer

    Cedars Digital 2023-08 → 2024-09
    • 以前合作過的技術主管把我找進來,當創始後端工程師之一,從零開始做碳足跡與排放管理的 SaaS 平台(Node.js、Nest.js、PostgreSQL、Redis、GCP)。v1.0 上線,也進到數家企業客戶手上。
    • 2024-05 升任 Team Lead。合約上的職稱幾個月後才跟上。工作從此不只是寫程式,還包括寫程式的那些人。
  3. Sr. R&D Engineer

    Taiwan Data Science Co. 2018-08 → 2022-03
    • Alliance Digital Technology 的主管把我挖過去幫忙草創工程團隊,我是最早進去的那幾個工程師之一。
    • WiSide 的應用層(Laravel + Vue.js 管理後台)和輸出層(即時群眾儀表板、活動報表)由我一個人做,邊緣掃描器和 ELK pipeline 是團隊的工作。坐在兩個我控制不到的層之間,逼出一個我留到現在的紀律:先把介面契約定下來,再讓兩邊各自照契約演進。Scanner 協定和 ELK 查詢 schema 各自獨立版控,所以 ELK 團隊升級 server 那次,變動停在介面層,應用邏輯一行都沒動。到 2021 年 9 月,全台已部署 314 台以上的掃描器;其中 20 台在 2019 年一場政治造勢裡偵測到 55,000 人,15 台在 2020 年台北跨年數出 113,000 人。參與 22 場以上的展覽。
    • 新北市立委的選民服務管理系統,收 39,600+ 筆選民資料和 100 筆以上的實地拜訪紀錄(2019-11 至 2021-07),含 Excel 匯入匯出與 iOS App 後端。
    • Douzo! 電商平台,和中華電信以及雲林、嘉義、台南的地方政府一起做,讓農民直接對到消費者。購物車前端我跟另外三位工程師一起開發,之後接手商家帳務平台的前端,把剩下的功能收完。
    • 國防部門禁系統,整合 4 家廠商的硬體,部署在全國多個營區。
    • 北港醫院問卷系統。資料庫層獨立出來,問卷 UI 重新設計。
  4. R&D Engineer

    Alliance Digital Technology 2017-09 → 2018-08
    • iPanSec 的主管把我引薦進一間行動身分識別新創,出資方是台灣國發會、五大電信商與悠遊卡公司。我在那裡做 ADTC-IFI,一個自動販賣機銷售視覺化的全端平台:把 ELK 後端的銷售資料拉出來,放上儀表板(Laravel + jQuery + GCP)。網站是我一個人開發的,資料端跟兩位資料工程師配合。另外也替公司的行動身分識別產品 Mobile Connect 寫了 PHP 範例 API 和使用說明,再把一家合作製造商的產品接上去,成為發表會的上線展示。
    • 我的直屬主管離職去創辦 Taiwan Data Science Co.,把我一起帶走,我也就離開了。
  5. R&D Engineer / Software Engineer

    iPanSec · TanoSecure · Gapertise 2015-12 → 2017-08
    • 這是我整個職涯反覆回去做的一件事:把驅動別人工具的那套系統做出來,再把它吐出來的東西變成生意上用得到的結果。
    • 三家公司,同一位技術創辦人。他到後兩家出任 CTO,核心團隊一路跟著沒散。
    • 做了 A4P,一個 APK 安全分析的全端平台。Python subprocess 呼叫本機的 MobSF 分析 Android APK 檔,網頁爬蟲(與兩位爬蟲工程師協作開發)把產生的報表頁抓下來,重新整理成結構化的安全報告。公司拿到資安實驗室認證,A4P 是關鍵之一。十年後在 Cedars 做 AI Code Review,我把同一套架構搬出來再用一次,只是 MobSF 的位置換成了 LLM API。
    • 交付法務部調查局(MJIB)的 IP 黑名單管理系統,整合硬體網路管理設備,並把 ELK 後端的資料視覺化。
    • 帶 4 人的前後端團隊做 IoT 裝置市集。客製化的 Node-RED build 是我一個人重寫的(登入、在地化、自訂節點),再把合作夥伴的 library 整進去,平台就能直接驅動 LED、超音波感測器和蜂鳴器。
  6. Software Engineer

    Weshine Technology 2012-12 → 2015-05
    • 大學畢業後的第一份工作,其中將近三年我都駐點在中華電信,做 MVDIS III,也就是政府的公路監理資訊系統(ASP.NET / C# / MSSQL / Informix)。我負責影像管理子系統。原本合約只規劃 Windows 應用程式,後來業主想要能從網頁進來,子系統的網頁功能就由我一個人開發。周邊的事情也全都算在這份工作裡:SA/SD 文件與操作手冊、影像辨識硬體測試(掃描機、攝影機)、QA、QC、客服,以及跟 12 家廠商、20 位以上的工程師對規格與介面的整合工作。另外我也參與了一個自助櫃台專案,還做了公司官網。
    • 我是在這裡才知道,一個團隊要把軟體規模化地交出去,實際代價是什麼;也知道 QA 不是可以砍掉的那一塊。

Featured Work

Side Projects

MRInspect

用 AI 模型審 GitLab merge request 的 CLI,純 Go 寫成。它跑在不擋 pipeline 的 CI job 裡:讀 diff、載入該團隊自己的審查標準,然後在 MR 上留一則結構化的留言。

253 個測試函式在 `go test -race` 下全綠,發布走 GitHub Release 加 GHCR 容器映像檔,別的團隊在 `.gitlab-ci.yml` 貼一段 job 就能跑。prompt 是單元測試釘不住的那一塊,所以另外做了離線的 4 組 fixture × 3 種模式,是一套可重跑的自用(dogfood)質性評估流程,每次改 prompt 我就重跑一次。

GoDocker
看 GitHub ↗

ReleaseGuard

MR 層級的發版把關:四個專用 agent 並行看同一份 diff,仲裁層再把它們的訊號收成一個結論,HOLD、REVIEW 或 PROCEED。

真正的產品是仲裁規則,所以判斷的理由全部寫下來:21 份架構決策紀錄(ADR),加上誤報回饋迴路,GitLab label 會回流去修正 HOLD 的精確度,現在還有 replay harness 拿匯入的真實已合併 MR 來量。第一個正式 release 帶著 CI(go test -race、lint、Docker smoke 驗 HOLD/REVIEW/PROCEED)與公開的 GHCR image;任一 agent panic 或逾時,仲裁層一律 fail-closed 收成 REVIEW。已完成設計與完整測試;尚未接上真實流量。

GoGitLab MRLCOV callgraphDocker Compose
看 GitHub ↗

excelTemplateParser

把一堆同格式的 Excel 轉成另一種格式。對應規則寫一次就能一直重複套用,單機 Docker 跑,不用登入。

難的地方是佇列,不是解析。跑到一半被中斷的任務會從 Redis 把狀態撿回來,跑完照樣通知瀏覽器;332 個自動化測試就是盯著這件事不放。

ReactViteTypeScriptFastAPI
看 GitHub ↗

tlor-orchestration

Claude Code 的調度框架,賭的是一件事:把 model、effort 和工具白名單釘在角色定義裡,成本和權限就不再是每次下 prompt 時的臨場決定。14 個中土世界 agent 角色、institution 調度規則、三鏡頭對抗式審查小組,以及可自行開關的 guard hooks。

分派是刻意按成本分層的(haiku→sonnet→opus):量大的活丟便宜的模型,需要判斷的才給貴的。外圍是 6 條 institution rules(plugin 擁有與使用者擁有分層)、rivendell-council 對抗式審查小組、四個 opt-in hooks(verify-gate、institution-guard、dispatch-guard、stdd-test-guard)、14 個 skills(其中 7 個組成 opt-in 的 STDD 規格到程式碼流水線),CI 走 GitHub Actions。我每天在自己的 Claude Code session 裡用它。

Claude CodePythonBashMarkdown
看 GitHub ↗

phosphorpulse

phosphorflux 的 Rust 重寫版:statusline renderer 吐出來的位元組跟原版一模一樣,外加一個 ratatui 全螢幕 TUI。從 STDD 規格到 v0.1.0 釋出不到兩天。

跟 TypeScript 原版位元組級一致這條沒有商量空間,由 11 組封閉式黃金樣本(hermetic golden fixture)守門,64 個測試在 Linux 加 macOS 雙平台 CI matrix 全綠。cargo-dist 產出四個平台的執行檔,內建 migrate 指令把 phosphorflux 的舊設定直接搬過來。暖啟 render 依本機量測快約 36-57 倍(不是進 repo 的 benchmark);1 秒刷新下閒置 CPU 約 0.7% 單核,原版約 25%。

Rustratatuicrosstermserde
看 GitHub ↗

phosphorflux

Claude Code 的主題化 statusline,全程用我自己的 agent orchestration framework 加 spec 驅動 TDD 做出來。空 repo 到 npm 上架花了 3 天。

已停止維護,由 Rust 重寫的 phosphorpulse 接替(https://github.com/twjohnwu/phosphorpulse),所以留下來的其實是流程,不是程式碼:101 個檔案裡 461 個測試,測試碼比實作碼還多;設定 wizard 先過 ajv schema 驗證,再 atomic write 進 Claude settings;雙語文件;還有一條任何人都能自己翻查的 spec→test→ship 軌跡。

TypeScriptReactInkajv
看 GitHub ↗

video-to-transcript

影音轉逐字稿,過程中沒有任何東西離開這台機器:不打 API、不上傳檔案,ASR 交給 mlx-whisper 在 Apple Silicon 的 GPU(Metal/MLX)上跑。它同時也是一個 Claude Code skill。

值得動手做的是防幻覺那一段:分段轉錄讓 Whisper 不會掉進重複迴圈。切出來的 VTT 分段再合併去重,最後用 OpenCC s2twp 轉成台灣正體。

mlx-whisperffmpegPythonClaude Code Skill
看 GitHub ↗

devutils-skill

Claude Code skill:走 devutils 的 URL scheme 把文字直接丟進 macOS 上的 DevUtils.app,讓 AI CLI 不必每次都先寫一個用完就丟的 markdown 檔。

整個 skill 只有四步:判斷輸入類型、查 tool ID、URL-encode、open。40 個 DevUtils 工具走的都是這同一條路。

Claude CodemacOS URL schemeSkill markdown
看 GitHub ↗

證照