[心得] 2023 軟體工程師(後端)面試分享

看板Soft_Job (軟體人)作者 (正太控)時間3年前 (2023/06/01 21:39), 3年前編輯推噓94(962151)
留言249則, 95人參與, 最新討論串1/1
各位安安,這邊想簡單分享一下我 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,但想想這會花費應徵者太多時間這次就不採用這種方式,有興趣的話我要問一下公司能不能授權公開當時的題目。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.226.47.65 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1685626794.A.29B.html ※ 編輯: MoMoShota (36.226.47.65 臺灣), 06/01/2023 21:51:24

06/01 22:04, 3年前 , 1F
請問貴公司這個職缺開多少錢,面試流程這麼多?
06/01 22:04, 1F

06/01 22:05, 3年前 , 2F
喔偏好是擇一,我誤會了
06/01 22:05, 2F

06/01 22:08, 3年前 , 3F
Junior ~ Mid 是 1M NTD 以下;Mid ~ Senior 是 1.2M
06/01 22:08, 3F

06/01 22:08, 3年前 , 4F
到 1.5M NTD,如果真的超強當然是可以往上談的
06/01 22:08, 4F

06/01 22:29, 3年前 , 5F
廣告業竟然可以開這麼高薪,滿意外的
06/01 22:29, 5F

06/01 22:35, 3年前 , 6F
兩個應徵者選不同的題目 你要怎麼評斷優劣?
06/01 22:35, 6F

06/01 22:46, 3年前 , 7F
咱應該屬於廣義的廣告業,至於薪資水準因為我很久沒出
06/01 22:46, 7F

06/01 22:46, 3年前 , 8F
來找工作了,所以不是很瞭解現在的水準
06/01 22:46, 8F

06/01 22:48, 3年前 , 9F
我們會根據應徵者的回答內容進行評分,然後每個項目會
06/01 22:48, 9F

06/01 22:48, 3年前 , 10F
取平均
06/01 22:48, 10F

06/01 22:50, 3年前 , 11F
舉例來說:問答題表現是 60 分,但實作有 80 分,那就
06/01 22:50, 11F

06/01 22:50, 3年前 , 12F
取平均 70 分(但有時候如果讓人眼睛一亮的回答還會有
06/01 22:50, 12F

06/01 22:50, 3年前 , 13F
些特殊加分)
06/01 22:50, 13F

06/01 23:00, 3年前 , 14F
另外補充一下,我如果時間允許會根據應徵者的履歷或 G
06/01 23:00, 14F

06/01 23:00, 3年前 , 15F
itHub 客製化題目,我認為每個人都有自己的特質跟值得
06/01 23:00, 15F

06/01 23:00, 3年前 , 16F
發揮的項目,如果千篇一律問考古題太無聊了
06/01 23:00, 16F

06/01 23:21, 3年前 , 17F
這薪水結構還蠻接近 y 社的
06/01 23:21, 17F

06/01 23:33, 3年前 , 18F
廣義的廣告業...字母公司也算是啦 XD
06/01 23:33, 18F

06/01 23:39, 3年前 , 19F
G 社也算廣告業,只是我進不去 QQ
06/01 23:39, 19F

06/02 00:03, 3年前 , 20F
推 喜歡看這種分享
06/02 00:03, 20F

06/02 00:10, 3年前 , 21F
好奇問一下,php 沒thread 為什麼要考這個。
06/02 00:10, 21F

06/02 00:10, 3年前 , 22F
另外php在寫 多執行的時候,相對於其他語言 memory更
06/02 00:10, 22F

06/02 00:10, 3年前 , 23F
不好控制跟回收。用其他語言寫反而比較穩才對?
06/02 00:10, 23F

06/02 00:11, 3年前 , 24F
new grad 來應徵後端的話會怎麼考?不會 php 也不會 d
06/02 00:11, 24F

06/02 00:11, 3年前 , 25F
b ...
06/02 00:11, 25F
上述的題目其實是因為本次的應徵者都是有經驗的(至少都有 3 年以上),所以才會選擇這些題目。 如果是資工本科系畢業的話,其實我就會改問一些必修課上會遇到的問題。 舉例來說:請問 C 語言的 qsort ᄄ蝳〞漁伅■亠曮蚻O如何(可以查 Google) 正確答案是,其實 qsort 並沒有指定要用什麼演算法實作(C 語言規格書說的) 但有一些誤人子弟的網站會斬釘截鐵地說它「一定」是用 Quick Sort(包括我的教授也是這樣),那這表示他可能不習慣於看第一手資料 (小聲)之前我問過 ChatGPT 也是唬爛說是 Quick Sort

06/02 00:17, 3年前 , 26F
問得好細喔 推
06/02 00:17, 26F

06/02 00:37, 3年前 , 27F
同樣好奇貴公司是否需要碰到thread?
06/02 00:37, 27F

06/02 00:37, 3年前 , 28F
用的那個extension?
06/02 00:37, 28F
關於 Thread 的部份我統一在這邊回覆。 確實,我們的系統目前並沒有在 PHP 上「直接使用」Thread 或 Coroutine 之類的技術。 但是 PHP-fpm 是一個經典的 Parent/Child Process 模型,同時在 Laravel Horizon 也用純 PHP 加 pcntl extension 實作類似的模型。 之前我們團隊在遇到 Laravel Horizon 相關的問題時,如果不理解這種模型實作可能會增加 Debug 的難度。 回到 Thread 的話題,目前我們沒有計畫在 PHP 應用程式上加入任何 Multi-thread 的技術。 誠如版友所述,PHP 在多執行緒的記憶體管理跟控制簡直是災難,而避免災難的方式就是不要用它(?) 近年來因為 Swoole 的出現,讓大家開始思考 PHP 的另一種可能性:Coroutine 然而從我的角度其實我也不是很喜歡 Swoole,一個理由是之前社群的分裂問題,另一個理由是「那我為何不選 Go?」

06/02 00:53, 3年前 , 29F
另外1的問題是指生命週期還是程式碼?
06/02 00:53, 29F
剛剛有人私信我詢問類似的問題,我直接轉貼我的回覆: 我們知道,PHP 有幾種 SAPI:apache2handler, cli, fpm(這邊僅列舉比較常見的,其實還有很多) 我在這題會期待得到的回應是:當我們啟動 php-fpm 程式(你可以想成直接執行它的執行檔)時,PHP 實際上會做哪些事? 像是 php-fpm 是一個經典的 Parent/Child Process 模型,它會去 fork 出很多的 Child Processes,而實際處理請求的是這些 Child Process(Parent Process 主要是用來監測這些 Child Process 是不是「還活著」) 然後,當我們收到來自 Web Server 的請求時,PHP-fpm 的 Child Processes 又是怎麼去服務這些請求的呢? 我會很樂意看到有人從 source code 的角度去剖析這件事,但我老實說這非常罕見 所以其實只要能夠從外部表現的行為(例如我們可以觀察到出現 Parent/Child Processes),然後結合一些自己的經驗或知識講述它設計的理由,其實在面試就算是過關了 ps. 如果他要講 apache2handler 也是可以的,不一定只能講 php-fpm ps2. 當然,如果對方要講得很深我也是可以一起聊聊的,雖然我研究 PHP Source Code 是 PHP 7 的時代的事了,但現在有些知識應該是通用的(如果被指出有誤的話,還可以順便學習 XD)

06/02 00:53, 3年前 , 30F
沒想到是Y或G這種廣告業XD 想說以前面數位廣代薪水很普
06/02 00:53, 30F

06/02 01:30, 3年前 , 31F
推一下XD
06/02 01:30, 31F

06/02 01:34, 3年前 , 32F
剛剛忘了推。現在ptt需要更多這種優質文章
06/02 01:34, 32F

06/02 01:36, 3年前 , 33F
推 感謝分享
06/02 01:36, 33F

06/02 02:35, 3年前 , 34F
蠻有趣的 推一下
06/02 02:35, 34F

06/02 03:10, 3年前 , 35F
06/02 03:10, 35F
※ 編輯: MoMoShota (36.226.47.65 臺灣), 06/02/2023 03:27:15 ※ 編輯: MoMoShota (36.226.47.65 臺灣), 06/02/2023 03:46:08
還有 180 則推文
還有 34 段內文
06/04 15:29, 3年前 , 216F
但成效卻出奇的好
06/04 15:29, 216F
我承認,以前我是那種會想辦法說服對方用我的方案的那種人 XD 不過年紀大了之後,我比較傾向讓對方放手去試試看,除非我看出有明顯的問題,不然我不太會阻止他。 舉兩個例子: 1. 同事覺得我們可以在 Laravel 上嘗試用 Pest 框架取代 PHPUnit,當時我覺得這個點子不錯所以讓他放手去改,而直到現在我們公司還是大量用 Pest 框架(寫起來比較不囉嗦) 2. 同事用了原生函式取代我實作的 XML Parser,被我阻止了,因為經過測試它的實作會使用兩倍的記憶體與降低處理速度約 20% ~ 30% 2-1. 他還跑來跟我爭說「原生函式一定比較好」。兄弟,benchmark 就擺在那邊了,你覺得我的實驗有問題你自己設計實驗,不然我就只能阻止他的 PR 2-2. 這個重構是他認為我的實作耗費太多記憶體了,在某個極端情況下會 out of memory,然後他的實作在更多的情況下 out of memory(?) 另一方面,我是很願意培養新人的,我找人來最大的目的是為了把自己給 fire XDD。 之前有個新人(Junior)進來後問我該怎麼快速養成實力,我就把他工作時遇到的盲點分析了一次,認為他的基礎知識不夠紮實(因為是非本科轉職,不能怪他) 當時我就推薦他去看一些資料結構跟作業系統的科普(雖然我更推薦讀教科書,但說真的下班後還要去 K 教科書這種事不太現實),以及一些我覺得還不錯的入門書籍。 通常來說,如果有個人來問我問題,我會先確定他要的是「我認為的解答」還是「思考的方向」 - 如果他要解答,我就跟他講我的思路及我認為要這麼做的理由 - 如果他要思考,我就會給他一些可以嘗試的方向或可以去哪裡找資料 - 如果我也不知道,那我會跟他一起找找看,或是請他實驗看看(甚至是自己接過來做實驗 XD)

06/04 15:36, 3年前 , 217F
回答出來的人會有更好待遇的去處,除非他不缺錢
06/04 15:36, 217F
※ 編輯: MoMoShota (36.226.34.224 臺灣), 06/04/2023 16:00:11

06/04 16:14, 3年前 , 218F
說到底就是$$$$$$$$$$$不夠
06/04 16:14, 218F

06/04 16:26, 3年前 , 219F
你選你的,我選我的,道不同不相為謀
06/04 16:26, 219F

06/04 16:59, 3年前 , 220F
覺得那個噓文 可以檢舉了吧 有攻擊的意味
06/04 16:59, 220F

06/04 20:47, 3年前 , 221F
應該投爆吧,薪水150+贏過板上一堆缺
06/04 20:47, 221F

06/05 10:25, 3年前 , 222F
推面試官認真準備面試
06/05 10:25, 222F

06/05 17:58, 3年前 , 223F
感謝好文分享推
06/05 17:58, 223F

06/05 18:18, 3年前 , 224F
應該說用DFS 去計算要吃掉多少棋子比較精確
06/05 18:18, 224F

06/05 18:21, 3年前 , 225F
而且這種寫規則的有很多corner case要注意
06/05 18:21, 225F

06/06 12:10, 3年前 , 226F
考的範圍廣 也只是想知道熟悉環境的程度 能理解
06/06 12:10, 226F

06/06 12:11, 3年前 , 227F
畢竟很多時候 問題不會侷限在單純 演算法/php程式
06/06 12:11, 227F

06/06 12:12, 3年前 , 228F
使用的硬體 其餘環境 如果有些了解 在解bug比較容易
06/06 12:12, 228F

06/06 12:12, 3年前 , 229F
看到比較廣的一面 雖然常常發生覺得是A問題去改A設定
06/06 12:12, 229F

06/06 12:13, 3年前 , 230F
好了一陣子又壞了 繞了一圈回來才發現原本的程式其實
06/06 12:13, 230F

06/06 12:13, 3年前 , 231F
有問題XDD 只是A的優化 讓問題可以延緩發生
06/06 12:13, 231F

06/06 12:13, 3年前 , 232F
感謝分享
06/06 12:13, 232F
確實,雖然不是很頻繁,但有些問題是跨領域且需要各種背景知識才容易解決的。 這也是我對 Senior Engineer 有的期許(雖然看起來 Soft_job 版好像不太崇尚這種想法?)

06/06 14:04, 3年前 , 233F
我也覺得是錢的問題,考這些開200+以上我想應該就不會
06/06 14:04, 233F

06/06 14:04, 3年前 , 234F
有酸民
06/06 14:04, 234F

06/06 14:07, 3年前 , 235F
事實上我認為拿300+以上的人也不一定會這些問題
06/06 14:07, 235F
我覺得,就算是 200+ 也一定會有人有意見。 我的心態就是「對,你說得都對,有能力選擇 200+ 還 2000+ 就不勞您加入我們了」 反正現在勞資雙方就是各自喊價,市場機制下喊得合理的就能找到人。

06/06 20:49, 3年前 , 236F
總歸回到市場,如果這樣的面試方式找得到人我們也不需要
06/06 20:49, 236F

06/06 20:49, 3年前 , 237F
瞎操心就是了。況且現在求職市場那麼差,說不定還更容易
06/06 20:49, 237F

06/06 20:49, 3年前 , 238F
找得到高手
06/06 20:49, 238F

06/10 00:06, , 239F
有認真分享自己的知識跟經驗給推。但感覺大家在意的是
06/10 00:06, 239F

06/10 00:06, , 240F
職位給的錢跟需求的技能跟求職市場行情差距過大,建議
06/10 00:06, 240F

06/10 00:06, , 241F
原PO可以自己看看現在市場行情需求再決定要不要調整。
06/10 00:06, 241F
其實 Soft_job 版算是惠我良多,我已經著手調整目前的題目,目前傾向於降低整體難度與更明確劃分 Junior 與 Senior。 如果未來公司仍授權我將面試題目分享出來,我應該還是會跟版友們分享。 (至於 FB 那邊我應該會阻止我朋友 po 文吧,我是因為對紫色貓貓沒啥好感所以一直沒加入才想說請他幫個忙,然後他自己搞到崩潰笑死)

06/13 19:52, , 242F
推!好文 身為一個剛畢業新鮮人覺得很受用
06/13 19:52, 242F

06/17 18:09, , 243F
優文 身為一個寫php半年的菜鳥一堆題目都看不懂 感謝
06/17 18:09, 243F

06/17 18:09, , 244F
分享!
06/17 18:09, 244F
沒事,技能的培養不會是一瞬間的事。 如果真心喜歡這個領域、這個產業,那進步也只是時間問題。 ※ 編輯: MoMoShota (36.226.26.49 臺灣), 06/18/2023 00:30:51

06/22 13:19, , 245F
比起這樣面試o不ok
06/22 13:19, 245F

06/22 13:19, , 246F
我更想知道其他鄉民們口中的更好的去處?
06/22 13:19, 246F

07/20 21:17, , 247F
kklllllllllllllllllllllll胬klllkkllllkllllllllklk
07/20 21:17, 247F

07/20 21:17, , 248F
@ashlikewing
07/20 21:17, 248F

08/14 20:18, , 249F
感謝分享
08/14 20:18, 249F
文章代碼(AID): #1aU9-gAR (Soft_Job)
文章代碼(AID): #1aU9-gAR (Soft_Job)