# ❓ 常見問題 FAQ

這份文件收錄了學習 SDD 開發技術時最常遇到的問題和解答。

---

## 📋 問題分類

- [學習方向](#學習方向)
- [環境設定](#環境設定)
- [規格撰寫](#規格撰寫)
- [測試開發](#測試開發)
- [程式實作](#程式實作)
- [AI 協作](#ai-協作)
- [學習進度](#學習進度)

---

## 🎯 學習方向

### Q1: 我完全沒有程式基礎，適合學習這套教材嗎？

**A:** 適合！這套教材專為跨領域學習者設計。

**建議學習路徑：**
1. 從「完全新手」路徑開始
2. 每天投入 1-2 小時
3. 預計 8 週完成基礎內容
4. 善用 AI 工具輔助學習

**成功案例：**
- 許多完全沒基礎的學習者都成功完成
- 關鍵是「每天持續」而非「一次學很多」

---

### Q2: 我已經會寫程式，這套教材還有幫助嗎？

**A:** 有！這套教材重點是「開發方法論」而非程式語法。

**你會學到：**
- 更好的需求分析方法
- 系統化的測試策略
- 模組化架構設計
- 高效的 AI 協作技巧

**建議：**
- 選擇「專業開發者」路徑
- 直接應用到現有專案
- 2 週可以完成核心內容

---

### Q3: 學完後我能做什麼？

**A:** 實際開發小型到中型的應用程式。

**具體能力：**
- ✅ 撰寫清晰的功能規格
- ✅ 設計測試案例
- ✅ 實作功能並通過測試
- ✅ 使用 AI 加速開發
- ✅ 建立可維護的程式架構

**實際應用：**
- 個人工具（筆記系統、習慣追蹤）
- 小型工作室系統（時間追蹤、客戶管理）
- 線上教師工具（課程管理、作業批改）

---

### Q4: 這套方法跟傳統教材有什麼不同？

**A:** 主要差異在學習順序和 AI 使用。

| 傳統教材 | 本教材 (SDD) |
|---------|-------------|
| 先學語法 → 再寫程式 | 先寫規格 → 測試 → 程式 |
| 6 個月才能寫第一個專案 | 2 週就能做出功能 |
| 自己苦讀或找老師 | AI 隨時協助 |
| 線性學習 | 問題導向學習 |

---

## 🔧 環境設定

### Q5: 我用 Windows，教材範例都是 Mac，怎麼辦？

**A:** 沒問題！大部分操作都是跨平台的。

**主要差異：**
- 終端機：用 PowerShell 或 Git Bash
- 快捷鍵：`Cmd` 改成 `Ctrl`
- 路徑：`/` 改成 `\`（但 Node.js 兩種都支援）

**建議：**
- 安裝 Git for Windows（附 Git Bash）
- 使用 Git Bash 作為終端機
- 參考教材中的 Windows 特別說明

---

### Q6: npm install 很慢或失敗怎麼辦？

**A:** 這是常見問題，有幾個解決方法。

**方法 1：更換 npm 鏡像源（中國地區）**
```bash
npm config set registry https://registry.npmmirror.com
```

**方法 2：使用 cnpm**
```bash
npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm install
```

**方法 3：清除快取**
```bash
npm cache clean --force
npm install
```

**方法 4：刪除 node_modules 重裝**
```bash
rm -rf node_modules
rm package-lock.json
npm install
```

---

### Q7: 執行 npm test 出現「找不到 jest」錯誤？

**A:** 這表示 Jest 沒有正確安裝。

**解決步驟：**

1. **確認 package.json 中有 Jest**
```json
{
  "devDependencies": {
    "jest": "^29.0.0"
  }
}
```

2. **重新安裝**
```bash
npm install --save-dev jest
```

3. **確認 scripts 設定**
```json
{
  "scripts": {
    "test": "jest"
  }
}
```

4. **驗證安裝**
```bash
npx jest --version
```

---

### Q8: Git 提交時出現「Please tell me who you are」錯誤？

**A:** 需要設定 Git 使用者資訊。

**解決方法：**
```bash
git config --global user.name "你的名字"
git config --global user.email "your.email@example.com"
```

**驗證設定：**
```bash
git config --list
```

---

## 📝 規格撰寫

### Q9: 不知道要寫多詳細，規格到底要寫到什麼程度？

**A:** 以「能轉換為測試」為標準。

**判斷標準：**
- ✅ **夠詳細**：別人看了知道如何測試
- ❌ **太簡略**：「使用者能登入」（怎麼算成功？）
- ❌ **太詳細**：寫到實作細節（那是程式碼的工作）

**範例對比：**

❌ **太簡略：**
```
使用者可以預約課程
```

✅ **適當：**
```
Given 我是已登入的學生
  And 教師 Mary 在 2024-12-20 14:00 有可預約時段
When 我選擇該時段並確認預約
Then 系統應該顯示「預約成功」
  And 該時段應該從列表中移除
```

---

### Q10: Gherkin 場景一定要用英文嗎？

**A:** 不用！中文完全可以。

**Gherkin 支援多語言：**
```gherkin
# 中文
假如 我是已登入的使用者
當 我點擊「新增」按鈕
那麼 系統應該顯示新增表單

# 英文
Given I am a logged-in user
When I click the "Add" button
Then the system should show the add form
```

**建議：**
- 團隊都是華語使用者 → 用中文
- 國際團隊 → 用英文
- 保持一致性最重要

---

### Q11: 怎麼知道有沒有遺漏場景？

**A:** 使用檢核清單和 AI 輔助。

**檢核清單：**
- [ ] 成功路徑（Happy Path）
- [ ] 錯誤處理（輸入錯誤、資料不存在）
- [ ] 邊界情況（空值、零、最大值）
- [ ] 權限檢查（未登入、權限不足）
- [ ] 安全性（注入攻擊、資料洩露）

**使用 AI：**
```
請幫我檢查這份規格是否遺漏重要場景：
[貼上你的規格]

請特別注意：
1. 錯誤處理
2. 邊界情況
3. 安全性
```

---

## 🧪 測試開發

### Q12: 測試一直失敗，不知道問題在哪？

**A:** 系統化除錯，一步步找出問題。

**除錯流程：**

1. **仔細閱讀錯誤訊息**
```
FAIL tests/example.test.js
● Cannot find module '../src/example'
```
→ 檔案路徑錯誤或檔案不存在

2. **確認檔案存在**
```bash
ls src/example.js
```

3. **確認匯出正確**
```javascript
// src/example.js
module.exports = { functionName };
```

4. **確認引入正確**
```javascript
// tests/example.test.js
const { functionName } = require('../src/example');
```

5. **簡化測試**
先寫最簡單的測試確認環境正常：
```javascript
test('環境測試', () => {
  expect(true).toBe(true);
});
```

---

### Q13: 我的實作明明正確，為什麼測試還是失敗？

**A:** 可能是測試本身有問題。

**常見原因：**

1. **斷言錯誤**
```javascript
// 錯誤
expect(result).toBe({ value: 1 });  // 物件用 toBe 會失敗

// 正確
expect(result).toEqual({ value: 1 });  // 物件要用 toEqual
```

2. **非同步問題**
```javascript
// 錯誤
test('async test', () => {
  fetchData().then(data => {
    expect(data).toBeDefined();  // 這個斷言可能不會執行
  });
});

// 正確
test('async test', async () => {
  const data = await fetchData();
  expect(data).toBeDefined();
});
```

3. **資料狀態問題**
```javascript
// 每個測試後重置資料
afterEach(() => {
  resetData();
});
```

---

### Q14: 測試覆蓋率要達到多少才算好？

**A:** 視專案階段而定，不要盲目追求 100%。

**建議目標：**
- 🥉 初學者：60%+
- 🥈 中級者：80%+
- 🥇 進階者：90%+
- 專案關鍵模組：95%+

**重點：**
- 質量比數字重要
- 關鍵邏輯必須 100% 覆蓋
- 簡單的 getter/setter 可以較低

**查看覆蓋率：**
```bash
npm run test:coverage
```

---

## 💻 程式實作

### Q15: AI 生成的程式碼可以直接用嗎？

**A:** 不要盲目複製貼上，需要審查和理解。

**使用 AI 程式碼的正確流程：**

1. **閱讀並理解**
   - 每一行在做什麼？
   - 為什麼這樣寫？

2. **執行測試**
   - 確認功能正確
   - 查看測試覆蓋率

3. **審查品質**
   - 命名是否清晰？
   - 有沒有重複代碼？
   - 錯誤處理是否完善？

4. **必要時調整**
   - 改善命名
   - 補充註解
   - 優化結構

**警告標誌：**
- ⚠️ 看不懂的程式碼
- ⚠️ 過度複雜的實作
- ⚠️ 缺少錯誤處理
- ⚠️ 沒有註解

---

### Q16: 程式碼寫得很亂，但測試通過了，要重構嗎？

**A:** 要！趁測試通過時重構是最安全的。

**重構時機：**
- ✅ 測試通過時
- ✅ 發現重複代碼時
- ✅ 準備新增功能前

**重構原則：**
1. 小步重構（一次改一個地方）
2. 頻繁執行測試（確保沒破壞功能）
3. 頻繁提交（方便回溯）

**重構範例：**
```javascript
// 重構前：函數太長
function processOrder(data) {
  // 50 行程式碼...
}

// 重構後：拆分職責
function processOrder(data) {
  validateOrder(data);
  calculateTotal(data);
  updateInventory(data);
  sendConfirmation(data);
}
```

---

### Q17: 什麼是「最簡實作」？怎麼判斷？

**A:** 能通過測試的最簡單程式碼。

**判斷標準：**
- ✅ 所有測試通過
- ✅ 沒有多餘的功能
- ✅ 沒有過度設計
- ✅ 易於理解

**範例：**

❌ **過度設計：**
```javascript
// 測試只要求回傳固定值，但寫了複雜邏輯
function getWelcomeMessage(user) {
  const messageTemplates = {
    morning: '早安',
    afternoon: '午安',
    evening: '晚安'
  };
  const hour = new Date().getHours();
  const timeOfDay = hour < 12 ? 'morning' : hour < 18 ? 'afternoon' : 'evening';
  return `${messageTemplates[timeOfDay]}，${user.name}！`;
}
```

✅ **最簡實作：**
```javascript
// 測試只要求回傳「歡迎，{name}！」
function getWelcomeMessage(user) {
  return `歡迎，${user.name}！`;
}
```

等測試要求時間判斷時，再加入該功能。

---

## 🤖 AI 協作

### Q18: ChatGPT 和 Claude 哪個比較適合學習程式？

**A:** 各有優勢，建議都試試。

**ChatGPT 優勢：**
- 回答速度快
- 免費版就很好用
- 程式碼範例豐富

**Claude 優勢：**
- 理解長文件能力強
- 解釋更詳細
- 適合複雜問題

**建議：**
- 快速查詢 → ChatGPT
- 深入討論 → Claude
- 程式碼生成 → GitHub Copilot

---

### Q19: AI 給的答案好像有錯，怎麼辦？

**A:** AI 不是100%正確，需要驗證。

**驗證方法：**

1. **執行程式碼**
   - 能不能跑？
   - 測試是否通過？

2. **查閱官方文件**
   - API 是否正確？
   - 版本是否相容？

3. **詢問 AI**
```
這段程式碼執行後出現以下錯誤：
[貼上錯誤]

請檢查：
1. API 使用是否正確？
2. 是否有版本相容問題？
3. 如何修正？
```

4. **搜尋引擎**
   - Google 錯誤訊息
   - Stack Overflow

---

### Q20: GitHub Copilot 值得訂閱嗎？

**A:** 如果認真學習，非常值得。

**優點：**
- 直接在編輯器中使用
- 根據上下文生成程式碼
- 節省大量時間

**費用：**
- 學生：免費
- 個人：$10/月
- 專業：$19/月

**建議：**
- 先用免費的 ChatGPT/Claude 學習
- 熟悉後再考慮 Copilot
- 學生可直接申請免費版

---

## 📈 學習進度

### Q21: 學了兩週還是看不懂程式碼，是不是我不適合？

**A:** 這完全正常！學習需要時間。

**學習曲線：**
```
理解程度
  ↑
  │         ┌────── 突然開竅
  │       ┌─┘
  │     ┌─┘
  │ ┌───┘         
  └─────────────────→ 時間
   Week 1-4   Week 5-8
   (困惑期)   (開竅期)
```

**建議：**
- 不要急，持續學習
- 多動手實作（不要只看）
- 善用 AI 解釋程式碼
- 加入學習社群互相鼓勵

**記住：** 每個專業開發者都經歷過這個階段！

---

### Q22: 工作很忙，每天只能學 30 分鐘，可以嗎？

**A:** 可以！關鍵是「持續」而非「一次很多」。

**30 分鐘高效學習法：**

**方法 1：微學習**
- 每天讀一小節
- 寫一個小練習
- 累積 2 週 = 7 小時

**方法 2：週末集中**
- 平日 30 分鐘讀理論
- 週末 2-3 小時實作

**方法 3：碎片時間**
- 通勤時聽解說
- 午休時看範例
- 睡前做小練習

**建議：**
- 設定固定學習時間
- 關掉社交媒體
- 專注品質而非數量

---

### Q23: 完成教材後，接下來該做什麼？

**A:** 持續實踐和深化。

**建議路徑：**

**1. 應用到實際專案（最重要！）**
- 做一個自己真正會用的工具
- 持續維護和優化
- 建立作品集

**2. 深入特定領域**
- 前端開發（React, Vue）
- 後端開發（Node.js, Express）
- 資料庫（MongoDB, PostgreSQL）
- 雲端部署（Vercel, Railway）

**3. 參與社群**
- 加入開發者社群
- 分享學習心得
- 協助其他學習者
- 貢獻開源專案

**4. 持續學習**
- 訂閱技術部落格
- 參加線上課程
- 看技術書籍
- 做 side projects

---

## 🆘 還有其他問題？

### 提問前的檢查清單

在提問前，先確認：
- [ ] 閱讀過相關模組內容
- [ ] 查看過這份 FAQ
- [ ] 嘗試用 AI 搜尋答案
- [ ] 檢查過錯誤訊息速查表

### 如何有效提問

好的問題格式：
```
【問題描述】
清楚描述遇到的問題

【已嘗試的方法】
列出已經試過的解決方法

【環境資訊】
作業系統、Node.js 版本等

【相關程式碼】
貼上相關的程式碼片段

【錯誤訊息】
完整的錯誤訊息
```

### 獲取協助的管道

1. **使用 AI 工具**
   - ChatGPT, Claude
   - 參考：AI學習Prompt大全.md

2. **查閱文件**
   - 模組內容
   - 學習資源
   - 錯誤訊息速查表

3. **社群討論**
   - GitHub Issues
   - 技術論壇
   - Discord 社群

---

祝你學習順利！記住，遇到問題是正常的，解決問題是成長的過程！🚀

