面試乾貨——年末乾貨大放送,你準備好了嗎?(轉)

轉自:http://www.cnblogs.com/landeanfen/p/4955891.htmlcss

 

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

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

1、對於 Web 性能優化,您有哪些瞭解和經驗嗎?

出現指數:五顆星jquery

主要考點:這道題是博主在博客園的新聞裏面看到的,回想以前幾年的面試經歷,發現此題出現機率仍是比較高的。由於它的考麪灰常廣,可讓面試官很快了解你的技術涉及面以及這些技術面的深度。web

參考答案:這個問題能夠分前端和後端來講。面試

一、前端優化ajax

(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裏面循環的次數,諸如此類。

二、後端優化:

(1)程序的優化:這是一個很大的話題,我這裏就選幾個常見的。好比減小代碼的層級結構、避免循環嵌套、避免循環CURD數據庫、優化算法等等。

(2)數據庫的優化:(因爲數據庫優化不是本題重點,因此可選幾個主要的來講)好比啓用數據庫緩存、經常使用的字段建索引、儘可能避免大事務操做、避免select * 的寫法、儘可能不用in和not in 這種耗性能的用法等等。

(3)服務器優化:(這個可做爲可選項)負載均衡、Web服務器和數據庫分離、UI和Service分離等等。

2、MVC路由理解?(家常便飯)

出現指數:五顆星

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

參考答案:

一、首先咱們要理解MVC中路由的做用:url Routing的做用是將瀏覽器的URL請求映射到特定的MVC控制器動做。

二、當咱們訪問http://localhost:8080/Home/Index 這個地址的時候,請求首先被UrlRoutingModule截獲,截獲請求後,從Routes中獲得與當前請求URL相符合的RouteData對象, 將RouteData對象和當前URL封裝成一個RequestContext對象,而後從Requestcontext封裝的RouteData中獲得 Controller名字,根據Controller的名字,經過反射建立控制器對象,這個時候控制器才真正被激活,最後去執行控制器裏面對應的 action。

3、談談你以爲作的不錯系統,大概介紹下用到了哪些技術?

出現指數:五顆星

主要考點:這是一道很是開放的面試題。博主遇到過好幾家公司的面試官都問道了這個,博主以爲他們是想經過這個問題快速瞭解面試者的技術水平。此題只要結合你最近項目用到的技術談談就行了。

參考答案:

就拿我以前作過的一個項目爲例來簡單說明一下吧。項目分爲客戶端和服務端,客戶端分 爲BS客戶端和CS客戶端,BS客戶端採用MVC 5.0的框架,CS客戶端是Winform項目,服務端使用WebApi統一提供服務接口,考慮之後可能還要擴展手機端,因此服務接口的參數和返回值使用 通用的Json格式來傳遞數據。

一、服務端採用的面向接口編程,咱們在軟件架構的過程當中,層和層之間經過接口依賴, 下層不是直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI 層不直接依賴於BLL層,而是依賴於中間的一個IBLL層,在程序運行的時候,經過MEF動態將BLL裏面的實現注入到UI層裏面去,這樣作的好處是減小 了層與層之間的耦合。服務端的異常裏面、權限驗證、日誌記錄等通用功能使用了AOP攔截的機制統一管理,項目中使用的是Postsharp這個組件,很好 地將通用需求功能從不相關的類當中分離出來,提升了代碼的可維護性。

二、BS的客戶端採用的jquery+bootstrap 的方式,全部頁面採用流式佈局,能更好適應各類不一樣的終端設備(PC、手機)。項目中使用了各類功能強大的bootstrap組件,能適應各類複雜的業務需求。

4、Js繼承實現。

出現指數:五顆星

主要考點:這道題考驗面試者對js理解的深度。根據博主的經歷,這種題通常在筆試出現的概率較大,爲何把它放在這裏,由於它確實太常見了。其實js實現繼承的方式不少,咱們只要寫好其中一種就行了。

參考答案:原型鏈繼承

複製代碼
function Person(name, age){ this.name = name; this.age = age; } //經過原型鏈給Person添加一個方法 Person.prototype.getInfo = function(){ console.log(this.name + " is " + this.age + " years old!"); } function Teacher(staffId){ this.staffId = staffId; } //經過prototype生命Teacher繼承Person Teacher.prototype = new Person(); var will = new Teacher(1000); will.name = "Will"; will.age = 28; will.getInfo();
複製代碼

5、談談你對設計模式的認識?結合你用得最多的一種設計模式說說它的使用。

出現指數:五顆星

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

參考答案:

通用寫法

複製代碼
   public class Singleton { // 定義一個靜態變量來保存類的實例 private static Singleton uniqueInstance; // 定義一個標識確保線程同步 private static readonly object locker = new object(); // 定義私有構造函數,使外界不能建立該類實例 private Singleton() { } /// <summary> /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() {// 雙重鎖定只須要一句判斷就能夠了 if (uniqueInstance == null) { lock (locker) { // 若是類的實例不存在則建立,不然直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
複製代碼

單例模式確保一個類只有一個實例,並提供一個全局訪問點,它的使用場景好比任務管理 器整個系統中應該只有一個把,再好比操做文件的對象,同一時間咱們只能有一個對象去操做文件吧。最重要的,好比咱們項目中用得很是多的功能→日誌記錄,在 一個線程中,記錄日誌的對象應該也只能有一個吧。單例模式的目的是爲了保證程序的安全性和數據的惟一性。或者你也能夠結合你使用的其餘設計模式來講明。

6、IIS的工做原理?

出現指數:四顆星

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

參考答案:

一、當客戶端發送HTTP Request時,服務端的HTTP.sys(能夠理解爲IIS的一個監聽組件) 攔截到這個請求;

二、HTTP.sys 聯繫 WAS 向配置存儲中心請求配置信息。

三、而後將請求傳入IIS的應用程序池。

四、檢查請求的後綴,啓動aspnet_isapi.dll這個dll,這個dll是.net framework裏面的,也就是說到這一步,請求進入了.net framework的管轄範圍。

五、這個時候若是是WebForm,開始執行復雜的頁面生命週期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);若是是MVC,則啓動mvc的路由機制,根據路由規則爲URL來指定HttpHandler。

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

7、Http協議

出現指數:四顆星

主要考點:此題主要考對於web裏面http協議的理解。

參考答案:

一、http協議是瀏覽器和服務器雙方共同遵循的規範,是一種基於TCP/IP應用層協議。

二、http是一種典型的請求/響應協議。客戶端發送請求,請求的內容以及參數存放到請求報文裏面,服務端收到請求後,作出響應,返回響應的結果放到響應報文裏面。經過F12能夠查看請求報文和響應報文。

三、http協議是」無狀態」的,當客戶端向服務端發送一次http請求後,服務端收到請求而後返回給客戶端相應的結果,服務器會當即斷開鏈接並釋放資源。在實際開發過程當中,咱們有時須要「保持」這種狀態,因此衍生出了Session/Cookie這些技術。

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

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

8、數據庫優化經驗(後端工程師很是常見)

出現指數:四顆星

主要考點:此題考察後端工程師操做數據庫的經驗。說實話,數據庫是博主的弱項,博主以爲對於這種考題,須要抓住幾個經常使用而且關鍵的優化經驗,若是說得不對,歡迎你們斧正。

參考答案:

一、數據庫運維方面的優化:啓用數據庫緩存。對於一些比較經常使用的查詢能夠採用數據庫緩存的機制,部署的時候須要注意設置好緩存依賴項,防止「過時」數據的產生。

二、數據庫索引方面的優化:好比經常使用的字段建索引,聯合查詢考慮聯合索引。(PS:若是你有基礎,能夠敞開談談彙集索引和非彙集索引的使用場景和區別)

三、數據庫查詢方面的優化:避免select * 的寫法、儘可能不用in和not in 這種耗性能的用法等等。

四、數據庫算法方面的優化:儘可能避免大事務操做、減小循環算法,對於大數據量的操做,避免使用遊標的用法等等。

9、關於代碼優化你怎麼理解?你會考慮去代碼重構嗎?

出現指數:四顆星

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

參考答案:

一、對於代碼優化,以前的公司每週會作代碼審覈,審覈的主要做用就是保證代碼的正確性和執行效率,好比減小代碼的層級結構、避免循環嵌套、避免循環CURD數據庫、儘可能避免一次取出大量數據放在內存中(容易內存溢出)、優化算法等。

二、對於陳舊代碼,可能不少地方有調用,而且開發和維護人員頗有可能不是同一我的,因此重構時要格外當心,若是沒有十足的把握,不要輕易重構。若是必需要重構,必須作好充分的單元測試和全局測試。

10、談談你的優勢和缺點?

出現指數:四顆星

主要考點:這道題讓人有一種罵人的衝動,可是沒辦法,恰恰不少所謂的大公司會問這個。好比華爲。這個問題見仁見智,答案能夠本身組織。

參考答案:

優勢:對於新的技術學習能力強,能很快適應新環境等等

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

11、關於服務器端 MVC 架構的技術實現,您是怎樣理解的?這種架構方式有什麼好處?您在項目中是如何應用這一架構的?

出現指數:三顆星

主要考點:此題主要考的對於MVC這種框架的理解。

參考答案:MVC,顧名思義,Model、View、Controller。全部的 界面代碼放在View裏面,全部涉及和界面交互以及URL路由相關的邏輯都在Controller裏面,Model提供數據模型。MVC的架構方式會讓系 統的可維護性更高,使得每一部分更加專一本身的職責,而且MVC提供了強大的路由機制,方便了頁面切換和界面交互。而後能夠結合和WebForm的比較, 談談MVC如何解決複雜的控件樹生成、如何避免了複雜的頁面生命週期。

12、網站優化:網站運行慢,如何定位問題?發現問題如何解決?

出現指數:三顆星

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

參考答案:

瀏覽器F12→網絡→查看http請求數以及每一個請求的耗時,找到問題的根源,而後依次解決,解決方案能夠參考問題一里面的Web優化方案。

十3、說說你最擅長的技術?並說說你是如何使用的?

出現指數:三顆星

主要考點:這是一道很是開放的面試題。最初遇到這種問題,博主很想來一句:你妹,這叫什麼問題!但確實有面試官問到。回頭想一想,其實此題考查你擅長的技術的涉及深度。其實博主以爲對於這個問題,能夠結合你項目中用到的某一個技術來講就行了。

參考答案:

 簡單談談MEF在咱們項目裏面的使用吧。

在談MEF以前,咱們必需要先談談DIP、IOC、DI

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

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

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

什麼意思呢?也就是說,咱們在軟件架構的過程當中,層和層之間經過接口依賴,下層不是 直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI層不直接 依賴於BLL層,而是依賴於中間的一個IBLL層,在程序運行的時候,經過MEF動態將BLL裏面的實現注入到UI層裏面去,這樣作的好處是減小了層與層 之間的耦合。這也正是面向接口編程方式的體現。

十4、本身寫過JS組件嗎?舉例說明。

出現指數:三顆星

主要考點:此題考的js組件封裝和js閉包的一些用法。通常來講,仍是筆試出現的概率較大。

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

 

複製代碼
//combobox (function ($) { $.fn.combobox = function (options, param) { if (typeof options == 'string') { return $.fn.combobox.methods[options](this, param); } options = $.extend({}, $.fn.combobox.defaults, options || {}); var target = $(this); target.attr('valuefield', options.valueField); target.attr('textfield', options.textField); target.empty(); var option = $('<option></option>'); option.attr('value', ''); option.text(options.placeholder); target.append(option); if (options.data) { init(target, options.data); } else { //var param = {};  options.onBeforeLoad.call(target, option.param); if (!options.url) return; $.getJSON(options.url, option.param, function (data) { init(target, data); }); } function init(target, data) { $.each(data, function (i, item) { var option = $('<option></option>'); option.attr('value', item[options.valueField]); option.text(item[options.textField]); target.append(option); }); options.onLoadSuccess.call(target); } target.unbind("change"); target.on("change", function (e) { if (options.onChange) return options.onChange(target.val()); }); } $.fn.combobox.methods = { getValue: function (jq) { return jq.val(); }, setValue: function (jq, param) { jq.val(param); }, load: function (jq, url) { $.getJSON(url, function (data) { jq.empty(); var option = $('<option></option>'); option.attr('value', ''); option.text('請選擇'); jq.append(option); $.each(data, function (i, item) { var option = $('<option></option>'); option.attr('value', item[jq.attr('valuefield')]); option.text(item[jq.attr('textfield')]); jq.append(option); }); }); } }; $.fn.combobox.defaults = { url: null, param: null, data: null, valueField: 'value', textField: 'text', placeholder: '請選擇', onBeforeLoad: function (param) { }, onLoadSuccess: function () { }, onChange: function (value) { } }; })(jQuery);
複製代碼

調用的時候

        $("#sel_search_orderstatus").combobox({
            url: '/apiaction/Order/OrderApi/GetOrderStatu', valueField: 'VALUE', textField: 'NAME' });

就能自動從後臺取數據,注意valueField和textField對應要顯示和實際值。

十5、本身寫過多線程組件嗎?簡要說明!

出現指數:三顆星

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

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

 

以上就是博主根據本身的理解作的一些總結,若是有不對的地方,歡迎指出。固然,若是園友們以爲還有哪些沒涉及到可是出現頻率很是高的面試題,歡迎提出,你們一塊兒討論,一塊兒進步。若是文章或多或少可以幫到你,請幫忙推薦吧,千萬不要客氣~~

相關文章
相關標籤/搜索