一些基础的笔试和简单的面试题,博主不照本宣科。本文对博主在网上经常遇到和经常看到的一些面试题做一个总结。PS:由于博主主要使用的编程语言是C#,所以本文主要介绍.net面试的常见问题。1、您对web性能优化有哪些了解和经验?出镜指数:五颗星主要考点:这道题是博主在博客园的新闻里看到的。回顾这几年的面试经历,发现这个问题出现的概率还是比较高的。因为它的考察面很广,可以让面试官很快了解你的技术方面,以及这些技术方面的深度。参考答案:本题分为前端和后端。1.前端优化(1)减少HTTP请求次数。我们知道每次发送http请求都会花费相当长的时间来建立连接和等待响应,所以在发送http请求的时候尽量减少请求的次数,并且做到不要发送多个请求中可以检索的数据。(2)启用浏览器缓存。当确定请求的数据不会改变时,如果可以直接读取浏览器缓存,就不要向服务器发送请求。比如我们的ajax中有一个参数可以设置请求时是否开启缓存。在这种情况下,我们需要在发送请求时做好缓存工作。(3)css文件放在
中,js文件尽量放在页面底部。因为请求js文件需要很多时间,如果放在中,会导致页面的DOM树渲染等待js文件加载。这就是为什么很多网站的源代码最后看到引用文件的原因。(4)使用压缩的css和js文件。不用说,网络流量很小。(5)如果条件允许,尽量使用CDN引用文件,可以减少网络流量。比如我们常用的网站http://www.bootcdn.cn/。(6)写js和css的语法时,尽量避免css重复,尽量减少js的循环次数等。2.后端优化:(1)程序优化:这是一个很大的话题,这里我就挑几个比较常见的。比如减少代码层次结构,避免循环嵌套,避免循环CURD数据库,优化算法等等。(2)数据库优化:(由于数据库优化不是本题的重点,可以选几个主要的)比如开启数据库缓存,为常用字段建立索引,尽量避免大事务操作,避免写法select*,尽量不要使用in和notin的使用,会消耗性能等等。(3)服务器优化:(这个可以作为选项)负载均衡,Web服务器和数据库分离,UI和Service分离等。二、MVC路由理解?(并不少见)颜值指数:五颗星主考点:本题主要考点是对MVC路由的理解。参考答案:1、首先我们要了解路由在MVC中的作用:url路由的作用是将浏览器的URL请求映射到具体的MVC控制器动作。2、当我们访问地址http://localhost:8080/Home/Index时,请求首先被UrlRoutingModule拦截。请求被拦截后,从Routes中获取匹配当前请求URL的RouteData对象,并将RouteData对象和当前的URL封装成一个RequestContext对象,再从Requestcontext中封装的RouteData中获取Controller名称。根据Controller名称,通过反射创建控制器对象。这个时候controller才真正被激活,最后执行controller中对应的action。3、说说你觉得做的不错的系统,简单介绍下使用了哪些技术?颜值指数:五颗星主要考点:这是一道很开放的面试题。博主遇??到过几家公司的面试官,都问过这个问题。博主认为他们是想通过这个问题快速了解面试官的技术水平。这个问题就结合你最近的项目用到的技术说一下吧。参考答案:以我之前做的一个项目为例简单说明一下。项目分为客户端和服务端。客户端分为BS客户端和CS客户端。BS客户端采用MVC5.0架构。CS客户端是一个Winform项目。服务端使用WebApi提供统一的服务接口。对移动端进行扩展,服务接口的参数和返回值使用通用的Json格式传递数据。1、服务器端采用面向接口的编程方式。在软件架构过程中,我们依赖层与层之间的接口。下层不直接向上层提供实现,而是提供接口。具体实现以依赖注入的方式运行。当动态注入其中时。MEF是一个实现依赖注入的组件。它的使用使得UI层不直接依赖于BLL层,而是依赖于中间的一个IBLL层。程序运行时,BLL中的实现通过MEF动态注入到UI层。这样做的好处是减少层与层之间的耦合。服务端异常、权限验证、日志记录等常用功能使用AOP拦截机制统一管理。项目中使用了Postsharp组件,将通用功能和无关类分离,改进了代码。可维护性。2、BS客户端采用jquery+bootstrap的方式,所有页面采用流式布局,能更好的适配各种终端设备(PC、手机)。项目中使用了各种强大的bootstrap组件,可以适应各种复杂的业务需求。四、Js继承实现。颜值指数:五颗星主要考点:本题考查面试官对js的理解深度。根据博主的经验,这种题一般比较容易出现在笔试中,为什么放在这里呢,因为真的是太常见了。其实在js中实现继承的方式有很多种,我们只需要写其中一种即可。参考答案:原型链继承functionPerson(name,age){this.name=name;this.age=age;}//通过原型链Person添加一个方法Person.prototype.getInfo=function(){console.log(this.name+"is"+this.age+"yearsold!");}functionTeacher(staffId){this.staffId=staffId;}//通过原型生命继承PersonTeacherTeacher.prototype=newPerson();varwill=newTeacher(1000);will.name="Will";will.age=28;will.getInfo();五、谈谈你对设计模式的理解?结合您最常使用的一种设计模式,谈谈它的用途。外观指数:五颗星主要考点:不用说了,这道题是关于设计模式的理解。通常,为了简单起见,您可能需要编写单例模式。注意最好写一个完整的考虑线程安全的。那我就让你说说你什么时候会在项目中使用这个模式。参考答案:一般写法publicclassSingleton{//定义一个静态变量保存类的实例privatestaticSingletonuniqueInstance;//定义一个标识保证线程同步privatestaticreadonlyobjectlocker=newobject();//定义一个私有构造函数,这样外界就无法创建这个类的一个实例privateSingleton(){}///
///定义一个public方法来提供一个全局的访问点,也可以定义一个public属性来提供一个全局的访问点//////
publicstaticSingletonGetInstance(){//双重加锁只需要一次判断if(uniqueInstance==null){lock(locker){//如果类的实例不存在,则创建it,否则直接returnif(uniqueInstance==null){uniqueInstance=newSingleton();}}}returnuniqueInstance;}}单例模式保证一个类只有一个实例,并且提供全局访问点,它比如有整个系统中应该只有一个任务管理器em,再比如就是操作文件的对象。同时,我们只能有一个对象来操作文件。最重要的是,比如我们项目中用的比较多的函数→logging,在一个线程中,应该只有一个logging对象。单例模式的目的是保证程序的安全性和数据的唯一性。或者你也可以将它与你用来说明的其他设计模式结合起来。6.IIS是如何工作的?外观指数:四星主要考点:本题主要考查.netframework和IIS如何结合呈现页面。这是一个有些复杂的过程,在采访的时候不可能说得完整,所以我们只能抓住几个重点说一下。其实博主也无法完全理解这个过程,所以今天正好借此机会回顾一下。参考答案:1、当客户端发送HTTPRequest时,服务器端的HTTP.sys(可以理解为IIS的一个监听组件)拦截该请求;2、HTTP.sys联系WAS向配置存储中心请求配置信息。3、然后将请求传递给IIS的应用程序池。4、检查请求的后缀,启动.netframework中的dllaspnet_isapi.dll,也就是说,此时请求已经进入了.netframework的管辖范围。5、此时如果是WebForm,则开始执行复杂的页面生命周期(HttpRuntime→ProcessRequest→HttpContext→HttpHandler);如果是MVC,则启动mvc的路由机制,根据路由规则为URL指定HttpHandler。6、httpHandler处理完请求后,请求结束,给出Response,client处理response,整个流程结束。7、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(服务器错误)八、数据库优化经验(后端工程师很常见)外观指数:四星主要考点:这个question调查后端工程师操作数据库的经验。说实话,数据库是博主的软肋。博主觉得对于这类考题,有必要掌握几个常见的、关键的优化经验。如有不妥,欢迎大家指正。参考答案:1、数据库运维优化:启用数据库缓存。对于一些比较常用的查询,可以使用数据库缓存机制。部署时需要注意设置缓存依赖,防止产生“过时”数据。2、数据库索引优化:比如对公共字段进行索引,联合查询考虑联合索引。(PS:有基础的可以大方说说聚集索引和非聚集索引的使用场景和区别)3、数据库查询优化:避免select*的写法,尽量不要用in和notin4.数据库算法优化:尽量避免大事务操作,减少循环算法,避免使用游标进行大数据量的操作等。9.你是如何理解代码优化的?你会考虑代码重构吗?颜值指数:四颗星主要考点:该题考查面试官对代码优化的理解和重构代码的知识。参考答案:1.代码优化,之前公司每周都会进行codereview。review的主要作用是保证代码的正确性和执行效率,比如减少代码的层次结构,避免循环嵌套,避免循环CURD数据库,尽量避免一次取出大量数据并存储在内存中(容易内存溢出),优化算法等。2.对于老代码,可能有很多地方调用,开发者和维护者可能不是同一个人,重构的时候要格外小心。如果不确定,请不要轻易重构。如果需要重构,则必须进行充分的单元测试和全局测试。10.说说你的优点和缺点?颜值指数:四星主要考点:这个问题让人有想骂人的冲动,但是没办法,但是很多所谓的大公司都会问这个问题。比如华为。这个问题不同的人有不同的看法,答案可以自己整理。参考答案:优点:对新技术的学习能力强,能快速适应新环境等缺点:过于迷恋技术等十一.如何理解服务端MVC架构的技术实现?这种架构方法有什么好处?你是如何在你的项目中应用这种架构的?颜值指数:三颗星主要考点:本题主要考查对MVC框架的理解。参考答案:MVC,顾名思义,Model、View、Controller。所有界面代码都放在View中,所有与界面交互和URL路由相关的逻辑都放在Controller中,Model提供数据模型。MVC架构将使系统更易于维护,使每个部分更专注于自己的职责,并且MVC提供了强大的路由机制,方便页面切换和界面交互。那么可以结合和WebForm的对比,谈谈MVC如何解决复杂的控件树生成,如何避免复杂的页面生命周期。12、网站优化:网站运行缓慢,如何定位问题?如何解决问题?出镜指数:三颗星主要考点:本题与第1题类似,考察Web的问题定位能力和优化方案。参考答案:浏览器F12→网络→查看http请求次数和每次请求耗时,找到问题根源,然后一一解决。解决方法可以参考问题1中的Web优化解决方法。13.说说你最擅长的技术?并告诉我你是如何使用它的?颜值指数:三颗星主要考点:这是一道很开放的面试题。第一次遇到这种问题的时候,博主真的很想说:你妹这是什么问题啊!但有些面试官确实问了。回过头来看,其实这道题考察的是你所擅长的技术的深度。其实博主觉得对于这个问题,可以结合自己项目中使用的某项技术。参考答案:简单说一下MEF在我们项目中的使用。在说MEF之前,我们必须先说说DIP、IOC、DIDependencyInversionPrinciple(DIP):软件架构设计的一个原则(抽象概念)InversionofControl(IoC):一种反向流、依赖和接口的方式(DIP的具体实现)。DependencyInjection(DI):IoC的一种实现,用于反转依赖(IoC的具体实现)。这意味着什么?也就是说,在软件架构过程中,层次依赖于接口。下层不直接向上层提供实现,而是提供接口。具体实现以依赖注入的形式在运行时动态注入。MEF是一个实现依赖注入的组件。它的使用使得UI层不直接依赖于BLL层,而是依赖于中间的一个IBLL层。程序运行时,BLL中的实现通过MEF动态注入到UI层。这样做的好处是减少层与层之间的耦合。这正是面向接口编程的体现。14、你自己写过JS组件吗?例如。外观指数:三颗星主要考点:本题测试的js组件封装和js闭包的一些用法。一般来说,出现在笔试中的概率较高。参考答案:selectcomponentofcustomhtml//combobox(function($){$.fn.combobox=function(options,param){if(typeofoptions=='string'){return$.fn.combobox.methods[options](this,param);}options=$.extend({},$.fn.combobox.defaults,options||{});vartarget=$(this);target.attr('valuefield',options.valueField);target.attr('textfield',options.textField);target.empty();varoption=$('
');option.attr('value','');选项。text(options.placeholder);target.append(option);if(options.data){init(target,options.data);}else{//varparam={};options.onBeforeLoad.call(target,option.param);if(!options.url)return;$.getJSON(options.url,option.param,function(data){init(target,data);});}functioninit(target,data){$.each(data,function(i,item){varoption=$('
');option.attr('value',item[options.valueField]);option.text(item[options.textField]);target.append(选项);});options.onLoadSuccess.call(target);}target.unbind("更改");target.on("改变”,函数(e){if(options.onChange)returnoptions.onChange(target.val());});}$.fn.combobox.methods={getValue:function(jq){returnjq.val();},setValue:function(jq,param){jq.val(param);},load:function(jq,url){$.getJSON(url,function(data){jq.empty();varoption=$('
');option.attr('value','');option.text('请选择');jq.append(option);$.each(data,function(i,item){varoption=$('
');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:'Pleaseselect',onBeforeLoad:function(param){},onLoadSuccess:function(){},onChange:function(value){}};})(jQuery);当调用$("#sel_search_orderstatus").combobox({url:'/apiaction/Order/OrderApi/GetOrderStatu',valueField:'VALUE',textField:'NAME'});可以后台自动取数据,注意对应关系值字段和要显示的文本字段和实际值15.你自己写多线程组件吗?简要说明!出镜指数:三颗星主要考点:这个问题是博主两年前在携程电话面试时遇到的,其他地方基本没遇到过。其实当时我还是不能理解面试官问这个问题的目的。但我认为这个问题必须有一个来源。估计面试官想知道你对多线程和线程池的理解深度。参考答案:可以参考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/1593647.html以上是博主根据自己的理解做的一些总结。如有不妥欢迎指出。当然,如果园友觉得有一些没有涉及但出现频率很高的面试题,欢迎提出来,一起讨论,共同进步。如果文章或多或少能帮到你,请帮忙推荐一下,不要客气~~