.NET高级软件工程师面试题排行榜(转载)

原文引用:https://m.sanwen8.cn/p/104gMSd.html

一、对于 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实现继承的方式很多,我们只要写好其中一种就好了。

参考答案:原型链继承

  1. function Person(name, age){
  2. this.name = name;
  3. this.age = age;
  4. }
  5. //通过原型链给Person添加一个方法
  6. Person.prototype.getInfo = function(){
  7. 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;
  8. will.getInfo();

五、谈谈你对设计模式的认识?结合你用得最多的一种设计模式说说它的使用。

出现指数:五颗星

主要考点:不用多说,这题考的就是对设计模式的理解。一般为了简单可能会要求你写一个单例模式,注意最好是写一个完整点的,考虑线程安全的那种。然后会让你说说你在项目中什么情况下会用到这种模式

参考答案:

通用写法

  1. public class Singleton
  2. {
  3. // 定义一个静态变量来保存类的实例
  4. private static Singleton uniqueInstance;
  5. // 定义一个标识确保线程同步
  6. private static readonly object locker = new object();
  7. // 定义私有构造函数,使外界不能创建该类实例
  8. private Singleton()
  9. {
  10. }
  11. /// <summary>
  12. /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
  13. /// </summary>
  14. /// <returns></returns>
  15. public static Singleton GetInstance()
  16. {// 双重锁定只需要一句判断就可以了
  17. if (uniqueInstance == null)
  18. {
  19. lock (locker)
  20. {
  21. // 如果类的实例不存在则创建,否则直接返回
  22. if (uniqueInstance == null)
  23. {
  24. uniqueInstance = new Singleton();
  25. }
  26. }
  27. }
  28. return uniqueInstance;
  29. }
  30. }

单例模式确保一个类只有一个实例,并提供一个全局访问点,它的使用场景比如任务管理 器整个系统中应该只有一个把,再比如操作文件的对象,同一时间我们只能有一个对象**作文件吧。最重要的,比如我们项目中用得非常多的功能→日志记录,在 一个线程中,记录日志的对象应该也只能有一个吧。单例模式的目的是为了保证程序的安全性和数据的唯一性。或者你也可以结合你使用的其他设计模式来说明。

六、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组件

  1. //combobox
  2. (function ($) {
  3. $.fn.combobox = function (options, param) {
  4. if (typeof options == ‘string‘) {
  5. return $.fn.combobox.methods[options](this, param);
  6. }
  7. options = $.extend({}, $.fn.combobox.defaults, options || {});
  8. var target = $(this);
  9. target.attr(‘valuefield‘, options.valueField);
  10. target.attr(‘textfield‘, options.textField);
  11. target.empty();
  12. var option = $(‘<option></option>‘);
  13. option.attr(‘value‘, ‘‘);
  14. option.text(options.placeholder);
  15. target.append(option);
  16. if (options.data) {
  17. init(target, options.data);
  18. }
  19. else {
  20. //var param = {};
  21. options.onBeforeLoad.call(target, option.param);
  22. if (!options.url) return;
  23. $.getJSON(options.url, option.param, function (data) {
  24. init(target, data);
  25. });
  26. }
  27. function init(target, data) {
  28. $.each(data, function (i, item) {
  29. var option = $(‘<option></option>‘);
  30. option.attr(‘value‘, item[options.valueField]);
  31. option.text(item[options.textField]);
  32. target.append(option);
  33. });
  34. options.onLoadSuccess.call(target);
  35. }
  36. 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) { }
  37. };
  38. })(jQuery);

调用的时候

  1. $("#sel_search_orderstatus").combobox({
  2. url: ‘/apiaction/Order/OrderApi/GetOrderStatu‘,
  3. valueField: ‘VALUE‘,
  4. textField: ‘NAME‘
  5. });

就能自动从后台取数据,注意valueField和textField对应要显示和实际值。

十五、自己写过多线程组件吗?简要说明!

出现指数:三颗星

主要考点:此题是两年前博主在携程的一次电话面试中遇到的,其他地方基本上没遇到过,其实到现在也不能理解当时面试官问这个问题的目的。但我想,此问题必有出处,估计面试官是想了解你对多线程以及线程池等的理解深度。

参考答案:可以参考http://www.cnblogs.com/Alexander-Lee/archive/2009/10/31/159****47.html

原文地址:http://developer.51cto.com/art/201512/503102.htm

时间: 2024-10-24 14:15:59

.NET高级软件工程师面试题排行榜(转载)的相关文章

Java高级软件工程师面试题

Java 软件高级工程师笔试题 [智力部分](30分) 1. 烧一根不均匀的绳要用一个小时,如何用它来判断半个小时?(5分) 两头同时烧 2. 4,4,10,10,加减乘除,怎么出24点?四个数字分别只能用一次(5分) (10*10-4)/4 3. 如果你有无穷多的水,一个容积为3L的和5L的提桶,你如何准确称出 4L的水?(5分) 第一步:向5L的通中放两次3L水,这时3L水桶剩1L水. 第二步:将3L水桶中的1L水倒入5L的水桶中,这时5L的水桶中有1L水. 第三步:再用3L水桶盛满水全部倒

Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driver/mvc 等) 2 1.2. 高级概念(lambda,闭包closure,fp,dsl ) 2 1.3. 元编程MOP  Annotation/attributi 2 1.4. 规则引擎and jbpm 2 1.5. 自己的框架and工具的 2 1.6. 自己的输入法 2 1.7. Uapi 3

JAVA软件工程师笔试试题

JAVA软件工程师笔试试题 (考试时间:120分钟 试卷分值:150分 ) 一. 逻辑推理题[10分] 1.甲.乙.丙.丁四位同学中有一位同学为海啸灾区捐款1000元,当老师询问时,他们分别这样回答: 甲:这1000元不是我捐的 乙:这1000元是丁捐的 丙:这1000元是乙捐的 丁:这1000元不是我捐的 这四人中只有一个人说了真话,由此可见这1000元是谁捐的( ).[2分] A.甲 B.乙 C.丙 D.丁 2. 甲.乙.丙三人是同一家公司的员工,他们的未婚妻A.B.C也都是这家公司的职员.

高级软件测试工程师笔试题

1.某目录下所有文件统一批量修改ip 2.获取登陆者自身ip 3.删除某目录下小于10b的文件 4.通过Linux执行MySQL脚本 5.监控某Java进程下所有线程数 6.QTP.watir与selenium的优劣对比 7.什么是回归测试,侧重点是什么 8.什么是场景下考虑性能测试 9.简述安全测试流程 10.a.建class表包括name,id b.插name=wonter,id=1到class表 c.查询id<2的所有名称 d.将以上操作通过存储过程形式写出 e.执行该存储过程 答案一周后

2014年java软件工程师面试题收集

假设页面中于五个li标签,写个js使点击每一个li返回他的index <!doctype html> <html> <head> <style> li{cursor:pointer;list-style:none;float:left;width:50px;height:30px;border: solid 1px #7D899E;padding-left:10px;} </style> <script type="text/ja

成为高级软件工程师的10个步骤

What 软件工程师的职业生涯要历经以下几个阶段:初级.中级,最后才是高级.这篇文章主要是讲如何通过 10 个步骤助你成为一名高级软件工程师. Why 得到更多的报酬!因为你的薪水会随着你水平的提高而增加 提升你的职业生涯.成为了高级软件工程师之后,就可以朝着架构师.团队负责人.CTO 等职位前进 历经更大的挑战.随着你的成长,各种影响力也会提高. How 软件工程是很难的.这一行业在不断变化中,所以你必须紧跟它的步伐.你必须不断地投入时间和精力,因为你需要学习的东西总是比你能吸收的多.很多新手

高级软件工程师和架构师的区别(转)

架构师 倾向于 通信 . 通信框架 .队列和 分布式框架运用以及阿里云和微软现有分布式组件的运用. 高级软件工程师 倾向于 C#基础. 多线程.锁和数据库索引 (队列和通信也会问只是会问的浅一些) 研发经理 包含高级软件工程师问的这些外,还会问管理方面的知识 我面试的三家公司分别面试了三个职位,将知识点进行了一个表格整理,分值越高就意味着问的越深,不能百度之百准确,只当参考. 职位 C#基础 通信 缓存和队列 数据库索引 数据库锁事务 前端 多线程 数据结构 管理 自我介绍 大数据方案 常用框架

问题集录--Java高级软件工程师面试考纲(转)

如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对Java高级开发工程师职位的考核纲要,希望可以帮助到需要的人. 当前,市面上有<Java XX宝典>类似的图书,而且图书中的内容都着重在讲解Java最为基础的部分,最严重的是,里面有着大量错误的内容,极具误导性.另外,网上也有各种各样的Java面试题,很多也是着重在Java语言基础上.实际上,如果

高级软件工程师试题B

一.          单选题(每题1分,共70分) 以下哪个表述不正确___D___. A.ARM是一个公司的名称 B.ARM是对一类微处理器的通称 C.ARM是一种技术的名字 D.ARM是一款芯片的名称 ( D ) 命令是在vi编辑器中执行保存退出. A  :q B  ZZ C  :q! D  :wq GCC的正确编译流程为 ( A ) . A 预处理-编译-汇编-链接 B 预处理-编译-链接-汇编 C 预处理-链接-编译-汇编 D 编译-预处理-汇编-链接 下列命令中,删除文件的命令是:_