開源之旅 - Apache Airflow Committer

Today

自我介紹

我是邱冠銘,大學讀臺大資管,目前讀臺大電機所。
專注在開源貢獻,對前後端開發資料工程很有興趣!

為什麼選擇貢獻 Airflow?

在貢獻 Apache Airflow 之前其實沒有聽過這個專案,
主要是因為看到 源來適你 的各種推坑文章才開始關注的。
後來發現 Airflow 是 ASF Top Level Project,而且也有很多知名公司都在使用。
當時覺得很有趣,而且自己也對 React 和 Python 比較熟悉,所以就開始貢獻了~

貢獻統計 (2025/04/01 ~ 2025/09/30)

項目數量
Pull Requests (Merged)139
Reviewed PRs (Merged)66
貢獻排名#34
投入時間每天約 3~4 小時

2025/09/30,收到來自 Airflow PMC Member 的邀請,成為 Airflow Committer!

Apache Airflow Committer

過程

在看完李唯還有哲佑大大的文章後,決定從 Providers 入手,主要是想要從相對沒有那麼複雜的部分來熟悉 Airflow 的架構。一開始就是看到 good first issue 就會去試著看看那部分的 code 自己看不看得懂。也會去翻翻舊的 PR 來看看有沒有可以學習的,或是原作者沒打算繼續做可以接著做的。

在翻舊的 PR 時,很幸運翻到了 #33911,發現很多使用者在處理資料時不只依賴 pandas,也開始使用 Polars。但 Airflow 原本只有 get_pandas_df() 可以用,對想用 Polars 的人來說不太方便。看到這個需求後,我就接著在 #48875 這個 PR 裡繼續做下去,新增了一個通用的 get_df() 方法,讓使用者可以自己選擇要用哪種 DataFrame。這支 PR 的主要改動簡單來說就是:

  1. 新增 get_df()get_df_by_chunks(),並支援不同 DataFrame library
  2. 將舊的 get_pandas_df() 標記為 deprecated,同時還是兼顧向後兼容的設計

在幾次來回修改之後,最後這個 PR 被 Elad merge 了!

而除了在 common-sql 的改動之外,還需要把這個改動整合到其他的 providers 中。所以又再花了一段時間再把這個改動引入不同的 providers。總結來看在這個題目上貢獻了 18 個 PR,影響大約 10+ 個不同的 providers。做完之後自己也覺得蠻有成就感的,也同時刷了一波存在感。雖然也不知道到底會不會有人用到,但看到 PR 被 merge 還是蠻開心的,所以就接著一路栽進去開源貢獻了!

在對 Airflow 有了一定了解之後,我開始轉向 Airflow Core 貢獻,
主要是在 ui 和 api-server 也就是前後端的部分。我從一開始的 bug fix、code refactor 和一些小的 feature 開發,慢慢熟悉整個 Airflow 的架構。

這個階段主要貢獻包括:

  • #49475 - 支援 External Log Links API and UI
  • #50309 - 新增 Task Group detail 頁面
  • #50443 - 新增 Task Instance bulk actions API endpoint
  • #50746 - 使用 virtualized rendering 優化 log 渲染效能,速度提升約 7 倍
  • #51376 - 實作 RTL (Right-to-Left) 語言介面

經過大概兩個月的累積,對整個 Airflow 的架構有了更深入的了解,也漸漸可以參與 Airflow 3.1 的主要功能開發和討論了。

到了後期,開始參與 Airflow 3.1 的重要功能開發和討論,也慢慢開始幫忙 Code Review,去幫助剛進來的貢獻者完成第一次貢獻。這段時間也是我對 Airflow 貢獻最多的一段時間,在最近的 3.1 版本貢獻有被納入 top 20 contributors 之中。

Airflow 3.1 Contribution Rank

HITL UI

後來有機會參與 Airflow 3.1 的重要功能 Human-in-the-Loop (HITL) 的開發!這個功能是基於 AIP-90,主要是想提供一個機制讓使用者能在任務執行過程中可以「人工介入」,去修正 AI 的判斷或是處理需要人工確認的步驟。

#53035 這個 PR 中,我負責實作 AIP-90 的 UI 的部分,包括 HITL task instances 的展示和操作介面、與後端 API 的整合等等。而且因為在 AIP 中其實只有對 UI 很粗略的想像,並沒有非常詳細的 UIUX 設計,所以需要透過自己的想像跟與社群的討論來取得共識,來做出最後的結果。整個討論過程還是蠻有趣的。大家都會有自己堅持的點,不過都是想要讓整個 UI 變得更好,而且都非常積極的參與討論,整個討論氣氛很熱烈也很正向。在這個過程中有體會到一個好的開源軟體是需要透過由許多人共同合作、討論、來共同打造出來的。這種感覺挺酷的!

這個過程中非常感謝李唯大大帶飛,幫我解決了很多問題,也很樂意跟我來回討論,讓我學到很多前後端協作和大型功能開發的經驗。

Gantt Chart

另外一個蠻有趣的開發是 Gantt Chart 的重新實作!因為 Airflow 3.x 的 UI 從舊的 Flask UI 全部重寫成 React,但在新版 UI 裡面一直缺少 Gantt Chart 這個功能,讓很多使用者在追蹤 task 執行時間和依賴關係時不太方便。

#51667 這個 PR 中,我重新實作了 Gantt Chart 的功能,主要使用 Chart.js 搭配 dayjs adapter 來實作。並且把 Gantt Chart 整合到 RunTIGroupTI 等頁面,並且放在左側面板(這個位置也是討論了很久才決定的)。在實作過程也是有遇到一些問題,像是:

  • 效能優化:當 dag run 有 100+ 個 TI 時,要確保 Gantt Chart 還能流暢渲染。所以參考 Chart.js 的官方文件,以及各種論壇上的討論。減少了不必要的動畫,也重構了不少程式碼。最後有成功讓在 TI 數量增加到 100+ 時,也能夠順暢運作。
  • UI/UX 討論:一開始討論要放在右邊面板還是左邊,也討論了 tooltip 的設計、header 的高度等等細節。大家都很積極參與討論,經過了多次的來回修改和測試,最後才達成了一個大家都相對比較滿意的結果。

雖然這個 PR 來回修改花了快要一個月,但最後也順利 merge 到 Airflow 3.1.0 了。非常感謝 BrentPierre 還有 Jens 大大的很有耐心跟細心的 review,讓這個 PR 能夠順利 merge。看到 Gantt Chart 重新出現在新版 UI,真的覺得蠻有成就感的!

PR of the Month

蠻幸運的是,HITL UI 和 Gantt Chart 這兩個 PR 都獲選成為 2025 年 8 月的 PR of the Month!因為這個原因,我第一次受邀上 Airflow Townhall 跟大家分享開發過程。老實說第一次在這種國際場合講英文分享真的超級緊張,一直結巴而且 live demo 還差點出事(忘記買乖乖了),還好最後還是順利 demo 完。雖然自己覺得講得沒有很好,但還是蠻開心能有這個機會跟社群分享自己的貢獻!

  • learn -> 成為 Committer 絕對不代表我完全理解 Airflow,我認爲我目前最熟悉的還是 UI 的部分,其他部分都還有很多值得我學習的地方。
  • review -> 接下來希望可以多參與 Code Review,練習怎麼給建設性的 review,並去引導新的貢獻者更快地融入社群。
  • design -> 更積極地參與 Airflow 的架構設計討論,提出自己的想法和建議。
  • share -> 嘗試將這些經驗分享給更多人,還有拉更多人入坑開源!

收穫

  1. 技術
    • 在大型專案裡寫 code,不只是解決眼前的問題而已。也同時需要要考慮長期維護性、向後兼容、效能影響,也會需要去了解各種不同的 Design Pattern、System Design 等等。因為使用 Airflow 的人跟公司都很多,改一個小東西可能就會影響到很多人,所以需要考慮到很多細節。這種對軟體工程的實務上理解,我認為是單純寫 side project 或是學校期末專案絕對學不到的。
    • 可以觀摩各種不同的大神面對問題會怎麼樣實作,而且只需要點開 PR 就可以了解整個討論和實作,雖然一開始 context 太少都看不太懂,但後來慢慢看懂之後,會發現很多大神在實作的時候都會考慮到很多細節,而且寫出來的 code 都很乾淨,這我認為也超級值得學習。
  2. 溝通
    • 寫 code 之外,怎麼在 PR 裡清楚說明設計動機、怎麼給建設性的 review、怎麼在意見不合時找到共識,這些有時候比寫 code 還難。好的溝通讓討論更有效率,也讓能社群氛圍更正向。
  3. 朋友
    • 除了能力上的提升以外,我也因為開源認識了不少有趣的朋友,一起討論技術、分享最近做了什麼或是又被哪個 reviewer 嘴之類的。尤其是源來適你的大家,各位都是超級熱心的大神,每次有問題都會有人幫忙解答,而且還會一起討論怎麼實作,還有丟 meta issue 來通知大家可以開刷之類的。這種大家一起講幹話然後一起為了同一個目標努力的感覺真的蠻棒的!

如何開始貢獻 Apache Airflow?

  1. 好文推薦
  2. 閱讀文件:Airflow 的 contribution guide 寫得非常清楚。
  3. 熟悉環境:使用 breeze 啟動開發環境,跑過基本測試。
  4. 從簡單的 issue 開始:挑選 good first issue、小型 bug fix 或是維護翻譯
  5. 撰寫好 PR 描述:清楚說明 Why / How,方便 reviewer 理解。
  6. 多看別人的 PR:學習別人怎麼解決問題、溝通。如果有別人做一半棄坑的,可以去幫忙接著做。或是如果剛好對那個部分比較熟悉,也可以試著給予 review。

感謝!

  1. 嘉平大大創辦的源來適你,如果沒有源來適你,我可能都不會知道 Airflow 這個專案,也不會遇到一群有趣的開源朋友。
  2. 所有在 review、討論中給我指導的 Airflow PMC Members 還有 Committers,特別是 BrentPierreJensJarek 還有 Elad
  3. 李唯哲佑大大的文章和分享,讓我快速掌握 Airflow 這個專案。還有幫我 review 大部分的 python code(我真的是 python 菜雞)。
  4. 李喆宸老哥一起刷前端 PR 還有一起講幹話。下一波就是你了。

參考資料