譯者 | 蘇本如,責編 | 郭芮
原文:https://dev.to/mortoray/how-i-evaluate-you-in-a-code-interview-42hh
本文為 CSDN 翻譯
如果能多了解一些面試的基本知識,可以幫助你在面試中對自身有更準確的定位,並且能提升你的面試技巧。作者 | edA‑qa mort‑ora‑y
以下為譯文:
由於不知道面試官對面試者的衡量標準,許多我曾面試過的候選人在面試中表現得差強人意。雖然不同的面試官有自己不同的衡量標準,但這些標準間也存在一些共通之處。如果能多了解一些面試的基本知識,可以幫助你在面試中對自身有更準確的定位,並且能提升你的面試技巧。
我在interviewing.io(譯者註:美國一個在線技術面試平台)上會根據三個方面來評價面試候選人的表現。我認為這三方面基本代表了各家公司對你的評價的依據。即便這三方面的能力沒有在面試中直接被考察,它們也會影響面試官對你的總體評估。
雖然我需要對以上每一種能力分別評分,但這三個方面的能力其實是緊密地聯繫在一起的。如果一個候選人缺乏其中的一項能力,他往往也會欠缺另外兩方面的能力。讓我們一起看看每種能力都有什麼獨有的特徵。
1
問題解決能力
問題解決能力是從代碼編寫中體現出的一種抽象的能力。我想了解你編寫代碼的整個過程,而非僅僅是一個結果。這就要求你知道問題是什麼,以及對何種有效的解決方案會被我認可有著清晰的認識。解決問題的關鍵很大部分在於定義約束條件,找到模糊或不確定的地方,並加以解決。
不同問題設置的挑戰也不盡相同。例如我的紙牌遊戲問題2要求你編寫一個小型的仿真遊戲。我想看到的是你如何解決問題,我還想看到的是你會提出問題。例如「紙牌」到底是什麼,你又會用什麼代表它?「發牌」又具體是什麼意思?
解決問題的關鍵在於接收到高層次的需求並將其轉化為具體的步驟。如果你正在做一個項目,那麼問題解決的階段就是你編寫用戶故事和用戶旅程的階段。你不一定要在面試中很刻意地體現這個階段,但我想知道你是否對要求有所了解。你得告訴我你的想法並寫下其中的重點。
你需要展示出解決問題的時候你的輸入和輸出內容分別是什麼。你需要說明你是在轉換數據還是實施一個流程。你還需要描述你是如何將大問題分解為較小的問題的。就一個算法問題來說,你需要指出所應用的相關算法,並告訴我如何讓它們適用這種新情況。
你要明確你識別出了哪些部分,以及它們與你之前所做的有何相似之處。如果有一塊白板,請你在上面勾畫出流程、數據集和你想到的任何其他內容。尤其當你遇到難題的時候,我想知道你是如何解決這一難題的,永遠不要只是沉默而茫然地盯著我。我在這裡是為了向你提供幫助,但是如果我無法理解你的思考過程,那麼我將無法幫助你。
另外,絕對不要將解決問題視為一個階段。我並不指望你在面試開始時就能提出完美的解決方案。但我想看到的是,你產生了一個想法並將其付諸實踐,這其中可能會產生問題,需要糾正。我甚至會更改對你的提出的需求,或者批評你的方法,但我希望你能接受這些改變並適應它們。
2
技術能力
我對應聘者的技術能力主要考量兩個方面。第一是你在編碼習慣用法和知識方面的經驗,你是否知道什麼是可能實現的,以及如何對其進行編碼?第二是具體的語言能力,當你明白了你想做的事情後,你能用你使用的程式語言把它實現得多好。
第一方面是關於你的一般編碼知識。你是否了解數據結構,程序流程以及程式語言能夠執行的所有操作?這些知識就像是你的工具箱,會影響你解決問題的能力,而你的編程設計是否有效,則取決於這些工具是否可用。
我在這裡會根據應聘者的猶豫程度或是否快速回應來評估他們。但我並不是在評價速度本身,而是會將速度作為候選人對自己工具的熟練程度的指標。我同樣會聽你的表達方式,看看你的聲音是信心十足,還是帶著疑問需要向我尋求肯定。
第二方面是考察你對具體程式語言的語法和語義的了解,這與第一方面聯繫極為緊密。因為我是主要通過觀察你是如何在代碼中表達自身想法,從而了解你對一般編碼知識的掌握。如果你需要費盡心機才能編寫出一個循環,那麼我需要確認這是因為你不懂程式語言,還是你不確定循環應當如何應用於這個問題。
我會考量你是否有能力將你的想法順暢地轉化成代碼。以我的紙牌遊戲問題為例,有一個階段是處理髮牌,在這一階段中你必須將紙牌分成兩疊,每個玩家一疊。無論你是選擇使用循環,還是高級拆分功能,你都應該能夠順暢地編寫出這段代碼。如果你編寫了錯誤的代碼、忘記了循環的工作原理,或是使用了錯誤的拆分語法,都會導致面試官對你產生負面的評價。
我不會因為一個人犯錯而懲罰一個應聘者,因為錯誤總是會發生。但是,若是出現相似的錯誤,或重複出現同樣的錯誤,會讓我認為你缺乏相應的知識。如果我發現了一個錯誤,我可能會忽略它,也可能會就這一代碼錯誤向你提問。如果你能夠認出自己的錯誤,會讓面試官對你的能力做出正面評價。
程式語言有很多特性,而我會考量你是否能夠恰當的使用它們。例如你是否在使用枚舉和常量?你是否能夠創建一個結構來封裝值?你是否通過值或引用正確地傳遞了變量?你是否使用了標準錯誤機制?
我不期望應聘者能夠了解所有與編程相關的知識,但我希望他們可以了解所有的基本知識。對於自稱對使用某程式語言有經驗的應聘者,我會考察他們一些常用的習慣用法。例如,在Python語言中,我會考察他們對列表解析(list comprehension)和字典的使用。在C ++語言中,我會考察他們對智能指針和(可能)lambda函數的了解。如果一位應聘者的代碼中沒有任何常用的程式語言習慣用法,那麼他很可能並沒有使用該程式語言的經驗。
3
溝通能力
正確地把你的想法表達出來能確保我對你做出準確的評價。有的應聘者做不到這一點,他的表現就會劣於其他候選人。表達流暢能提升我對你的溝通能力的評價,同時也確保面試進行得更加順利,並有助於你準時寫完代碼。
如果你在面試中寫的代碼中有些錯誤,良好的溝通也能為這種錯誤起到緩衝作用。如果你僅僅寫完代碼,那我就只能通過代碼來衡量你的能力。如果你與我溝通自己是如何寫這段代碼的,即便這段代碼寫錯了,我也能理解你的思路。
但你的溝通方式如果是僅僅把所寫的代碼念給我聽,那將毫無裨益。我自己也能看代碼。你應該把溝通的重點放在代碼中無法體現出來的,編程者在代碼背後的思考。有許多應聘者知道在面試時應該多溝通交流,但我覺得他們不知道應該說些什麼。因此他們最終選擇直接再念一遍自己所寫的代碼。你要學會和他人分享你寫代碼時的思路,但這需要多加練習。
注意使用編程術語。你應該知道如何使用行業術語來談論軟體。你的編程術語會透露出你的經驗是否充足,也會表現出你對細節的關注程度。我想要聽到具體的東西,比如實例變量、常量值和使用參數調用函數。我想聽到你說「從堆棧中取出數據和枚舉一個Map中的所有元素」,而不是聽到「用這個東西做這個」之類的話。
我也不想聽到你在面試中使用時髦術語。也不要使用一些你不懂的專業術語,或對一些專業術語不懂裝懂。不誠實是面試中的一大危險信號,不要以為你能僥倖逃脫不被面試官看出來。我和那些在人力資源部門工作的大多數人以及做過大量招聘工作的許多程式設計師一樣,都很擅長發現胡話連篇的人。
你不需要擔心自己有很多不懂的東西。我會根據你的經驗和水平來調整對你的預期。初級程式設計師沒有接觸過很多概念是很正常的。你需要保持開放的心態,做個誠實的人,並保有好奇之心。然而,我對一個有十年以上工作經驗的面試者的心理預期會更高。
面試是一個互動過程,良好的溝通可以讓我們處在同一頻道上。不良的溝通往往會導致我對你解決問題的能力和編程能力產生誤解。我越了解你的想法,就越能幫助你解決問題。
4
結束語
一般來說,缺乏溝通技巧或解決問題的能力會導致應聘者的面試失敗。我想不到有什麼公司會想要僱傭一個缺乏這兩種能力的人。當然在某些特定情形中,也許會聘用一些缺乏這兩種能力但具備某些冷門技術的人。但即便如此,你也需要和其他候選人競爭。
還有一些人雖然可以編寫基礎代碼,但是無法把已掌握的知識融會貫通地應用到新情況中。他們看上去掌握了一種新的方法,但其實並不理解這種方法背後的邏輯。我不能保證我在面試中根據觀察到的情況從而對應聘者產生的印象都是正確的,所以應聘者在面試中充分地展示他們的能力是非常重要的。
你可能想知道如何在面試中展示自己的這些能力。顯然,要提高其中任何一種能力都需要不斷的練習和學習。但是要在面試中全部展示出來則需要平衡好。不要讓你的腦子陷在代碼中,要表達出你的想法,這是展示你的知識儲備和問題解決能力的關鍵方法。不要擔心會暴露你的知識的局限性,相反,要開誠布公,展示你是如何解決問題的。多和面試官交流。也可以利用白板來進行圖示。
你要清醒地意識到自己被評估,從三個主要方面:解決問題能力、技術能力和溝通能力。