.NET面試題系列

索引:html

.NET框架基礎知識[1] - http://www.cnblogs.com/haoyifei/p/5643689.html前端

.NET框架基礎知識[2] - http://www.cnblogs.com/haoyifei/p/5646288.html程序員

通過了四年的工做,我已經跳槽6次了。這四年我所有都使用C#進行開發,除了得到到的offer以外,還面試失敗或拒掉了很多offer,加起來面試的次數至少有30次。這些面試有質量很高的,也有泛泛而談的,不一樣面試有時候還會問到幾乎相同的問題,經過對問題的深刻程度,能夠大體判斷一家公司和麪試官的水平。面試

跳槽就是爲了更好的生活。而改善生活須要有強大的業務能力,說服面試官在衆多候選人中選擇你做爲勝利者。在若干年的工做學習中,個人水平也慢慢上升,一開始是什麼都不會,後來會一些東西,到如今也能夠從面試官的問題中,大概瞭解到他/她的水平如何。算法

不一樣類型的公司的面試題目也略有不一樣,而這些題目要不表明着你面試經過以後可能在實際工做中遇到的問題,要麼就是面試官但願經過題目瞭解你我的的水平如何。例如Facebook,Google,BAT這種綜合性公司在校招的時候,面對的都是應屆大學生,他們沒有什麼可能會對搜索引擎十分專精,或者擅長天然語言語義分析。他們會的只是四年的大學計算機教育而已,面試完了以後,這些勝出者也不知道本身會去哪一個組作什麼方向的工做。因此這時候,給他們出題也不能考搜索引擎,大數據,而只能考最general的內容,那無非就是計算機基礎知識和算法了。shell

而社招大部分狀況下,面試官但願你第一天面試經過,次日就能上班,而且來之能戰。因此這時候問題基本都是你未來工做可能會遇到的問題。面試官但願你研究過這些問題,而且證實本身能作的比別人更好。固然,面試官也但願你的基礎知識水平牢固,不會在開發,部署,測試等基本流程上一問三不知。例如,我曾經面試過三家投行,他們都但願面試者熟悉WPF或者Winform。因此,其中的兩家問到了工做線程如何修改UI線程控件的內容這個經典問題。對於這個經典的情境,你不只須要知道若是是按照常規的方法處理會發生什麼(UI線程控件的內容只能被擁有控件的線程修改),還要知道怎麼解決(Winform使用委託,WPF使用Dispatcher)。並且,你還能夠提,若是你的應用是ASP.NET Web Application,則你須要反其道而行之,使用ConfigureAwait強制令系統不進行任何線程的切換。若是面試官知道你在說什麼,他/她必定會很開心。若是面試官表現的一臉懵比,你能夠在心中爲這家公司下降一個檔次。數據庫

當你回答問題時,若是你能夠答的超乎面試官的意料,則他們給你開的工資可能也會出乎你的意料。例如,對於簡單的問題「如何實現一個單例模式」,若是你只是給出了很簡單的一個構造函數,則面試官可能會以爲你對線程安全不夠敏感(固然比較弱的面試官可能會很高興) 。若是你加了雙重鎖檢查,面試官會問你第一個if是作什麼的。若是你也知道,而且還能夠解釋清楚,爲何須要雙重鎖檢查,面試官會以爲很滿意。若是你甚至還能夠提一句,在不少依賴注入工具中,只須要一個函數就能保證對象在全局都是單例的,例如autofac就有這個功能。面試官將會很是爽,而後話題可能會轉到ioc,或者談談天氣。編程

外國人問問題有時候不按常理出牌(或者你能夠理解爲,外國人的常理就是那樣)。我遇到過的比較有趣的問題有:說出你以爲c#好的任意一個理由(我給出的答案是它的語法天然易懂,且比較優雅,背後編譯器做的大量工做你能夠不用知道。例證如lambda表達式和async與await關鍵字),爲何c語言被命名爲c,說出你自學某語言時看過的書籍,你最喜歡哪一種數據結構等。這些問題沒有標準答案,你須要結合事例解釋你的答案。對付這種問題,死記硬背是沒有什麼用的,你須要理解或者在背書的基礎上,造成你本身的觀點。小程序

在學習的過程當中,我泛泛閱讀了若干本經典書籍,固然還有不少本正放在書架上供着,我可能一生也不會去看或者理解的了(例如「編譯原理」)。我也看了不少博客,其中有大量現成的代碼可供直接使用。我認爲,做爲一個立志奮發圖強的.NET + C# 程序員,應該瞭解的知識包括:c#

  1. .NET框架基礎知識,如.NET框架的核心 – CLR作什麼,.NET是如何將源語言編譯成目標語言的,.NET中程序集的做用等等。這些都是背景知識,除了程序集以外基本沒人問,但合格的. NET程序員必須知道。若是你願意瞭解更多,能夠去拜讀「龍書」(即編譯原理)。我反正在5年以內不打算讀這本書。
  2. C#的基礎知識,如類型安全,類和結構,垃圾回收,反射,面向對象基本知識等。這些問題比較基礎,但若是深刻的問起來仍是能夠難倒不少不少開發者的。通讀一遍CLR via C#會有很大幫助。
  3. 委託與事件。雖然任何一本書上都有關於它們的章節,但仍然有不少人對委託的理解僅僅是函數指針這個層次。熟悉委託和事件的開發者,應當知道二者之間的關係,什麼是委託鏈,以及委託是如何作到無處不在的(例如,linq裏面就大量充斥着委託)。
  4. C#從2.0開始的新特性,這是一個極大的話題,主要包括2.0的泛型和可空類型,匿名方法,3.0的linq(以及相關的全部特性,包括閉包),4.0的dynamic,泛型的協變與逆變,4.5的async & await等等。熟悉它們會對代碼有質的影響。任意一本好的介紹C#的書籍都會詳細介紹它們,我我的則是看了Jon Skeet的深刻理解C#。這本書包含了不少技術細節,我有三分之一都看不懂。不過我的認爲,是否理解那些細節並不會影響你的代碼質量。一般來講,敢在簡歷上寫「熟悉C#」的人,至少應該瞭解三分之二的C#新特性。
  5. 數據結構。C#幫你實現了不少經常使用的數據結構,包括隊列,棧,鏈表。對一些比較經常使用的數據結構要作到熟悉,並在特定情境時有所取捨。例如,對於常常在中間插入刪除,但沒有什麼查找的情境時,選用鏈表而不是List<T>。C#全部的數據結構都基於IEnumerable,我曾經遇到一個面試官問我IEnumerable是作什麼的,怎麼實現一個IEnumerable。我的認爲,後一個問題有點強人所難。不過,若是有人問我List<T>和IList<T>有什麼區別,我不會以爲很過度。清華大學出版的「數據結構」足以讓你在這個話題所向披靡。
  6. 多線程的基本知識。進程和線程的區別,線程的優劣,以及線程的狀態,如何管理線程。對這個問題的深刻能夠去到計算機最基礎的構造。在C#中,CLR提供了線程池管理線程,不過咱們不須要直接和它進行溝通,咱們能夠經過任務間接的和它溝通。線程有幾種狀態:start,工做中,被阻塞和abort。它們之間的互相轉化構成了同步的幾種方式。你能夠去搞一本「深刻理解計算機系統」,也許你會對這個問題豁然開朗,不過我纔剛剛開始這本書的閱讀。
  7. 多線程同步。同步方式有不少種,從最經典的lock到它的真身monitor,mutex,semaphore,Event構造,原子操做,死鎖等。考這個的面試官基本都是高手,由於明白這一塊內容很不容易。我面試了這麼多家公司,也才就遇到三個問這塊問題的,並且只有一個問的十分深刻,剩下的只是考考概念。不過,對於死鎖,不少人喜歡問,他們一般問死鎖產生的條件以及如何避免。加里.納特的「操做系統」中對於死鎖有着十分精彩的論述。一般能夠結合哲學家就餐問題回答如何避免死鎖。Windows核心編程這本書也很好,不過我也還沒開始看。
  8. 異步編程的基本知識。首先,要清楚異步和多線程沒什麼關係,它並非多線程的子集。單線程也能夠異步。而後,C#對異步操做提供了幾種方式,例如基於委託,基於事件,以及基於任務。對於每種方式,要清楚它的優缺點(一般缺點都是難以取消或者得到結果,而基於任務的方式解決了全部問題)。
  9. 測試。如何編寫單元測試和集成測試,測試的做用,如何隔離和模擬物件,測試驅動開發。不會測試或者不有意在工程中添加測試代碼的工程是使人不安的。持續集成重要的一個緣由就是它能夠幫你自動把測試都跑一遍。一個無懈可擊的測試十分十分複雜。
  10. 軟件工程方面的知識。包括版本控制,持續集成等。持續集成已經愈來愈多地被各個公司使用,以實現快速迭代和交付。若是你能夠獨立爲公司實現持續集成的從無到有,你將會十分值錢。另外,你以前的公司是實行什麼風格的軟件開發流程的?是瀑布仍是敏捷?你更喜歡哪一種?你對結對編程有什麼見解?你認爲敏捷有什麼很差的地方?
  11. 關於數據庫的一些基本知識,包括幾個範式,最基本的SQL,表上查詢須要注意的事情(索引怎麼放,放哪列等)。另外,你可能也須要知道ORM(Entity Framework)的好處有哪些。大數據,商業智能方向以及數據庫管理員須要重點了解這塊,而且還要加上大量內容,例如事務,數據庫容災,備份,數據倉庫以及ETL。對於不是這些方向的開發者則不須要了解。夢裏花落知多少的這篇http://www.cnblogs.com/anding/p/5281558.html其實已經有點多了,我的以爲(固然,對於DBA來講又太少了)。尤爲是對於那些把數據都放在雲上,平時拿數據都經過API的互聯網金融公司來講。對於那種公司,你不會SQL都不要緊,由於根本不須要,你也不用建表。
  12. 經常使用設計模式。雖然經典的設計模式有20多種,但沒人會變態到讓你把它們都背下來。最多見的無非是單例模式,迭代器模式,工廠,策略模式(ioc),觀察者模式等等,清楚它們怎麼實現,何時使用它們。另外,對於solid要大體瞭解,而且在本身設計時,儘可能作到。要了解ioc究竟有什麼好處。
  13. 代碼風格和簡單算法。要說看一我的的編程水平如何,最準確的方法就是看代碼了。好的代碼讓你賞心悅目,差的代碼把你逼上梁山。代碼必需要清晰易懂,配上精準的註釋,以致於讓別人基本不須要思考就能理解你要作什麼。我很是痛恨的代碼有:一個函數超過100行,命名混亂,瞎選數據結構,算法喜人等。對於算法,若是不是面算法工程師,會最基本的幾個排序和遞歸問題就足夠了,例如,若是你知道C#的Sort方法是如何實現的,而且理解爲何會這麼幹,或者你知道數據庫的索引用的是B+樹而不是哈希,你的算法水平已經足夠了。(對於谷歌第一題就是徒手翻轉二叉樹我表示不對胃口)不過若是有興趣,能夠讀一讀這本「算法」(不是算法導論)https://book.douban.com/subject/10432347/。若是你沒有在大學看過算法導論的話,那麼算法導論只有一個功能,那就是能夠成功證實你的數學是狗屎。若是你聲稱你能看懂TAOCP的第一本,請作一個for循環,給世界前10科技公司和投行各發一份簡歷,請相信我,若是你連TAOCP的第一本都看得懂,英語對你的大腦來講簡直就是沒有難度,你甚至只須要寫一句話:我能看懂TAOCP的第一本。
  14. 能用任意一款腳本語言寫一個猜數字(就是文曲星上的那個遊戲)。腳本語言是生活的小幫手,尤爲是你須要批處理運行多個程序的時候。咱們不須要作到十分熟悉Linux的各個命令,但咱們能夠在Python,Perl等腳本語言中任選一款,寫一些你認爲用C# + VS過於笨重的小程序。固然,若是你還擅長函數式編程語言,那簡直太棒了。
  15. 你喜歡使用什麼工具,讓你的茫茫重構之路變得不那麼崎嶇?我我的則是一直在用Resharper。

上面這些若是你基本都會的八九不離十,你在任何一家公司均可以勝任一個後端程序員了。但若是你面試的職位還須要你寫點API,以便讓前端的哥們使用,那你還要粗淺的瞭解如下內容:

    1. Web基礎,包括五層模型,get和post的區別,http協議的一些狀態碼以及IIS的基本設定。對這個話題的深刻了解,能夠搞一本計算機網絡方面的書籍,裏面有詳細的關於五層模型,TCP和IP協議的細節。若是你不是應聘網絡方面的專家級別職位,我不認爲它們是十分必要的。固然,若是你立志成爲這方面的專家,請遵循http://coolshell.cn/articles/4990.html

    2. Web服務。Web服務具備悠久的歷史,最經典的兩種方式SOAP和Restful的區別要知道。另外,微軟對於這兩種方式都給出了本身的實現,即WCF和WebAPI。

    3. 對MVC有必定的瞭解。瞭解如何利用工具,對你的API進行自動化或非自動化的集成測試。

    4. OWIN。微軟的OWIN幫助咱們從ASP.NET又臭又長的生命週期解脫出來,今後咱們能夠定義本身的生命週期。新的ASP.NET Core中也是這樣,生命週期已經成爲歷史。咱們要了解OWIN基本的工做方式,以及它如何和ioc工具進行配合。另外,經過OWIN,咱們的工程能夠和IIS解耦,能夠用其餘的工具代替笨重的IIS。

    5. 對於金融交易系統,須要特別關注一下SignalR。它集成了服務器和用戶進行通信的幾種方式,從常規的輪詢,到服務器主動發送訊息,以及如今經常使用的WebSocket。它會根據狀況自行選用它認爲最合適的方式。

上面的內容並不包括前端,這是由於我以爲全棧工程師十分不現實(由於前端的內容和後端幾乎是同樣多的,而光掌握後端的內容,也須要至少3-5年的時間),因此不打算朝這個方向努力,並且我對前端的瞭解也十分皮毛。固然,只會簡單的HTML和jQuery,可不能稱本身是一個合格的前端工程師。

在漫漫的學習過程當中,咱們不只要打牢基礎,還要時刻關注新技術的動向。C# 6推出來一段時間了(雖然其中並無什麼重大的改進),C# 7也立刻就要問世。ASP.NET Core的推出,把前端的打包和測試拉上了檯面,同時令Angular JS 成爲官方前端語言。對於後端來講,也許你沒有機會爲公司貢獻Angular JS代碼,但把握住新技術的演進流程,也會對整個知識體系的融會貫通有重要的做用。

我已經寫了很多筆記,雖然大部分都是抄別人的。我在這裏也打算效仿博客園衆位前輩,弄一個面試題系列,其中不徹底包含上述的全部內容,望各位大大不吝賜教。畢竟互相交流,人人都能受益。那麼廢話少說,咱們立刻開始。

相關文章
相關標籤/搜索