原文引用:https://m.sanwen8.cn/p/104gMSd.htmljavascript
1、对于 Web 性能优化,您有哪些了解和经验吗?css
出现指数:五颗星html
主要考点:这道题是博主在博客园的新闻里面看到的,回想以前几年的面试经历,发现此题出现几率仍是比较高的。由于它的考面灰常广,可让面试官很快了解你的技术涉及面以及这些技术面的深度。前端
参考答案:这个问题能够分前端和后端来讲。java
一、前端优化jquery
(1)减小 HTTP 请求的次数。咱们知道每次发送http请求,创建链接和等待相应会花去至关一部分时间,因此在发送http请求的时候,尽可能减小请求的次数,一次请求能取出的数据就不要分屡次发送。web
(2)启用浏览器缓存,当肯定请求的数据不会发生变化时,可以直接读浏览器缓存的就不要向服务端发送请求。好比咱们ajax里面有一个参数可以设置请求的时候是否启用缓存,这种状况下就须要咱们在发送请求的时候作好相应的缓存处理。面试
(3)css文件放 在<head>里面,js文件尽可能放在页面的底部。由于请求js文件是很花费时间,若是放在<head>里面,就会致使页面的 DOM树呈现须要等待js文件加载完成。这也就是为何不少网站的源码里面看到引用的文件放在最后的缘由。ajax
(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实现继承的方式不少,咱们只要写好其中一种就行了。
参考答案:原型链继承
//1.定义Persiong函数 function Person(name, age) { this.name = name; this.age = age; } //2.经过原型链给Person添加一个方法 Person.prototype.getInfo = function () { console.log(this.name + " is " + this.age + " years old!"); } function Teacher(staffId) { this.staffId = staffId; } //3.经过prototype生命 Teacher继承Person Teacher.prototype = new Person(); //4.实例Teacher函数 var will = new Teacher(1000); will.name= "Will"; will.age = 28; //5.调用父类函数 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/159****47.html
原文地址:http://developer.51cto.com/art/201512/503102.htm