天天看點

記我的一次面試經曆, 感慨萬千

     好俗的部落格題目,和國小作文差不多。

     竊以為自己C#的水準已經達到了“熟練”的程度,畢竟怎麼也有10W以上的開發經驗了。可是因為各大公司從來都不面試C#,是以這半年我一直在複習C++,很久沒有看C#的知識了。

     那天中午因為着急,我午飯也沒有吃,就直接打車去了某著名網際網路公司。前台簽到,等待一面。

     一面是個挺帥氣的年輕面試官,看了我的履歷,對我做的項目挺感興趣,我給他詳細介紹了架構,UI,插件和類庫的設計思路。他頻頻點頭,說道“我們公司用的主要使用JAVA開發背景,不過我以前也做過C#,看你的開發經驗比同齡應屆生高出一大截,那我們就不妨讨論幾個C#的基礎問題吧。我就不拿JAVA和C++來面你了”。

     餓的有點頭暈的樓主一聽要面C#,頓時開心的不得了。心想,“總算遇到懂行的人了,看來沒白來。”

      我一聽,愣了一下,說道,哈希表主要是通過key-value對的形式存儲關聯資訊的,通過索引器的方式通過key快速檢索value. 而它們兩的映射關系需要通過GetHashCode方法實作,String主要是通過字元串的操作(具體操作的那個名字我忘了),其他類可以通過重寫該函數的形式實作,或者采用其預設實作(預設實作是怎樣的?我也忘了)。

      面試官剛聽到這裡,打斷了我的話頭,說你說的不完整,我們換個話題。(嗚嗚)

      想當年,這個問題是難不倒我的,可是在面試那種環境下,腦袋被驢踢了。想着string的很多特性,直接脫口說“是值類型!” 面試官問道,它是類麼?我說,是啊,實作了ICompare接口啊。“那你剛才不是說,所有的對象不都是引用類型嗎?”  我頓時無語了,默默的說道“是引用類型”。

     “再考考你,我們知道string是唯一的,隻要你對它做任何操作,出現的新string和以前的完全是兩個變量,那為什麼這樣處理?”

       這個常識我知道,拼接字元串的性能是很差的,是以我們才使用StringBuilder。它的底層肯定是char數組,可為什麼架構采用了以上的處理政策?腦子裡全是準備面試時寫的各種C++的字元串操作,百思不得其解。面試官看了我的囧樣,又換了一個問題。

     (回來後才一拍腦門,常量字元串區!所有生成的字元串在記憶體中僅會保留一份副本,為的當然是節省空間啊!)

      垃圾回收器?以前在講原理的書上看過,我就侃侃而談,GC主要按照代數工作,共分為三代,0代,1代,2代。0代一般是局部變量等容易被回收的。若在一次回收周期中沒有被回收,則該變量代數+1。 另外,有一個引用計數的問題。每當B引用了A,A的引用計數就+1. 銷毀了B, A引用計數就-1. 當某個變量引用計數值為0時,就該被回收了。  不過我不知道,當一個對象在外部被訂閱了事件處理函數,GC是怎麼處理的。

     面試官笑了笑,引用計數?VB6和以前的一些語言,都是用引用計數的,不過現代的C#和JAVA都不用引用計數而采用“代數”的方法了。那你說,為什麼不使用引用計數了?

     引用計數,我想起了以前超難解決的子圖分割問題。我畫了一幅圖: A,B,C互相連接配接。說道,三個變量都沒有用了,可是它們互相耦合,引用計數都不為0,GC無法回收,是以這種方式不好。是以需要采用子圖分割的方法。

     面試官說,引用計數隻是個數,它可沒有儲存圖的結構,你怎麼子圖分割?

     我說,是啊,是個很難的問題,還是“代數”友善一些。 

     面試官笑了笑,我們再換個話題。

    我說道,我寫過一篇部落格,說的就是這個問題。C#中,值類型的局部變量都在棧上。

    “所有的情況都在棧上麼?”

     當然不是,比如在一個類中定義的值類型成員,它處在堆上。

     還有其他的情況麼?

     我想啊想,怎麼也沒有想出來。面試官說,想想lamda表達式。

     我一拍腦袋,閉包!但我和面試官說,雖然閉包做了一個局部變量的拷貝,它存儲在堆上。但我認為它們并不是一樣的變量,而且閉包還有陷阱。總之這個事情比較麻煩。

     面試官笑了笑,說,你回去再查一下吧。

     線程安全?我腦子裡出現了一堆與“鎖,互斥,線程同步”的一堆詞彙。我說道,線程安全主要是為了保護共享變量,保證“原子性”。然後說道,我曾經在用log4net日志系統輸出UI的調試資訊時,常常因為多個線程同時輸出而産生鎖死問題,于是查了不少資料,采用了Monitor類,使用了如下代碼:

     面試官說,還有嗎? 我說,我通常會使用線程安全的集合,比如.NET 4.5提供的一組線程安全集合,就不用做同步了。  面試官還是笑了笑。

     以前看過某大神async和await異步的使用介紹,還在開發WP8時,大量使用了異步模式解決資料傳輸卡死UI的問題。以前用非異步開發WCF時,常常采用大量挂接事件的方式來“模拟異步”。但是代碼醜陋,而且容易出錯。

      可是,真要問起原理,我還真沒想過,”難道是類似消息隊列那樣的機制?“ 

     面試官笑了笑,你也回去查一下吧。

     聊到這裡,我的腦袋上已經沁出了一些汗珠,一點餓的感覺都沒有了。面試官說,看你用部落格園,看看你的部落格吧。我打開了部落格,讓他掃了兩眼,他說,“我以前也玩部落格園,最好的時候是第37名,當然現在兩年多沒玩了。”當時我就驚了。遇到大神了啊。

     他接着說,“你的開發水準确實比同齡人強,可是對應屆生來說,考察占50%比例的是基礎知識,你說你對C#熟悉,可是我考你的這幾個問題,你一個都沒有完整的答上來,隻是知其然不知是以然。我還沒問你JAVA呢。這方面一定要注意啊,不過,我還是會讓你通過面試的。”

     我臉上紅一塊白一塊的,一直在點頭。”沒錯沒錯,隻是最近一直在複習C++,C#太久沒看,兩年前看的東西現在很多都忘記了“。

     他又說,”基礎知識,在開發的時候好像感覺不出特别大的作用,可是在調試的時候,這就非常看功夫了。常常半夜起來,伺服器負載超高,無法登陸,可是那時候又沒人通路,怎麼去查錯?這種情況下,就要看你的基礎知識了“。

     我說,非常正确,我當時就因為做嵌入式開發時一個非常底層的問題卡了我半年,如果我基礎知識和經驗牢靠,可能就不會出現這樣的錯誤了。

   他笑着說,你還有什麼問題麼?  我說,”今天遇到大神了,我還需要繼續努力。“後面的二面三面,且按下在此不表,至于以上的問題,我就不給出答案了,大家自己查閱吧。大家可以順便猜下我拿到這家公司的offer沒。

   等我回到學校,我仔細看了他的部落格,橫刀天笑的碎碎念,頓時就吓尿了。果然是部落格園前50的氣質和實力:

記我的一次面試經曆, 感慨萬千

      該大神橫跨.NET,JAVA和函數式程式設計,對設計模式,底層知識,算法和業務邏輯都有充分的見解,他問我的很多問題都來自于自己的博文。而且是能出”系列“的。而我呢?發的基本都是沒有營養的牢騷貼和介紹帖,水了一逼。也許我唯一能值得說說的,就是好像我比他年輕,06年他開始上班寫部落格的時候,我才上高中呢。

     好好反思自己,讀書的時候喜歡跳讀,平時遇到問題才去網上查,很少有系統的讀書,也少有做筆記的時候。很多兩三年前看的知識點,現在都隻留下個影子。給人說上兩三句就沒有了。這還不如那些沒搞過開發,卻看了不少書的同學呢。

     自認為自己搞的很寬,什麼都有涉及。可是什麼都不深刻,論WPF,我比不過Mgen, 論對語言的了解,我和這位MSRA的大神λ-calculus in CnBlogs比差了十萬八千裡(最近一直在反複的看他的部落格,因為一遍根本看不懂)。當然還有我大四時認識的在高中就每天上課看C#的大神Loning's home(他還比我低一屆)。 自認為懂機器學習和資料挖掘, 别人問我的問題稍微深一點就直接跪掉。 當然還有無數的大神沒有寫上來。 看他們的文章,每一個字都透出那種聰明和能力。而自己開始正經寫代碼已經是大三的時候了,在通信領域搞計算機,沒有同道之人和大環境。和科班出身的同學相比,差距甚遠啊。

      以後每天努力學習,看大神的部落格。還有橫刀天笑大哥,謝謝你的提醒。

      真是啥都不說了。幹活吧。

作者:熱情的沙漠

出處:http://www.cnblogs.com/buptzym/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。