程式設計師面試面試中的優缺點
程式設計師面試一直是大家討論的熱門話題。面試中優缺點有什麼,小編對這個問題有自己看法,下面是我對程式設計師面試問題的一個階段性反思和經驗總結。
經驗面試優缺點
這裡所說的經驗不是通過工作了多少年來衡量的,而主要是指面試者的經歷,比如,是否完整地實現過一個軟體,或作為主要開發者完成過一個專案。經驗的重要性在於它能說明一個人的綜合能力。從專案的性質、規模和難度,面試官就可以大致判斷出面試者的綜合能力。如果一個面試者一直在大公司負責一個小模組的開發維護,那麼基本可以判斷他不具備獨立或作為主要開發者承擔一個專案的能力,只適合在另一家大公司做類似的事情。對於門檻較高需要長期技術積累的職位,相關經驗更顯得尤為重要,比如,Linux核心開發,JVM開發,遊戲引擎開發,資料庫實現,高階UX等。對於這類職位,沒有經驗的面試者即使綜合素質不錯也是需要長時間的學習和積累才能勝任。所以,基本上如果確定了你的職位屬於此類,那麼相關經驗毫無疑問應該成為首選因素,換句話說,P工作好 | 相關經驗好的概率是非常高的。
通過專案經驗判斷面試者的優劣比通過基礎和演算法測試更加靠譜,所以,面試過程中面試官應該花比較多的時間聽面試者介紹專案經驗,並進行深入地探討交流,瞭解面試者的知識面、思維能力、表達能力等。同時,可以結合專案提一些基礎知識和演算法的問題,比如,如果面試者做過C++相關的專案,那就可以問他如何進行記憶體管理?是否熟悉智慧指標?如果面試者的回答不能令人滿意,那麼就基本上可以判斷他的專案做得不是很好。
要注意的是,經驗也是一個多維度的事物。比如,C++股票交易中介軟體系統,這就涉及C++,中介軟體,股票 3個維度。假如面試者A做過C++股票交易客戶端,面試者B做過C的股票交易中介軟體。從語言角度看,A最匹配,從專案性質看,B最匹配,你如何選擇?這就是在多個維度中,哪個維度更重要的問題,就這個例子而言,我個人更傾向於B,因為我認為中介軟體開發經驗是主要矛盾,而從C切換到C++並不是問題。所以,面試官需要判斷哪一種經驗是主要的,而哪一種經驗是次要的。比如,我們招聘Android應用開發,這個職位的Android技術門檻並不高,它的真正難點在於做出好的使用者體驗UX。所以,如果一個面試者沒有Android的經驗我們是可以接受的,但是我希望他在UX方面有經驗,至少做過其他平臺的移動應用開發。
基礎面試優缺點
基礎面試是指考察諸如指標使用、程序執行緒概念等基礎知識的面試,十分類似於大學期末考試題。我曾經以為基礎面試十分重要,但是現在不這麼。在工作中基礎的確是重要的,但是在面試過程中,它必須具有區分性才有意義,也就是說P工作好|基礎好的概率要高,那麼考察指標使用,程序執行緒區別這樣的基礎題目才有它的意義。我的實際經驗是,基礎面試並不具有很好的區分性,和演算法一樣, 差不多P工作好|基礎好 = 50%。同時,基礎面試是最容易準備的,中國人有長期的應試教育經驗,要準備幾個把玩指標題目太容易了。
我曾經遇到過這樣的面試者,他的C語言基礎和編譯、連結等原理掌握得非常好,給我留下了深刻的印象,我給的面試結論是:知識面不寬,只會C語言,但基礎很紮實,建議錄用。後來的事情證明了那個結論的前半部分是對的,但是”建議錄用“錯了。他在實際工作中表現得一塌糊塗,不理解需求,不理解整體架構;同時,上班時間不是花在專案上,而是花在閱讀諸如《程式設計師的自我修養》之類的書籍上。最後,這位同事由於長期“不出活”離開了公司。
基礎不是不重要,而是“基礎好”不足以說明面試者能幹好工作,因為基礎是屬於區域性性知識,而實際工作需要綜合性能力,二者有天壤之別。C語言、作業系統能考高分,但是不會寫程式的人在大學我們還見得少嗎? 軟體開發就像蓋房子,綜合能力是設計和搭骨架,基礎知識是碼磚。張小龍原先Foxmail是Delphi開發的,他它不懂C#,你如果要招聘一個開發.NET Email客戶端的人,你考察他對CLR掌握得好不好有意義嗎? 讓張小龍來開發一個C#版的Foxmail真的會有困難嗎? 你招一個精通C#但沒有Email客戶端開發經驗的人來真的比張小龍靠譜嗎?
我說基礎知識不重要,和古人說的“不積窪步無以至千里”是不是矛盾呢?不矛盾!“窪步”與“千里”是一種可累加關係,但再多的“基礎知識”都累加不成“綜合能力”。學習軟體開發要像持續整合一樣,一開始就是一個完整的系統,雖然規模不大,問題很多,但它麻雀雖小五臟俱全,從小系統到大系統,從簡單系統到複雜系統逐步演化。
所以,基礎好本身不足以說明太多的問題,必須進一步考察綜合能力。對於基礎面試表現不好的面試者,如果時間允許也要進一步考察,有的面試者其實是有能力的,只是沒有進行充分的準備。最理想的狀態當然是基礎和綜合能力俱佳,若不能兼顧,應當綜合能力優先。
性格面試優缺點
現在,我來談我認為最重要的因素:性格。這可能是許多初為面試官的朋友所難以想象的,怎麼會是性格最重要呢?說實話,當我意識到這一點時,我自己也很驚訝!說白了,還是 P工作好|性格好的概率最高啊。我的實際經驗是,如果一個人的性格好,他能把工作做好的可能性是最高的,性格好遠比基礎好、演算法好要靠譜。
一個人如果技術上有缺陷,經驗上有不足,但性格好,在團隊中是很容易由其他人來補位的,他自己也很容易逐漸補起來;相反,如果一個人的性格不好,所有的技術優勢經驗優勢都發揮不出來,甚至還會起到負作用,而且性格缺點很難改變。我一直談到實際工作所需要的是綜合性的能力,這種綜合能力的發揮中性格是至關重要的。專案中不止會遇到技術問題,要涉及溝通、協調,不同的人不同的部門既有合作又有磨擦,如何處理這些事情都需要一個良好的性格。可以說,在開發團隊裡讓你與眾不同的不是你從哪個學校畢業,也不是你過去的經驗,而是你的性格。
當然,性格是一個複雜的東西,它包含了很多的方面,並非所有方面都是程式設計師面試所需要關注的。我的經驗是可以重點考察這些方面:
1 態度積極還是消極。有的面試者在談吐中就會自然給你一種積極上進的感覺,或者你可以在他的經歷中發現他積極的因素,這些都不是太難看出來的。相反,有的面試者你能明顯感覺到他的消極情緒。積極性在工作中是十分重要的,積極的人能給團隊帶來朝氣,也更易於合作。基本上,如果確定面試者屬於態度積極的,他通過我這一關的可能性就會大大增加;相反,如果確定屬於態度消極的,即使技術能力不錯我也會十分謹慎。
2 IQ。我的經驗是,總體來看,聰明的人在工作中的表現更為優秀。在面試中要考察一個人是否聰明並不一定要像Google和MS那樣找些專門測試IQ的智力題,其實,你只需要看他討論問題是不是很有邏輯性,思考和說話是不是反應敏捷就可以做出大致的判斷。另外,眼睛是人心靈的窗戶,一個人聰明與否,眼睛是會說話的。不過,聰明也不完全是優點,比如,當公司或專案遇到困難時,往往是聰明人先跑掉了,堅守的往往是IQ一般的人。
3 語言表達能力。語言表達能力也是程式設計師十分重要的一項素質,它關係到專案中的溝通是否順暢。面試官可以看看面試者能否用簡明的語言介紹清楚曾經做過的專案,能否抓住要點,能否考慮到聽者的相關背景。一般來講,語言表達能力強的人綜合能力都不會太差。
4 是否具有使用者意識。有人說程式設計師是做研發的,哪來什麼使用者?只有銷售、市場人員才會和使用者打交道。其實,這是完完全全的錯誤認識。你寫一個模組,甚至一個API,只要有別人用,他就是你的使用者。有的程式設計師設計一個模組或是一個軟體總是習慣於從使用者的角度來考慮,儘量地方便使用者,這就是一種良好的使用者意識。具有良好的使用者意識的人更能考慮別人的感受和整體的需要,而不是單純地從自己和區域性來思考問題。當面試者談及過去的專案經驗時,面試官可以常常站在使用者的角度對其進行提問,從這個過程中觀察其是否具有良好的使用者意識。
5 如何應對質疑和壓力。面試官應該對面試者的回答以及以往專案進行合理的質疑,看看他如何應對。曾經有一位面試者談到做遊戲登入伺服器的經歷,我就問:“如果登入伺服器掛了,怎麼辦呢”?他說原先雖然沒有考慮這個問題,但是可以怎麼怎麼改進。其實,大家都理解專案中有各種不完美,這裡面原因很多,只要面對質疑和壓力能從容應對努力往好的方向思考解決就可以了,不需要掩飾缺陷,更不應該有情緒。我遇到過有的面試者,一旦你對其專案提出質疑,他馬上產生反抗情緒,或不高興,或不承認有問題,這很容易一下子看出來他在工作中容不得質疑和批評,這種人要想合作就很困難。
6 個性特點。許多面試者喜歡在簡歷上寫“精通C++/Linux“,這些字眼看得人麻木,如果有人寫”喜歡C++/Linux“,我就會有一種眼前一亮的感覺。“精通”是沒有感情色彩的敘述,而“喜歡”包含了面試者的個性,我更願意看到面試者的個性。我相信對某樣東西真正的熱情遠比你當前對它的掌握程度更為重要。其實,N年的經歷告訴我們,同一個班的同學,同一個專案組的同事,雖然每天所學的知識,所接觸的工作都是相同的,但其實每個人的成績和表現差異是十分明顯的。那麼,到底本質的差異是什麼呢?其實,就是每個人的個性。是個性使得有的人業餘時間去打球,有的人業餘時間去看書,有的人喜歡Linux,有的人喜歡Mac。一個人在團隊中扮演的角色也和他的個性有很大的關係。面試官應該引導面試者展現自己的個性,並判斷其是否有益於團隊。