---
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))
```