這個只供內部人員用的老產品,我最印象深刻的是,
f instanceof DoSomeThingFragment
的 if - else 條件來逐個頁面實例去比對套用。
以及其他族繁不及備載的特色。
在維護這個產品,只能受限於這一大包的技術債及架構上來增添功能及修復錯誤。
為了能讓外勤同事們能享有比照 iOS 產品的滑順體驗,我想藉由 AI 工具的輔助,搭配人為決策的軟體架構,來建立一個現代 Android 開發框架的產品。
在專案片段去識別化、抽象化,及使用假領域之後,預計於參賽 10 多天後提供公開的程式碼以供檢閱指教。
| Day | 標題(暫定) | 對應程式碼 |
|---|---|---|
| 01 | 為什麼重寫:一個一萬兩千行 Activity 的診斷書 | — |
| 02 | 目標架構總覽:分層、模組圖、依賴方向 | — |
| 03 | 建置骨架:多模組、version catalog、convention plugins、secrets 不進 git | build-logic、app |
| 04 | DI 取捨:ServiceLocator 到 Hilt | core:common |
| 05 | 網路邊界:後端信封與 d: Any? 的約束,AppResult 的誕生 |
core:network |
| 06 | UiState / UiEvent / UiEffect:單向資料流但不背 MVI 的儀式 | core:ui |
| 07 | 導航:型別安全路由與 feature 的對外 API | app NavHost |
| 08 | Design system:token、theme、元件的邊界 | core:designsystem |
| 09 | 測試基礎與架構守門:fake vs mock、Konsist | core:testing |
| 10 | Session:40 個 static key 到 DataStore | core:datastore、data |
| 11 | 登入畫面:第一個完整的 UiState 實作 | feature:login |
| 12 | 公開架構模板:抽出 core 與一個假領域 feature | 公開 repo |
| 13 | 多型 JSON:Moshi adapter factory 與 sealed model | data |
| 14 | 拆一個 1,700 行的 ViewModel:combine 取代屏障 |
feature:tasks |
| 15 | 拖曳排序:樂觀更新與回滾 | feature:tasks |
| 16 | Use case 層要不要:何時值得 | domain |
| 17 | 硬體抽象:把 BLE 掃描包成 Flow | core:scale |
| 18 | 裝置鎖定與穩定讀值:狀態機與去抖 | feature:weighing |
| 19 | 硬體與生命週期:掃描綁 Compose lifecycle、權限流程 | feature:weighing |
| 20 | CameraX 在 Compose:AndroidView 逃生門原則 | core:media |
| 21 | 離線佇列:Room + WorkManager | core:database、core:upload |
| 22 | 上傳策略:可插拔目標、重試與進度 | core:upload |
| 23 | 端到端:拍照 → 佇列 → 上傳 → UI | feature:capture |
| 24 | 13 個掃描 Activity 收斂成 1 個 | core:scanner |
| 25 | 導航回傳結果:SavedStateHandle 與共享 ViewModel 的取捨 | feature:scanner |
| 26 | 地圖與叢集:兩個「就緒」的競態 | feature:map |
| 27 | 前景定位服務與 Compose 的溝通 | core:location |
| 28 | 雙方握手的狀態機 | feature:transfer |
| 29 | 回顧:模組依賴圖、指標、沒做到的事 | — |
| 30 | 下一步:剩餘畫面的遷移策略 | — |