若是你是一個剛畢業的學生業生或一個職業生涯中期的工程師,那麼準備接受你求之不得的工做的技術面試可能既費時又使人緊張。想象一下,人們指望你可以在現場解決一個複雜的挑戰,並將其轉化爲無錯誤的代碼?git
好了,不用擔憂了。在這篇文章中,我將向您展現一些提示和技巧,以幫助您在技術面試中度過難關並得到下一個夢想的工做。程序員
瞭解範圍
讓咱們面對現實吧:多年的計算機科學學習包含不少內容。若是你在沒有面試重點準備的狀況下複習資料,你可能會面臨精力分散的問題。好消息是:許多公司都足夠信息透明,可讓您普遍瞭解面試中涉及的重點。就問招聘人員好了。github
儘早準備
你應該爲本身面試準備足夠的時間。做爲通常準則,至少提早兩週開始準備面試,特別是當你從未接受過技術面試或者好久沒有作技術面試了。要作到平均天天花一到兩個小時。若是你是全職工做,必定要留出足夠的非工做時間進行面試。面試
爲何?由於須要時間讓你進入解決問題的思惟模式,並讓你重溫你在學校學到的計算機科學基礎知識,這對於幫助你完成面試是相當重要的。一旦開始,你可能會對你須要多少CS知識感到驚訝,而且你會慶幸你儘早準備,因此你沒必要急於完成。算法
當我準備在微軟面試時,我開始準備兩週。過後看來,我認爲它在我順利經過微軟的面試中發揮了重要做用。不相信?這是另外一個例子:這傢伙花了8個月的時間準備Google技術面試。這可能聽起來有點極端,我不建議你走那麼遠,但你明白個人意思了。編程
技術書籍清單
如下是爲即將到來的技術訪談準備的必讀書籍清單。設計模式
Cracking the Code Interview, by Gayle Laakmann McDowell.
本書包括150個編程面試問題和答案,以及其餘建議,爲您提供得到頂級軟件開發人員工做所需的面試準備。
數組
Programming Interviews Exposed, by John Mongan, et al.
這是來自亞馬遜的評價:網絡
我我的對本書的見解是,除了提升您的技術技能的建議外,它還提供了關於本身營銷以及如何開始工做申請流程的完整章節。 這樣能夠鳥瞰整個過程,這對於即將首次進入人才市場的人來講尤爲有價值。框架
Elements of Programming Interviews, by Adnan Aziz, et al.
本書將技術面試問題分紅不一樣的章節,每章都處理CS的基本概念,如數組,列表等。
來自亞馬遜的評價:
練習!練習!練習!
如今你已經花了不少時間複習,你將在下一次技術面試中得到成功。對嗎?
好吧,也許尚未。
正如許多應聘人經歷的那樣,可以解決複雜的技術挑戰只是面試的一部分。在面試期間,您必須在指定的時間範圍內同時對解決方案進行描述,推理和編程。若是你認爲這聽起來像是在處理多項任務,那是由於實際狀況就是這樣。
爲了可以熟練地掌握這種能力,你須要練習。只要有可能,選擇一個合理的面試問題,仔細考慮,開始白板,記下你的思考過程,並嘗試將解決方案做爲代碼實現。在45分鐘到一小時內完成全部這些工做。
此外,最好與一位具備編碼背景的朋友配對,讓他擔任面試官。這種設置的目的是儘量地模擬面試場景,以便您瞭解在真正的面試中的感覺。不少人發現他們比單獨解決面試挑戰更加劇視這種模擬面試。此外,這種模擬面試有助於候選人減輕壓力,更好地傳達他們的想法,並在真實的面試中表現更好。
這是來自一個面試者的心聲:
在自我導向的時間壓力下解決技術挑戰是一回事。 當另外一我的在場並等待你提出你的解決方案時,解決它是另外一回事。
在過去幾年中,技術公司正在轉向使用在線協做編碼平臺進行遠程面試。這些工具容許公司在將他們帶到現場採訪以前,在線快速評估候選人的編碼技能。 Codidate就是這樣一種工具。
若是您要採訪的公司要求您在第一輪使用此類工具,請務必事先熟悉它。此外,請確保您在安靜的地方擁有可靠的互聯網鏈接,以便不會中斷訪談。
此外,複習一下簡歷中的內容,以便您能夠提供過去項目的細節,這樣您會在面試中對答如流。
目的
請記住,技術面試的目標是讓您(候選人)展現您的解決問題的能力。畢竟解決問題的技能在您將來的工做表現中起着相當重要的做用。
具體而言,您須要可以分析問題,分解問題,使用結構化方法解決問題,將解決方案做爲代碼實施,適應需求變動,進行必要的權衡,並可以對你的選擇進行合理的解釋。這是一個能夠在面試中使用的問題解決框架。
一樣重要的是確保在整個面試過程當中與面試官保持有效的溝通。在進行分析,處理解決方案,測試代碼等時要說出來,這樣面試官就能夠按照你的思路進行思考,讓大家溝通順暢。
分析問題
在你遇到這個問題的那一刻,頗有可能想一步到位,直接編碼解決問題。請不要這樣作。相反,請確保您首先徹底理解問題,它的約束、邊界狀況等。每當有疑問或您須要澄清時,請求面試官驗證您的假設。例如,「我是否能夠訪問C++ STL?」或「我可使用遞歸來解決此問題嗎?」
您還能夠列舉一些案例,並讓面試官確認您的理解是正確的。例如,「我認爲在此步驟以後數組中有3個元素。它們是a,b和c。正確嗎?」
掌握了手頭的問題,你就能夠解決它了。
分解問題
一般你很難在一個步驟中解決問題,尤爲是現實問題。一旦分解爲子問題,許多看似具備挑戰性的問題變得更加容易。若是您可以作到這一點,您極可能可以解決每一個子問題,並將它們組合成最終解決方案。
將解決方案變成代碼
一旦您認爲本身已經找到了解決方案,就應該將它做爲代碼組合在一塊兒。您能夠嘗試使用您最熟悉的編程語言來實現它,許多公司都容許您選擇本身的語言。但再一次,在繼續以前詢問面試官。
一些公司,如Facebook,但願候選人在面試中寫出無錯的代碼。若是您碰巧遇到這種狀況,請密切注意邊界狀況。在提交解決方案以前,請確保您的算法適用於全部邊界狀況。
若是對解決方案施加時間/空間限制,請確保您也知足此類要求。若是您可以在沒有任何優化的狀況下提出可行的解決方案,您能夠先實現基本解決方案,而後再修改它以知足時間/空間要求。
適應變化
許多候選人常犯的一個錯誤是,他們傾向於認爲他們所須要的只是在整個一小時的面試中制定出有效的解決方案,所以他們花了太多時間研究面試官提出的第一個問題。但這一般不符合實際狀況。不少時候,在候選人完成第一次挑戰後,面試官將提出另外一個進一步的問題,可能與前一個問題有關,以進一步測試候選人的解決問題的能力。
例如,如下是一系列編碼挑戰:
請記住,在您嘗試解決的問題以後可能會遇到更多挑戰,所以一旦您確信您的解決方案是正確的,請準備好繼續前進。 你解決的挑戰越多,面試官的印象就越深入。
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,已經通過做者贊成。