問:技術面試的時候,題目挺簡單的,我覺得自己都做出來了。可最后怎么還是被拒了啊? 答:面試被拒有很多種可能,比如面試官認為你性格不適合、態度不夠誠懇等等。但在技術面試過程中,這些都不是最重要的。技術面試的面試官一般都是程序員,程序員通常沒有那么多花花腸子,他們只認一個理:題目做對、做完整了,就讓你通過面試;否則就沒戲。所以碰到簡單題目卻被拒的情況,應聘者還是要檢討題目是不是真的做對、做完整了。 舉一個微軟面試開發工程師時最常用的一個問題為例:把一個字符串轉換成整數。這個題目很簡單吧?很多人都能在三分鐘之類寫出如下不到十行的代碼: 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(unsigned int 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就是水到渠成的事情了。 作者:何海濤 |