Logo

如何打造一份開源專案

近年來,越來越多開發者著手打造 side project,目的或許是探索新技術、參與技術生態系、或單純出於興趣,隨著大型語言模型(LLM)興起,如今開發者能使用的工具與資源前所未見的豐富。

另一方面,開源已成為現代軟體開發的基石,許多當今最具影響力的工具皆由大型科技公司開源釋出,例如 Google 的 TensorFlow、Kubernetes 和 Angular;Meta 的 React、PyTorch;以及 Microsoft 的 VS Code、TypeScript。這些專案不僅展示卓越的技術成就,更體現了協作與共創精神。

身為個人開發者,同樣也能以具意義的方式參與開源專案,具體而言,有兩條常見的路徑可供選擇。

第一條相對簡單,直接貢獻現有的開源專案,無論想精進現有技能,或學習全新的 tech stack,幾乎都能找到與之對應的專案,選一個 Github repo、找到 issue、提交 pull request,這是提升技術力的絕佳方式。

相較之下,第二條路是本文的將著重探討的主題,即開源自己的 side project。

為何開源

整體而言,將個人專案開源,在許多面向而言都能帶來豐厚回報,其中以下列三點為首要:

技術成長

首先是技術能力的進步與成長,以一般情況而言,一份專案通常並不適合立即公開開源,可能需要整理程式碼、撰寫文件、甚至清除敏感資訊,例如 API Key 等,在過程中能培養寫出 clena code 的習慣、並了解如何創造易於維護的程式架構。

此外也會接觸到許多新工具,整個開源流程中,實務經驗是至關重要的,Git、Docker、各種 CI/CD 工具,能幫助個人開發者快速成長。

社群指導

社群是開源精神的核心,透過專案開源,有機會在與資深開發者、業界前輩互動過程中得到回饋,更可能因此與來自世界各地的開發者建立友誼。

職涯發展

當應徵一份自認具備對應實力的職位時,絕大多數的求職者只能透過一頁 A4 的履歷,試圖傳達「自己是最佳人選」的信號,然而,短短的字裡行間,脫穎而出絕對談不上容易,這時開源專案、開源的 Github repo 便能更具體地提升說服力。

此外,開發開源專案所涵蓋的遠不只技術面,還包括資源管理、商業思維與策略規劃等,在建立個人聲譽的同時,也能拓展更多未來職涯機會。

example of open source project
一份突出的開源專案將帶來多面向優勢

開源實作步驟

完整準備程式碼

首要的第一步,便是確保自身專案的程式碼乾淨、安全,若你已然完成一份專案並打算開源,這將至關重要,以下兩點原因說明,能在自己電腦上順利執行的程式,並不等價於已準備好公開釋出。

首先,每位開發者都有自己的獨一無二的 coding 習慣,有時認為理所當然的寫法,對其他人來說可能難以理解,因此在一開始就致力提升程式碼的可讀性,不可忽視的的第一步。

其次,專案程式碼可能包含私人資訊,即便是開源,也並不必過度的開誠布公,應該妥善的確保私人資訊不會一併進行公開。

關於 code style,網路上有大量資源可以參考,在這裡,我們更專注探討程式碼安全性問題。

普遍來說,敏感資訊應儲存在 .env 檔案中,在開源前,應將其改為 .env.example 檔,並使用類似 YOUR_API_KEY 的佔位符來借代實際內容,保護資訊外,也能幫助其他開發者正確建立環境變數。

# instance of .env.example

# Spotify Developer Credentials
CLIENT_ID=your_spotify_client_id
CLIENT_SECRET=your_spotify_client_secret
REDIRECT_URI=http://localhost:8888/callback

# Application URL (Frontend)
FRONTEND_URL=http://localhost:3000

# Redis
REDIS_HOST=localhost
REDIS_PORT=6379

# Optional
PORT=8888

打造容易參與的專案

妥善整理程式碼後,下一步則是將其放到可公開瀏覽、使用的平台,首選通常是 GitHub。

然而,在上傳 Github 後,其他開發者並不往往能水到渠成的將專案轉移或 clone 到各自的本地環境,實際上,往往會出現預料之外的錯誤。

接下來將介紹兩個簡易、直觀的方法,協助大幅提升專案的可參與度:

1. 連同相依套件相關檔案一併上傳

確保在上傳專案程式碼的過程中包含 tech stack 與相依套件的資訊,例如 package.json、package-lock.json 等檔案,透過這樣的方式,雖然不需額外複雜設定,但請務必確保其他開發者能順利安裝必要套件與相依項目,以便成功建置與執行專案。

2. Docker 化處理

Docker 是極其強大的工具,可確保不同環境間的執行環境一致,只要將專案程式碼打包成容器,任何安裝 Docker 的使用者,不論作業系統或設定,即能以相同方式運行專案。

要讓專案支援 Docker,通常需要兩份檔案:Dockerfiledocker-compose.yml.

Dockerfile 定義了如何建構應用程式的單一容器。詳細說明請參考: Writing a Dockerfile.

docker-compose.yml 則用來定義多個服務如何一同運作,例如,專案需連接 Redis 或 MongoDB,便可以透過 docker-compose.yml 設定,一次啟動所有服務。延伸說明請見: Use Docker Compose.

以下是幾項須特別注意之處:

  • 使用 env_file 確保安全注入環境變數.
  • 若專案依賴其他服務,加入 depends_on 設定.
  • 若需持久化資料,或在開發階段想對映本機程式碼,可使用 volumes。
  • 避免將敏感資訊 hard code 進原始碼,應儲存於 .env 檔中,並記得將其加入 .gitignore

當一切就緒,最後只需執行:

docker-compose up

即可順利啟動專案

Docker
Docker

撰寫縝密的 README

一份專案的 README 檔案完整度,將會直接影響其他開發者是否願意參與其,內容凌亂、不詳盡的 README ,可能會讓人望而卻步。 README 相當於專案完整的介紹和指引,引導使用者從安裝相依套件到在本地執行專案,一般而言,一份理想的 README 應包含以下幾個環節:

專案簡介

簡要介紹專案的源起,例如為何會開始這份專案、專案具備哪些功能、期望達成的目的、希望解決何種問題。

前置準備

告知開發者在開始參與專案開發前需要做哪些準備,例如是否需要申請、設定 API 金鑰,相關的前置作業必須在此完整的被提及。

Tech Stack

這個專案使用了哪些技術與開發工具,這個部分至關重要,開發者將會透過這份資訊評估自身技術背景是否符合專案的 Teck Stack,抑或是他們是否有興趣學習專案所使用的工具。

執行說明

提供明確的指引,告知使用者如何在本機端執行專案,這部分需要尤其謹慎,以避免讓其他開發者感到困惑,或是在執行過程中出現 README 並未描述的錯誤。

貢獻方式

說明希望其他開發者以何種形式參與專案,最好能詳列具體步驟,並說明有哪些面向、待解議題希望優先獲得協助。

授權條款

標示專案所選擇之授權方式,下一章將進一步介紹開源授權相關內容。

聯絡資訊

提供偏好的聯絡方式,以供開發者在遇到 README 之外的問題、或任何想法時可以主動進行聯繫。

選擇合適的授權條款

開源授權條款不僅是法律上的形式,其定義了他人如何使用、修改與重新發佈開源專案程式碼,一份合適的授權條款不僅能保障專案發起者與其他貢獻者的權益,也能釐清外界對一份開源專案在整合、應用於其他系統或商業產品時的預期效果。

以下是幾種常見的開源授權方式,不同的授權條款呈現了其背後的不同理念與實務面影響。

MIT License

適用對象: 想以最少限制提供最大自由的專案。

MIT 授權是目前相對寬鬆且廣泛使用的開源授權條款之一,其允許任何人使用、複製、修改、合併、發佈、散佈、再授權(sublicense)以及販售軟體的副本,只要保留原始的授權條款與版權聲明即可。

Apache License 2.0

適用對象: 需要專利保護且重視商業友善性的專案。

Apache 2.0 同樣是偏向寬鬆授權的授權方式,但額外加入了一項重要條款,其明確授予使用者專利權利,成為對專利議題有所考量的公司、開發者非常理想的選擇。

GNU General Public License (GPL v3)

適用對象: 希望專案始終保持開源,並具備強制回饋機制的專案。

GPL 屬於「copyleft」(著作權回饋)型授權,意即任何衍生作品也必須在 GPL 授權下發佈,如果有人修改並散佈專案程式碼,他們必須同樣將修改後的版本開源。

Mozilla Public License 2.0 (MPL 2.0)

適用對象: 介於寬鬆與 copyleft 間,適合追求平衡的專案。

MPL 要求對原始 MPL 授權檔案所做的修改,必須以相同授權條款開放,但允許這些檔案與專屬授權(proprietary)的程式碼一同使用,對於希望獲得回饋、但不強制整個專案都開放的開發者而言,是頗為平衡的選擇。

Unlicense / Public Domain

適用對象: 想讓程式碼毫無限制、完全開放的專案。

Unlicense 實質上將你的程式碼釋出至公領域,放棄所有版權與授權權利。它允許完全不受限制的使用,但不提供任何保證或法律保障。

在選擇授權條款時,應仔細考量以下幾個層面:是否希望他人可以將此專案用於商業用途、是否希望其他貢獻者公開其修改內容、是否重視專利保護、是否能接受的程式碼被用於專屬軟體中,若一時之間難以拿定主意,選擇 MIT 授權或將是一個穩妥的起點。

要正式為專案指定授權條款,可於 Github 在建立 repo 時進行選擇,在根目錄中新增 LICENSE 檔案,並在README.md 中明確標示所採用的授權類型。

推廣專案

將一個開源專案發佈僅只是起點,若希望被更多人看見、吸引貢獻者、甚至有更廣泛的應用,那推廣、行銷是不可或缺,以下將介紹幾個適合分享開源專案之平台,解釋其各自特點,以及如何有效展示專案。

Reddit

Reddit 上有許多活躍的社群,時常可見獨立開發者與開源貢獻者在這些版面上分享作品。其中三個值得特別關注的 subreddit 分別是:

r/SideProject: 對獨立創作者與業餘愛好者友好,適合分享開發歷程、尋求回饋、或單純討論正在進行的專案。

r/webdev: 平時禁止宣傳,但有每週一次的「Showoff Saturday」活動,開發者可以自由展示、推廣展示自己的專案。

r/opensource: 規模較小,但專注於開源相關討論,品質扎實。

在 Reddit 發文時應具體說明專案動機、tech stack、甚至分享背後的故事,真誠的內容相當重要。

Product Hunt

Product Hunt 是一個針對廣泛技術族群的平台,專門用來發佈新產品與工具,雖不限於開源軟體,但可在上面找到對專案感興趣的使用者。

Product Hunt 適合發佈已接近完成、使用者可實際體驗的專案,不建議在專案尚在開發中便倉促於 Product Hunt 上線,應待開發出 Demo 後再於 Product Hunt 蒐集用戶反饋。

Indie Hackers

Indie Hackers 是非常適合分享專案背後故事的平台,若開源專案緊扣開發者的個人心路歷程(例如程式學習、解決特定問題的過程經歷),Indie Hackers 會是訴說經歷、建立連結的合適空間,且開發者可以針對專案、產品持續發佈更新,讓專案長期內維持能見度。

Hacker News

Hacker News 重內容、輕行銷,非常適合以下類型內容:

  1. 有技術亮點的開源工具

  2. 解決真實問題的工具

  3. 結合工程技術觀點的文章

在使用 Hacker News 時,應避免過度包裝、明顯的商業宣傳用詞,盡可能著重於專案的技術成分,在分享專案時,其規定的發文格式是使用「Show HN」,標題範例如:

"Show HN: Auralytics – An open-source Spotify listening insights dashboard"

Reddit example
"Showoff Saturdays"

結語

將個人專案開源,是對個人開發者而言重要的里程碑,將自我投入昇華為協作與回饋,並提供在技術與職涯層面上持續成長的契機,然而正一同所有公開、公眾的行動,開源同樣伴隨著相對應的責任。

一旦專案上線,就不只是身邊朋友或其他正派開發者擁有查看程式碼權限,也可能將吸引廣大的網路駭客。若專案中含有 hard coding 的 API key、具備管理者的帳號密碼、或不全然安全的邏輯設計,這些內容可能會在未察覺的情況下被利用或外洩,抑或者,灰帽駭客(gray hat hacker)可能透過實際操作漏洞方式,進一步向開發者聯繫,索要報酬。

另一項常見風險是釣魚攻擊,由於開發者在 README 或 commit metadata 中留下聯絡方式,可能會收到看似來自善意人士的詐騙郵件,假裝回報 bug 或貢獻程式碼,實則內含惡意連結、社交工程陷阱。當主動聯絡、甚至要求取得 repo 權限或管理權時,應務必保持警覺,仔細查證對方的身份和動機。

上述風險並不是阻止開源的理由,而是必須以專業態度來正視開源,終究開源帶來的效益難以估量,而在開源路上的收穫,足以是坐而言,不如起而行的絕佳動機。







Auralytics 致力提供使用者深入的 Spotify 聆聽數據洞察,透過串接 Spotify API,Auralytics 幫助使用者查看自己最常聆聽的歌曲、歌手、專輯、音樂類型與活躍年代,目前已支援達 10 種語言。

Auralytics 的正式版本現已上線,並名列 Product Hunt 同日 195 項發布產品第 54 名:


若對 Arualytics 專案原始碼有興趣,請前往官方 GitHub repository:


其中包含 Auralytics 開源之本地端版本,開發者能在自己的電腦上執行 Auralytics 並參與優化改進,我們將會積極審查並合併具有價值的貢獻至正式版本中。