# 開源協作導論

::: tip 前言
**想參與開源專案但不知道從哪開始？** 開源不只是「免費用別人的程式碼」，更是一種協作方式和職涯加速器。一次高品質的開源貢獻，可能比履歷上寫十個個人專案更有說服力。

本章帶你理解開源協作的完整流程，從找專案到提交 PR，邁出開源貢獻的第一步。
:::

**這篇文章會帶你學什麼？**

| 章節 | 內容 | 核心概念 |
|-----|------|---------|
| **第 1 章** | 開源貢獻流程 | Fork → PR 的完整鏈路 |
| **第 2 章** | 開源授權條款 | 不同授權條款的差異 |
| **第 3 章** | 協作禮儀 | 如何做一個受歡迎的貢獻者 |
| **第 4 章** | 從零開始貢獻 | 找到適合新手的專案 |

學完本章，你將掌握開源協作的完整流程和禮儀，有信心向任何開源專案提交貢獻。

---

## 0. 全景圖：開源的價值

開源不只是程式碼共享，更是一種**全球化的協作模式**。Linux、React、Vue、Node.js——這些改變世界的專案都是開源的。

::: tip 參與開源的好處
- **技術成長**：閱讀優秀程式碼，接受高手 Review
- **職涯發展**：開源貢獻是最好的技術名片
- **社群歸屬**：成為全球開發者社群的一員
- **回饋生態**：你每天用的工具，也需要有人維護
:::

---

## 1. 開源貢獻流程

透過下面的互動元件，逐步了解從 Fork 到 Merge 的完整流程：

<OpenSourceWorkflowDemo />

### 1.1 流程概覽

```
Fork → Clone → Branch → Commit → Push → PR → Review → Merge
```

### 1.2 關鍵步驟詳解

**建立功能分支**：不要直接在 main 上開發。

```bash
git checkout -b fix/typo-in-readme
```

**寫清楚的 Commit Message**：遵循專案的提交規範。

```bash
git commit -m "fix: 修復 README 中的安裝指令拼寫錯誤"
```

**建立 Pull Request**：PR 描述應包含：
- 改了什麼、為什麼改
- 關聯的 Issue 編號（如 `Fixes #123`）
- 如何測試你的改動

---

## 2. 開源授權條款

透過下面的互動元件，對比常見開源授權條款的差異：

<LicenseComparisonDemo />

### 2.1 常見授權條款

| 授權條款 | 特點 | 典型專案 |
|-------|------|---------|
| **MIT** | 最寬鬆，幾乎無限制 | React, Vue, jQuery |
| **Apache 2.0** | 需保留版權聲明，有專利授權 | Android, Kubernetes |
| **GPL** | 衍生作品必須也開源 | Linux, WordPress |
| **BSD** | 類似 MIT，略有不同 | FreeBSD, Flask |

### 2.2 選擇的方法

- **想讓更多人用**：選 MIT
- **想保護專利**：選 Apache 2.0
- **想確保衍生品也開源**：選 GPL

---

## 3. 協作禮儀

### 3.1 提 Issue 的禮儀

```markdown
<!-- 差 -->
標題：不能用了
內容：你們的東西有 bug

<!-- 好 -->
標題：v2.1.0 在 Safari 17 下登入頁白屏
內容：
- 環境：macOS 14.2, Safari 17.2
- 重現步驟：1. 開啟登入頁 2. 輸入帳號密碼 3. 點擊登入
- 預期行為：導向首頁
- 實際行為：頁面白屏，主控台報錯 TypeError: xxx
- 截圖：[附圖]
```

### 3.2 提 PR 的禮儀

- 先看 `CONTRIBUTING.md`，了解專案的貢獻規範
- 一個 PR 只做一件事，不要混合多個改動
- 保持 PR 小而聚焦，方便 Review
- 耐心等待 Review，禮貌回應回饋

### 3.3 Review 他人程式碼

- 先肯定做得好的地方，再提改進建議
- 提問而不是命令：「這裡是否考慮過用 X 方案？」
- 給出理由和替代方案，而不只是說「不好」

---

## 4. 從零開始貢獻

### 4.1 適合新手的貢獻類型

| 類型 | 難度 | 說明 |
|------|------|------|
| 修復文件錯誤 | 低 | 錯別字、過時連結、不清楚的說明 |
| 翻譯 | 低 | 將文件翻譯為其他語言 |
| 補充測試 | 中 | 為未覆蓋的程式碼添加測試 |
| 修復標記為 `good first issue` 的 Bug | 中 | 專案維護者標記的新手友善問題 |
| 新功能 | 高 | 先在 Issue 中討論方案，獲得認可後再動手 |

### 4.2 找到合適的專案

- 從你日常使用的工具開始
- GitHub 搜尋 `good first issue` 標籤
- 關注專案的活躍度（最近是否有人維護）

---

## 5. AI 助力：用大模型加速開源貢獻

大模型可以幫你快速理解陌生的程式碼庫、寫出高品質的 PR 描述、甚至輔助 Code Review。

### 5.1 快速理解陌生程式碼庫

> **提示詞**：
> ```
> 我剛 clone 了一個開源專案，請幫我分析以下目錄結構，
> 說明每個目錄/檔案的職責，以及程式碼的整體架構和資料流向。
> 我想修復一個登入相關的 Bug，應該從哪裡開始看？
>
> [貼上 tree 指令輸出或目錄結構]
> ```

### 5.2 寫 PR 描述

> **提示詞**：
> ```
> 根據以下 git diff，幫我寫一份 Pull Request 描述，包括：
> - 標題（簡潔，說明改了什麼）
> - 改動說明（為什麼改、改了什麼）
> - 測試方法（如何驗證改動正確）
> - 關聯 Issue（如果有）
> 用英文撰寫，語氣專業友善。
>
> [貼上 git diff 輸出]
> ```

### 5.3 輔助翻譯文件

> **提示詞**：
> ```
> 將以下中文技術文件翻譯為英文，要求：
> 1. 技術術語使用業界通用的英文表達
> 2. 程式碼註解和變數名稱不翻譯
> 3. 保持 Markdown 格式不變
> 4. 語氣自然流暢，不要機翻感
>
> [貼上中文文件]
> ```

::: tip AI 使用建議
用 AI 寫 PR 描述時，確保你自己理解了每一行改動。審查者可能會問你為什麼這麼改——如果你答不上來，說明你還沒真正理解。
:::

---

## 6. 總結

1. **流程**：Fork → Branch → Commit → PR → Review → Merge
2. **授權條款**：MIT 最寬鬆，GPL 最嚴格，根據需求選擇
3. **禮儀**：清楚的 Issue、聚焦的 PR、禮貌的溝通
4. **起步**：從文件修復和 `good first issue` 開始

::: tip 終極思考
開源的本質是**協作**。技術能力固然重要，但溝通能力、協作意識同樣關鍵。一個態度友善、描述清晰的 PR，比一個程式碼完美但溝通粗暴的 PR 更受歡迎。**你的第一個 PR 不需要完美，只需要邁出第一步。**
:::

---

## 延伸閱讀

- **入門指南**：GitHub 的 Open Source Guide 是最好的開源入門資源。
- **實踐建議**：找一個你喜歡的專案，先 Star，再讀程式碼，最後找機會貢獻。
- **社群參與**：參加 Hacktoberfest 等開源活動，獲得社群支持。
- **維護者視角**：了解維護者的工作量和壓力，做一個體貼的貢獻者。
