橫看成嶺側成峰,遠近高低各不同——從面試官的角度談面試

weixin_33816946發表於2018-11-26

  最近有一本很紅的面試書叫《劍指Offer:名企面試官精講典型程式設計題》,作者是美國微軟總部資深軟體工程師何海濤,他在書中以面試官的角度分享了程式設計師面試的方方面面,並且還在書中停供了80餘道面試題,大部分是與資料結構和演算法有關。本文不會重點分析這些面試題目,而是歸納總結書中所提到的一些面試相關的程式設計技能和軟技能。

一、面試流程

1)面試的3種形式

  第一種是電話面試,應聘者在投出簡歷一到二週之內,不僅要保證手機電池能連續通話一小時,還要避免長時間待在嘈雜的地方。電話面試沒有了肢體語言、面部表情,應聘者表達自己想法的難度要比現場面試大很多,因此,應聘者儘可能用形象化的語言把細節說清楚。例如在電話面試中,如果想說一棵二叉樹,就需要把二叉樹中有哪些節點,每個節點的左子節點是什麼、右子節點是什麼都要說得很清楚,只有這樣面試官才能準確地理解應聘者的思路。當不確定面試官的問題的時候,應聘者一定要大膽地向面試官多提問,直到弄清楚面試官的意圖為止,切忌不懂裝懂、答非所問。

  第二種是共享桌面遠端面試,利用一些共享桌面的軟體,應聘者把自己電腦共享給遠端的面試官。這樣兩個人雖然沒有坐在一起,但是面試管卻能通過共享桌面觀看應聘者程式設計和除錯的過程。這種形式的面試,面試關心的是應聘者的程式設計習慣和除錯能力,通常面試官會認可應聘者下面幾種程式設計習慣:

1、思考清楚再開始編碼。

2、良好的程式碼命名和縮排對齊習慣。

3、能夠進行單元測試。

  當應聘者執行程式碼發現結果不對之後的表現,是面試官關注的重點,因為應聘者此時的反應、採取的措施都能體現出他的除錯功底。如果應聘者能夠熟練地設定斷點、單步跟蹤、檢視記憶體、分析呼叫棧,就能很快發現問題的根源並最終解決問題,那麼面試官將會覺得他的開發經驗豐富,在寫面試報告的時候是不會吝嗇讚美之詞的。

  第三種是現場面試,在去公司參加現場面試之前,應聘者應該做好以下幾點準備:

1、規劃好線路並估算出行時間。

2、準備好得體的衣服。

3、注意面試邀請函裡的面試流程。

4、準備幾個問題。

  現場面試是整個面試流程中的重頭戲。由於是坐在面試官的對面,應聘者的一舉一動都看在面試官眼裡。面試官通過應聘者的語言和行動考察他的溝通能力、學習能力、程式設計能力等綜合實力。

2)面試的3個環節

  首先是行為面試,面試開始的5~10分鐘通常是行為面試的時間。面試官在這段時間會注意應聘者的性格特點,深入瞭解簡歷中列舉的專案經歷。這是一個暖場的過程,應聘者可以利用這幾分鐘調整自己的情緒,進入面試狀態。不少面試官會讓應聘者做一個簡短的自我介紹,而自我介紹不用花很多時間,用30秒到1分鐘的時間介紹自己的主要學習、工作經歷即可。如果面試官對某一段經歷或者參與的某一個專案感興趣,那麼他會有針對性的提幾個問題詳細瞭解。

1、應聘者的專案經驗建議用STAR模型描述,Situation:簡短的專案背景;Task:自己完成的任務;Action:為完成任務自己做了哪些工作,是怎麼做的;Result:自己的貢獻。除此之外,面試官針對專案經驗最常問的問題包括以下幾個型別。

a)你在該專案中碰到的最大問題是什麼,你是怎麼解決的?

b)從這個專案中你學到了什麼?

c)什麼時候會和其他團隊成員有什麼樣的衝突,你們是怎麼解決衝突的?

2、應聘者掌握的技能,描述技能掌握程度時也要注意“瞭解”、“熟悉”和“精通”的區別。

a)瞭解是指對某項技能只是上過課或看過書,但沒有做過實際的專案。不建議在簡歷中列出只是膚淺地瞭解一點的技能。

b)熟悉是指在實際專案中使用某項技能已經有很長的時間,通過查閱相關的文件可以獨立解決大部分問題。簡歷中技能的掌握大部分應該是熟悉。

c)精通是指對一項技術使用的得心應手,在專案開發過程中,有信心也有能力解決各種問題。除非自己能輕鬆回答這個領域裡的絕大多數問題,否則不要在簡歷中使用精通。

3、回答“為什麼跳槽”。面試官會通過這個問題來了解應聘者的性格,在回答時不要抱怨,也不要流露出負面情緒。應聘者儘量避免以下4個原因:

a)老闆太苛刻。

b)同事太難相處。

c)加班太頻繁。

d)工資太低。

  其次是技術面試,一輪一小時的面試,通常計算面試會佔據40~50分鐘,對面試的結果起決定性作用。總體來說,面試官都會關注應聘者的5種素質:

1、紮實的基礎知識,包括程式語言、資料結構和演算法。

2、能寫出正確的、完整的、魯棒(健壯)的高質量的程式碼,面試官會格外關注邊界條件、特殊輸入等看似細枝末節但至關重要的地方。

3、分析問題時思路清晰,面試官不喜歡應聘者草率地開始寫程式碼,這樣的程式碼容易邏輯混亂、錯誤百出。應聘者可以用幾個簡單的方法幫助自己形成清晰的思路。

a)舉幾個簡單的例子讓自己理解問題,舉例能使抽象問題具體化。

b)用圖形表示抽象的資料結構,圖形能使抽象的問題具體化、形象化。

c)把複雜的問題分解成若干個簡單的子問題,然後逐個擊破。

4、能優化時間效率和空間效率,需要熟知各種資料結構的優缺點,並且熟練掌握常用的演算法。

5、學習、溝通等各方面的能力。

a)面試官會觀察應聘者在介紹專案經驗或演算法思路時是否觀點明確、邏輯清晰,並以此判斷其溝通能力的強弱。有意向加入外企的應聘者注意提高自己英語交流的能力。

b)面試官也會從應聘者說話的神態和語氣來判斷他是否有團隊合作的意識。

c)面試官通過詢問應聘者最近在看什麼書、從中學到了哪些技術來了解應聘者的學習願望和學習能力。

d)面試官丟擲一個新概念,觀察應聘者能否在短時間內理解新概念,期待他們通過思考、提問、再思考的過程,理解並最終解決相關問題。

e)建議應聘者在面試過程中遇到不明白的地方多提問,這樣面試官會覺得你態度積極、求知慾強烈,會給面試結果加分。

f)知識遷移能力是一種特殊的學習能力,通俗的說法是舉一反三,如果能夠把已經掌握的知識遷移到其它領域,那麼學習新技術或者解決新問題會變得容易。

g)不少面試官從日常生活中提煉出問題,考查應聘者的抽象建模能力和發散思維能力。

  最後是應聘者提問,在結束面試前的5~10分鐘,面試官會給應聘者機會問幾個問題,應聘者的問題質量對面試的結果也有一定的影響。首先,不要問和自己的職位沒有關係的問題,例如公司未來五年的發展戰略是什麼;其次,不要問薪水;再次,不要打聽面試結果;最後,推薦問與應聘的職位或專案相關的問題。要問好這類問題可以從兩方面去了解:一是面試前做足功課,到網上搜尋一些相關的資訊,做到對公司成立時間、主要業務、職位要求等都瞭然於胸;二是面試過程中留心面試官說過的話,他的話中可能會包含其它渠道無法得到的資訊,例如專案進展情況等。

二、高質量的程式碼

1)程式碼的規範性

  如果應聘者程式碼寫得不夠規範,影響面試官閱讀程式碼的興致,那麼面試官就會默默地減去幾分。書寫、佈局和命名都決定著程式碼的規範性。

  首先,規範的程式碼書寫清晰,在白板或白紙上寫程式碼,要減慢寫字的速度,儘量把每個字母寫清楚,不要擔心時間不夠。其次,規範的程式碼佈局清晰,離開了工具手寫程式碼,格外要注意佈局問題。最後,規範的程式碼命名合理,用完整的英文單片語合命名變數和函式。

2)程式碼的完整性

  面試官會非常關注應聘者考慮問題是否周全。通過檢查程式碼是否完整來考察應聘者的思維是否全面。

1、從功能測試、邊界測試和負面測試3個方面確保程式碼的完整性。

a)功能測試保證寫出的程式碼能夠完成面試官要求的基本功能。

b)邊界測試用於檢查迴圈的邊界條件是否正確,遞迴終止的邊界值是否正確等。

c)負面測試需要考慮各種可能的錯誤輸入,對其做出合理的錯誤處理。

2、通常有3種方式把錯誤資訊傳遞給函式的呼叫者:

a)用返回值告知呼叫者是否出錯。

b)當錯誤發生時設定一個全域性變數。

c)當函式執行出錯的時候,就丟擲一個異常,根據不同出錯原因定義不同的異常型別。

3)程式碼的魯棒性

  魯棒性也稱為健壯性,是指程式能夠判斷輸入是否合乎規範要求,並對不符合要求的輸入予以合理的處理。容錯性是魯棒性的一個重要提現。提高程式碼魯棒性的有效途徑是進行防禦性程式設計。防禦性程式設計是一種程式設計習慣,是指預見在什麼地方可能會出現問題,併為這些可能出現的問題制定處理方式。在面試時,最簡單也是最實用的防禦性程式設計就是在函式入口新增程式碼以驗證使用者輸入是否符合要求。

相關文章