面試干貨——年底干貨大放送,你準(zhǔn)備好了嗎?
對于一些基礎(chǔ)的筆試和簡單的面試題,博主就不照本宣科了。本篇就結(jié)合博主遇到以及網(wǎng)上經(jīng)??吹降囊恍┟嬖囶}做一個總結(jié)。PS:由于博主用的主要編程語言是C#,所以本篇主要介紹關(guān)于.net面試中的常見問題。
一、對于 Web 性能優(yōu)化,您有哪些了解和經(jīng)驗嗎?
出現(xiàn)指數(shù):五顆星
主要考點(diǎn):這道題是博主在博客園的新聞里面看到的,回想之前幾年的面試經(jīng)歷,發(fā)現(xiàn)此題出現(xiàn)概率還是比較高的。因為它的考面灰常廣,可以讓面試官很快了解你的技術(shù)涉及面以及這些技術(shù)面的深度。
參考答案:這個問題可以分前端和后端來說。
1、前端優(yōu)化
(1)減少 HTTP 請求的次數(shù)。我們知道每次發(fā)送http請求,建立連接和等待相應(yīng)會花去相當(dāng)一部分時間,所以在發(fā)送http請求的時候,盡量減少請求的次數(shù),一次請求能取出的數(shù)據(jù)就不要分多次發(fā)送。
(2)啟用瀏覽器緩存,當(dāng)確定請求的數(shù)據(jù)不會發(fā)生變化時,能夠直接讀瀏覽器緩存的就不要向服務(wù)端發(fā)送請求。比如我們ajax里面有一個參數(shù)能夠設(shè)置請求的時候是否啟用緩存,這種情況下就需要我們在發(fā)送請求的時候做好相應(yīng)的緩存處理。
(3)css文件放 在<head>里面,js文件盡量放在頁面的底部。因為請求js文件是很花費(fèi)時間,如果放在<head>里面,就會導(dǎo)致頁面的 DOM樹呈現(xiàn)需要等待js文件加載完成。這也就是為什么很多網(wǎng)站的源碼里面看到引用的文件放在最后的原因。
(4)使用壓縮的css和js文件。這個不用多說,網(wǎng)絡(luò)流量小。
(5)如果條件允許,盡量使用CDN的方式引用文件,這樣就能減少網(wǎng)絡(luò)流量。比如我們常用的網(wǎng)站http://www.bootcdn.cn/。
(6)在寫js和css的語法時,盡量避免重復(fù)的css,盡量減少js里面循環(huán)的次數(shù),諸如此類。
2、后端優(yōu)化:
(1)程序的優(yōu)化:這是一個很大的話題,我這里就選幾個常見的。比如減少代碼的層級結(jié)構(gòu)、避免循環(huán)嵌套、避免循環(huán)CURD數(shù)據(jù)庫、優(yōu)化算法等等。
(2)數(shù)據(jù)庫的優(yōu)化:(由于數(shù)據(jù)庫優(yōu)化不是本題重點(diǎn),所以可選幾個主要的來說)比如啟用數(shù)據(jù)庫緩存、常用的字段建索引、盡量避免大事務(wù)操作、避免select * 的寫法、盡量不用in和not in 這種耗性能的用法等等。
(3)服務(wù)器優(yōu)化:(這個可作為可選項)負(fù)載均衡、Web服務(wù)器和數(shù)據(jù)庫分離、UI和Service分離等等。
二、MVC路由理解?(屢見不鮮)
出現(xiàn)指數(shù):五顆星
主要考點(diǎn):此題主要考點(diǎn)是MVC路由的理解。
參考答案:
1、首先我們要理解MVC中路由的作用:url Routing的作用是將瀏覽器的URL請求映射到特定的MVC控制器動作。
2、當(dāng)我們訪問http://localhost:8080/Home/Index 這個地址的時候,請求首先被UrlRoutingModule截獲,截獲請求后,從Routes中得到與當(dāng)前請求URL相符合的RouteData對象, 將RouteData對象和當(dāng)前URL封裝成一個RequestContext對象,然后從Requestcontext封裝的RouteData中得到 Controller名字,根據(jù)Controller的名字,通過反射創(chuàng)建控制器對象,這個時候控制器才真正被激活,最后去執(zhí)行控制器里面對應(yīng)的 action。
三、談?wù)勀阌X得做的不錯系統(tǒng),大概介紹下用到了哪些技術(shù)?
出現(xiàn)指數(shù):五顆星
主要考點(diǎn):這是一道非常開放的面試題。博主遇到過好幾家公司的面試官都問道了這個,博主覺得他們是想通過這個問題快速了解面試者的技術(shù)水平。此題只要結(jié)合你最近項目用到的技術(shù)談?wù)劸秃昧恕?/p>
參考答案:
就拿我之前做過的一個項目為例來簡單說明一下吧。項目分為客戶端和服務(wù)端,客戶端分 為BS客戶端和CS客戶端,BS客戶端采用MVC 5.0的框架,CS客戶端是Winform項目,服務(wù)端使用WebApi統(tǒng)一提供服務(wù)接口,考慮以后可能還要擴(kuò)展手機(jī)端,所以服務(wù)接口的參數(shù)和返回值使用 通用的Json格式來傳遞數(shù)據(jù)。
1、服務(wù)端采用的面向接口編程,我們在軟件架構(gòu)的過程中,層和層之間通過接口依賴, 下層不是直接給上層提供實現(xiàn),而是提供接口,具體的實現(xiàn)以依賴注入的方式在運(yùn)行的時候動態(tài)注入進(jìn)去。MEF就是實現(xiàn)依賴注入的一種組件。它的使用使得UI 層不直接依賴于BLL層,而是依賴于中間的一個IBLL層,在程序運(yùn)行的時候,通過MEF動態(tài)將BLL里面的實現(xiàn)注入到UI層里面去,這樣做的好處是減少 了層與層之間的耦合。服務(wù)端的異常里面、權(quán)限驗證、日志記錄等通用功能使用了AOP攔截的機(jī)制統(tǒng)一管理,項目中使用的是Postsharp這個組件,很好 地將通用需求功能從不相關(guān)的類當(dāng)中分離出來,提高了代碼的可維護(hù)性。
2、BS的客戶端采用的jquery+bootstrap 的方式,所有頁面采用流式布局,能更好適應(yīng)各種不同的終端設(shè)備(PC、手機(jī))。項目中使用了各種功能強(qiáng)大的bootstrap組件,能適應(yīng)各種復(fù)雜的業(yè)務(wù)需求。
四、Js繼承實現(xiàn)。
出現(xiàn)指數(shù):五顆星
主要考點(diǎn):這道題考驗面試者對js理解的深度。根據(jù)博主的經(jīng)歷,這種題一般在筆試出現(xiàn)的幾率較大,為什么把它放在這里,因為它確實太常見了。其實js實現(xiàn)繼承的方式很多,我們只要寫好其中一種就好了。
參考答案:原型鏈繼承
- 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();
五、談?wù)勀銓υO(shè)計模式的認(rèn)識?結(jié)合你用得最多的一種設(shè)計模式說說它的使用。
出現(xiàn)指數(shù):五顆星
主要考點(diǎn):不用多說,這題考的就是對設(shè)計模式的理解。一般為了簡單可能會要求你寫一個單例模式,注意最好是寫一個完整點(diǎn)的,考慮線程安全的那種。然后會讓你說說你在項目中什么情況下會用到這種模式
參考答案:
通用寫法
- public class Singleton
- {
- // 定義一個靜態(tài)變量來保存類的實例
- private static Singleton uniqueInstance;
- // 定義一個標(biāo)識確保線程同步
- private static readonly object locker = new object();
- // 定義私有構(gòu)造函數(shù),使外界不能創(chuàng)建該類實例
- private Singleton()
- {
- }
- /// <summary>
- /// 定義公有方法提供一個全局訪問點(diǎn),同時你也可以定義公有屬性來提供全局訪問點(diǎn)
- /// </summary>
- /// <returns></returns>
- public static Singleton GetInstance()
- {// 雙重鎖定只需要一句判斷就可以了
- if (uniqueInstance == null)
- {
- lock (locker)
- {
- // 如果類的實例不存在則創(chuàng)建,否則直接返回
- if (uniqueInstance == null)
- {
- uniqueInstance = new Singleton();
- }
- }
- }
- return uniqueInstance;
- }
- }
單例模式確保一個類只有一個實例,并提供一個全局訪問點(diǎn),它的使用場景比如任務(wù)管理 器整個系統(tǒng)中應(yīng)該只有一個把,再比如操作文件的對象,同一時間我們只能有一個對象去操作文件吧。最重要的,比如我們項目中用得非常多的功能→日志記錄,在 一個線程中,記錄日志的對象應(yīng)該也只能有一個吧。單例模式的目的是為了保證程序的安全性和數(shù)據(jù)的唯一性?;蛘吣阋部梢越Y(jié)合你使用的其他設(shè)計模式來說明。
六、IIS的工作原理?
出現(xiàn)指數(shù):四顆星
主要考點(diǎn):此題主要考的是.net framework和IIS是如何結(jié)合呈現(xiàn)頁面的。這是一個有點(diǎn)復(fù)雜的過程,面試的時候不可能說得完整,那么我們就抓住幾個關(guān)鍵點(diǎn)說說就可以。其實博主也不能完全理解這個過程,今天正好借這個機(jī)會溫習(xí)下。
參考答案:
1、當(dāng)客戶端發(fā)送HTTP Request時,服務(wù)端的HTTP.sys(可以理解為IIS的一個監(jiān)聽組件) 攔截到這個請求;
2、HTTP.sys 聯(lián)系 WAS 向配置存儲中心請求配置信息。
3、然后將請求傳入IIS的應(yīng)用程序池。
4、檢查請求的后綴,啟動aspnet_isapi.dll這個dll,這個dll是.net framework里面的,也就是說到這一步,請求進(jìn)入了.net framework的管轄范圍。
5、這個時候如果是WebForm,開始執(zhí)行復(fù)雜的頁面生命周期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);如果是MVC,則啟動mvc的路由機(jī)制,根據(jù)路由規(guī)則為URL來指定HttpHandler。
6、httpHandler處理請求后,請求結(jié)束,給出Response,客戶端處理響應(yīng),整個過程結(jié)束。
七、Http協(xié)議
出現(xiàn)指數(shù):四顆星
主要考點(diǎn):此題主要考對于web里面http協(xié)議的理解。
參考答案:
1、http協(xié)議是瀏覽器和服務(wù)器雙方共同遵循的規(guī)范,是一種基于TCP/IP應(yīng)用層協(xié)議。
2、http是一種典型的請求/響應(yīng)協(xié)議??蛻舳税l(fā)送請求,請求的內(nèi)容以及參數(shù)存放到請求報文里面,服務(wù)端收到請求后,做出響應(yīng),返回響應(yīng)的結(jié)果放到響應(yīng)報文里面。通過F12可以查看請求報文和響應(yīng)報文。
3、http協(xié)議是”無狀態(tài)”的,當(dāng)客戶端向服務(wù)端發(fā)送一次http請求后,服務(wù)端收到請求然后返回給客戶端相應(yīng)的結(jié)果,服務(wù)器會立即斷開連接并釋放資源。在實際開發(fā)過程中,我們有時需要“保持”這種狀態(tài),所以衍生出了Session/Cookie這些技術(shù)。
4、http請求的方式主要有g(shù)et/post。
5、http狀態(tài)碼最好記幾個,博主有一次面試就被問到了。200(請求成功)、404(請求的資源不存在)、403(禁止訪問)、5xx(服務(wù)端錯誤)
八、數(shù)據(jù)庫優(yōu)化經(jīng)驗(后端工程師非常常見)
出現(xiàn)指數(shù):四顆星
主要考點(diǎn):此題考察后端工程師操作數(shù)據(jù)庫的經(jīng)驗。說實話,數(shù)據(jù)庫是博主的弱項,博主覺得對于這種考題,需要抓住幾個常用并且關(guān)鍵的優(yōu)化經(jīng)驗,如果說得不對,歡迎大家斧正。
參考答案:
1、數(shù)據(jù)庫運(yùn)維方面的優(yōu)化:啟用數(shù)據(jù)庫緩存。對于一些比較常用的查詢可以采用數(shù)據(jù)庫緩存的機(jī)制,部署的時候需要注意設(shè)置好緩存依賴項,防止“過期”數(shù)據(jù)的產(chǎn)生。
2、數(shù)據(jù)庫索引方面的優(yōu)化:比如常用的字段建索引,聯(lián)合查詢考慮聯(lián)合索引。(PS:如果你有基礎(chǔ),可以敞開談?wù)劸奂饕头蔷奂饕氖褂脠鼍昂蛥^(qū)別)
3、數(shù)據(jù)庫查詢方面的優(yōu)化:避免select * 的寫法、盡量不用in和not in 這種耗性能的用法等等。
4、數(shù)據(jù)庫算法方面的優(yōu)化:盡量避免大事務(wù)操作、減少循環(huán)算法,對于大數(shù)據(jù)量的操作,避免使用游標(biāo)的用法等等。
九、關(guān)于代碼優(yōu)化你怎么理解?你會考慮去代碼重構(gòu)嗎?
出現(xiàn)指數(shù):四顆星
主要考點(diǎn):此題考的是面試者對代碼優(yōu)化的理解,以及代碼如何重構(gòu)的相關(guān)知識。
參考答案:
1、對于代碼優(yōu)化,之前的公司每周會做代碼審核,審核的主要作用就是保證代碼的正確性和執(zhí)行效率,比如減少代碼的層級結(jié)構(gòu)、避免循環(huán)嵌套、避免循環(huán)CURD數(shù)據(jù)庫、盡量避免一次取出大量數(shù)據(jù)放在內(nèi)存中(容易內(nèi)存溢出)、優(yōu)化算法等。
2、對于陳舊代碼,可能很多地方有調(diào)用,并且開發(fā)和維護(hù)人員很有可能不是同一個人,所以重構(gòu)時要格外小心,如果沒有十足的把握,不要輕易重構(gòu)。如果必須要重構(gòu),必須做好充分的單元測試和全局測試。
十、談?wù)勀愕膬?yōu)點(diǎn)和缺點(diǎn)?
出現(xiàn)指數(shù):四顆星
主要考點(diǎn):這道題讓人有一種罵人的沖動,但是沒辦法,偏偏很多所謂的大公司會問這個。比如華為。這個問題見仁見智,答案可以自己組織。
參考答案:
優(yōu)點(diǎn):對于新的技術(shù)學(xué)習(xí)能力強(qiáng),能很快適應(yīng)新環(huán)境等等
缺點(diǎn):對技術(shù)太過于執(zhí)著等等
十一、關(guān)于服務(wù)器端 MVC 架構(gòu)的技術(shù)實現(xiàn),您是怎樣理解的?這種架構(gòu)方式有什么好處?您在項目中是如何應(yīng)用這一架構(gòu)的?
出現(xiàn)指數(shù):三顆星
主要考點(diǎn):此題主要考的對于MVC這種框架的理解。
參考答案:MVC,顧名思義,Model、View、Controller。所有的 界面代碼放在View里面,所有涉及和界面交互以及URL路由相關(guān)的邏輯都在Controller里面,Model提供數(shù)據(jù)模型。MVC的架構(gòu)方式會讓系 統(tǒng)的可維護(hù)性更高,使得每一部分更加專注自己的職責(zé),并且MVC提供了強(qiáng)大的路由機(jī)制,方便了頁面切換和界面交互。然后可以結(jié)合和WebForm的比較, 談?wù)凪VC如何解決復(fù)雜的控件樹生成、如何避免了復(fù)雜的頁面生命周期。
十二、網(wǎng)站優(yōu)化:網(wǎng)站運(yùn)行慢,如何定位問題?發(fā)現(xiàn)問題如何解決?
出現(xiàn)指數(shù):三顆星
主要考點(diǎn):此題和問題一類似,考察Web的問題定位能力和優(yōu)化方案。
參考答案:
瀏覽器F12→網(wǎng)絡(luò)→查看http請求數(shù)以及每個請求的耗時,找到問題的根源,然后依次解決,解決方案可以參考問題一里面的Web優(yōu)化方案。
十三、說說你最擅長的技術(shù)?并說說你是如何使用的?
出現(xiàn)指數(shù):三顆星
主要考點(diǎn):這是一道非常開放的面試題。最初遇到這種問題,博主很想來一句:你妹,這叫什么問題!但確實有面試官問到?;仡^想想,其實此題考查你擅長的技術(shù)的涉及深度。其實博主覺得對于這個問題,可以結(jié)合你項目中用到的某一個技術(shù)來說就好了。
參考答案:
簡單談?wù)凪EF在我們項目里面的使用吧。
在談MEF之前,我們必須要先談?wù)凞IP、IOC、DI
依賴倒置原則(DIP):一種軟件架構(gòu)設(shè)計的原則(抽象概念)
控制反轉(zhuǎn)(IoC):一種反轉(zhuǎn)流、依賴和接口的方式(DIP的具體實現(xiàn)方式)。
依賴注入(DI):IoC的一種實現(xiàn)方式,用來反轉(zhuǎn)依賴(IoC的具體實現(xiàn)方式)。
什么意思呢?也就是說,我們在軟件架構(gòu)的過程中,層和層之間通過接口依賴,下層不是 直接給上層提供實現(xiàn),而是提供接口,具體的實現(xiàn)以依賴注入的方式在運(yùn)行的時候動態(tài)注入進(jìn)去。MEF就是實現(xiàn)依賴注入的一種組件。它的使用使得UI層不直接 依賴于BLL層,而是依賴于中間的一個IBLL層,在程序運(yùn)行的時候,通過MEF動態(tài)將BLL里面的實現(xiàn)注入到UI層里面去,這樣做的好處是減少了層與層 之間的耦合。這也正是面向接口編程方式的體現(xiàn)。
十四、自己寫過JS組件嗎?舉例說明。
出現(xiàn)指數(shù):三顆星
主要考點(diǎn):此題考的js組件封裝和js閉包的一些用法。一般來說,還是筆試出現(xiàn)的幾率較大。
參考答案:自定義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'
- });
就能自動從后臺取數(shù)據(jù),注意valueField和textField對應(yīng)要顯示和實際值。
十五、自己寫過多線程組件嗎?簡要說明!
出現(xiàn)指數(shù):三顆星
主要考點(diǎn):此題是兩年前博主在攜程的一次電話面試中遇到的,其他地方基本上沒遇到過,其實到現(xiàn)在也不能理解當(dāng)時面試官問這個問題的目的。但我想,此問題必有出處,估計面試官是想了解你對多線程以及線程池等的理解深度。
參考答案:可以參考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html
以上就是博主根據(jù)自己的理解做的一些總結(jié),如果有不對的地方,歡迎指出。當(dāng)然,如果園友們覺得還有哪些沒涉及到但是出現(xiàn)頻率非常高的面試題,歡迎提出,大家一起討論,一起進(jìn)步。如果文章或多或少能夠幫到你,請幫忙推薦吧,千萬不要客氣~~