面試困惑問與答(2)——感覺挺好,為啥被拒了?
問:技術面試的時候,題目挺簡單的,我覺得自己都做出來了。可最后怎么還是被拒了啊?
答:面試被拒有很多種可能,比如面試官認為你性格不適合、態度不夠誠懇等等。但在技術面試過程中,這些都不是最重要的。技術面試的面試官一般都是程序員,程序員通常沒有那么多花花腸子,他們只認一個理:題目做對、做完整了,就讓你通過面試;否則就沒戲。所以碰到簡單題目卻被拒的情況,應聘者還是要檢討題目是不是真的做對、做完整了。
???????????????舉一個微軟面試開發工程師時最常用的一個問題為例:把一個字符串轉換成整數。這個題目很簡單吧?很多人都能在三分鐘之類寫出如下不到十行的代碼:
int StrToInt(char* string)
{
???????int number = 0;
???????while(*string != 0)
???????{
???????????????number = number * 10 + *string - '0';
???????????????++string;
???????}
?
???????return number;
}
???????????????看了上面的代碼,你是不是覺得微軟很容易搞定?如果你真的這么想,不好意思,你可能又要被拒了。
通常越是簡單的問題,面試官的期望值就會越高。當題目簡單的時候,面試官就會期待應聘者能夠很完整解決問題,除了完成基本功能之外,能夠考慮各種邊界條件、錯誤處理等各個方面。像這道題,面試官不僅僅只是期待你能完成把字符串轉換成整數這個最最起碼的要求,而是希望你能考慮到各種特殊的輸入。如果我是面試官,我至少會期待應聘者能夠在不需要提示的情況下,考慮到輸入的字符串中有非數字字符和正負號,要考慮到最大的正整數和最小的負整數,以及溢出,同時還要考慮當輸入的字符串不能轉換成整數時,應該如何做錯誤處理。當把這個問題的方方面面都考慮到的時候,你也就不會再認為這道題簡單了。
除了問題考慮不全面之外,還有一個面試官不能容忍的錯誤就是程序不夠魯棒。以前面的那段代碼為例,只要輸入一個空指針,程序立即崩潰。這樣的代碼如果加入到軟件當中,將是災難。因此當面試官看到代碼中對空指針沒有判斷并加以特殊處理的時候,通常他連往下看的興趣都沒有。
當然,不是所有與魯棒性相關的問題都和前面的代碼那樣明顯。再舉一個很多人都被面試過的問題:求鏈表中的倒數第k個結點。有不少人先在網上看過這個題目,因此知道思路是用兩個指針,第一個指針先走k-1?步,然后兩個指針一起走。當第一個指針走到尾結點的時候,第二個指針指向的就是倒數第k個結點。于是他大筆一揮,寫下了下面的代碼:
ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)
{
???????if(pListHead == NULL || k == 0)
???????????????return NULL;
?
???????ListNode *pAhead = pListHead;
???????ListNode *pBehind = NULL;
?
???????for(unsignedint i = 0; i < k - 1; ++ i)
???????{
???????????????pAhead = pAhead->m_pNext;
???????}
?
???????pBehind = pListHead;
?
???????while(pAhead->m_pNext != NULL)
???????{
???????????????pAhead = pAhead->m_pNext;
???????????????pBehind = pBehind->m_pNext;
???????}
?
???????return pBehind;
}
寫完之后,應聘者看到自己已經判斷了輸入的指針是不是空指針并做了特殊處理,于是心里洋洋得意以為這次面試必定順利通過了。可是,他沒有想到的是這段代碼中仍然有很嚴重的問題:當鏈表中的結點總數小于k的時候,程序還是會崩潰。因此,幾天之后他收到的仍然不會是Offer,而是拒信。
要想很好地解決前面的問題,最好的辦法是在動手寫代碼之后想好測試用例。只有把各種可能的輸入事先都想好了,才能在寫代碼的時候把各種情況都做相應的處理。寫完代碼之后,也不要立刻給面試官檢查,而是先在心里默默地運行。當程序運行之前想好的所有測試用例都能得到合理的輸出時,再把代碼交給面試官。做到了這一步,通過面試拿到Offer就是水到渠成的事情了。
?
博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://blog.csdn.net/cadcisdhht。整理出版物請和作者聯系。有任何建議或意見,歡迎在評論中告知,或者加我微博http://weibo.com/zhedahht與我交流。
面試困惑問與答(3)——題目沒弄懂,可以問面試官嗎?
問:面試的時候,面試官突然冒出一個之前沒有聽過的概念,請問我可以問面試官讓他把題目說清楚嗎?如果問的話他會不會覺得我很傻?
答:面試和筆試最大的區別是:面試是一個注重溝通交流的過程,而且溝通是雙向的。因此面試官可以問應聘者問題,同樣應聘者也可以問面試官問題。
???????????????通常在面試環節面試官的一個很重要的任務就是考察應聘者的學習愿望以及學習能力。學習能力怎么體現呢?面試官提出一個新概念,應聘者沒有聽說他,于是他在已有的理解的基礎上問進一步的問題,然后掌握了這個概念。這就是學習能力。通常學習能力強的人具有主動積極的態度。因此建議在應聘過程中碰到不明白的地方多提問,這樣面試官覺得你態度積極,求知欲望強烈,這樣會給面試結果加分。
???????????????舉個例子,google曾經有一道面試題:找出第1500個丑數。很多人都不知道丑數是什么。不知道怎么辦?面試官就坐在對面,可以問他啊。面試官會告訴你只含有2、3、5三個因子的數就是丑數。你聽了后,覺得聽明白了,但不太確定,于是可以舉幾個例子并讓面試確認你的理解是不是對的: 6、8、 10、12都是丑數,但14就不是,對嗎?當面試官給出肯定的答復,你就知道自己的理解是對的了。問題問的是第1500個丑數,與順序有關。可是哪個數字時第一個丑數呢,1是不是第一個?這個你可能也不能確定,怎么辦?還是問面試官,他會告訴你1是或者不是丑數。題目是他出的,他有責任把題目給你解釋清楚。
???????????????有些面試官甚至故意一開始不把題目描述的清楚,讓題目存在一定的二義性。他期待應聘者能夠一步步通過提問來弄明白題目的要求。這就是在考察應聘者的溝通能力。為什么要這樣考察?因為實際工作也是這樣,不是一開始項目需求就定義得很清楚了。程序員需要多次與項目經理甚至客戶反復溝通才能把需求弄清楚。如果沒有一定的溝通能力,當程序員面對一個模糊的客戶需求時,他就會覺得無處下手。
比如最近很流行的一個面試題,面試官最開始問:如何求樹中兩個結點的最近公共父結點。此時面試官對題目中的樹的特點完全沒有給出描述。他希望應聘者在聽到問題后會提出幾個問題,比如這棵樹是二叉樹還是普通的樹。
如果面試官說是二叉樹,應聘者可以繼續問該樹是不是排序的二叉樹。面試官回答是排序的。聽到這里,應聘者才能確定思路:從書的根結點出發遍歷樹,如果當前結點都大于輸入的兩個結點,則下一步遍歷當前結點的左子樹;如果當前結點小于輸入的兩個結點,則下一步遍歷當前結點右子樹。一直遍歷到當前結點比一個輸入結點大而比另一個小的時候,此時當前結點就是符合要求的最近公共父結點。
如果應聘者問樹是不是二叉樹的時候,面試官回答是任意的樹。此時應聘者可以接著提問在樹結點中有沒有指向父結點的指針,面試官將會給出肯定的回答。由于樹的結點中有指向父結點的指針,因此從輸入的結點出發,沿著指向父結點的指針一直到樹的根結點,可以看做是一個鏈表,因此這個題目的解法就和求兩個鏈表的第一個公共結點的解法是一樣的了。
我們可以看出面試官給出不同的條件,將是兩個兩個完全不一樣的題目。如果一開始應聘者沒有弄清楚面試官的意圖就貿然動手解題,那結果很有可能是離題千里。從中我們也可以看出在面試過程中溝通的重要性,當覺得題目的條件、要求不夠明確的時候,一定要多提問來消除自己的疑惑。
?
博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://blog.csdn.net/cadcisdhht。整理出版物請和作者聯系。有任何建議或意見,歡迎在評論中告知,或者加我微博http://weibo.com/zhedahht與我交流。
面試困惑問與答(4)——最后該問什么?
問:每次面試的時候,面試官都會問我有沒有什么問題要問他。我可以問什么問題呢?
答:面試官讓應聘者問問題,主要是想了解應聘者最關心的問題有哪些。因此,首先至少要問一兩個問題。不然面試官就會覺得你對我們公司、職位等都不感興趣,那你來面試做什么?但是也不是什么問題都可以在這個時候問。如果問題問得比較合適,對應聘者來說是個加分的好機會;但如果問的問題不太合適,面試官對你的印象就會大打折扣,相當于跳入面試官的陷阱了。
???????????????先談談不適合問的問題。首先是問和自己的職位沒有關系的問題,比如問“公司未來五年的發展戰略是什么”。如果你面試的職位是CTO,而你的面試官是CEO,這倒是個合適的問題。如果面試的職位只是個程序員,那這個問題離你就太遠了,與你的切身利益沒有多少關系。再說,坐在你對面的面試官很有可能也只是個程序員,你讓他怎么回答這個關系公司發展戰略的問題呢?
???????????????其次是問薪水。技術面試不是談薪水的時候。要談工資,等通過面試之后和HR談。這個問題在前面的第一個困惑中已經講過,不在贅述。
???????????????第三是立即打聽面試結果,比如問“您覺得我能拿到Offer嗎”之類的問題。現在大部分公司的面試都有好幾輪,最終決定應聘者能不能通過面試,是要把所有面試官的評價綜合起來的。問這個問題相當于白問,因為問了面試官也不可能告訴你結果。
???????????????筆者推薦問的問題是與招聘的職位或者項目相關的問題。如果這種類型的問題問得很到位,那么面試官就會覺得你對應聘的職位很有興趣。不過要問好這種類型的問題也不容易,因為首先對應聘的職位或者項目的背景要有一定的了解。我們可以從兩方面去了解相關的信息。一是面試前做足功課,到網上去搜集一些相關的信息,做到對公司成立時間、主要業務、職位要求等都了然于胸。二是面試過程中注意面試官說過的話。有不少的面試官在面試之前會對招聘的職位相關的項目會做簡單介紹,其中會包含其他渠道無法得到的信息,比如項目進展情況等等。應聘者可以從中找出一兩個點,然后向面試官問。
???????????????舉幾個我當時來思科面試的時候問的幾個問題。一個面試官介紹項目時說這次招聘是項目組第一次在中國招人,目前這個項目所有人員都在美國總部。那一輪我最后問的問題是:這個項目所有的老員工都在美國,那怎么對中國這一批新員工進行培訓?中國的新員工有沒有機會去美國總部學習?最后一輪面試是老板面試,她介紹我要加入的項目組是負責開發思科測試供應商生產出來的網絡設備的測試系統。當時我最后問的幾個問題是:這個組是做測試系統的,那這個組的人員是不是也要參與網絡設備的測試,是不是需要學習硬件測試相關的知識?因為我們測試的對象是網絡設備,那么這個職位對網絡硬件的掌握程度有沒有要求?
?
???????????????博主何海濤對本博客文章享有版權。網絡轉載請注明出處http://blog.csdn.net/cadcisdhht。整理出版物請和作者聯系。有任何建議或意見,歡迎在評論中告知,或者加我微博http://weibo.com/zhedahht與我交流。