Funny Vote 十年演進:從 Java MVP 到 Compose 與雲原生架構(全系列導覽)

橫跨十年的真實開源專案演進全紀錄(2016 – 2026)

這不是教科書上的玩具 Demo,而是一個真實經歷十年間 Android 開發典範轉移的開源投票 App(Funny Vote)。從 2016 年手敲 30+ 份 XML 與 ButterKnife 的舊石器時代,到 MVP、RxJava、Kotlin 1.2、Compose 重組地獄、MVI 單向流、Material 3 全量復刻、五美元伺服器倒閉換心 Firebase,直到 2026 年由 Codex 審查員接管工位、達成 OWASP MASVS 100/100 滿分資安加固。全系列八部曲現已全數完結。

全系列八部曲章節導讀

第一部曲:開源原點 – 從零到一的獨立開發雜記:開源原點與上架驚魂(一)

對應分支:master (2016) | 核心技術:Java / 原生 Android SDK / ButterKnife / Retrofit / SQLite

系列始祖原點!紀錄 2016 年如何從零單幹出一個投票 App。從被自己刻出來的鳥畫面嚇退、硬學 Inkscape 畫 Logo、訂定第一份 SPEC、拉攏後端朋友入坑,到發布時遭遇 Google Play 政策審查下架驚魂記。最真實的獨立開發者起手式。

第二部曲:架構初醒 – Funny vote APP -MVP 更新雜記(二)

對應分支:mvp (2017) | 核心技術:Google Architecture Blueprints / MVP / 契約分離 / Dagger 2 依賴注入

告別亂七八糟的 God Activity!全專案嚴格落實 Google 官方 MVP 藍圖,將 View 與 Presenter 職責以 Contract 介面徹底解耦;痛定思痛砍掉所有濫用的 static 變數;引入 Dagger 2 依賴注入,並建立 Mockito 單元測試與自動化 CI 流程。

第三部曲:現代先鋒 – Funny vote APP – Kotlin 與 RxJava 的遲來救贖(三)

對應分支:mvp_kotlin & mvp_rxjava (2018) | 核心技術:Kotlin 1.2 / Data Class / Kotlin Synthetics / RxJava 2

自打臉十年前「看起來太簡單懶得用」的狂話!用 RxJava 串流拉直非同步回呼地獄;跨入 Kotlin 享受 Data Class 砍掉 200 行 POJO 的蜜月期;直擊 Mockito 撞翻 Kotlin 預設 Final 類別、手刻 MockMaker 擦屁股、以及 Anko 慘遭官方廢棄的背叛現場。

第四部曲:典範轉移 – Funny vote APP – 告別 XML 迎來 Compose,與踩進重組地獄雜記(四)

對應分支:kotlin-rewrite (2024) | 核心技術:Jetpack Compose / 宣告式 UI / Layout Inspector / @Immutable 穩定性分析

跳躍至 2024 年!徹底告別 30+ 份 XML 排版,一個 MainActivity 濃縮至 32 行純 Compose 容器。但在 Samsung S23 實機上遭遇幀率崩潰:深挖 Kotlin 標準 List 被判定為 Unstable 導致全量重組、迴圈內匿名 Lambda 擊穿 Skip 優化的大坑。

第五部曲:單向救贖 – Funny vote APP – 為了解決狀態打架:直上 MVI 單向流與拯救白屏災難(五)

對應分支:mvi-rewrite (2024) | 核心技術:MVI (UDF) / HomeUiState / HomeIntent / Channel.BUFFERED 副作用

剖析傳統 MVVM 多個 StateFlow 在非同步並發下的「狀態撕裂」災難;批駁公版 Sealed Class 在下拉刷新時整屏白屏閃爍的「玩具架構陷阱」;引入單一不可變狀態的增量 copy 哲學與 Channel 單次副作用通道,徹底穩固架構。

第六部曲:情感潔癖 – Funny vote APP – 強迫症的 100% 畫面復刻:把十年前的青春搬進 Material 3(六)

對應分支:modern-android (2026) | 核心技術:Material 3 Dynamic Color / 向量 SVG / HorizontalPager 導覽 / 自訂分享彈窗

拒絕只做兩三個頁面的開源「樣品屋重構」!耐著性子把 48×48 模糊點陣圖升級 SVG、寫死顏色遷入 M3 深淺動態取色、100% 復刻 6 頁導覽與 4 個致敬當年老夥伴的關於頁面。最後撞上「畫面 120fps 但十年前 VPS 早就倒閉」的荒謬現場。

第七部曲:雲端換心 – Funny vote APP – 五美元伺服器陣亡後:用 Firebase 與老分支續命的雲端換心雜記(七)

對應分支:feature/firebase-backend (2026) | 核心技術:Cloud Firestore / Serverless / NgramUtil Bi-gram 模糊搜尋 / 歷史分支復活

零維運 Serverless 革命!手刻 Bi-gram 雙字元切詞演算法零成本拯救 Firestore 殘廢中文搜尋;砍掉 Room+Firestore 雙快取過度設計;終極彩蛋:打造四個歷史分支(mvp_firebase 等),讓十年前的老架構換上雲端心臟無縫共舞。

第八部曲:終局之戰 – Funny vote APP – 當 Codex 接管工位:從零構建、SDD 幻象到 Agent-Centric 的資安終局實錄(八·終局篇)

對應分支:feature/firebase-backend 終局完結 | 核心技術:Vibe Coding 護欄 / SDD 翻案 / OWASP MASVS 100/100 滿分加固 / 零信任加鹽雜湊

由 Codex 冷面審查員主筆!戳破盲打 Prompt 產生數位垃圾的迷思;打破 50 頁 SPEC 幻象,提出「最小可執行契約 + 測試護欄」;四大硬核實戰劇場(監聽器流洩、IDOR 越權刪庫、改票負數、幽靈依賴 CVE);全維度資安拆彈直取 MASVS 100/100 A+ 滿分。十年前欠自己的青春債,今天徹底還清!


專案 GitHub 倉庫與老分支地圖

本系列所有代碼與歷史演進分支,均真實託管於 GitHub:
https://github.com/boochlin06/FunnyVote

  • master:2016 始祖 Java 版本
  • mvp:2017 MVP 重構版
  • mvp_rxjava:2017 RxJava 串流版
  • mvp_kotlin:2018 Kotlin 語言先行版
  • kotlin-rewrite:2024 Jetpack Compose 初探版
  • mvi-rewrite:2024 MVI 單向資料流版
  • modern-android:2026 100% 畫面復刻旗艦版
  • feature/firebase-backend:2026 雲原生 Firebase 終局完結版

感謝各位十年間的陪伴與閱讀,收工!