天天看點

面試幹貨——年底幹貨大放送,你準備好了嗎?

前言:年底了,騷年們有沒有很雞凍——年終獎有盼頭了。之前在介紹事件的這篇 C#基礎系列——再也不用擔心面試官問我“事件”了 也聊到了面試,引起了很多園友的共鳴。在不久的年後,熱門的跳槽季就要來了,如果你準備換工作,本篇或多或少能幫到你;如果你不打算換,沒關系,看看也無妨,看看是否有那麼幾道題能夠引起你的一點點感觸;又或者你是面試官,老實交代,是否問過其中的某些~~不管你是否準備面試,用一句自嘲的話來說:工作經驗可以沒有,但換工作的經驗咱可不能缺~~

對于一些基礎的筆試和簡單的面試題,部落客就不照本宣科了,部落格園一搜一大把:http://zzk.cnblogs.com/s?t=b&w=.net%20%E9%9D%A2%E8%AF%95%E9%A2%98。本篇就結合部落客遇到以及網上經常看到的一些面試題做一個總結。PS:由于部落客用的主要程式設計語言是C#,是以本篇主要介紹關于.net面試中的常見問題。

出現指數:五顆星

主要考點:這道題是部落客在部落格園的新聞裡面看到的,回想之前幾年的面試經曆,發現此題出現機率還是比較高的。因為它的考面灰常廣,可以讓面試官很快了解你的技術涉及面以及這些技術面的深度。

參考答案:這個問題可以分前端和後端來說。

1、前端優化

(1)減少 HTTP 請求的次數。我們知道每次發送http請求,建立連接配接和等待相應會花去相當一部分時間,是以在發送http請求的時候,盡量減少請求的次數,一次請求能取出的資料就不要分多次發送。

(2)啟用浏覽器緩存,當确定請求的資料不會發生變化時,能夠直接讀浏覽器緩存的就不要向服務端發送請求。比如我們ajax裡面有一個參數能夠設定請求的時候是否啟用緩存,這種情況下就需要我們在發送請求的時候做好相應的緩存處理。

(3)css檔案放在<head>裡面,js檔案盡量放在頁面的底部。因為請求js檔案是很花費時間,如果放在<head>裡面,就會導緻頁面的DOM樹呈現需要等待js檔案加載完成。這也就是為什麼很多網站的源碼裡面看到引用的檔案放在最後的原因。

(4)使用壓縮的css和js檔案。這個不用多說,網絡流量小。

(5)如果條件允許,盡量使用CDN的方式引用檔案,這樣就能減少網絡流量。比如我們常用的網站http://www.bootcdn.cn/。

(6)在寫js和css的文法時,盡量避免重複的css,盡量減少js裡面循環的次數,諸如此類。

2、後端優化:

(1)程式的優化:這是一個很大的話題,我這裡就選幾個常見的。比如減少代碼的層級結構、避免循環嵌套、避免循環CURD資料庫、優化算法等等。

(2)資料庫的優化:(由于資料庫優化不是本題重點,是以可選幾個主要的來說)比如啟用資料庫緩存、常用的字段建索引、盡量避免大事務操作、避免select * 的寫法、盡量不用in和not in 這種耗性能的用法等等。

(3)伺服器優化:(這個可作為可選項)負載均衡、Web伺服器和資料庫分離、UI和Service分離等等。

主要考點:此題主要考點是MVC路由的了解。

參考答案:

1、首先我們要了解MVC中路由的作用:url Routing的作用是将浏覽器的URL請求映射到特定的MVC控制器動作。

2、當我們通路http://localhost:8080/Home/Index這個位址的時候,請求首先被UrlRoutingModule截獲,截獲請求後,從Routes中得到與目前請求URL相符合的RouteData對象,将RouteData對象和目前URL封裝成一個RequestContext對象,然後從Requestcontext封裝的RouteData中得到Controller名字,根據Controller的名字,通過反射建立控制器對象,這個時候控制器才真正被激活,最後去執行控制器裡面對應的action。

主要考點:這是一道非常開放的面試題。部落客遇到過好幾家公司的面試官都問道了這個,部落客覺得他們是想通過這個問題快速了解面試者的技術水準。此題隻要結合你最近項目用到的技術談談就好了。

就拿我之前做過的一個項目為例來簡單說明一下吧。項目分為用戶端和服務端,用戶端分為BS用戶端和CS用戶端,BS用戶端采用MVC 5.0的架構,CS用戶端是Winform項目,服務端使用WebApi統一提供服務接口,考慮以後可能還要擴充手機端,是以服務接口的參數和傳回值使用通用的Json格式來傳遞資料。由于不同的用戶端調用WebApi服務,這裡就存在跨域的問題,我們使用CORS來解決,隻有指定來源的請求才能成功取到資料。

1、服務端采用的面向接口程式設計,我們在軟體架構的過程中,層和層之間通過接口依賴,下層不是直接給上層提供實作,而是提供接口,具體的實作以依賴注入的方式在運作的時候動态注入進去。MEF就是實作依賴注入的一種元件。它的使用使得UI層不直接依賴于BLL層,而是依賴于中間的一個IBLL層,在程式運作的時候,通過MEF動态将BLL裡面的實作注入到UI層裡面去,這樣做的好處是減少了層與層之間的耦合。服務端的異常裡面、權限驗證、日志記錄等通用功能使用了AOP攔截的機制統一管理,項目中使用的是Postsharp這個元件,很好地将通用需求功能從不相關的類當中分離出來,提高了代碼的可維護性。

2、BS的用戶端采用的jquery+bootstrap 的方式,所有頁面采用流式布局,能更好适應各種不同的終端裝置(PC、手機)。項目中使用了各種功能強大的bootstrap元件,能适應各種複雜的業務需求。

主要考點:這道題考驗面試者對js了解的深度。根據部落客的經曆,這種題一般在筆試出現的幾率較大,為什麼把它放在這裡,因為它确實太常見了。其實js實作繼承的方式很多,我們隻要寫好其中一種就好了。

參考答案:原型鍊繼承

主要考點:不用多說,這題考的就是對設計模式的了解。一般為了簡單可能會要求你寫一個單例模式,注意最好是寫一個完整點的,考慮線程安全的那種。然後會讓你說說你在項目中什麼情況下會用到這種模式

通用寫法

單例模式確定一個類隻有一個執行個體,并提供一個全局通路點,它的使用場景比如任務管理器整個系統中應該隻有一個把,再比如操作檔案的對象,同一時間我們隻能有一個對象去操作檔案吧。最重要的,比如我們項目中用得非常多的功能→日志記錄,在一個線程中,記錄日志的對象應該也隻能有一個吧。單例模式的目的是為了保證程式的安全性和資料的唯一性。或者你也可以結合你使用的其他設計模式來說明。

出現指數:四顆星

主要考點:此題主要考的是.net framework和IIS是如何結合呈現頁面的。這是一個有點複雜的過程,面試的時候不可能說得完整,那麼我們就抓住幾個關鍵點說說就可以。其實部落客也不能完全了解這個過程,今天正好借這個機會溫習下。

1、當用戶端發送HTTP Request時,服務端的HTTP.sys(可以了解為IIS的一個監聽元件) 攔截到這個請求;

2、HTTP.sys 聯系 WAS 向配置存儲中心請求配置資訊。

3、然後将請求傳入IIS的應用程式池。

4、檢查請求的字尾,啟動aspnet_isapi.dll這個dll,這個dll是.net framework裡面的,也就是說到這一步,請求進入了.net framework的管轄範圍。

5、這個時候如果是WebForm,開始執行複雜的頁面生命周期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);如果是MVC,則啟動mvc的路由機制,根據路由規則為URL來指定HttpHandler。

6、httpHandler處理請求後,請求結束,給出Response,用戶端處理響應,整個過程結束。

主要考點:此題主要考對于web裡面http協定的了解。

1、http協定是浏覽器和伺服器雙方共同遵循的規範,是一種基于TCP/IP應用層協定。

2、http是一種典型的請求/響應協定。用戶端發送請求,請求的内容以及參數存放到請求封包裡面,服務端收到請求後,做出響應,傳回響應的結果放到響應封包裡面。通過F12可以檢視請求封包和響應封包。

3、http協定是”無狀态”的,當用戶端向服務端發送一次http請求後,服務端收到請求然後傳回給用戶端相應的結果,伺服器會立即斷開連接配接并釋放資源。在實際開發過程中,我們有時需要“保持”這種狀态,是以衍生出了Session/Cookie這些技術。

4、http請求的方式主要有get/post。

5、http狀态碼最好記幾個,部落客有一次面試就被問到了。200(請求成功)、404(請求的資源不存在)、403(禁止通路)、5xx(服務端錯誤)

主要考點:此題考察後端工程師操作資料庫的經驗。說實話,資料庫是部落客的弱項,部落客覺得對于這種考題,需要抓住幾個常用并且關鍵的優化經驗,如果說得不對,歡迎大家斧正。

1、資料庫運維方面的優化:啟用資料庫緩存。對于一些比較常用的查詢可以采用資料庫緩存的機制,部署的時候需要注意設定好緩存依賴項,防止“過期”資料的産生。

2、資料庫索引方面的優化:比如常用的字段建索引,聯合查詢考慮聯合索引。(PS:如果你有基礎,可以敞開談談聚集索引和非聚集索引的使用場景和差別)

3、資料庫查詢方面的優化:避免select * 的寫法、盡量不用in和not in 這種耗性能的用法等等。

4、資料庫算法方面的優化:盡量避免大事務操作、減少循環算法,對于大資料量的操作,避免使用遊标的用法等等。

主要考點:此題考的是面試者對代碼優化的了解,以及代碼如何重構的相關知識。

1、對于代碼優化,之前的公司每周會做代碼稽核,稽核的主要作用就是保證代碼的正确性和執行效率,比如減少代碼的層級結構、避免循環嵌套、避免循環CURD資料庫、盡量避免一次取出大量資料放在記憶體中(容易記憶體溢出)、優化算法等。

2、對于陳舊代碼,可能很多地方有調用,并且開發和維護人員很有可能不是同一個人,是以重構時要格外小心,如果沒有十足的把握,不要輕易重構。如果必須要重構,必須做好充分的單元測試和全局測試。

主要考點:這道題讓人有一種罵人的沖動,但是沒辦法,偏偏很多所謂的大公司會問這個。比如華為。這個問題見仁見智,答案可以自己組織。

優點:對于新的技術學習能力強,能很快适應新環境等等

缺點:對技術太過于執着等等

出現指數:三顆星

主要考點:此題主要考的對于MVC這種架構的了解。

參考答案:MVC,顧名思義,Model、View、Controller。所有的界面代碼放在View裡面,所有涉及和界面互動以及URL路由相關的邏輯都在Controller裡面,Model提供資料模型。MVC的架構方式會讓系統的可維護性更高,使得每一部分更加專注自己的職責,并且MVC提供了強大的路由機制,友善了頁面切換和界面互動。然後可以結合和WebForm的比較,談談MVC如何解決複雜的控件樹生成、如何避免了複雜的頁面生命周期。

主要考點:此題和問題一類似,考察Web的問題定位能力和優化方案。

浏覽器F12→網絡→檢視http請求數以及每個請求的耗時,找到問題的根源,然後依次解決,解決方案可以參考問題一裡面的Web優化方案。

主要考點:這是一道非常開放的面試題。最初遇到這種問題,部落客很想來一句:你妹,這叫什麼問題!但确實有面試官問到。回頭想想,其實此題考查你擅長的技術的涉及深度。其實部落客覺得對于這個問題,可以結合你項目中用到的某一個技術來說就好了。

 簡單談談MEF在我們項目裡面的使用吧。

在談MEF之前,我們必須要先談談DIP、IOC、DI

依賴倒置原則(DIP):一種軟體架構設計的原則(抽象概念)

控制反轉(IoC):一種反轉流、依賴和接口的方式(DIP的具體實作方式)。

依賴注入(DI):IoC的一種實作方式,用來反轉依賴(IoC的具體實作方式)。

什麼意思呢?也就是說,我們在軟體架構的過程中,層和層之間通過接口依賴,下層不是直接給上層提供實作,而是提供接口,具體的實作以依賴注入的方式在運作的時候動态注入進去。MEF就是實作依賴注入的一種元件。它的使用使得UI層不直接依賴于BLL層,而是依賴于中間的一個IBLL層,在程式運作的時候,通過MEF動态将BLL裡面的實作注入到UI層裡面去,這樣做的好處是減少了層與層之間的耦合。這也正是面向接口程式設計方式的展現。

主要考點:此題考的js元件封裝和js閉包的一些用法。一般來說,還是筆試出現的幾率較大。

參考答案:自定義html的select元件

調用的時候

就能自動從背景取資料,注意valueField和textField對應要顯示和實際值。

主要考點:此題是兩年前部落客在攜程的一次電話面試中遇到的,其他地方基本上沒遇到過,其實到現在也不能了解當時面試官問這個問題的目的。但我想,此問題必有出處,估計面試官是想了解你對多線程以及線程池等的了解深度。

參考答案:可以參考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html