面試經歷-201106

      一個偶爾的機會,獲得幾個公司的面試邀請,其中兩家比較熟悉,在09年第一次跳槽的時候就面過,毫無疑問都是以等消息無果而告終。現在這個機會又呈現在面前,由於最近公司比較忙,很難請假,最終選擇挑戰W公司,雖然它是個外包公司。挑選的理由有兩個:

      第一,在我看來W公司的水平還算不錯,如果能加入,能提升自己各方面的能力。

      第二,W公司提供了兩個職位嘗試,而且薪水也能滿意。

      回想起來,09年那次面試準備不充分,連面試題都沒看,直接衝了過去面,早上8點出門,下午4點半才面完,感覺整個人都被掏空了,這算是一次非常難忘的經歷吧!由於瞭解了他們出題的一些思路,準備也稍微多了一些。

 

=『電話面試』 ===================

      週五的時候通知,第一輪是電話面試,會涉及到英文面試,不過人事MM說,英文不會涉及得很深,只需要準備一下英文的自我介紹和項目經歷就好了,時間就約在週一上午。

      一個週末的準備,時間還算充裕,爲了這輪英文面試準備了很多,幸好有同學這方面還算不錯,兩人交流了兩個晚上,終於準備好一段三分鐘的自我介紹,說的是自己的一些事情,所以,背誦起來並不難。

      週一,特別起了個早牀,雖然電面中彼此看不到雙方,也準備了許多,但還是忍不住有些緊張,腦瓜子裏全是英文,走在路上開口閉口就是自我介紹的前面幾句。

     該來的終於來了,然而,這次面試官出招卻讓我始料不及!我以爲一開始會是英文面試,導致腦子裏全是那些東西,沒想到一開始會是中文的技術問題,搞得我有點時空錯亂的感覺,他問了五個問題:

      Q1. Asp.net page的生命週期

      Q2. 談談Session和ViewState

      Q3. 如何在兩個頁面之間傳值

      Q4. 談談Ado.net

      Q5. 談談MVC模式

      A1. 問題好像不是這麼問的,但考的是這方面的知識,面之前還看過這方面的東西,可以,那會兒腦子裏全是英文,一時間竟然反應不過來,被這個問題搞得非常狼狽,自我感覺是沒有說清楚。

      A2. 這個問題非常及時,是個老生常談的問題,剛好對於這方面稍微熟悉一點。我簡單的說了下session的實現機制,存儲session的三種方法,禁用cookie對於session的影響,以及應對辦法(URL重寫)。接着,講了webform的服務端控件保存狀態的一些原理,其實就是ViewState的相關,相對於asp.net mvc來說,webform在這方面有一定的性能損耗,畢竟要來回傳遞隱藏表單域。

      A3. 辦法比較多吧,可以通過提交表單的形式,也可以通過Url傳值,另外利用cookie、session也可以傳值,講得不深,對方聽到你談到這些,感覺也差不多了。

      A4. Ado.net也沒談多少,就講了講封裝的一些操作數據庫的方法,對方聽了也沒繼續讓我講更多。

      A5. 這個問題經常問,網上一搜也是一大把,基本上隨便講講,問題不大,不過,要清楚我們在項目中常用的三層架構,跟MVC模式還是有些區別的,這個在設計模式書中會有比較詳細的解釋。

      終於,技術問題問完了,到了面英文的環節,然而,這時候又出狀況了,他讓我簡單用英文介紹下自己的興趣愛好,這下讓我有點手足無措,主要是在那種場合下,自己沒準備,心裏就發虛,後面,我說,要不我用英文介紹下自己的經歷和項目經驗吧!對方說好,於是,我儘量用平靜穩定的聲音來念我準備的“稿子”!

      - -   直感覺口乾舌苦,估計那會兒口氣特別大,我自己也清楚自己的英文水平,發音還算OK,但交流經驗太少,遇到情景對話的環節會比較囧!不過好在我準備充分,一些常用的句式,和一些緩衝轉移話題的語句都有準備(我想這也是一個積累,如果過去我有這些積累,也不至於臨陣抱佛腳!),聽我念完,那邊的面試官感覺也比較詫異,畢竟準備了兩個晚上的東西!還是有料的!

      然後,就是一些簡單的英文對話,例如:我的興趣愛好啊?我在什麼時候什麼地方畢業啊?基本都能聽明白,雖然答得不是很流利,估計語法也是一塌糊塗,可恨的是,面試官並不問我項目相關的東西,白讓我準備了一堆Q&A。

      面了差不多20多分鐘吧,然後又聽到了糾結的等消息!自我感覺不是很好(主要是面試官出招有點出乎我的意料),淚奔……

      心想:面不過就算了。

      大約11點左右吧,收到人事MM的電話,問我對於面試感覺怎麼樣,個人覺得可能英文還好,技術方面有些遺憾,有些問題沒回答好,一個是緊張,一個是對於英文準備過於充分,腦子有點反應不過來。

      不過,人事MM給的回覆還不錯,約我去面試,並且把剛纔電面的反饋發給我了,看了看,自我感覺還比較欣慰,不枉我準備了一些,評價是這樣的:

      English Skills: He can introduce himself well but looks like he prepared a lot. He can communicate with me but cannot speak long and fluent.

      Comments: Normal English, Good Asp.net technology, can answer my question on a deep range. SDE2 Recommend 2nd interview.

 

=『第一輪面試』========================

      接下來到了真正的考驗考場,這次職位的要求3~5年的工作經驗,有asp.net mvc框架的開發經驗,最好有支付類相關項目的開發經驗,這幾個條件我基本滿足,而且這個職位在W公司對應的等級是SDE3,對於我來說,有挑戰,並且我瞭解到,接下來會有兩輪面,一輪是技術,一輪是跟副總裁的面談,過了接下來一輪技術,只要其他要求不太過分,基本OK。

      非常遠,坐了兩個小時的地鐵(09年去的那次更嚴重,沒通地鐵,坐了很久的公交,屁股都坐疼了)。

      進入正題,面我的是個胖子(帶一個旁聽),看起來不苟言笑,估計是做技術的那種(後面的遭遇也證實這個)。

      他問了很多,有印象的大概是這些:

      1. 先談了一些asp.net mvc的東西,Razor視圖引擎,2和3的一些特性,Model的校驗,filter等等。

      2. 談asp.net mvc的分頁控件

      幸好自己寫過一個asp.net mvc的分頁控件 ,而且在blog中整理過, 對於這個並不陌生,不過,很顯然我的那種實現方式在他眼裏,太草根,對於點擊菜單頭排序的做法也不是很理解,主要是,這個控件使用起來比較麻煩,而且代碼也不是很優雅。

      3. 不通過ajax,如何實現一個異步加載的用戶自定義控件?

      這個問題沒了解過,不知道從哪裏答起,講一些替代方法,面試官也沒興趣聽,後來,只好老實說不了解。

      4. 由一個簡單的問題講到對象的棧和堆,爲什麼棧比堆的效率要高,具體訪問一個對象,在棧和堆中是怎麼操作的,類的static屬性存在堆的哪些地方?

      說實話,我對於棧和堆的瞭解並不深入,只說了一個引用型的對象會在在堆裏面保存對象的值,在棧裏面保存堆的地址。存放在堆裏的對象,不會因爲對象超出作用域而主動刪除,它的回收基於垃圾回收機制,而對於棧來說,在操作系統底層對棧有支持,由於分配了特定的寄存器用於保存棧的地址,並且出棧與入棧都有相應的指令,因此,棧的訪問效率會比堆要高。對於類的static變量保存在哪裏,也說不清楚。導致,這個問題答得比較糾結,我回答的那部分在他看來太膚淺,深究的話,我也說得不清楚。

      這個問題的答案參考:自動內存管理機制深入剖析-C#分析篇C#的內存管理:堆棧、託管堆與指針

      5. 由第四個問題引申到這個問題,那就是對於GC的理解。

      我的回答也較淺,堆棧中的引用會在超出作用域後,被刪除,而堆中的實例只有在垃圾回收機制能處理,由於垃圾回收機制太耗系統資源,因此從實例超出作用域到被銷燬,必然有一段時間(他可能更期望我會怎麼處理這種情況,例如:使用類的Dispose()方法或者定義析構方法來處理這類問題),答案參考自動內存管理機制深入剖析-C#分析篇 ,當時,我說不出來。

       6. 談談ref和out,寫一個使用的例子出來。

      比較糾結,這個問題回答很糟糕,想想也是一個很簡單的問題,因爲沒有關注,也沒有使用過,導致不知道如何回答。後面看到這篇文章:C#中ref和out的使用小結 ,感覺更加糾結,實際上在項目中用過它們,只是因爲用得少,同時,用的時候也經常copy,導致對於它們沒有多少印象。

       7. 談談閉包這個概念。

       沒答出來,C#和Java的閉包-Jon談《The Beauty of Closures》

       到這裏差不多了,自我感覺也挺受打擊的,很多問題一旦深入就答不出來,可見我本身C#的基礎並不好,並且,由於一直專注於做實際應用,忽略了這些概念和原理才導致這個結果。

       很快我得到結果,被告知基礎不夠,不適合這個職位,比較失落,一來是自己確實準備了不少東西,關於web應用的、js及一些框架、css、ajax、sql等等;二來,面試過程比較受打擊,感覺被問到的東西,很多都說不清楚。

       後來人事MM調解一下,問我想不想做測試的相關職位,待遇差不多,想的話,可以接着被另外一個團隊面,我個人傾向於開發,而且對於測試相關不是很熟悉,婉拒了,並表示想試試另外一個職位。

 

=『多輪面試之一』========================

       人事MM的效率很高,20分鐘後,我進去下一個職位的面試流程。

       這是一次故地重遊,眼前這個招牌對於.net程序員來說,讓人心潮澎湃,09年的時候,我就是在這棟大廈裏,差不多同樣的房間,被面了一整天,回想起來,感慨萬千。

       第一輪面試是個MM,非常湊巧,她就是09年面我的其中一個,很想笑,我禮貌地問了下,是不是在這個地方只有他們一個團隊是外包的(實際上我的意思是,怎麼又碰到了?太巧了?還是一些其他的原因?),她說不是,後面我還是沒忍住,跟她談了以前面過的事情,雖然,她對我沒有印象,結果,得知她面過我之後,她笑了笑說:“面過你啊!那算了!”然後她就走了,換了一個人過來(內牛滿面,我太耿直了!這個MM出的題目明顯要簡單很多)。

       新來一個男的面試官,比較年輕,直接上題目:

       1. 考察類的繼承、覆寫、虛方法,一個類繼承自一個類,覆寫父類的構造函數,然後,new實例,求打印順序(即構造函數的執行順序),這個問題網上很多,略過。

       2. 談談session和cookie的機制

       session的問題之前問過,也講過很多,基本上一些關鍵點都要講到:

       a. session是服務端保存單個用戶狀態的一種緩存,一般情況下是保存在服務器的內存中,重啓IIS,session會丟失

       b. 它有三種保存方式:InProc、StateService、Sql Server AspState,後面兩種需要對象支持序列化。第二種要求啓動asp state service,它的狀態保存在asp_net state服務的進程中,IIS重啓,不受影響;第三種,是保存在aspstate數據庫,訪問效率要低一些,並且無法捕捉session_end的事件

       c. 當客戶端發送一個帶session的請求,服務端會校驗這個請求中session是否帶sessionid,帶的話,查詢這個id,找到對應的session,並檢驗是否過期;不帶的話,會創建一個不重複的難發現規律的字符串作爲sessionid,一般情況下,sessionid依賴cookie保存,每個請求傳遞的sessionid都是緩存在cookie中,如果禁用cookie,就只能通過URL重寫的方式,來實現session(http session原理 )。

      d. 如果session通過InProc的方式保存,又在IIS上配置了負載均衡,可能發生session狀態丟失的問題(由於某臺機器保存了session狀態,但是IIS將後來的請求發送到另外一臺web服務器上) ,可以通過配置machinekey的方式解決問題:解決WEB場中網絡負載均衡後產生大Session丟失的問題

      cookie的話,正統的cookie是客戶端請求產生的,它存在於http請求的報頭中,包括五個部分:域、存儲路徑、鍵、值、過期時間,域和存儲路徑決定了它的作用範圍,大小是4KB,只能存儲字符串,不設置過期時間的話,它在瀏覽器被關閉後,自動刪除,設置過期時間,在瀏覽器關閉後,會保存在硬盤中。

       然後,他問了子域如何共享父域的cookie的問題,要做一種什麼特殊處理,我想了想,應該不會是指定一下cookie的域名那麼簡單吧?不大敢說這個答案,於是,說了一種替代的辦法。

       3. asp.net mvc的原理,瀏覽器是怎麼解析url的

        講了asp.net mvc的路由機制,講得不深,看得出,不是他想要的答案,後面自己找了找答案,感覺還是沒把握他出這個問題的考點:ASP.NET MVC 原理及路由(轉)

       4. 算法題:兩個byte[]數據,非常大,找出第一個重複的數和第一個不重複的數,寫出最優算法。

        時間給得不多,我的第一思路是兩個for循環遍歷,把位置不同的數字比較一遍,發現重複出現的數值就退出循環,要實現肯定是非常簡單的,只是這明顯不是他要的答案,他強調了兩點:第一,它是一個byte數組;第二,它非常大。

       當時沒有想出好的解決辦法,到網上找了一下,沒有答案,但是從海量數據處理的帖子上找到一些思路:百度曾經考試過的一個算法題:從2.5億個數字裏面找出不重複的數字的個數 ,在內存,或者在硬盤中創建一個緩存區,記錄已訪問過的數據和訪問次數,通過操作內存或者操作文件的方式,找到第一個重複的數和第一個不重複的數。

       時至中午,這輪面試差不多結束了,感覺還好吧,他問的問題基本都能答上,有些可以講得稍微深入一點,有些可能還不夠熟練,差不多時間到了中午,我被告知下午還有至少兩輪面試,一點開始。

 

=『多輪面試之二』========================

       1點前,人事MM帶我去食堂吃飯,得到一些消息,心裏稍微好受一點,這個消息是人事MM的一點抱怨,主要是針對上午第一位面試官,從3月份到現在,基本上他們人事相關的各個團隊給他推薦的人,沒有一個不被斃掉,非常挑剔的一個人,讓她們也很憤滿,畢竟這個職位沒有高得嚇人的薪水,要求水平高,工資又沒達到相應的要求,找不到人也是正常的(我如是安慰自己)。

       中午吃完飯,還剩下不到十五分鐘,午睡已經來不及了,我乾脆給同學打了個電話,侃侃上午發生的事情,也爲自己減減壓。

       下午第一輪面試也是個胖子,不過這位看起來要和藹很多,我們還算聊得比較開心,然後,技術問題也答得還算比較滿意吧!可以說是最輕鬆的一輪面試了。

       由於前面面過算法,他也沒給我繼續出算法題,我試探了一下,問他那個byte[]數組的問題怎麼解決時,他也沒給出答案,繞了過去。

       後面基本問一下js和css相關的問題,js方面可能jquery比較多一點,是自己比較熟悉的領域,感覺基本答得還可以,因此沒有特別留意的題目,唯有一道題我沒有答上來:

       當一個Ajax訪問無響應時,怎麼中止這個Ajax請求?

       網上找了一些答案:怎樣取消ajax的請求?使用JavaScript殺死使用jQuery Ajax請求

       總的來說,這輪面試還可以,主要是面試官也比較擅長溝通,兩個人聊得開,最後走的時候,他微笑跟我握手,說:希望我們能成爲同事,比較開心。

 

 

=『多輪面試之三』========================

 

       上一輪完了不久,接着又是一輪面試,這次的面試官比較年輕,年紀跟我差不多,他主要問了以下一些問題:

       1. 談談單例,singalton模式

       忘得差不多了,沒寫來,感覺挺可惜的,很久之前看過,單實例模式(Singleton) ,表述不是很清楚。

       2. 一個算法題,實現F(n) = F(n-1) + F(n-2)。

       當時的第一感覺題目不應該這麼出吧?!我倒是看過一個類似的題目,不過那個題目給出的是一個數組:1, 1, 2, 3, 5, 8, 13, 21……計算出第30個數字。需要你觀察數字的規律,寫出算法實現,後面寫一個遞歸實現了,不過比較囧的事情是,自己寫的算法有個小bug,被他抓住了。

       3. 拆箱和裝箱的概念

       隨便講了講,這個問題又可以引申到堆和棧,然後,又可以引申到對象在內存中的操作,可以出很多實際題目,我是無比的糾結啊!C#核心概念--裝箱和拆箱(什麼是裝箱和拆箱)

       4. asp.net mvc可以基於route機制可以整出比較漂亮的url,那麼如何在webform中實現同樣的需求?

       這個問題沒答上來,網上找到了答案:如何在Web Form中使用URL Routing?

       差不多又是基於c#這門語言的特徵題目比較多,回答還好,這輪面試結束,三個面試官開始討論了,等了大約40分鐘,最終,得到一個結果,他們這個項目有一個Leader,我還需要那個Leader再面談一次,才能確定,由於這個項目是臨時調過來試的,Leader是不在的,因此只能另外約時間面談。

 

=『多輪面試之四』========================

 

       這個時候差不多已經到了四點,我也打算回去了,按照人事MM的要求,走之前打了一個電話,這時候,他又推薦了一個職位讓我嘗試,這個職位對於英文要求比較高,客戶是印度人,不需要你聽懂他說什麼,會配一個翻譯,但是需要你說給他聽,他能聽懂,所以,接下來的面試是英語的場景對話,我想拒絕掉,後面在對方的強烈要求下,嘗試了。

       英文問題很簡單:用五個關鍵字描述你自己?談談對上海的看法啊?談談你接下來幾年的想法?你是願意在團隊工作,還是願意單幹?爲什麼?

       基本都能聽明白,但是話到口裏,說不出,硬撐了過去,估計對方也不滿意。

       後面又考了一段算法題:兩個數組,一個升序,一個降序,把它們合併成一個升序的數組,求最優算法。 這個類似的算法做過,所以,寫起來比較順利,複雜度大約爲O(n),他看了也基本滿意,面了差不多半個小時。

       後面說,還是需要Leader來決定,這一天的面試到這差不多就結束了,剩下的還是等他們的二次通知電話。

 

=『總結』========================

 

       對於sql的考察基本沒有,對於web、js的一些考察也比較少,很多短板倒是被測了出來, 還是比較遺憾的。

       總的來說,對於c#語言中,對於程序員透明的那塊考察比較多,這應該算是衡量.net程序員水平的一個要素吧!對於我這個學java出身,畢業後轉.net,並一直專注於實際應用開發的人來說,考到了點子上!很多缺陷都暴露出來!

       另外一個感觸比較深的地方在於,還是要積累 ,英文積累是一個方面,其他技術都需要積累,寫Blog是個很好的習慣

       總之,不管這次面試的結果怎樣,都算一次比較好的經歷,至少,我從以前不敢面英文,到勉強能應付英文,這算一個小小的進步吧!技術方面,也考察得比較全面,明白自己的短板在哪裏,以後,能有的放矢地補全這方面的知識。

       最後,贈言於即將面試的朋友,這個世界很小,W公司是什麼公司,很多人可能猜得出來,如果你也獲得這樣的機會,不妨多準備一下,臨陣磨槍,不快也光!也許一些必要的準備,就能成就你的一次飛躍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章