如何順利通過程式設計面試

符言發表於2019-08-27

如果你是一個剛畢業的學生業生或一個職業生涯中期的工程師,那麼準備接受你夢寐以求的工作的技術面試可能既費時又令人緊張。想象一下,人們期望你能夠在現場解決一個複雜的挑戰,並將其轉化為無錯誤的程式碼?

好了,不用擔心了。在這篇文章中,我將向您展示一些提示和技巧,以幫助您在技術面試中度過難關並獲得下一個夢想的工作。

面試之前

瞭解範圍
讓我們面對現實吧:多年的電腦科學學習包含很多內容。如果你在沒有面試重點準備的情況下複習資料,你可能會面臨精力分散的問題。好訊息是:許多公司都足夠資訊透明,可以讓您廣泛瞭解面試中涉及的重點。就問招聘人員好了。

儘早準備
你應該為自己面試準備足夠的時間。作為一般準則,至少提前兩週開始準備面試,特別是當你從未接受過技術面試或者很久沒有做技術面試了。要做到平均每天花一到兩個小時。如果你是全職工作,一定要留出足夠的非工作時間進行面試。

為什麼?因為需要時間讓你進入解決問題的思維模式,並讓你重溫你在學校學到的電腦科學基礎知識,這對於幫助你完成面試是至關重要的。一旦開始,你可能會對你需要多少CS知識感到驚訝,並且你會慶幸你儘早準備,所以你不必急於完成。

當我準備在微軟面試時,我開始準備兩週。事後看來,我認為它在我順利通過微軟的面試中發揮了重要作用。不相信?這是另一個例子:這傢伙花了8個月的時間準備Google技術面試。這可能聽起來有點極端,我不建議你走那麼遠,但你明白我的意思了。

技術書籍清單
以下是為即將到來的技術訪談準備的必讀書籍清單。

Cracking the Code Interview, by Gayle Laakmann McDowell.
本書包括150個程式設計面試問題和答案,以及其他建議,為您提供獲得頂級軟體開發人員工作所需的面試準備。
cracking-the-code-interview.jpg

Programming Interviews Exposed, by John Mongan, et al.
這是來自亞馬遜的評價:

  • 檢視當前的求職和招聘流程,例如利用LinkedIn和其他社交網路作為招聘資源
  • 為程式設計師提供針對最重要的語言做準備,以便了解和提供多種語言的示例
  • 包括旨在提高您的知識的新的程式設計問題
  • 提供有關設計模式和排序的全新章節,包括如何處理記憶體約束和移動性問題

我個人對本書的看法是,除了提高您的技術技能的建議外,它還提供了關於自己營銷以及如何開始工作申請流程的完整章節。 這樣可以鳥瞰整個過程,這對於即將首次進入人才市場的人來說尤其有價值。

programming-interviews-exposed.jpg

Elements of Programming Interviews, by Adnan Aziz, et al.
本書將技術面試問題分成不同的章節,每章都處理CS的基本概念,如陣列,列表等。

來自亞馬遜的評價:

  • 由於不同的應聘人有不同的時間限制,EPI包括一個有幾個場景的學習指南,從週末的Hackathon到學期的長期準備,併為每個場景推薦一系列問題。
  • 所有問題都根據其難易程度進行分類,幷包含許多變體,以幫助您更廣泛地應用所學內容。
  • 所有問題都包括對陷入困境的讀者的提示。這模擬了您在真實面試中將面臨的問題。

elements-of-programming-interviews.jpg

練習!練習!練習!
現在你已經花了很多時間複習,你將在下一次技術面試中獲得成功。對嗎?

好吧,也許還沒有。

正如許多應聘人經歷的那樣,能夠解決複雜的技術挑戰只是面試的一部分。在面試期間,您必須在指定的時間範圍內同時對解決方案進行描述,推理和程式設計。如果你認為這聽起來像是在處理多項任務,那是因為實際情況就是這樣。

為了能夠熟練地掌握這種能力,你需要練習。只要有可能,選擇一個合理的面試問題,仔細考慮,開始白板,記下你的思考過程,並嘗試將解決方案作為程式碼實現。在45分鐘到一小時內完成所有這些工作。

此外,最好與一位具有編碼背景的朋友配對,讓他擔任面試官。這種設定的目的是儘可能地模擬面試場景,以便您瞭解在真正的面試中的感受。很多人發現他們比單獨解決面試挑戰更加重視這種模擬面試。此外,這種模擬面試有助於候選人減輕壓力,更好地傳達他們的想法,並在真實的面試中表現更好。

這是來自一個面試者的心聲:
在自我導向的時間壓力下解決技術挑戰是一回事。 當另一個人在場並等待你提出你的解決方案時,解決它是另一回事。

在過去幾年中,技術公司正在轉向使用線上協作編碼平臺進行遠端面試。這些工具允許公司在將他們帶到現場採訪之前,線上快速評估候選人的編碼技能。 Codidate就是這樣一種工具。

如果您要採訪的公司要求您在第一輪使用此類工具,請務必事先熟悉它。此外,請確保您在安靜的地方擁有可靠的網際網路連線,以便不會中斷訪談。

此外,複習一下簡歷中的內容,以便您可以提供過去專案的細節,這樣您會在面試中對答如流。

面試中

目的\
請記住,技術面試的目標是讓您(候選人)展示您的解決問題的能力。畢竟解決問題的技能在您未來的工作表現中起著至關重要的作用。

具體而言,您需要能夠分析問題,分解問題,使用結構化方法解決問題,將解決方案作為程式碼實施,適應需求變更,進行必要的權衡,並能夠對你的選擇進行合理的解釋。這是一個可以在面試中使用的問題解決框架。

同樣重要的是確保在整個面試過程中與面試官保持有效的溝通。在進行分析,處理解決方案,測試程式碼等時要說出來,這樣面試官就可以按照你的思路進行思考,讓你們溝通順暢。

分析問題\
在你遇到這個問題的那一刻,很有可能想一步到位,直接編碼解決問題。請不要這樣做。相反,請確保您首先完全理解問題,它的約束、邊界情況等。每當有疑問或您需要澄清時,請求面試官驗證您的假設。例如,“我是否可以訪問C++ STL?”或“我可以使用遞迴來解決此問題嗎?”

您還可以列舉一些案例,並讓面試官確認您的理解是正確的。例如,“我認為在此步驟之後陣列中有3個元素。它們是a,b和c。正確嗎?”

掌握了手頭的問題,你就可以解決它了。

分解問題
通常你很難在一個步驟中解決問題,尤其是現實問題。一旦分解為子問題,許多看似具有挑戰性的問題變得更加容易。如果您能夠做到這一點,您很可能能夠解決每個子問題,並將它們組合成最終解決方案。

將解決方案變成程式碼
一旦您認為自己已經找到了解決方案,就應該將它作為程式碼組合在一起。您可以嘗試使用您最熟悉的程式語言來實現它,許多公司都允許您選擇自己的語言。但再一次,在繼續之前詢問面試官。

一些公司,如Facebook,希望候選人在面試中寫出無錯的程式碼。如果您碰巧遇到這種情況,請密切注意邊界情況。在提交解決方案之前,請確保您的演算法適用於所有邊界情況。

如果對解決方案施加時間/空間限制,請確保您也滿足此類要求。如果您能夠在沒有任何優化的情況下提出可行的解決方案,您可以先實現基本解決方案,然後再修改它以滿足時間/空間要求。

適應變化
許多候選人常犯的一個錯誤是,他們傾向於認為他們所需要的只是在整個一小時的面試中制定出有效的解決方案,因此他們花了太多時間研究面試官提出的第一個問題。但這通常不符合實際情況。很多時候,在候選人完成第一次挑戰後,面試官將提出另一個進一步的問題,可能與前一個問題有關,以進一步測試候選人的解決問題的能力。

例如,以下是一系列編碼挑戰:

  • 招聘人:實現一種演算法來對物件陣列進行排序。
  • 應聘者:沒問題。
  • 招聘人:如果陣列大小為10GB,實體記憶體只有4GB怎麼辦?
  • 應聘者:沒問題。
  • 招聘人:如果陣列增長超出硬碟的容量怎麼辦?
  • 應聘者:沒問題。

請記住,在您嘗試解決的問題之後可能會遇到更多挑戰,因此一旦您確信您的解決方案是正確的,請準備好繼續前進。 你解決的挑戰越多,面試官的印象就越深刻。

資源

A complete computer science study plan to become a software engineer

How to Win the Coding Interview

How to Get a Job at the Big 4 - Amazon, Facebook, Google & Microsoft

原文來自How to Ace Your Technical Interview,已經經過作者同意。

相關文章