科技業面試的技術關卡到底在考什麼?

除了把題目做出來,你還有許多能做的事

Hank Chen
May 26, 2023

去年我分享了對於履歷應該如何準備的想法,其中就提到了拿到科技業工作機會可以分成兩步:獲得面試機會,以及通過面試。該篇文章主要著重在第一步,也就是將履歷寫好以順利得到面試機會,而在那之後,緊接著就會碰上技術關卡的面試。

表面上,一般常見的技術關卡就是考一至數題 LeetCode 風格的題目,考驗面試者在有限的時間內是否能夠解出來(這邊指的是寫出正確且複雜度符合面試官期待的程式碼,但其實我認為「解出來」的定義也很值得討論);然而,就我個人的經驗而言,有更多細節、可以練習的方向隱藏在其中。在這篇文章中,我會分享我認為的技術關卡除了考驗解題能力以外,還有哪些面向是面試官可能在乎的——至於如何準備這些面向,會留到之後的文章。

跟其他篇文章一樣,所有內容只是我個人的看法,請接受自己認同的地方就好。如果有想討論的地方,歡迎留言或寄信給我。

考察面向

以下是我認為技術關卡中,面試者可能被考察的三個面向:

A venn diagram of what can be examined during an interview.

由圖示可以看出,解題能力當然是很重要沒錯,但還有其他兩項我覺得也很重要(甚至更重要)的面向:思路以及互動。

解題能力

「解題能力」應該是正在準備面試的我們最熟悉的,這項包含但不限於:

  • 資料結構、演算法
    也就是我們在課堂上所學到的圖、樹、二分搜尋等知識;對於不同公司、職位,所需要掌握的範圍、程度也不同。
  • 複雜度分析
    時間、空間複雜度的分析,常常是許多人回答得不好的地方。
  • 特殊限制條件
    主要是針對題目給出的額外條件,能否有合理的解法。例如:輸入是兩個陣列,其中一個的長度遠大於另一個時,有時候會有更精簡、甚至複雜度更好的另一種解法;又或者是輸入的資料量很大時,會限制每次只能 access 其中的一部份、或只能 sequential 地拿之類的。
  • Domain knowledge
    像是前端相關知識、記憶體相關知識、網路安全相關知識等,根據面試的職位而有所不同。(這些知識不見得是另外出考題,有時候會結合在 LeetCode-y 的題目中。)

這項主要著重在面試者的硬知識,準備方向不外乎就是 LeetCode、一些整理好的網站(如:GeeksforGeeks)、書籍(如:Introduction to Algorithms)、或線上課程等。

思路

「思路」這項的範圍甚至比「解題能力」更廣,從拿到題目、分析、開始解題、驗證、優化,一直到最後的分析與討論。包含但不限於:

  • 針對已知題目,如何去拆解成小部分、逐一解決,並且合併得出最後的解法。
  • 針對已知題目,如何思考並列舉出可能的邊界條件,並且用合理的方式處理掉它們。
  • 在已知的範例、條件中,如何善用它們幫助解題。例如:找出規律、思考為什麼條件會存在。
  • 在面試官給出提示後,如何善用它們幫助解題。例如:限縮思考的方向、限縮能使用的工具、思考為什麼面試官給出這樣的提示。
  • 針對提出的解法,如何用現有或者新提出的範例來測試(dry-run)。這不只幫助你展示解法的正確性,也能夠找出可能存在的小錯誤或 typo——如果你沒有驗證而直接告知面試官「你寫完了」,從這個時間點之後,所有被你或面試官挑出的錯誤都算在你頭上了(他都有權利寫進他向上提交的報告。)
  • 針對提出的解法,如何根據面試官的回覆、要求做進一步的優化。例如:面試官詢問將陣列排序的目的為何、或者划不划算時,思考是否能用其他資料結構避開排序的需求、為什麼不需要排序。
  • 針對面試官提出的 Follow-up,將現有的解法進一步延伸。例如:題目範圍變大,或者說條件變寬鬆時(例如原題是兩個陣列,現在考慮 k 個陣列),思考是否能夠 generalize 原解法使其能夠直接套用在新題目上;題目範圍變小,或者說條件變嚴格時(例如原題是 binary tree,現在考慮 binary search tree),思考原解法是否能「丟掉」某些操作,而那些操作已經在題目中被「新的條件」處理掉了。
  • 針對毫無思緒的題目,如何能夠穩定地構造出次佳解。(這點我認為是必備且應該多加練習的——會拿到什麼題目很看運氣,但能至少丟出一個解法是對於面試者合理的期望。)

相較於「解題能力」,這項重視的是「思考能力」,也就是面試者是否能在有限範圍內思考、是否能跳出思考的瓶頸,以及對於現有結論的延伸

互動

「互動」是從聽題目開始,一直到回答問題都囊括在內。包含但不限於:

  • 如何聽題目
    面試官描述題目時,如何做出反應。
  • 如何釐清題意
    聽完題目後,如何問出合理且有意義的問題,以更完整地了解題目意思。這項做不好的後果就是提出解法後被面試官糾正:「我問的是 ABC,不是 XYZ」,對我來說是大 red flag。
  • 如何詢問條件
    提出一些問題來限縮題目範圍。例如:輸入的大小、型態等;需要特別注意的是不要問沒有意義(對解題沒有影響)的問題。
  • 如何開始思考
    讓面試官知道你即將開始思考題目。我列出這點的目的在於:如果你什麼都不說就開始埋頭苦思,容易讓面試官不知道這時候他該說話、重新講一遍題目、或者等待你思考。
  • 如何提出想法
    將腦中的想法闡述給面試官,並且解釋出該想法的正確性。這點很重要的原因在於:在還沒拿到面試官明確的「可以開始寫」的訊號之前就開始寫程式碼,是很危險的行為。
  • 如何邊寫邊講
    讓面試官跟上你的思路、你寫每行程式碼的目的,對他來說通常是比較好的體驗。當然,如果你真的希望先寫完再開始說明你的程式碼,你至少要讓他知道你接下來程不會邊寫邊講,否則他又會面臨不知道該做什麼的情況。

雖然是技術面試,但也同時考察著面試者的人格特質與溝通能力,對於面試官將是未來主管的關卡來說,這項有時候比前兩項更重要。

為什麼是這三個面向?

我之所以將考察面向分為這三個而不是其他三個或四個,主要有兩點原因:

  1. 當初在面試時,對於我成功拿到 offer 的那些職位,我自認為在這三個面向的表現都還行。
  2. 缺少其中一項或兩項能力的面試者,我們的確可以猜到他可能存在的不足之處。例如:「解題能力」較弱代表基礎知識可能不熟;「思路」較弱代表思考深度可能較不足、缺乏 AC 之前及之後的練習;「互動」較弱則代表只專注在寫一堆題目,但沒有練習面試或者實戰經驗,抑或是不熟悉面試的流程。

當然,這三個面向頂多是必要條件而不是充分條件(甚至不是必要的),它們各自也能延伸出更多可以琢磨的方向,沒有絕對的劃分方式。我想強調的是,除了解題能力以外,面試者真的還有很多其他能努力的方向,絕對不是「解不出來就直接下去」、「寫出來就穩上」這麼簡單而已。

後記

寫這篇文章的目的在於希望提供準備面試的人一些不同的觀點,重新審視自己的準備方式是否完善、過去失敗的面試中是否有哪一項真的表現較差,進一步參考這三個面向來調整自己的心態及準備方式。

至於這三個面向分別應該如何準備,我也有很多看法及經驗,之後有時間會再另外寫文章來分享,有興趣閱讀的話可以訂閱我的 Medium。

--

--