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


     好俗的博客題目,和小學作文差不多。

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

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

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

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

     1. 哈希表的實現方法?

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

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

      2. C#的String是值類型還是引用類型?

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

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

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

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

       3.GC的原理?

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

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

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

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

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

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

    4. 值類型一定在棧上嗎?

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

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

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

     還有其他的情況么?

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

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

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

  5.線程安全怎么處理?

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

private readonly object lockobj = new object();
        public void Info(object message)
        {
            bool lockTaken = false;

            Monitor.TryEnter(this.lockobj, 300, ref lockTaken);
            if (lockTaken)
            {
                try
                {
                    this.thisXLog.Info(message);
                }
                finally
                {
                    Monitor.Exit(this.lockobj);
                }
            }
            else
            {
                return;
            }
        }

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

   6.C# 5.0有了async和await關鍵字,那異步的原理是什么?

     以前看過某大神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(他還比我低一屆)。 自認為懂機器學習和數據挖掘, 別人問我的問題稍微深一點就直接跪掉。 當然還有無數的大神沒有寫上來。 看他們的文章,每一個字都透出那種聰明和能力。而自己開始正經寫代碼已經是大三的時候了,在通信領域搞計算機,沒有同道之人和大環境。和科班出身的同學相比,差距甚遠啊。

      以后每天努力學習,看大神的博客。還有橫刀天笑大哥,謝謝你的提醒。

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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM