編程技術面試的五大要點

紮實的基礎知識、高質量的代碼、清晰的思路、優化代碼的能力、優秀的綜合能力是編程技術面試的五大要點。程序員

找工做一直是一個熱門話題。要想找到心儀的工做,不免須要通過多輪面試。編程面試是程序員面試過程當中最爲重要的一個環節。若是能在編程面試的環節充分展現本身的能力,那麼拿到中意的Offer就是水到渠成的事情。面試

我前後在歐特克、微軟和思科等公司任軟件工程師,屢次接受他人的面試,同時也面試過不少人。總結面試與被面試的經驗,我發現儘管面試官的背景、性格 各不相同,但都關注應聘者五種素質:紮實的基礎知識;能寫高質量的代碼;分析問題時思路清晰;能優化時間效率和空間效率;具有包括學習能力、溝通能力、發 散思惟能力等在內的綜合能力。算法

紮實的基礎知識編程

紮實的基本功是成爲優秀程序員的前提條件,所以面試官首要關注應聘者的素質便是否具有紮實的基礎。一般基本功在編程面試環節體如今兩個方面:一是編程語言,二是數據結構和算法。設計模式

每一個程序員至少要熟練掌握1~2門編程語言。面試官從應聘者在面試過程當中寫的代碼以及跟進的提問中,能看出他編程語言掌握的熟練程度。以大部分公司 面試要求的C++爲例,若是函數須要傳入一個指針,面試官可能會問是否須要爲該指針加上const,把const加在指針不一樣的位置有什麼區別;若是寫的 函數須要傳入的參數是一個複雜類型的實例,面試官可能會問傳入值參數或者引用參數有什麼區別,何時須要爲傳入的引用參數加上const。數組

數據結構一般是編程面試過程當中考查的重點。在參加面試以前,應聘者須要熟練掌握鏈表、樹、棧、隊列以及哈希表等數據結構以及它們的操做。若是咱們留 心各大公司的面試題,就會發現鏈表和二叉樹相關的問題是不少面試官喜歡問的問題。這方面的問題看似簡單,但真正掌握也很不容易,特別適合在短短几十分鐘的 面試時間內檢驗應聘者的基本功。若是應聘者事先對鏈表的插入和刪除結點了如指掌,對二叉樹的各類遍歷方法的循環和遞歸寫法都爛熟於胸,那麼真正到了面試時 也就遊刃有餘了。數據結構

大部分公司對算法的要求都只是考查查找和排序。應聘者能夠在瞭解各類查找和排序算法的基礎上,重點掌握二分查找、歸併排序和快速排序,由於不少面試 題都只是這些算法的變體而已。好比把排序好的數組的前面若干個數字移到數組的後面,而後問怎樣在這個數組之中找到最小的數字。這道題其本質就是考查二分查 找。少數對算法很重視的公司好比谷歌或者百度,還會要求應聘者熟練掌握動態規劃和貪婪算法。若是對這種類型的公司感興趣,那麼應聘者在參加面試以前就應該 增強對相關算法題目的練習。 數據結構和算法

高質量的代碼編程語言

只有注重質量的程序員,才能寫出魯棒穩定的大型軟件。在面試過程當中,面試官總會格外關注邊界條件、特殊輸入等看似細枝末節但實質相當重要的地方,以 此來分析應聘者是否注重代碼質量。不少時候,面試官發現應聘者寫出來的代碼只能完成最基本的功能,一旦輸入特殊的邊界條件參數就會錯誤百出甚至程序崩潰。ide

舉個不少應聘者都被問過的一個問題:寫一個函數,把字符串轉化成整數。這道題看似很簡單,絕大部分計算機專業的畢業生都能用十行之內的代碼實現最基 本的功能。但是在實際面試過程當中,十個應聘者中只有一我的能經過這道題的面試,由於絕大部分應聘者不能全面考慮到各類特殊輸入,好比輸入的字符串含中有非 數字的符號、在字符串的開頭有正負號、字符串中有正負號但其位置不是在字符串的開頭。

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

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

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

要想寫出魯棒的高質量代碼,須要在動手寫代碼以前想好測試用例。在寫代碼以前,先要想好各類邊界條件和特殊輸入做爲測試用例。當代碼寫好以後,本身 在內心用以前想好的測試用例來檢驗本身寫出的代碼,這樣就能在面試官以前發現並解決問題。以求鏈表的倒數第k個結點爲例,若是事先想到了輸入頭指針爲空指 針和鏈表上的結點總數少於k這兩個測試用例,而且在寫好代碼以後在內心模擬代碼的運行過程,確保可以經過這兩個測試用例的測試,那麼這輪面試必然是可以通 過的。

清晰的思路

只有思路清晰,應聘者纔有可能在面試過程當中解決複雜的問題。有時面試官會有意出一些比較複雜的問題,以考查可否在短期內造成清晰的思路並解決問 題。對於確實很複雜的問題,面試官甚至不期待應聘者能在面試不到一個小時的時間裏給出完整的答案,他更看重的可能仍是應聘者是否有清晰的思路。面試官一般 不會喜歡應聘者在沒有造成清晰思路以前就草率地開始寫代碼,結果寫出來的代碼容易邏輯混亂、錯誤百出。

應聘者能夠用幾個簡單的方法幫助本身造成清晰的思路。

首先是舉幾個簡單的具體例子讓本身理解問題。當一眼看不出問題中隱藏的規律時,能夠試着用1~2個具體的例子模擬操做的過程,這樣說不定就能經過具體的例子找到抽象的規律。

其次能夠試着用圖形表示抽象的數據結構。像分析與鏈表、二叉樹相關的題目時,能夠畫出它們的結構圖來簡化題目。

最後能夠試着把複雜的問題分解成若干個簡單的子問題,再一一解決。不少基於遞歸的思路,包括分治法和動態規劃法,都是把複雜的問題分解成一個或者多個簡單的子問題。

好比把二叉搜索樹轉化排序的雙向鏈表這個問題就很複雜。碰到這個問題,不妨先畫出1~2個具體的二叉搜索樹及其對應的排序雙向鏈表,直觀地感覺二叉 搜索樹和排序的雙向鏈表有哪些聯繫。若是一會兒找不出轉換的規律,能夠把整個二叉樹看出三部分:根結點、左子樹和右子樹。當遞歸地把轉換左右子樹這兩個子 問題解決以後,再把轉換左右子樹獲得的鏈表和根結點連接起來,整個問題也就解決了。

優化代碼的能力

優秀的程序員對時間和空間的消耗錙銖必較,他們頗有激情不斷優化本身的代碼。當面試官出的題目有多種解法時,一般他會期待應聘者最終可以找到最優解。這就要求應聘者在面試官提示還有更好的解法時,不能放棄思考,而應該努力尋找在時間消耗或者空間消耗上能夠優化的地方。

要想優化時間或者空間效率,首先要知道如何分析效率。即便是同一個算法,用不一樣方法實現的效率可能也會大不相同,要可以分析出算法及其代碼實現的效 率。例如求斐波那契數列,不少人喜歡用遞歸公式f(n)=f(n-1)+f(n-2)求解。若是分析它的遞歸調用樹,就會發現有大量的計算是重複的,時間 效率是以n的指數增長。但若是先求f(1)、f(2),再根據f(1)和f(2)求出f(3),接下來根據f(2)、f(3)求出f(4),並以此類推用 一個循環求出f(n),這種計算方法的時間效率就只有O(n),比前面遞歸的方法要好不少。

要想優化代碼的效率,還要熟知各類數據結構的優缺點,並能選擇合適的數據結構解決問題。咱們在數組中根據下標能夠用O(1)完成查找。數組的這個特 徵能夠用來實現簡單的哈希表解決不少面試題,好比在字符串中找到第一個只出現一次的字符。再好比爲了找出n個數字中最小的k個數,須要一個數據容器來存儲 k個數字。在這個數據容器中,咱們但願可以快速地找到最大值而且能快速地替換其中的數字。通過權衡,咱們發現二叉樹好比最大堆或者紅黑樹都是實現這個數據 容器的理想選擇。

要想優化代碼的效率,也要熟練掌握經常使用的算法。面試中最經常使用的算法是查找和排序。若是從頭至尾順序掃描一個數組,須要O(n)時間才能完成查找操 做。但若是數組是排序的,應用二分查找算法就能把時間複雜度下降到O(logn)。排序算法除了可以給數組排序以外,還能用來解決其餘問題。好比快速排序 算法中的Partition函數可以用來在n個數裏查找第k大的數字,從而能夠用O(n)的時間在數組中找到出現次數超過數組長度一半的數字。若是面試題 是一個求最大值或者最小值的題目,則能夠嘗試用動態規劃法或者貪婪算法,好比用動態規劃法求出數組中連續子數組的最大和。

優秀的綜合能力

在面試過程當中,應聘者除了展現本身的編程能力和技術功底以外,還須要展現本身的軟技能,諸如溝通能力和學習能力。隨着軟件系統的規模愈來愈大,軟件開發已經告別了單打獨鬥的年代,程序員與他人的溝通變得愈來愈重要。在面試過程當中,面試官會觀察應聘者在介紹項目經驗或者算法思路時是否觀點明確、邏輯清晰,並以此判斷他溝通能力的強弱。另外,面試官也會從應聘者說話的神態和語氣來判斷他是否有團隊合做的意識。一般面試官不會喜歡高傲或者輕視合做者的人。

IT行業知識更新很快,所以程序員只有具有很好的學習能力才能跟上知識更替的步伐。一般面試官有兩種辦法考查應聘者的學習能力。第一種方法是詢問應 聘者最近在看什麼書、從中學到了哪些新技術。面試官能夠用這個問題了解應聘者的學習願望和學習能力。第二種方法是拋出一個新概念,接下來他會觀察應聘者能 不能在較短期內理解這個新概念並解決相關的問題。好比面試官要求應聘者計算第1500個醜數。不少人都沒有據說過醜數這個概念。這時面試官就會觀察應聘 者面對醜數這個新概念,能不能通過提問、思考、再提問的過程,最終找出醜數的規律從而找到解決方案。

知識遷移能力是一種特殊的學習能力。若是咱們可以把已經掌握的知識遷移到其餘領域,那麼學習新技術或者解決新問題就會變得容易。面試官常常會先問一 個簡單的問題,再問一個很複雜但和前面的簡單問題相關的問題。這時面試官期待應聘者可以從簡單問題中獲得啓示,從而找到解決複雜問題的竅門。好比面試官先 要求應聘者寫一個函數求斐波那契數列,再問一個青蛙跳臺階的問題:一隻青蛙一次能夠跳上1級臺階,也能夠跳上2級臺階,請問這隻青蛙跳上n級的臺階總共有 多少種跳法?應聘者若是具備較強的知識遷移能力,就能分析出青蛙跳臺階問題實質上只是斐波那契數列的一個應用。

還有很多面試官喜歡考查應聘者的抽象建模能力和發散思惟能力。面試官從平常生活中提煉出問題,好比如何判斷5張撲克牌是否是順子,考查應聘者能不能 把問題抽象出來用合理的數據結構表示,並找到其中的規律解決這個問題。面試官也能夠限制應聘者不得使用常規方法,這要求應聘者具有創新精神,可以打開思路 從多角度去分析、解決問題。好比面試官要求應聘者不用加減乘除四則運算實現兩個整數的加法。此時面試官期待應聘者可以打開思路,用位運算實現整數的加法。

小結

咱們能夠用下圖來總結出應聘者須要具有的素質。

未命名_副本

從上圖能夠看出,應聘者在面試以前須要作足準備,對編程語言、數據結構和算法等基礎知識有全面的瞭解。面試時若是碰到簡單的問題應聘者必定要注重細 節寫出完整、魯棒的代碼。若是碰到複雜的問題應聘者能夠經過畫圖、舉具體例子分析和分解複雜問題等方法先理清思路再動手編程。除此以外,應聘者還應該不斷 優化時間效率和空間效率,力求找到最優的解法。在面試過程當中,應聘者還應該主動提問弄清楚題目的要求,表現本身的溝通能力。當面試官先後問的兩個問題有相 關性時,儘可能把解決前面問題的思路遷移到後面的問題中去,展現本身良好的學習能力。若是能作到這麼幾點,那麼應聘者順利經過面試得到心儀的職位將是瓜熟蒂 落的事情。

做者何海濤,思科高級軟件工程師,以前前後任職於Autodesk和微軟。主要關注C++/C#的開發技術,並對設計模式和項目管理也很感興趣。

相關文章
相關標籤/搜索