<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                第1章 面試的流程 1.1 面試官談面試 “對于初級程序員,我一般會偏向考查算法和數據結構,看應聘者的基本功;對于高級程序員,我會多關注專業技能和項目經驗。” ——何幸杰(SAP,高級工程師) “應聘者要事先做好準備,對公司近況、項目情況有所了解,對所應聘的工作真的很有熱情。另外,應聘者還要準備好合適的問題問面試官。” ——韓偉東(盛大,高級研究員) “應聘者在面試過程首先需要放松,不要過于緊張,這有助于后面解決問題時開拓思路。其次不要急于編寫代碼,應該先了解清楚所要解決的問題。這時候最好先和面試官多做溝通,然后開始做一些整體的設計和規劃,這有助于編寫高質量和高可讀性的代碼。寫完代碼后不要馬上提交,最好自己review并借助一些測試用例來走幾遍代碼,找出可能出現的錯誤。” ——堯敏(淘寶,資深經理) “‘神馬’都是浮云,應聘技術崗位就是要踏實寫程序。” ——田超(微軟,SDE II) 1.2 面試的三種形式 如果應聘者能夠通過公司的簡歷篩選環節,那恭喜他取得了階段性的成功。但要想拿到心儀的Offer,應聘者還有更長的路要走。大部分公司的面試都是從電話面試開始的。通過電話面試之后,有些公司還會有一兩輪遠程面試。面試官讓應聘者共享自己的桌面,遠程觀察應聘者編寫及調試代碼的過程。如果前面的面試都很順利,應聘者就會收到現場面試的邀請信,請他去公司接受面對面的面試。整個面試的流程我們可以用圖1.1表示。 ![](https://img.kancloud.cn/cc/d7/ccd7d4d7a33df8d5728c0be029429e5c_419x55.jpg) 圖1.1 面試的形式和流程 注:只有少數公司有共享桌面遠程面試環節。 1.2.1 電話面試 顧名思義,電話面試是面試官以打電話的形式考查應聘者。有些面試官會先和應聘者預約好電話面試的時間,而還有些面試官卻喜歡搞突然襲擊,一個電話打過去就開始面試。為了應付這種突然襲擊,建議應聘者在投出簡歷之后的一兩個星期之內,要保證手機電池能至少連續通話一個小時。另外,應聘者不要長時間呆在很嘈雜的地方。如果應聘者身在鬧市的時候突然接到面試電話,那么雙方就有可能因為聽不清對方而倍感尷尬。 電話面試和現場面試最大的區別就是應聘者和面試官是見不到對方的,因此雙方的溝通只能依靠聲音。沒有了肢體語言、面部表情,應聘者清楚地表達自己想法的難度就比現場面試時要大很多,特別是在解釋復雜算法的時候。應聘者在電話面試的時候應盡可能用形象化的語言把細節說清楚。例如,在現場面試的時候,應聘者如果想說一個二叉樹的結構,可以用筆在白紙上畫出來,就一目了然。但在電話面試的時候,應聘者就需要把二叉樹中有哪些結點,每個結點的左子結點是什么、右子結點是什么都要說得很清楚,只有這樣面試官才能準確地理解應聘者的思路。 很多外企在電話面試時都會加上英語面試的環節,甚至有些公司全部面試都會用英語進行。電話面試時應聘者只能聽到面試官的聲音而看不到他的口型,這對應聘者的聽力提出了更高的要求。如果應聘者在面試的時候沒有聽清楚或者聽懂面試官的問題,千萬不要不懂裝懂、答非所問,這是面試的大忌。當不確定面試官的問題的時候,應聘者一定要大膽地向面試官多提問,直到弄清楚面試官的意圖為止。 面試小提示: 應聘者在電話面試的時候應盡可能用形象的語言把細節說清楚。 如果在英語面試時沒有聽清或沒有聽懂面試官的問題,應聘者要敢于說Pardon。 1.2.2 共享桌面遠程面試 共享桌面遠程面試(Phone-Screen Interview)是指利用一些共享桌面的軟件(比如微軟的Live Meeting、思科的WebEx等),應聘者把自己電腦的桌面共享給遠程的面試官。這樣兩個人雖然沒有坐在一起,但面試官卻能通過共享桌面觀看應聘者編程和調試的過程。目前只有為數不多的幾家大公司會在邀請應聘者到公司參加現場面試之前,先進行一兩輪共享桌面的遠程面試。 這種形式的面試,面試官最關心的是應聘者的編程習慣及調試能力。通常面試官會認可應聘者下列幾種編程習慣: ● 思考清楚再開始編碼。應聘者不要一聽到題目就匆忙打開編程軟件如Visual Studio開始敲代碼,因為在沒有形成清晰的思路之前寫出的代碼通常會漏洞百出。這些漏洞被面試官發現之后,應聘者容易慌張,這個時候再修改代碼也會越改越亂,最終導致面試的結果不理想。更好的策略是應聘者應先想清楚解決問題的思路,算法的時間、空間復雜度各是什么,有哪些特殊情況需要處理等,然后再動手編寫代碼。 ● 良好的代碼命名和縮進對齊習慣。一目了然的變量和函數名,加以合理的縮進和括號對齊,會讓面試官覺得應聘者有參與大型項目的開發經驗。 ● 能夠單元測試。通常面試官出的題目都是要求寫函數解決某一問題,如果應聘者能夠在定義函數之后,立即對該函數進行全面的單元測試,那就相當于向面試官證明了自己有著專業的軟件開發經驗。如果應聘者是先寫單元測試用例,再寫解決問題的函數,我相信面試官定會對你刮目相看,因為能做到測試在前、開發在后的程序員實在是太稀缺了,他會毫不猶豫地拋出綠色的橄欖枝。 通常我們在寫代碼的時候都會遇到問題。當應聘者運行代碼發現結果不對之后的表現,也是面試官關注的重點,因為應聘者此時的反應、采取的措施都能體現出他的調試功底。如果應聘者能夠熟練地設置斷點、單步跟蹤、查看內存、分析調用棧,能很快發現問題的根源并最終解決問題,那么面試官將會覺得他的開發經驗很豐富。調試能力是在書本上學不到的,只有通過大量的軟件開發實踐才能積累出調試技巧。當面試官發現一個應聘者的調試功底很扎實的時候,他在寫面試報告的時候是不會吝嗇贊美之詞的。 面試小提示: 在共享桌面遠程面試過程中,面試官最關心的是應聘者的編程習慣及調試能力。 1.2.3 現場面試 在通過電話面試和共享桌面遠程面試之后,應聘者不久就會收到E-mail,邀請他去公司參加現場面試(Onsite Interview)。 去公司參加現場面試之前,應聘者應做好以下幾點準備: ● 規劃好路線并估算出行時間。應聘者要事先估算在路上需要花費多長時間,并預留半小時左右的緩沖時間以應對堵車等意外情況。如果面試遲到,那至少印象分會大打折扣。 ● 準備好得體的衣服。IT公司通常衣著比較隨意,應聘者通常沒有必要穿著正裝,一般舒服干凈的衣服都可以。 ● 注意面試邀請函里的面試流程。如果面試有好幾輪,時間也很長,那么你在面試過程中可能會覺得疲勞并思維變得遲鈍。比如微軟對技術職位通常有五輪面試,連續幾個小時處在高壓的面試之中,人難免會變得精疲力盡。因此應聘者可以帶一些提神的飲料或者食品,在兩輪面試之間提神醒腦。 ● 準備幾個問題。每一輪面試的最后,面試官都會讓應聘者問幾個問題,應聘者可以提前準備好問題。 現場面試是整個面試流程中的重頭戲。由于是坐在面試官的對面,應聘者的一舉一動都看在面試官的眼里。面試官通過應聘者的語言和行動,考查他的溝通能力、學習能力、編程能力等綜合實力。本書接下來的章節將詳細討論各種能力。 1.3 面試的三個環節 通常面試官會把每一輪面試分為三個環節(如圖1.2所示):首先是行為面試,面試官參照簡歷了解應聘者的過往經驗;然后是技術面試,這一環節很有可能會要求應聘者現場寫代碼;最后一個環節是應聘者問幾個自己最感興趣的問題。下面將詳細討論面試的這三個環節。 ![](https://img.kancloud.cn/23/e3/23e363b6b60e2e7cb62119525354ee63_438x50.jpg) 圖1.2 面試的三個環節 1.3.1 行為面試環節 面試開始的5~10分鐘通常是行為面試的時間。在行為面試這個環節里,面試官會注意應聘者的性格特點,深入地了解簡歷中列舉的項目經歷。由于這一環節一般不會問技術難題,因此也是一個暖場的過程,應聘者可以利用這幾分鐘時間調整自己的情緒,進入面試的狀態。 不少面試官會讓應聘者做一個簡短的自我介紹。由于面試官手中拿著應聘者的簡歷,而那里有應聘者的詳細信息,因此此時的自我介紹不用花很多時間,用30秒到1分鐘的時間介紹自己的主要學習、工作經歷就即可。如果面試官對你的某一段經歷或者參與的某一個項目很感興趣,他會有針對性地提幾個問題詳細了解。 1.應聘者的項目經驗 應聘者自我介紹之后,面試官接著會對照應聘者的簡歷去詳細了解他感興趣的項目。應聘者在準備簡歷的時候,建議用如圖1.3所示的STAR模型描述自己經歷過的每一個項目。 ![](https://img.kancloud.cn/62/0b/620b1a467a7dc37f407040bf795bff5d_566x192.jpg) 圖1.3 簡歷中描述項目的STAR模型 ● Situation:簡短的項目背景,比如項目的規模,開發的軟件的功能、目標用戶等。 ● Task:自己完成的任務。這個要寫詳細,要讓面試官對自己的工作一目了然。在用詞上要注意區分“參與”和“負責”:如果只是加入某一個開發團隊寫了幾行代碼就用“負責”,那就很危險。面試官看到簡歷上應聘者“負責”了某個項目,他可能就會問項目的總體框架設計、核心算法、團隊合作等問題。這些問題對于只是簡單“參與”的人來說,是很難回答的,會讓面試官認為你不誠實,印象分會減去很多。 ● Action:為了完成任務自己做了哪些工作,是怎么做的。這里可以詳細介紹。做系統設計的,可以介紹系統架構的特點;做軟件開發的,可以寫基于什么工具在哪個平臺下應用了哪些技術;做軟件測試的,可以寫是手工測試還是自動化測試,是白盒測試還是黑盒測試等。 ● Result:自己的貢獻。這方面的信息可以寫得具體些,最好能用數字加以說明。如果是參與功能開發,可以說按時完成了多少功能;如果做優化,可以說性能提高的百分比是多少;如果是維護,可以說修改了多少個Bug。 舉個例子,筆者用下面一段話介紹自己在微軟Winforms項目組的經歷: Winforms是微軟.NET中的一個成熟的UI平臺(Situation)。本人的工作是在添加少量新功能之外主要負責維護已有的功能(Task)。新的功能主要是讓Winforms的控件的風格和Vista、Windows 7的風格保持一致。在維護方面,對于較難的問題我用WinDbg等工具進行調試(Action)。在過去兩年中我總共修改了超過200個Bug(Result)。 如果在應聘者的簡歷中上述4類信息還不夠清晰,面試官可能會追問相關的問題。除此之外,面試官針對項目經驗最常問的問題還包括如下幾個類型: ● 你在該項目中碰到的最大的問題是什么,你是怎么解決的? ● 從這個項目中你學到了什么? ● 什么時候會和其他團隊成員(包括開發人員、測試人員、設計人員、項目經理等)有什么樣的沖突,你們是怎么解決沖突的? 應聘者在準備簡歷的時候,針對每一個項目經歷都應提前做好相應的準備。只有準備充分,應聘者在行為面試這個環節才可以表現得游刃有余了。 面試小提示: 在介紹項目經驗(包括在簡歷上介紹和面試時口頭介紹)時,應聘者不必詳述項目的背景,而要突出介紹自己完成的工作及取得的成績。 2.應聘者掌握的技能 除了應聘者參與過的項目之外,面試官對應聘者掌握的技能也很感興趣,他有可能針對簡歷上提到的技能提出問題。和描述項目時要注意“參與”和“負責”一樣,描述技能掌握程度時也要注意“了解”、“熟悉”和“精通”的區別。 “了解”指對某一個技術只是上過課或者看過書,但沒有做過實際的項目。通常不建議在簡歷中列出只是膚淺地了解一點的技能,除非這項技術應聘的職位的確需要。比如某學生讀本科的時候學過《計算機圖形學》這門課程,但一直沒有開發過與圖形繪制相關的項目,那就只能算是了解。如果他去應聘Autodesk公司,那他可以在簡歷上提一下他了解圖形學。Autodesk是一個開發三維設計軟件的公司,有很多職位或多或少都會與圖形學有關系,那么了解圖形學的總比完全不了解的要適合一些。但如果他是去應聘Oracle,那就沒有必要提這一點了,因為開發數據庫系統的Oracle公司大部分職位與圖形學沒有什么關系。 簡歷中我們描述技能的掌握程度大部分應該是“熟悉”。如果我們在實際項目中使用某一項技術已經有較長的時間,通過查閱相關的文檔可以獨立解決大部分問題,我們就熟悉它了。對應屆畢業生而言,他畢業設計所用到的技能,可以用“熟悉”;對已經工作過的,在項目開發過程中所用到的技能,也可以用“熟悉”。 如果我們對一項技術使用得得心應手,在項目開發過程中當同學或同事向我們請教這個領域的問題我們都有信心也有能力解決,這個時候我們就可以說自己精通了這項技術。應聘者不要試圖在簡歷中把自己修飾成“高人”而輕易使用“精通”,除非自己能夠很輕松地回答這個領域里的絕大多數問題,否則就會適得其反。通常如果應聘者在簡歷中說自己精通某一項技術,面試官就會對他有很高的期望值,因此會挑一些比較難的問題來問。這也是越裝高手就越容易露餡的原因。曾經碰到一個在簡歷中說自己精通C++的應聘者,連成員變量的初始化順序這樣的問題都被問得一頭霧水,那最終的結果也就可想而知了。 3.回答“為什么跳槽” 在面試已經有工作經驗的應聘者的時候,面試官總喜歡問為什么打算跳槽。每個人都有自己的跳槽動機和原因,因此面試官也不會期待一個標準答案。面試官只是想通過這個問題來了解應聘者的性格,因此應聘者可以大膽地根據自己的真實想法來回答這個問題。但是,應聘者也不要想說什么就說什么,以免給面試官留下負面的印象。 在回答這個問題時不要抱怨,也不要流露出負面的情緒。負面的情緒通常是能夠傳染的,當應聘者總是在抱怨的時候,面試官就會擔心如果把他招進來的話他將成為團隊負面情緒的傳染源,從而影響整個團隊的士氣。應聘者應盡量避免以下4個原因: ● 老板太苛刻。如果面試官就是當前招聘的職位的老板,他聽到應聘者抱怨現在的老板苛刻時,他肯定會想要是把這個人招進來,接下來他就會抱怨我也苛刻了。 ● 同事太難相處。如果應聘者說他周圍有很多很難相處的同事,面試官很有可能會覺得這個人他本身就很難相處。 ● 加班太頻繁。對于大部分IT企業來說,加班是家常便飯。如果正在面試的公司也需要經常加班,那等于應聘者說他不想進這家公司。 ● 工資太低。現在的工資太低的確是大部分人跳槽的真實原因,但不建議在面試的時候對面試官抱怨。面試的目的是拿到offer,我們要盡量給面試官留下好印象。現在假設你是面試官,有兩個人來面試:一個人一開口就說現在工資太低了,希望新工作能加多少多少工資;另一個說我只管努力干活,工資公司看著給,相信公司不會虧待勤奮的員工。你更喜歡哪個?這里不是說工資不重要,但我們要清楚面試不是談工資的時候。等完成技術面試之后談offer的時候,再和HR談工資也不遲。通過面試之后我們就掌握主動了,想怎么談就怎么談,如果工資真的開高了HR會和你很客氣地商量。 筆者在面試的時候,通常給出的答案是:現在的工作做了一段時間,已經沒有太多的激情了,因此希望尋找一份更有挑戰的工作。然后具體論述為什么有些厭倦現在的職位,以及面試的職位我為什么會有興趣。筆者自己跳過兩次槽,第一次從Autodesk跳槽到微軟,第二次從微軟跳槽到現在的思科。從面試的結果來看,這樣的回答都讓面試官很滿意,最終也都拿到了offer。 當時在微軟面試被問到為什么要跳槽時,筆者的回答是:我在Autodesk開發的軟件Civil 3D是一款面向土木行業的設計軟件。如果我想在現在的職位上得到提升,就必須加強土木行業的學習,可我對諸如計算土方量、道路設計等沒有太多興趣,因此出來尋找機會。 在微軟工作兩年半之后去思科面試的時候,筆者的回答是:我在微軟的主要工作是開發和維護.NET的UI平臺Winforms。由于Winforms已經非常成熟,不需要添加多少新功能,因此我的大部分工作都是維護和修改BUG。兩年下來,調試的能力得到了很大的提高,但長期如此自己的軟件開發和設計能力將不能得到提高,因此想出來尋找可以設計和開發系統的職位。同時,我在過去幾年里的工作都是開發桌面軟件,對網絡了解甚少,因此希望下一個工作能與網絡相關。眾所周知,思科是個網絡公司,這里的軟件和系統或多或少都離不開網絡,因此我對思科的職位很感興趣。 1.3.2 技術面試環節 面試官在通過簡歷及行為面試大致了解應聘者的背景之后,接下來就要開始技術面試了。一輪1小時的面試,通常技術面試會占據40~50分鐘。這是面試的重頭戲,對面試的結果起決定性作用。雖然不同公司里不同面試官的背景、性格各不相同,但總體來說他們都會關注應聘者5種素質:扎實的基礎知識、能寫高質量的代碼、分析問題時思路清晰、能優化時間效率和空間效率,以及學習溝通等各方面的能力(如圖1.4所示)。 ![](https://img.kancloud.cn/0e/84/0e8443319bc5bc0a134a090061989b05_502x212.jpg) 圖1.4 應聘者需要具備的素質 應聘者在面試之前需要做足準備,對編程語言、數據結構和算法等基礎知識有全面的了解。面試的時候如果遇到簡單的問題,應聘者一定要注重細節,寫出完整、魯棒的代碼。如果遇到復雜的問題,應聘者可以通過畫圖、舉具體例子分析和分解復雜問題等方法先理清思路再動手編程。除此之外,應聘者還應該不斷優化時間效率和空間效率,力求找到最優的解法。在面試過程中,應聘者還應該主動提問,以弄清楚題目的要求,表現自己的溝通能力。當面試官前后問的兩個問題有相關性的時候,盡量把解決前面問題的思路遷移到后面的問題中去,展示自己良好的學習能力。如果能做到這么幾點,那么通過面試獲得心儀的職位將是水到渠成的事情。 1.扎實的基礎知識 扎實的基本功是成為優秀程序員的前提條件,因此面試官首要關注的應聘者素質就是是否具備扎實的基礎知識。通常基本功在編程面試環節體現在3個方面:編程語言、數據結構和算法。 首先,每個程序員至少要掌握一兩門編程語言。面試官從應聘者在面試過程中寫的代碼及跟進的提問中,能看出其編程語言掌握的熟練程度。以大部分公司面試要求的C++舉例。如果寫的函數需要傳入一個指針,面試官可能會問是否需要為該指針加上const,把const加在指針不同的位置是否有區別;如果寫的函數需要傳入的參數是一個復雜類型的實例,面試官可能會問傳入值參數和傳入引用參數有什么區別,什么時候需要為傳入的引用參數加上const。 其次,數據結構通常是編程面試過程中考查的重點。在參加面試之前,應聘者需要熟練掌握鏈表、樹、棧、隊列和哈希表等數據結構,以及它們的操作。如果我們留意各大公司的面試題,就會發現鏈表和二叉樹相關的問題是很多面試官喜歡問的問題。這方面的問題看似比較簡單,但要真正掌握也不容易,特別適合在這么短的面試時間內檢驗應聘者的基本功。如果應聘者事先對鏈表的插入和刪除結點了如指掌,對二叉樹的各種遍歷方法的循環和遞歸寫法都爛熟于胸,那么真正到了面試的時候也就游刃有余了。 最后,大部分公司都會注重考查查找、排序等算法。應聘者可以在了解各種查找和排序算法的基礎上,重點掌握二分查找、歸并排序和快速排序,因為很多面試題都只是這些算法的變體而已。比如面試題8“旋轉數組的最小數字”和面試題38“數字在排序數組中出現的次數”的本質是考查二分查找,而面試題36“數組中的逆序對”實際上是考查歸并排序。少數對算法很重視的公司比如谷歌或者百度,還會要求應聘者熟練掌握動態規劃和貪婪算法。如果應聘者對動態規劃算法很熟悉,那么他就能很輕松地解決面試題31“連續子數組的最大和”。 在本書的第2章“面試需要的基礎知識”中,我們將詳細介紹應聘者需要熟練掌握的基礎知識。 2.高質量的代碼 只有注重質量的程序員,才能寫出魯棒穩定的大型軟件。在面試過程中,面試官總會格外關注邊界條件、特殊輸入等看似細枝末節但實質至關重要的地方,以考查應聘者是否注重代碼質量。很多時候,面試官發現應聘者寫出來的代碼只能完成最基本的功能,一旦輸入特殊的邊界條件參數就會錯誤百出甚至程序崩潰。 總有些應聘者很困惑:面試的時候覺得題目很簡單,感覺自己都做出來了,可最后為什么被拒了呢?面試被拒有很多種可能,比如面試官認為你性格不適合、態度不夠誠懇等。但在技術面試過程中,這些都不是最重要的。技術面試的面試官一般都是程序員,程序員通常沒有那么多想法,他們只認一個理:題目做對、做完整了,就讓你通過面試;否則失敗。所以遇到簡單題目卻被拒的情況,應聘者應認真反思在思路或者代碼中存在哪些漏洞。 以微軟面試開發工程師時最常用的一個問題為例:把一個字符串轉換成整數。這個題目很簡單,很多人都能在三分鐘之內寫出如下不到10行的代碼: ![](https://img.kancloud.cn/6c/55/6c5590bd13edd4b2a60d5f96d608486a_482x230.jpg) 看了上面的代碼,你是不是覺得微軟面試很容易?如果你真的這么想,那你可能又要被拒了。 通常越是簡單的問題,面試官的期望值就會越高。如果題目很簡單,面試官就會期待應聘者能夠很完整地解決問題,除了完成基本功能之外,還要考慮到邊界條件、錯誤處理等各個方面。比如這道題,面試官不僅僅是期待你能完成把字符串轉換成整數這個最起碼的要求,而且希望你能考慮到各種特殊的輸入。面試官至少會期待應聘者能夠在不需要提示的情況下,考慮到輸入的字符串中有非數字字符和正負號,要考慮到最大的正整數和最小的負整數以及溢出。同時面試官還期待應聘者能夠考慮到當輸入的字符串不能轉換成整數時,應該如何做錯誤處理。當把這個問題的方方面面都考慮到的時候,我們就不會再認為這道題簡單了。 除了問題考慮不全面之外,還有一個面試官不能容忍的錯誤就是程序不夠魯棒。以前面的那段代碼為例,只要輸入一個空指針,程序立即崩潰。這樣的代碼如果加入到軟件當中,將是災難。因此當面試官看到代碼中對空指針沒有判斷并加以特殊處理的時候,通常他連往下看的興趣都沒有。 當然,不是所有與魯棒性相關的問題都和前面的代碼那樣明顯。再舉一個很多人都曾經被面試過的問題:求鏈表中的倒數第k個結點。有不少人在面試之前在網上看過這個題目,因此知道思路是用兩個指針,第一個指針先走k-1步,然后兩個指針一起走。當第一個指針走到尾結點的時候,第二個指針指向的就是倒數第k個結點。于是他大筆一揮,寫下了下面的代碼: ![](https://img.kancloud.cn/c5/28/c528dec24b5005258cf0a68b19a72e90_566x408.jpg) 寫完之后,應聘者看到自己已經判斷了輸入的指針是不是空指針并做了特殊處理,于是以為這次面試必定能順利通過,可是他沒有想到的是這段代碼中仍然有很嚴重的問題:當鏈表中的結點總數小于k的時候,程序還是會崩潰。另外,當輸入的k為0時,同樣也會引起程序崩潰。因此,幾天之后他收到的仍然不是Offer而是拒信。 要想很好地解決前面的問題,最好的辦法是在動手寫代碼之后想好測試用例。只有把各種可能的輸入事先都想好了,才能在寫代碼的時候把各種情況都做相應的處理。寫完代碼之后,也不要立刻給面試官檢查,而是先在心里默默地運行。當輸入之前想好的所有測試用例都能得到合理的輸出時,再把代碼交給面試官。做到了這一步,通過面試拿到Offer就是順理成章的事情了。 在本書的第3章“高質量的代碼”中,我們將詳細討論提高代碼質量的方法。 面試小提示: 面試官除了希望應聘者的代碼能夠完成基本的功能之外,還會關注應聘者是否考慮了邊界條件、特殊輸入(比如NULL指針,空字符串等)及錯誤處理。 3.清晰的思路 只有思路清晰,應聘者才有可能在面試過程中解決復雜的問題。有些時候面試官會有意出一些比較復雜的問題,以考查應聘者能否在短時間內形成清晰的思路并解決問題。對于確實很復雜的問題,面試官甚至不期待應聘者能在面試不到一個小時的時間里給出完整的答案,他更看重的可能還是應聘者是否有清晰的思路。面試官通常不喜歡應聘者在沒有形成清晰思路之前就草率地開始寫代碼,這樣寫出來的代碼容易邏輯混亂、錯誤百出。 應聘者可以用幾個簡單的方法幫助自己形成清晰的思路。首先是舉幾個簡單的具體例子讓自己理解問題。當我們一眼看不出問題中隱藏的規律的時候,可以試著用一兩個具體的例子模擬操作的過程,這樣說不定就能通過具體的例子找到抽象的規律。其次可以試著用圖形表示抽象的數據結構。像分析與鏈表、二叉樹相關的題目,我們都可以畫出它們的結構來簡化題目。最后可以試著把復雜的問題分解成若干個簡單的子問題,再一一解決。很多基于遞歸的思路,包括分治法和動態規劃,都是把復雜的問題分解成一個或者多個簡單的子問題。 比如把二叉搜索樹轉換成排序的雙向鏈表這個問題就很復雜。遇到這個問題,我們不妨先畫出一兩個具體的二叉搜索樹,直觀地感受二叉搜索樹和排序的雙向鏈表有哪些聯系。如果一下子找不出轉換的規律,我們可以把整個二叉樹看成3個部分:根結點、左子樹和右子樹。當我們遞歸地把轉換左右子樹這兩個子問題解決之后,再把轉換左右子樹得到的鏈表和根結點鏈接起來,整個問題也就解決了(詳見面試題27“二叉搜索樹與雙向鏈表”)。 在本書的第4章“解決面試題的思路”中,我們將詳細討論遇到復雜問題時如何采用畫圖、舉例和分解問題等方法幫助我們解決問題。 面試小提示: 如果在面試的時候遇到難題,我們有3種辦法分析、解決復雜的問題:畫圖能使抽象問題形象化,舉例使抽象問題具體化,分解使復雜問題簡單化。 4.優化效率的能力 優秀的程序員對時間和內存的消耗錙銖必較,他們很有激情地不斷優化自己的代碼。當面試官出的題目有多種解法的時候,通常他會期待應聘者最終能夠找到最優解。當面試官提示還有更好的解法的時候,應聘者不能放棄思考,而應該努力尋找在時間消耗或者空間消耗上可以優化的地方。 要想優化時間或者空間效率,首先要知道如何分析效率。即使是同一個算法,用不同方法實現的效率可能也會大不相同,我們要能夠分析出算法及其代碼實現的效率。例如求斐波那契數列,很多人喜歡用遞歸公式f(n)=f(n-1)+f(n-2)求解。如果分析它的遞歸調用樹,我們就會發現有大量的計算是重復的,時間復雜度以n的指數增加。但如果我們先求f(1)、f(2),再根據f(1)和f(2)求出f(3),接下來根據f(2)、f(3)求出f(4),并以此類推用一個循環求出f(n),這種計算方法的時間效率就只有O(n),比前面遞歸的方法要好得多。 要想優化代碼的效率,我們還要熟知各種數據結構的優缺點,并能選擇合適的數據結構解決問題。我們在數組中根據下標可以用O(1)時間完成查找。數組的這個特征可以用來實現簡單的哈希表解決很多問題,比如面試題35“第一個只出現一次的字符”。為了解決面試題30“最小的k個數”,我們需要一個數據容器來存儲k個數字。在這個數據容器中,我們希望能夠快速地找到最大值并且能快速地替換其中的數字。經過權衡,我們發現二叉樹比如最大堆或者紅黑樹都是實現這個數據容器的不錯選擇。 要想優化代碼的效率,我們也要熟練掌握常用的算法。面試中最常用的算法是查找和排序。如果從頭到尾順序掃描一個數組,我們需要O(n)時間才能完成查找操作。但如果數組是排序的,應用二分查找算法就能把時間復雜度降低到O(logn)(如面試題8“旋轉數組的最小值”和面試題38“數字在排序數組中出現的次數”)。排序算法除了能夠給數組排序之外,還能用來解決其他問題。比如快速排序算法中的Partition函數能夠用來在n個數里查找第k大的數字,從而解決面試題29“數組中出現次數超過一半的數字”和面試題30“最小的k個數”。歸并排序算法能夠實現在O(nlogn)時間統計n個數字中的逆序對數目(面試題36“數組中的逆序對”)。 在本書的第5章“優化時間空間效率”中,我們將詳細討論如何從時間效率和空間效率兩方面去做優化。 5.優秀的綜合能力 在面試過程中,應聘者除了展示自己的編程能力和技術功底之外,還需要展示自己的軟技能(Soft Skills),諸如自己的溝通能力和學習能力。隨著軟件系統的規模越來越大,軟件開發已經告別了單打獨斗的年代,程序員與他人的溝通變得越來越重要。在面試過程中,面試官會觀察應聘者在介紹項目經驗或者算法思路時是否觀點明確、邏輯清晰,并以此判斷其溝通能力的強弱。另外,面試官也會從應聘者說話的神態和語氣來判斷他是否有團隊合作的意識。通常面試官不會喜歡高傲或者輕視合作者的人。 IT行業知識更新很快,因此程序員只有具備很好的學習能力才能跟上知識更替的步伐。通常面試官有兩種辦法考查應聘者的學習能力。面試官的第一種方法是詢問應聘者最近在看什么書、從中學到了哪些新技術。面試官可以用這個問題了解應聘者的學習愿望和學習能力。面試官的第二種方法是拋出一個新概念,接下來他會觀察應聘者能不能在較短時間內理解這個新概念并解決相關的問題。比如面試官要求應聘者計算第1500個丑數。很多人都沒有聽說過丑數這個概念。這個時候面試官就會觀察應聘者面對丑數這個新概念時,能不能經過提問、思考、再提問的過程,最終找出丑數的規律從而找到解決方案(詳見面試題34“丑數”)。 知識遷移能力是一種特殊的學習能力。如果我們能夠把已經掌握的知識遷移到其他領域,那么學習新技術或者解決新問題就會變得容易。面試官經常會先問一個簡單的問題,再問一個很復雜但和前面的簡單問題相關的問題。這個時候面試官期待應聘者能夠從簡單問題中得到啟示,從而找到解決復雜問題的竅門。比如面試官先要求應聘者寫一個函數求斐波那契數列,再問一個青蛙跳臺階的問題:一只青蛙一次可以跳上1級臺階,也可以跳上2級臺階。請問這只青蛙跳上n級臺階總共有多少種跳法。應聘者如果具有較強的知識遷移能力,就能分析出青蛙跳臺階問題實質上只是斐波那契數列的一個應用(詳見面試題9“斐波那契數列”)。 還有不少面試官喜歡考查應聘者的抽象建模能力和發散思維能力。面試官從日常生活中提煉出問題,比如面試題44“撲克牌中的順子”,考查應聘者能不能把問題抽象出來用合理的數據結構表示,并找到其中的規律解決這個問題。面試官也可以限制應聘者不得使用常規方法,這要求應聘者具備創新精神,能夠打開思路從多角度去分析、解決問題。比如在面試題47“不用加減乘除做加法”中,面試官期待應聘者能夠打開思路,用位運算實現整數的加法。 我們將在本書的第6章“面試中的各項能力”中用具體的面試題詳細討論上述能力在面試中的重要作用。 1.3.3 應聘者提問環節 在結束面試前的5~10分鐘,面試官會給應聘者機會問幾個問題,應聘者的問題的質量對面試的結果也有一定的影響。有些人的溝通能力很強,馬上就能想到有意思的問題。但對于大多數人而言,在經受了面試官將近一小時的拷問之后可能已經精疲力竭,再迅速想出幾個問題難度很大。因此建議應聘者不妨在面試之前做些功課,為每一輪面試準備2~3個問題,這樣到提問環節的時候就游刃有余了。 面試官讓應聘者問幾個問題,主要是想了解他最關心的問題有哪些,因此應聘者至少要問一兩個問題,否則面試官就會覺得你對我們公司、職位等都不感興趣,那你來面試做什么?但是也不是什么問題都可以在這個時候問。如果問題問得比較合適,對應聘者來說是個加分的好機會;但如果問的問題不太合適,面試官對他的印象就會大打折扣。 有些問題是不適合在技術面試這個環節里問的。首先是不要問和自己的職位沒有關系的問題,比如問“公司未來五年的發展戰略是什么”。如果應聘的職位是CTO,而面試官是CEO,這倒是個合適的問題。如果應聘的只是在一線開發的職位,那這個問題離我們就太遠了,與我們的切身利益沒有多少關系。另外,坐在對面的面試官很有可能也只是一個在一線開發的程序員,他該怎么回答這個關系公司發展戰略的問題呢? 其次是不要問薪水。技術面試不是談薪水的時候,要談工資要等通過面試之后和HR談。而且讓面試官覺得你最關心的問題就是薪水,給面試官留下的印象也不好。 再次是不要立即打聽面試結果,比如問“您覺得我能拿到Offer嗎”之類的問題。現在大部分公司的面試都有好幾輪,最終決定應聘者能不能通過面試,是要把所有面試官的評價綜合起來的。問這個問題相當于白問,因為問了面試官也不可能告訴應聘者結果,還會讓面試官覺得他沒有自我評估的能力。 最后推薦問的問題是與招聘的職位或者項目相關的問題。如果這種類型的問題問得很到位,那么面試官就會覺得你對應聘的職位很有興趣。不過要問好這種類型的問題也不容易,因為首先對應聘的職位或者項目的背景要有一定的了解。我們可以從兩方面去了解相關的信息:一是面試前做足功課,到網上去收集一些相關的信息,做到對公司成立時間、主要業務、職位要求等都了然于胸;二是面試過程中留心面試官說過的話。有不少面試官在面試之前會簡單介紹與招聘職位相關的項目,其中會包含其他渠道無法得到的信息,比如項目進展情況等。應聘者可以從中找出一兩個點,然后向面試官提問。 下面的例子是筆者去思科面試時問的幾個問題。一個面試官介紹項目時說這次招聘是項目組第一次在中國招人,目前這個項目所有人員都在美國總部。這輪面試筆者最后問的問題是:這個項目所有的老員工都在美國,那怎么對中國這一批新員工進行培訓?中國的新員工有沒有機會去美國總部學習?最后一輪面試是老板面試,她介紹說正在招聘的項目組負責開發一個測試系統,思科用它來測試供應商生產的網絡設備。這一輪筆者問的幾個問題是:這個組是做測試系統的,那這個組的人員是不是也要參與網絡設備的測試?是不是需要學習硬件測試相關的知識?因為我們測試的對象是網絡設備,那么這個職位對網絡硬件的掌握程度有沒有要求? 1.4 本章小結 本章重點介紹了面試的流程。通常面試是從電話面試開始的。接下來可能有一兩輪共享桌面遠程面試,面試官通過桌面共享軟件遠程考查應聘者的編程和調試能力。如果應聘者的表現足夠優秀,那么公司將邀請他到公司去接受現場面試。 一般每一輪面試都有三個環節。首先是行為面試環節,面試官在這一環節中對照簡歷詢問應聘者的項目經驗和掌握的技能。接下來就是技術面試環節,這是面試的重頭戲。在這一環節里,面試官除了關注應聘者的編程能力和技術功底之外,還會注意考查他的溝通能力和學習能力。在面試的最后通常面試官會留幾分鐘時間讓應聘者問幾個他感興趣的問題。 本章的1.3.2節是全書的大綱。本節介紹了面試官關注應聘者5個方面的素質:基礎知識是否扎實、能否寫出高質量的代碼、思路是否清晰、是否有優化效率的能力,以及包括學習能力、溝通能力在內的綜合素質是否優秀。在接下來的第2章到第6章中我們將一一深入探討這5個方面的素質。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看