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