---
# System prepended metadata

title: 細節補充
tags: [recruitment]

---

---
tags: recruitment
---

## 方向
> 你覺得作為面試者，面試後端工程師職缺新人的時候可以準備哪些方面的問題？譬如說：
> 1. 軟體工程：程式碼風格／組織的能力，寫得乾不乾淨，整理得好不好找？
> 2. 語言特性熟悉度：（我們是使用 typescript）
> 3. 基礎設施架設經驗及架構設計
> 4. 基礎設施、演算法及資料結構等套件的使用經驗
> 
> 先不考慮品行或心態方面的事情
> 說說看你可以朝哪些方面想

作為面試後端工程師的面試官，你提出的幾個方向都很有道理，但在準備面試問題時，可以進一步細分或擴展每個方向，確保覆蓋到應徵者的技術能力和實際工作經驗。以下是針對每個方向的更具體思考及可能的問題：

### 1. **軟體工程與程式碼風格／組織能力**
   - **重點**: 評估候選人是否具備清晰、可維護的程式碼編寫習慣，是否理解軟體工程中的最佳實踐，例如模組化、抽象、SOLID 原則等。
   - **問題方向**:
     - 如何組織一個大型後端專案？你如何劃分模組或功能？
     - 如何平衡程式碼的可讀性與效能？
     - 在多人團隊合作時，如何保證程式碼的一致性？是否有使用過特定的程式碼規範或 lint 工具？
     - 你如何優化一段程式碼，使其更易於維護和擴展？
     - 如何處理技術債？當技術債積累時，你會如何向團隊解釋並解決它？

### 2. **語言特性熟悉度（針對 TypeScript）**
   - **重點**: 檢查候選人是否熟悉 TypeScript 語言的特性，了解靜態型別的優勢，以及對於 async/await 等現代 JavaScript 特性的掌握程度。
   - **問題方向**:
     - 你有多熟悉 TypeScript 的型別系統？你如何設計複雜的型別定義來描述系統中的資料結構？
     - 你如何在 TypeScript 中處理異步操作？舉例說明如何使用 `async/await` 處理異步行為。
     - 有哪些情況下會使用 `any` 型別？如何避免濫用它？
     - TypeScript 的 generics 是什麼？你會如何使用它來提升程式碼的彈性和重用性？
     - 你如何設計 TypeScript 的程式碼以保持強型別的同時減少冗長的型別聲明？

### 3. **基礎設施架設經驗及架構設計**
   - **重點**: 瞭解應徵者對於後端基礎設施和架構的經驗，特別是微服務、雲端部署、CI/CD、容器化（例如 Docker）和分散式系統設計等方面的經驗。
   - **問題方向**:
     - 你有設計和搭建過哪些後端架構？微服務架構、單體架構還是其他？你如何選擇適合的架構？
     - 請說明你如何設計一個具備高可用性和擴展性的系統。
     - 你有使用過哪些 CI/CD 工具（如 Jenkins、GitLab CI 等）？你如何設計自動化部署流程？
     - 當你設計 API（REST 或 GraphQL）時，如何保證其安全性和效能？
     - 如何處理系統的垂直和水平擴展問題？遇到效能瓶頸時你會如何分析和優化？
     - 是否有使用過容器技術（如 Docker、Kubernetes）？如何使用它們來簡化部署？

### 4. **基礎設施、演算法及資料結構等套件的使用經驗**
   - **重點**: 評估應徵者對於資料結構和演算法的理解，特別是在真實情況下如何選擇合適的解法和工具。
   - **問題方向**:
     - 在過去的專案中，你有遇到過效能瓶頸嗎？你是如何通過演算法優化來解決的？
     - 請描述一個你曾經使用的資料結構，並說明為什麼選擇它（例如樹、圖、HashMap 等）。
     - 如何在後端開發中應用演算法和資料結構來解決問題？請舉一個實際的例子。
     - 你有使用過哪些外部的資料結構庫或演算法庫？為什麼選擇這些套件而不是自己實現？
     - 當你處理大量資料（例如幾百萬條紀錄）時，你會如何設計系統來提高效能和穩定性？

### 5. **資料庫設計與優化經驗**
   - **重點**: 檢查候選人在資料庫選型、設計以及查詢優化方面的經驗，是否了解 NoSQL 與 SQL 資料庫的不同應用場景。
   - **問題方向**:
     - 你有設計過關聯型資料庫的 schema 嗎？你如何設計資料表來避免重複資料和確保一致性？
     - 你如何選擇 SQL 和 NoSQL 資料庫？有什麼情況下你會選擇一種而非另一種？
     - 如何優化資料庫查詢性能？你有使用過索引、分片或快取技術嗎？
     - 如何設計資料庫以支援高並發讀寫操作？
     - 請說明一次你使用資料庫的經驗，包括遇到的挑戰以及如何解決。

### 6. **測試與除錯能力**
   - **重點**: 評估應徵者的測試能力和除錯技能，是否有良好的自動化測試習慣，能否快速找到程式碼中的問題並修復。
   - **問題方向**:
     - 你如何撰寫測試來保證程式碼的質量？你更傾向於寫單元測試還是整合測試？為什麼？
     - 在 TypeScript 後端專案中，你會如何進行錯誤處理和除錯？
     - 你有使用過哪些測試框架？為什麼選擇這些框架？
     - 如何設計一個能夠自動化運行的測試套件？你會如何處理測試資料的準備和清理？
     - 請舉例說明一個你曾經解決過的複雜 Bug，以及你是如何定位問題的。

### 7. **安全性與認證管理**
   - **重點**: 檢驗候選人是否有後端安全的意識，是否了解常見的安全威脅（如 SQL Injection、XSS、CSRF），以及如何處理認證和授權。
   - **問題方向**:
     - 你如何確保 API 是安全的？如何處理常見的安全威脅（例如 SQL Injection、XSS、CSRF）？
     - 你有實現過 OAuth、JWT 或其他認證／授權機制嗎？你如何選擇適合的機制？
     - 你有處理過使用者資料的加密需求嗎？如何保證儲存和傳輸的資料安全？
     - 當你在設計一個需要角色管理和權限控管的系統時，你會如何處理這方面的邏輯？

這些問題會幫助你更全面地評估候選人在技術能力上的適配度，同時可以根據應徵者的背景和實際工作情境進行靈活調整。


## 選題
> 如果我們只能問 25 道題目，但要包含上述所有你提到的範疇，以 Junior 後端工程師而言，你會安排哪些題目？

針對 **Junior 後端工程師** 的 25 道面試問題，目的是涵蓋所有重要範疇，包括程式碼風格、語言特性、基礎設施架構、資料結構與演算法等。由於 Junior 開發者經驗較少，問題應該側重基礎概念和實際應用，而不過度聚焦於高階架構或高負載系統優化。以下是我會安排的問題：

### **軟體工程與程式碼風格／組織能力（5 道）**
1. **如何組織一個小型後端專案？你會如何劃分模組或檔案？**
   - 測試應徵者是否具備基本的專案架構設計能力。
2. **在團隊中，如何確保程式碼風格一致？你是否有使用過程式碼規範工具？**
   - 評估是否熟悉基本的程式碼風格維護工具（如 ESLint）。
3. **當你發現一段程式碼可以優化時，你會如何處理？如何向團隊提出建議？**
   - 了解應徵者是否具備優化思維，並且能與團隊合作。
4. **你有使用過版本控制系統（如 Git）嗎？你如何處理多人開發的合併衝突？**
   - 確認是否有基本的版本控制知識，這對於團隊協作至關重要。
5. **當你在開發中遇到技術債時，你會如何處理？如何權衡解決時間與產出？**
   - 檢查應徵者是否了解技術債的概念及其影響。

### **語言特性熟悉度（針對 TypeScript）（5 道）**
6. **你對 TypeScript 有多熟悉？為什麼你認為 TypeScript 比 JavaScript 更適合後端開發？**
   - 測試 TypeScript 知識及其對靜態型別優勢的理解。
7. **你如何在 TypeScript 中設計型別定義來描述複雜的資料結構？能舉一個例子嗎？**
   - 確認應徵者是否能靈活使用 TypeScript 的型別系統。
8. **請解釋 `any`、`unknown`、`never` 這幾個 TypeScript 型別的區別和使用場景。**
   - 測試對基本型別的掌握。
9. **你有使用過 TypeScript 的泛型（Generics）嗎？你會在什麼情況下使用它？**
   - 評估泛型使用經驗及其彈性程式碼設計能力。
10. **你如何在 TypeScript 中處理異步操作？請描述 `async/await` 的用法。**
   - 測試異步處理能力，這是後端開發中的常見場景。

### **基礎設施架設經驗及架構設計（5 道）**
11. **你有參與過任何後端系統的設計或實施嗎？請描述你所設計的一個簡單 API。**
   - 評估基本架構設計能力，尤其是 API 設計。
12. **你有使用過 CI/CD 工具來進行自動化部署嗎？你認為這些工具的作用是什麼？**
   - 測試對自動化流程的理解及基礎經驗。
13. **請描述你如何進行 API 安全性設計，如何防止常見的攻擊（如 SQL Injection）？**
   - 基本的 API 安全知識，是保障系統安全性的關鍵。
14. **你有使用過 Docker 嗎？如果有，請解釋它在開發過程中的作用。**
   - 測試對容器技術的基礎了解。
15. **如何設計一個能夠支持高併發的系統？如果你未曾設計過，請描述你會如何學習這一類技術。**
   - 確認應徵者對高併發的基礎認識，儘管 Junior 可能沒有實戰經驗。

### **基礎設施、演算法及資料結構使用經驗（5 道）**
16. **請描述你在程式設計中使用過的資料結構（例如陣列、鏈結串列、樹等），並說明為什麼選擇它。**
   - 確認是否理解常見資料結構及其應用場景。
17. **如果你要處理一百萬條資料，應該使用什麼資料結構來進行快速查找？**
   - 測試基礎資料結構和效能優化的理解（如 HashMap）。
18. **你有學過基本的排序演算法嗎？能否描述一個你熟悉的排序方法？**
   - 基本演算法知識，了解 Junior 是否有演算法的基礎。
19. **在實際開發中，如何選擇正確的演算法來解決問題？能舉個例子嗎？**
   - 測試是否具備將演算法應用於實際場景的能力。
20. **你有使用過外部的資料結構或演算法庫嗎？為什麼選擇它而不是自己實現？**
   - 檢查應徵者是否懂得平衡自實現與使用現有庫的取捨。

### **資料庫設計與優化經驗（3 道）**
21. **你有設計過資料庫 schema 嗎？請描述你如何設計一個簡單的資料表。**
   - 基本的資料庫設計能力。
22. **你了解 SQL 和 NoSQL 資料庫的區別嗎？在什麼情況下會選擇 NoSQL？**
   - 測試對不同資料庫技術的基本認識。
23. **你有優化過資料庫查詢嗎？能否描述一個簡單的優化策略？**
   - 檢驗是否具備基本的資料庫效能優化知識。

### **測試與除錯能力（2 道）**
24. **你有撰寫過單元測試或整合測試嗎？你認為測試對程式碼質量有什麼影響？**
   - 檢查應徵者是否有測試開發的基本認識。
25. **當程式發生錯誤時，你的第一步通常是什麼？你會如何進行問題排查和除錯？**
   - 測試除錯能力與問題解決思維。

---

這套 25 題的問題設計，旨在全面評估 Junior 工程師的技術基礎和實踐能力。題目會根據他們的經驗和技術深度進行簡單易懂的描述，重點關注他們對基礎知識的掌握和解決問題的能力。

# 細節補充

## 關於第 1 題，能請你設想一個小型專案的題目嗎?
當然！這裡有一個適合 **Junior 後端工程師** 的小型專案題目，包含基本的 API 設計和資料庫使用，讓應徵者能展示他們對後端架構的理解。

### **專案題目：任務管理系統 API**
設計並實現一個簡單的任務管理系統的後端 API，該系統允許用戶創建、更新、查看和刪除任務。系統需具備基本的認證功能，以確保只有已登入的用戶才能管理自己的任務。

#### **需求描述**
1. **用戶註冊和登入**:
   - 用戶可以註冊新帳戶，提供用戶名、電子郵件和密碼。
   - 用戶可以登入，成功登入後會獲得一個 JWT（JSON Web Token）作為後續 API 請求的認證標記。

2. **任務管理**:
   - 每個用戶可以創建、查看、更新和刪除他們自己的任務。
   - 每個任務包括以下資料：
     - `id`: 任務唯一標識符
     - `title`: 任務標題
     - `description`: 任務描述
     - `status`: 任務狀態（如 "pending", "in progress", "completed"）
     - `dueDate`: 任務的到期日
     - `createdAt`: 任務創建時間
     - `updatedAt`: 任務最後一次更新的時間

3. **權限控制**:
   - 只有已登入的用戶可以操作他們自己的任務，無法查看或修改其他用戶的任務。

#### **基本功能 API**
1. **用戶註冊**：`POST /users/register`
   - 請求資料：`{ username, email, password }`
   - 返回資料：註冊成功後的用戶信息

2. **用戶登入**：`POST /users/login`
   - 請求資料：`{ email, password }`
   - 返回資料：JWT token

3. **創建任務**：`POST /tasks`
   - 請求資料：`{ title, description, dueDate, status }`
   - 返回資料：創建的任務資料

4. **查看任務**：`GET /tasks`
   - 請求資料：JWT token（作為 Authorization header）
   - 返回資料：當前用戶的所有任務列表

5. **更新任務**：`PUT /tasks/:id`
   - 請求資料：`{ title, description, dueDate, status }` （根據需要更新的欄位）
   - 返回資料：更新後的任務資料

6. **刪除任務**：`DELETE /tasks/:id`
   - 請求資料：JWT token（作為 Authorization header）
   - 返回資料：刪除確認

#### **擴展功能 (選做)**
- **任務的搜尋和過濾**：允許用戶根據任務狀態或到期日篩選任務。
- **優先級排序**：為每個任務加入優先級欄位，並允許用戶按照優先級排序任務列表。

#### **資料庫設計建議**
應徵者可設計一個簡單的資料庫模式，如下：
1. **Users** 表：
   - `id`: 主鍵
   - `username`: 唯一的使用者名稱
   - `email`: 唯一的電子郵件
   - `password`: 加密的密碼

2. **Tasks** 表：
   - `id`: 主鍵
   - `title`: 任務標題
   - `description`: 任務描述
   - `status`: 任務狀態（如 "pending", "in progress", "completed"）
   - `dueDate`: 任務到期日
   - `userId`: 外鍵，對應用戶
   - `createdAt`: 任務創建時間
   - `updatedAt`: 任務最後一次更新的時間

#### **技術要求**
- **語言**：Node.js + TypeScript
- **資料庫**：選擇 MySQL、PostgreSQL 或 MongoDB 均可
- **驗證與認證**：使用 JWT 實現基本的登入驗證機制
- **架構**：採用 MVC 或其他清晰的專案結構

### **面試問題延伸**
- **架構設計**: 你會如何組織這個 API？例如如何劃分路由、控制器和資料庫模型？
- **認證與安全性**: 你如何保證只有擁有正確認證的用戶才能操作自己的任務？
- **資料庫選型**: 你會選擇哪種資料庫（SQL 或 NoSQL），為什麼？
- **錯誤處理**: 如何處理 API 中的錯誤（例如用戶嘗試操作其他人的任務）？

這個專案不僅涵蓋了後端開發中的核心技術，還能讓面試者展示對 API 設計、資料庫操作和基本安全性的理解。


## 關於第 3 題，可以請你設計一段可優化的程式碼嗎？我覺得不要牽涉到對資料庫或外部服務的整合比較好，希望題目的重點擺在譬如過深的巢狀、不好的命名或者變數的 scope 沒有隔離開來。

```typescript
function calculateTotal(cart) {
    let total = 0

    for (let i = 0; i < cart.length; i++) {
        const item = cart[i]
        if (item.available) {
            if (item.discount > 0) {
                total += item.price - item.discount
            } else {
                total += item.price
            }

            if (item.coupon) {
                if (item.coupon.type === 'percentage') {
                    total -= (total * item.coupon.value / 100)
                } else if (item.coupon.type === 'fixed') {
                    total -= item.coupon.value
                }
            }
        }
    }

    return total
}

const cart = [
    { price: 100, available: true, discount: 10, coupon: { type: 'percentage', value: 20 } },
    { price: 50, available: false, discount: 0 },
    { price: 200, available: true, discount: 0, coupon: { type: 'fixed', value: 30 } }
]

console.log(calculateTotal(cart))
```
