面試干貨——年底干貨大放送,你準備好了嗎?
對于一些基礎的筆試和簡單的面試題,博主就不照本宣科了。本篇就結合博主遇到以及網上經常看到的一些面試題做一個總結。PS:由于博主用的主要編程語言是C#,所以本篇主要介紹關于.net面試中的常見問題。
一、對于 Web 性能優化,您有哪些了解和經驗嗎?
出現指數:五顆星
主要考點:這道題是博主在博客園的新聞里面看到的,回想之前幾年的面試經歷,發現此題出現概率還是比較高的。因為它的考面灰常廣,可以讓面試官很快了解你的技術涉及面以及這些技術面的深度。
參考答案:這個問題可以分前端和后端來說。
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路由理解?(屢見不鮮)
出現指數:五顆星
主要考點:此題主要考點是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格式來傳遞數據。
1、服務端采用的面向接口編程,我們在軟件架構的過程中,層和層之間通過接口依賴, 下層不是直接給上層提供實現,而是提供接口,具體的實現以依賴注入的方式在運行的時候動態注入進去。MEF就是實現依賴注入的一種組件。它的使用使得UI 層不直接依賴于BLL層,而是依賴于中間的一個IBLL層,在程序運行的時候,通過MEF動態將BLL里面的實現注入到UI層里面去,這樣做的好處是減少 了層與層之間的耦合。服務端的異常里面、權限驗證、日志記錄等通用功能使用了AOP攔截的機制統一管理,項目中使用的是Postsharp這個組件,很好 地將通用需求功能從不相關的類當中分離出來,提高了代碼的可維護性。
2、BS的客戶端采用的jquery+bootstrap 的方式,所有頁面采用流式布局,能更好適應各種不同的終端設備(PC、手機)。項目中使用了各種功能強大的bootstrap組件,能適應各種復雜的業務需求。
四、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();
五、談談你對設計模式的認識?結合你用得最多的一種設計模式說說它的使用。
出現指數:五顆星
主要考點:不用多說,這題考的就是對設計模式的理解。一般為了簡單可能會要求你寫一個單例模式,注意最好是寫一個完整點的,考慮線程安全的那種。然后會讓你說說你在項目中什么情況下會用到這種模式
參考答案:
通用寫法
- 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;
- }
- }
單例模式確保一個類只有一個實例,并提供一個全局訪問點,它的使用場景比如任務管理 器整個系統中應該只有一個把,再比如操作文件的對象,同一時間我們只能有一個對象去操作文件吧。最重要的,比如我們項目中用得非常多的功能→日志記錄,在 一個線程中,記錄日志的對象應該也只能有一個吧。單例模式的目的是為了保證程序的安全性和數據的唯一性。或者你也可以結合你使用的其他設計模式來說明。
六、IIS的工作原理?
出現指數:四顆星
主要考點:此題主要考的是.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,客戶端處理響應,整個過程結束。
七、Http協議
出現指數:四顆星
主要考點:此題主要考對于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這種框架的理解。
參考答案: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組件封裝和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對應要顯示和實際值。
十五、自己寫過多線程組件嗎?簡要說明!
出現指數:三顆星
主要考點:此題是兩年前博主在攜程的一次電話面試中遇到的,其他地方基本上沒遇到過,其實到現在也不能理解當時面試官問這個問題的目的。但我想,此問題必有出處,估計面試官是想了解你對多線程以及線程池等的理解深度。
參考答案:可以參考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html
以上就是博主根據自己的理解做的一些總結,如果有不對的地方,歡迎指出。當然,如果園友們覺得還有哪些沒涉及到但是出現頻率非常高的面試題,歡迎提出,大家一起討論,一起進步。如果文章或多或少能夠幫到你,請幫忙推薦吧,千萬不要客氣~~