前言:年底了,骚年们有没有很鸡冻——年终奖有盼头了。之前在介绍事件的这篇 C#基础系列——再也不用担心面试官问我“事件”了 也聊到了面试,引起了很多园友的共鸣。在不久的年后,热门的跳槽季就要来了,如果你准备换工作,本篇或多或少能帮到你;如果你不打算换,没关系,看看也无妨,看看是否有那么几道题能够引起你的一点点感触;又或者你是面试官,老实交代,是否问过其中的某些~~不管你是否准备面试,用一句自嘲的话来说:工作经验可以没有,但换工作的经验咱可不能缺~~
对于一些基础的笔试和简单的面试题,博主就不照本宣科了,博客园一搜一大把:?t=b&w=.net%20%E9%9D%A2%E8%AF%95%E9%A2%98。本篇就结合博主遇到以及网上经常看到的一些面试题做一个总结。PS:由于博主用的主要编程语言是C#,所以本篇主要介绍关于.net面试中的常见问题。
一、对于 Web 性能优化,您有哪些了解和经验吗?出现指数:五颗星
主要考点:这道题是博主在博客园的新闻里面看到的,回想之前几年的面试经历,发现此题出现概率还是比较高的。因为它的考面灰常广,可以让面试官很快了解你的技术涉及面以及这些技术面的深度。
参考答案:这个问题可以分前端和后端来说。
1、前端优化
(1)减少 HTTP 请求的次数。我们知道每次发送http请求,建立连接和等待相应会花去相当一部分时间,所以在发送http请求的时候,尽量减少请求的次数,一次请求能取出的数据就不要分多次发送。
(2)启用浏览器缓存,当确定请求的数据不会发生变化时,能够直接读浏览器缓存的就不要向服务端发送请求。比如我们ajax里面有一个参数能够设置请求的时候是否启用缓存,这种情况下就需要我们在发送请求的时候做好相应的缓存处理。
(3)css文件放在<head>里面,js文件尽量放在页面的底部。因为请求js文件是很花费时间,如果放在<head>里面,就会导致页面的DOM树呈现需要等待js文件加载完成。这也就是为什么很多网站的源码里面看到引用的文件放在最后的原因。
(4)使用压缩的css和js文件。这个不用多说,网络流量小。
(5)如果条件允许,尽量使用CDN的方式引用文件,这样就能减少网络流量。比如我们常用的网站。
(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、当我们访问: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();
五、谈谈你对设计模式的认识?结合你用得最多的一种设计模式说说它的使用。出现指数:五颗星
主要考点:不用多说,这题考的就是对设计模式的理解。一般为了简单可能会要求你写一个单例模式,注意最好是写一个完整点的,考虑线程安全的那种。然后会让你说说你在项目中什么情况下会用到这种模式
参考答案:
通用写法