扎實的基礎知識、高質量的代碼、清晰的思路、優(yōu)化代碼的能力、的綜合能力是編程技術面試的五大要點。

  找工作一直是一個熱門話題。要想找到心儀的工作,難免需要經(jīng)過多輪面試。編程面試是程序員面試過程中為重要的一個環(huán)節(jié)。如果能在編程面試的環(huán)節(jié)充分展示自己的能力,那么拿到中意的Offer是水到渠成的事情。

  我先后在歐特克、微軟和思科等公司任軟件工程師,多次接受他人的面試,同時也面試過很多人?偨Y面試與被面試的經(jīng)驗,我發(fā)現(xiàn)盡管面試官的背景、性格各不相同,但都關注應聘者五種素質:扎實的基礎知識;能寫高質量的代碼;分析問題時思路清晰;能優(yōu)化時間效率和空間效率;具備包括學習能力、溝通能力、發(fā)散思維能力等在內的綜合能力。

  扎實的基礎知識

  扎實的基本功是成為程序員的前提條件,因此面試官首要關注應聘者的素質即是否具備扎實的基礎。通常基本功在編程面試環(huán)節(jié)體現(xiàn)在兩個方面:一是編程語言,二是數(shù)據(jù)結構和算法。

  每個程序員至少要熟練掌握1~2門編程語言。面試官從應聘者在面試過程中寫的代碼以及跟進的提問中,能看出他編程語言掌握的熟練程度。以大部分公司面試要求的C++為例,如果函數(shù)需要傳入一個指針,面試官可能會問是否需要為該指針加上const,把const加在指針不同的位置有什么區(qū)別;如果寫的函數(shù)需要傳入的參數(shù)是一個復雜類型的實例,面試官可能會問傳入值參數(shù)或者引用參數(shù)有什么區(qū)別,什么時候需要為傳入的引用參數(shù)加上const。

  數(shù)據(jù)結構通常是編程面試過程中考查的重點。在參加面試之前,應聘者需要熟練掌握鏈表、樹、棧、隊列以及哈希表等數(shù)據(jù)結構以及它們的操作。如果我們留心各大公司的面試題,會發(fā)現(xiàn)鏈表和二叉樹相關的問題是很多面試官喜歡問的問題。這方面的問題看似簡單,但真正掌握也很不容易,特別適合在短短幾十分鐘的面試時間內檢驗應聘者的基本功。如果應聘者事先對鏈表的插入和刪除結點了如指掌,對二叉樹的各種遍歷方法的循環(huán)和遞歸寫法都爛熟于胸,那么真正到了面試時也游刃有余了。

  大部分公司對算法的要求都只是考查查找和排序。應聘者可以在了解各種查找和排序算法的基礎上,重點掌握二分查找、歸并排序和快速排序,因為很多面試題都只是這些算法的變體而已。比如把排序好的數(shù)組的前面若干個數(shù)字移到數(shù)組的后面,然后問怎樣在這個數(shù)組之中找到小的數(shù)字。這道題其本質是考查二分查找。少數(shù)對算法很重視的公司比如谷歌或者百度,還會要求應聘者熟練掌握動態(tài)規(guī)劃和貪婪算法。如果對這種類型的公司感興趣,那么應聘者在參加面試之前應該加強對相關算法題目的練習。

  高質量的代碼

  只有注重質量的程序員,才能寫出魯棒穩(wěn)定的大型軟件。在面試過程中,面試官總會格外關注邊界條件、特殊輸入等看似細枝末節(jié)但實質至關重要的地方,以此來分析應聘者是否注重代碼質量。很多時候,面試官發(fā)現(xiàn)應聘者寫出來的代碼只能完成基本的功能,一旦輸入特殊的邊界條件參數(shù)會錯誤百出甚至程序崩潰。

  舉個很多應聘者都被問過的一個問題:寫一個函數(shù),把字符串轉化成整數(shù)。這道題看似很簡單,絕大部分計算機專業(yè)的畢業(yè)生都能用十行以內的代碼實現(xiàn)基本的功能?墒窃趯嶋H面試過程中,十個應聘者中只有一個人能通過這道題的面試,因為絕大部分應聘者不能全面考慮到各種特殊輸入,比如輸入的字符串含中有非數(shù)字的符號、在字符串的開頭有正負號、字符串中有正負號但其位置不是在字符串的開頭。

  除此之外,面試官還希望應聘者能考慮的邊界條件包括2147483647(0×7FFFFFFF,int能表示的大正整數(shù))和-2147483648(0×80000000,int能表示的小負整數(shù))。

  除了邊界條件和特殊輸入考慮不足之外,面試官還有一個不能容忍的錯誤是程序崩潰。面試時很多應聘者都會忘記對空指針做特殊處理而導致程序崩潰。如果面試時遇到鏈表、二叉樹相關的題目,應聘者一定要特別小心。因為這兩種題目對應的代碼里通常會有大量的指針操作,如果考慮不周到,有可能對空指針進行操作而使程序崩潰。

  比如這樣一道題:輸入一個鏈表的頭指針和一個無符號整數(shù)k,輸出該鏈表的倒數(shù)第k個結點。這個題目很多人都能想到用兩個指針來解決:第一個指針先在鏈表上移動k-1步,同時讓第一個指針和第二個指針在鏈表上移動。當?shù)谝粋指針移動到尾指針時,第二個指針指向的是倒數(shù)第k個結點。然而不是每個應聘者都能根據(jù)正確思路寫出完整的代碼。不少應聘者會忽略兩種可能:一是輸入的鏈表頭指針有可能是空指針;二是鏈表上結點的數(shù)目有可能少于k個。忽略這兩點的代碼都存在崩潰的可能,從而很難獲得面試官的青睞。

  要想寫出魯棒的高質量代碼,需要在動手寫代碼之前想好測試用例。在寫代碼之前,先要想好各種邊界條件和特殊輸入作為測試用例。當代碼寫好之后,自己在心里用之前想好的測試用例來檢驗自己寫出的代碼,這樣能在面試官之前發(fā)現(xiàn)并解決問題。以求鏈表的倒數(shù)第k個結點為例,如果事先想到了輸入頭指針為空指針和鏈表上的結點總數(shù)少于k這兩個測試用例,并且在寫好代碼之后在心里模擬代碼的運行過程,確保能夠通過這兩個測試用例的測試,那么這輪面試必然是能夠通過的。