索引: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#
上面這些若是你基本都會的八九不離十,你在任何一家公司均可以勝任一個後端程序員了。但若是你面試的職位還須要你寫點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代碼,但把握住新技術的演進流程,也會對整個知識體系的融會貫通有重要的做用。
我已經寫了很多筆記,雖然大部分都是抄別人的。我在這裏也打算效仿博客園衆位前輩,弄一個面試題系列,其中不徹底包含上述的全部內容,望各位大大不吝賜教。畢竟互相交流,人人都能受益。那麼廢話少說,咱們立刻開始。