天天看點

@程式員,如何在程式設計面試中脫穎而出?

"IT有得聊”是機械工業出版社旗下IT專業資訊和服務平台,緻力于幫助讀者在廣義的IT領域裡,掌握更專業、實用的知識與技能,快速提升職場競争力。 

如果能多了解一些面試的基本知識,可以幫助你在面試中對自身有更準确的定位,并且能提升你的面試技巧。​

@程式員,如何在程式設計面試中脫穎而出?

作者 | edA‑qa mort‑ora‑y

譯者 | 蘇本如,責編 | 郭芮出品 |

以下為譯文:

​由于不知道面試官對面試者的衡量标準,許多我曾面試過的候選人在面試中表現得差強人意。雖然不同的面試官有自己不同的衡量标準,但這些标準間也存在一些共通之處。如果能多了解一些面試的基本知識,可以幫助你在面試中對自身有更準确的定位,并且能提升你的面試技巧。我在interviewing.io(譯者注:美國一個線上技術面試平台)上會根據三個方面來評價面試候選人的表現。我認為這三方面基本代表了各家公司對你的評價的依據。即便這三方面的能力沒有在面試中直接被考察,它們也會影響面試官對你的總體評估。

  • 問題解決能力
  • 技術能力
  • 溝通能力

雖然我需要對以上每一種能力分别評分,但這三個方面的能力其實是緊密地聯系在一起的。如果一個候選人缺乏其中的一項能力,他往往也會欠缺另外兩方面的能力。讓我們一起看看每種能力都有什麼獨有的特征。

01問題解決能力​

問題解決能力是從代碼編寫中展現出的一種抽象的能力。我想了解你編寫代碼的整個過程,而非僅僅是一個結果。這就要求你知道問題是什麼,以及對何種有效的解決方案會被我認可有着清晰的認識。解決問題的關鍵很大部分在于定義限制條件,找到模糊或不确定的地方,并加以解決。不同問題設定的挑戰也不盡相同。例如我的紙牌遊戲問題2要求你編寫一個小型的仿真遊戲。我想看到的是你如何解決問題,我還想看到的是你會提出問題。例如“紙牌”到底是什麼,你又會用什麼代表它?“發牌”又具體是什麼意思?解決問題的關鍵在于接收到高層次的需求并将其轉化為具體的步驟。如果你正在做一個項目,那麼問題解決的階段就是你編寫使用者故事和使用者旅程的階段。你不一定要在面試中很刻意地展現這個階段,但我想知道你是否對要求有所了解。你得告訴我你的想法并寫下其中的重點。你需要展示出解決問題的時候你的輸入和輸出内容分别是什麼。你需要說明你是在轉換資料還是實施一個流程。你還需要描述你是如何将大問題分解為較小的問題的。就一個算法問題來說,你需要指出所應用的相關算法,并告訴我如何讓它們适用這種新情況。你要明确你識别出了哪些部分,以及它們與你之前所做的有何相似之處。如果有一塊白闆,請你在上面勾畫出流程、資料集和你想到的任何其他内容。尤其當你遇到難題的時候,我想知道你是如何解決這一難題的,永遠不要隻是沉默而茫然地盯着我。我在這裡是為了向你提供幫助,但是如果我無法了解你的思考過程,那麼我将無法幫助你。另外,絕對不要将解決問題視為一個階段。我并不指望你在面試開始時就能提出完美的解決方案。但我想看到的是,你産生了一個想法并将其付諸實踐,這其中可能會産生問題,需要糾正。我甚至會更改對你的提出的需求,或者批評你的方法,但我希望你能接受這些改變并适應它們。

02技術能力​

我對應聘者的技術能力主要考量兩個方面。第一是你在編碼習慣用法和知識方面的經驗,你是否知道什麼是可能實作的,以及如何對其進行編碼?第二是具體的語言能力,當你明白了你想做的事情後,你能用你使用的程式設計語言把它實作得多好。第一方面是關于你的一般編碼知識。你是否了解資料結構,程式流程以及程式設計語言能夠執行的所有操作?這些知識就像是你的工具箱,會影響你解決問題的能力,而你的程式設計設計是否有效,則取決于這些工具是否可用。我在這裡會根據應聘者的猶豫程度或是否快速回應來評估他們。但我并不是在評價速度本身,而是會将速度作為候選人對自己工具的熟練程度的名額。我同樣會聽你的表達方式,看看你的聲音是信心十足,還是帶着疑問需要向我尋求肯定。第二方面是考察你對具體程式設計語言的文法和語義的了解,這與第一方面聯系極為緊密。因為我是主要通過觀察你是如何在代碼中表達自身想法,進而了解你對一般編碼知識的掌握。如果你需要費盡心機才能編寫出一個循環,那麼我需要确認這是因為你不懂程式設計語言,還是你不确定循環應當如何應用于這個問題。我會考量你是否有能力将你的想法順暢地轉化成代碼。以我的紙牌遊戲問題為例,有一個階段是處理發牌,在這一階段中你必須将紙牌分成兩疊,每個玩家一疊。無論你是選擇使用循環,還是進階拆分功能,你都應該能夠順暢地編寫出這段代碼。如果你編寫了錯誤的代碼、忘記了循環的工作原理,或是使用了錯誤的拆分文法,都會導緻面試官對你産生負面的評價。我不會因為一個人犯錯而懲罰一個應聘者,因為錯誤總是會發生。但是,若是出現相似的錯誤,或重複出現同樣的錯誤,會讓我認為你缺乏相應的知識。如果我發現了一個錯誤,我可能會忽略它,也可能會就這一代碼錯誤向你提問。如果你能夠認出自己的錯誤,會讓面試官對你的能力做出正面評價。程式設計語言有很多特性,而我會考量你是否能夠恰當的使用它們。例如你是否在使用枚舉和常量?你是否能夠建立一個結構來封裝值?你是否通過值或引用正确地傳遞了變量?你是否使用了标準錯誤機制?我不期望應聘者能夠了解所有與程式設計相關的知識,但我希望他們可以了解所有的基本知識。對于自稱對使用某程式設計語言有經驗的應聘者,我會考察他們一些常用的習慣用法。例如,在Python語言中,我會考察他們對清單解析(list comprehension)和字典的使用。在C ++語言中,我會考察他們對智能指針和(可能)lambda函數的了解。如果一位應聘者的代碼中沒有任何常用的程式設計語言習慣用法,那麼他很可能并沒有使用該程式設計語言的經驗。

03溝通能力​

正确地把你的想法表達出來能確定我對你做出準确的評價。有的應聘者做不到這一點,他的表現就會劣于其他候選人。表達流暢能提升我對你的溝通能力的評價,同時也確定面試進行得更加順利,并有助于你準時寫完代碼。如果你在面試中寫的代碼中有些錯誤,良好的溝通也能為這種錯誤起到緩沖作用。如果你僅僅寫完代碼,那我就隻能通過代碼來衡量你的能力。如果你與我溝通自己是如何寫這段代碼的,即便這段代碼寫錯了,我也能了解你的思路。但你的溝通方式如果是僅僅把所寫的代碼念給我聽,那将毫無裨益。我自己也能看代碼。你應該把溝通的重點放在代碼中無法展現出來的,程式設計者在代碼背後的思考。有許多應聘者知道在面試時應該多溝通交流,但我覺得他們不知道應該說些什麼。是以他們最終選擇直接再念一遍自己所寫的代碼。你要學會和他人分享你寫代碼時的思路,但這需要多加練習。注意使用程式設計術語。你應該知道如何使用行業術語來談論軟體。你的程式設計術語會透露出你的經驗是否充足,也會表現出你對細節的關注程度。我想要聽到具體的東西,比如執行個體變量、常量值和使用參數調用函數。我想聽到你說“從堆棧中取出資料和枚舉一個Map中的所有元素”,而不是聽到“用這個東西做這個”之類的話。我也不想聽到你在面試中使用時髦術語。也不要使用一些你不懂的專業術語,或對一些專業術語不懂裝懂。不誠實是面試中的一大危險信号,不要以為你能僥幸逃脫不被面試官看出來。我和那些在人力資源部門工作的大多數人以及做過大量招聘工作的許多程式員一樣,都很擅長發現胡話連篇的人。你不需要擔心自己有很多不懂的東西。我會根據你的經驗和水準來調整對你的預期。初級程式員沒有接觸過很多概念是很正常的。你需要保持開放的心态,做個誠實的人,并保有好奇之心。然而,我對一個有十年以上工作經驗的面試者的心理預期會更高。面試是一個互動過程,良好的溝通可以讓我們處在同一頻道上。不良的溝通往往會導緻我對你解決問題的能力和程式設計能力産生誤解。我越了解你的想法,就越能幫助你解決問題。

04結束語​

一般來說,缺乏溝通技巧或解決問題的能力會導緻應聘者的面試失敗。我想不到有什麼公司會想要雇傭一個缺乏這兩種能力的人。當然在某些特定情形中,也許會聘用一些缺乏這兩種能力但具備某些冷門技術的人。但即便如此,你也需要和其他候選人競争。還有一些人雖然可以編寫基礎代碼,但是無法把已掌握的知識融會貫通地應用到新情況中。他們看上去掌握了一種新的方法,但其實并不了解這種方法背後的邏輯。我不能保證我在面試中根據觀察到的情況進而對應聘者産生的印象都是正确的,是以應聘者在面試中充分地展示他們的能力是非常重要的。你可能想知道如何在面試中展示自己的這些能力。顯然,要提高其中任何一種能力都需要不斷的練習和學習。但是要在面試中全部展示出來則需要平衡好。不要讓你的腦子陷在代碼中,要表達出你的想法,這是展示你的知識儲備和問題解決能力的關鍵方法。不要擔心會暴露你的知識的局限性,相反,要開誠布公,展示你是如何解決問題的。多和面試官交流。也可以利用白闆來進行圖示。你要清醒地意識到自己被評估,從三個主要方面:解決問題能力、技術能力和溝通能力。原文:https://dev.to/mortoray/how-i-evaluate-you-in-a-code-interview-42hh

為了友善大家交流學習,我們建立了”程式員讀者交流群“,想加入的朋友可以掃描下方二維碼,發送”程式員“三個字給小編。小編就會拉您入群啦。

繼續閱讀