各位安安,這邊想簡單分享一下我 2023 年中旬(上週 ~ 昨天)的面試經驗。
先自我介紹一下,本人是某廣告相關公司的 Software Engineer, Backend,同時也是本次分享技術面試的主持人。
鑑於版上幾乎都是求職者進行分享,所以本次在主管(老闆)的授權下以面試主持人的角度進行分享,還請各方先進不吝指教。
本公司主要想找 PHP/Laravel Backend Engineer,如果有其它語言的經驗也願意學習 Laravel 的人也非常歡迎(受限於目前公司的人力資源,還無法擅自變更使用的框架與語言,但這是未來很重要的里程碑之一)
註:為避免有偷渡徵才訊息的疑慮,本篇文章不會直接寫出公司名稱,如果有興趣的話歡迎私信詢問
註2:本公司仍然有在徵才哦,如果你看到這篇文章覺得想來當我的同事可以來投看看 XDD
===
流程介紹
本公司技術面試為第二輪(第一輪我不會參與,這邊也無法分享相關經驗),表訂時間約在 1 小時(但如果想跟我聊多一些,可以到 2 小時甚至以上,目前最高記錄是 3.5 小時)。
1. 雙方自我介紹
基於禮貌,我會盡量期許自己先開口自我介紹,但最近還在習慣這件事所以有時候還是麻煩對方先行自我介紹,也感謝近期應徵者的海涵。
2. 面試偏好詢問
參考一些面試經驗,有些人不喜歡考卷、白板題或 assignment 等各種類別,所以我會先行詢問對方的面試偏好。
以下選項擇一或全選皆可,但選擇越多可能會延伸面試時間;選擇的項目並不會影響到評估的結果,因為會以各項分數平均計算(我會私心對一些有利於應徵者的項目做加權,不過也不是只有我決定)。
(1) 白板題:演算法,不能用 ChatGPT(或其它 AI 輔助) 但可以查文件
(2) 實作題:程式能力,能用 ChatGPT 也可以查文件
(3) 架構題:Senior 獨有,能用 ChatGPT
(4) 問答題:基礎知識,不能使用 ChatGPT 也不能查文件
(5) Assignment:指定一個 Open Source Repository,請你發一個 Pull Request(我會實際去看你的變更內容跟 commit message 以及跟 maintainer 的應對)
- 這部份會以自願為優先,如果覺得真的很不想做或不知道從何下手的話也可以放棄(不計分)
利益申告:所有的問題與公司現行產品都盡量無關,這是為了避免有白嫖應徵者思路的嫌疑;而 Assignment 的選擇也會盡量挑選有一定用戶基礎的 Repository。
3. 詢問想要面試的難度
目前有開放的職位有兩個:
(1) Mid ~ Senior:能夠考量系統架構並定義良好的 Interface,並且能跟架構師討論未來的一些技術選型
(2) Junior ~ Mid:實作一些 CRUD API,以及實作一些 Senior 工程師定義好的 interfaces
如果不知道怎麼選擇也沒關係,我可以根據應徵者的實力自動調整問題的難度。
=====
聊天題(為了更瞭解對方,並核對履歷內容,不列入計分)
1. 最近看了哪些值得一提的資訊領域的內容,包括但不限於文章、影片、漫畫、meme、新聞、論文等
2. 擅長的工具與程式語言(用於確認履歷中的敘述)
=====
白板題
給定一個二維陣列代表圍棋棋盤
- 1 代表黑子
- 2 代表白子
- N (null) 代表未落子
若棋盤一定是理想的(定義下述),那白棋會被提多少子、黑棋會被提多少子?
舉例:
N 1
1 2
(1,1) 白子會被提子
舉例:
N 1 1 1 N
1 2 2 2 1
2 1 1 N 2
1 1 2 2 1
(0,2) 的白子會被提子
(4,3) 的黑子會被提子
「理想的」棋盤表示不會存在「打劫」的問題,舉例來說下述棋盤結果是不會出現的,因為中間的白子與黑子會互相提子
N 1 2 N
1 2 1 2
N 1 2 N
備註:
這一題的來源是我曾經出給一個學生的作業,他是非本科轉職前端,我本來只是想請他用 HTML + CSS 寫個圍棋棋盤,並且用 JS 實現落子邏輯,結果他連提子邏輯都一併寫出來了。當時他是自行實現了 DFS 去計算棋子是否還活著(圍棋術語是「有氣」)。
題外話,前陣子跟這學生吃飯的時候他提到公司在做某個功能,他自行研發了一個資料結構來解決這個問題,我一看就說「你這不是自行實現了字典樹(Trie)嗎?!」,不得不說他真的是一個天賦異秉的人,怪我能力不夠沒能教好他。
(小聲)打色碼眼睛快脫窗 = =
=====
實作題
下列 PHP 程式碼存在一些問題,請嘗試指出這些問題並且重構它。
註:下述程式隱藏了一些不重要的細節(例如資料庫連線、失敗處理等),回答時也可以隱藏實作細節(不一定要精準的使用所有的函式)
<?php
extract($_POST);
$db = new DB(); // connect to DB
$user = $db->query("SELECT * FROM users WHERE username = $username AND password = $password"); // query from DB
echo $user ? 'Login Success' : 'Login Failed';
這一題其實是互動題,因為實作題可以使用 ChatGPT 所以我更期望應徵者能跟我說明「為什麼它要這樣改」。
而且就我實測 ChatGPT 會唬爛所以不能全信(我認為分辨 ChatGPT 是不是在唬爛也是很重要的能力)。
=====
問答題
這部份不開放使用 ChatGPT,因為這些題目都是屬於基礎知識,如果開放使用 ChatGPT 幾乎都會被秒殺。
然而,我們後續內部檢討認為應該要開放可查詢 Google,畢竟有些東西是真的不會背在腦子裡(雖然我是都有大概記著,但每個人習慣不同不能一概而論),如果版友們有任何想法也歡迎回饋,我們會盡可能改善我們的流程。
1. PHP 相關
(1) PHP 的執行與啟動流程?[中級]:主要指的是它在 PHP Source Code 層級的執行流程,不僅僅是在外部觀察到的結果
2. Redis 相關
(1) 單 Redis Instance 可能會當機或因為網路問題無法存取,有什麼解決方案?[初級]:這應該算是八股題
(2) Redis 的 "字串" 是如何實現的,有沒有什麼值得一提的陷阱或細節?[中級]:這個是 Redis Source Code 的入門題,畢竟甚至有一個專門的網頁來介紹 SDS
3. 作業系統相關
(1) Thread 跟 Process 有什麼差別?[初級]:這個也是八股題,問到爛的那種
註:其實作業系統相關還有不少題目,但鑑於重複利用性我就先不公開(這些題目都沒用到,因為我評估對方可能對作業系統沒這麼熟)
4. 資料庫相關
(1) 請簡述一下 MySQL InnoDB 的資料寫入流程。[中級]:這可能是比較有爭議的題目,因為不能查資料,如果沒有相關的經驗很難背起來
(2) 為什麼大部份的 RDBMS 會選擇 B+ Tree 作為其底層的資料結構?[中級]
(2.1) 有個應徵者說因為 B+ Tree 有自平衡的特性,所以我又加問了「那為什麼不使用 RBTree 或 AVLTree?」[中級]
(2.2) B Tree 跟 B+ Tree 又有什麼差異呢?[中級]
(2.3) 近年來,LSM-Tree 相當盛行,能聊聊它與 B+ Tree 的差異嗎,以及你認為為什麼它會流行起來?[中高級]
(3) 請簡單描述一下 CAP 理論。[初級]
(3.1) 因為有一個應徵者有 MongoDB 的經驗,所以我又加問了「那 MongoDB 叢集是犧牲了 CA 的哪個點來達到 P 的?」[中級]
5. 虛擬化/容器化
(1) 請簡述一下 Virtualization 與 Containerization 的差異。[初級]
(2) 在 Linux 中,是如何達成 Containerization 的?[中級]
(3) 假設想讓 PHP-FPM 與 Nginx 的應用程式 Containerize,會如何實踐?[初級]
(3.1) 假設再加上 Laravel Queue Worker 及 Cronjob Scheduler,又會如何設計?[中級]
註:這題是因為去翻應徵者的 GitHub 發現他有類似的經驗,所以另外加上去的
=====
架構題
這部份有些難以說明,因為更著重的是互動性(根據對方的回答去反問一些問題),這邊先省略
=====
Assignment
目前還沒有人選過這個項目,看來大家是真的很不喜歡 Assignment。
以前我比較喜歡 Assignment 的時代有出過一些簡單的(?)題目,例如用 Laravel 實現幾個 APIs,但想想這會花費應徵者太多時間這次就不採用這種方式,有興趣的話我要問一下公司能不能授權公開當時的題目。
--