咱们组的开发人力一直比较紧张,今年春节后,高层终于给了几个headcount,咱们能够开始招人了。从三月初咱们就开始找简历,渠道有拉钩,内推,我司本身的招聘网站和智联等。简历筛了不少,也打了不少电话,叫过来面试了不少人,但是到目前为止,已经三个月了,咱们只招到了两我的,这两我的都是内推来的。html
我负责第一次电话面试,若是电话面试以为能够,咱们会叫过来 作一份笔试题,而后我会针对笔试题再进行提问。咱们想要招聘的,是一批中级.net开发工程师,工做经验最好在3到6年,在这三个月的面试过程当中,这些候选者鲜有我以为满意的。因此我就想,做为工做了3到6年的.NETer,到底应该掌握哪些知识。c++
我负责的电话面试和笔试,着重考察.NET基本概念和基础知识,不涉及任何项目经验。在电话面试时,我问的第一个问题就是介绍一下.NET的类型系统,不过很遗憾的是,不少候选者在听到“类型系统”这个词后,彻底不知道个人发问点在哪里,他们并不知道“类型系统”指的究竟是什么,因此我不得不换个提问方式,转而问“什么是引用类型什么是值类型,有什么区别“,后者的问法,只是前者的一个子集而已。从.NET类型系统,能够发问.NET如何实现跨语言开发,全部类型的共同父类是什么,为何要分引用类型和值类型,堆和栈的区别,装箱拆箱等等一系列问题,遗憾的是到目前为止尚未人可以说出我想要的答案。关于引用类型和值类型,候选人的回答也是五花八门的,有些人根本没听所过这两个术语,有些人听过,可是搞不清楚栈和堆的区别。而大部分的人,则彻底不清楚拆箱和装箱的概念。让我感到吃惊的是,不少人认为拆箱装箱就是父类型和子类型之间的类型转换。最近面试的一个有10年经验的.net开发者,居然认为装箱拆箱与反射有关。web
除去考察类型系统,我电话里还会问到泛型,委托,linq,多线程编程,异步。遗憾的是大部分候选者对于这些在.NET编程中常常用到的技术掌握的也并很差,这几个发问点里,可能多线程和异步编程的问题会有点难度,不过我认为做为一个有五年左右工做经验的人,理应掌握一些多线程和异步编程的技能。当我问道大部分候选者关于多线程和异步编程的问题时,他们都会回答工做中没有用到过因此不清楚,在我看来这根本不是理由。而前三个发问点:泛型,委托,linq,则是很是基本的.NET编程技能,可是不少人仅限于用过,可是却从未进行过一丁点的思考过,为何.NET要引入泛型,委托和linq,引入它们是为了解决什么样的问题,关于它们的实现原理大体是什么样子的。面试
在笔试题中,咱们会考察进程线程的基本概念,ado.net的使用,闭包,简单的设计模式。遗憾的是,不少人并不能描述清楚进程的概念。在orm大行其道的今天,不少.NETer已经不知道如何使用原始的ADO.NET来访问数据库了,有些工做了五年的候选者从未据说过闭包,有些人没法画出经典设计模式的uml类图。在面试了众多候选者以后我很惊讶,关于这些软件开发的基本技能,居然有这么多人已经没法掌握。sql
我面试的这些候选者,有至关一部分人都有在大公司的工做经历,包括微软的,携程的。简历上的title也有很多写的是开发组长,技术经理,架构师之类。简历上的项目经验列出来有好几页,多的我都看不过来。然而他对于基本技能的掌握状况实在使人堪忧。有至关一部分人,知足于作了一个又一个的项目,沾沾自喜。数据库
我在我上一家公司时,个人直属leader对我说“咱们是软件工程师,不是码农,不要知足于作成了多少个项目,这些项目都大同小异,能作一个就能作一百个。”这个leader对个人影响很是的大,他教会了我思考问题的方式。任何技术的出现,都是为了解决一类实际问题,而且有个逐步完善的过程。当咱们在进行软件开发用到了某种技术手段时,有多少人会去思考一下为何我要采用这种技术,这种技术解决了什么问题,若是不用会有哪些不便,在这种技术出现以前,是如何解决这类问题的。反过来,能不能本身尝试造个轮子,简单实现一下这个技术手段的功能。论语中说“学而不思则罔思而不学则殆”,学与思结合,收获会有不少。编程
最后回到题目中来,3到6年的.NETer到底该掌握哪些知识。我认为答案就在clr via c#中。其实我面试时问到的全部问题均可以从这本书中找到答案。c#的经典书籍并很少,若是只看一本的话这一本就够了,并且要反复看,经常看,每次看可能都有新收获。c#
咱们人尚未招满,若是你以为本身对.NET的掌握很是好,能够发简历到个人邮箱里lukexywang@qq.com。若是你还会c++的话,就更好了。工做地点在深圳南山区。设计模式
======================================分割线====================================多线程
昨天发完文以后,有个大学同窗到深圳来出差,就出去了,到晚上才回来,文章发出来的时候我就想到可能会引起不少的争论,你们下面的评论我都看了,谈谈个人见解。
下面有人说想到了老赵的博文http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html,这位同窗看起来跟我是同时期混博客园的,七八年前的博客园是很是活跃的,老赵对个人影响比较大。
有人说每天加班没时间学习的问题,人不想作一件事的时候老是能够找到一万个借口。
有人说不知晓原理也能作出项目,是这样子的。就我如今来讲,个人数据库知识很是薄弱,仅限于会写查询sql这样子。索引的原理,存储过程,数据库内置函数的使用这些我都不太了解,并且我也认为时间有限了解这些知识的原理还不是目前最重要的,由于我并非DBA。我要招一个.NET开发人员,.NET做为安身立命的基本技能都还无兴趣去了解的话,我不知道还能去了解什么东西。
有人说我面试的这些知识点是考背书,有人说刚毕业时都记得,工做时间长了都忘记了。看起来大家当时确实只是背书而已。
关于小蝶的评论,我司的面试至少有四轮,我第一轮就是考察基础,项目经验后面会有人问。基础知识的学习,一开始多是背书,可是在后续若干年的工做过程当中,在写代码时有没有想过为何代码要写成这样子。我面试时问会不会用EF,或者会不会用NH,并没什么用处,由于并非人人都用过orm,掌握这些工具类库的用法也并不会花费太多的时间。我第一份工做是winform开发,第二份工做开始asp.net开发,在第二份工做以前我没有任何web开发的经验,惟一的web知识就是http协议了解一点点。仍是那个对我影响比较大的leader说的,作网站这种东西,作一个和作一百个差距不大,看着demo写几回就ok了。关于基础知识的掌握和理解,是否是能够在平常工做中融入到你的思惟里。一个知识你认为你掌握了,那你是否是能给别人说清楚,能给别人说清楚才算你掌握了,并非背书背会了就行。关于小蝶最后提问的那个问题,非托管数据到托管环境,如何避免装箱。这个问题我第一次遇到,不过你的非托管数据指的是什么呢?装箱只会在值类型转换成引用类型时发生,非托管数据到托管数据映射,就必定发生这种类型转换?
来自大公司的候选人,我天然对他们的期待也比较高。这里并无酸葡萄内心,由于我司也不是个小公司。
有人说“不要用本身掌握的东西来考验别人,别人深究的技术点你不必定知道“,我要招聘一个.NET开发者,难道个人题目超纲了?问的不是.NET开发应该掌握的技能?
江宁织造的说法很中肯,关于理论和实践,任何实际应用都是有相应的理论支撑的,在实际操做的过程当中,支撑这种具体实践技能的理论是必定能够提现出来的。我以为这两者不能割裂开看。确实招一个能干活的人很容易,我也不须要考察这些,直接问有没有用过ASP.NET MVC ,EF,Redis,ZooKeeper就能够了。可是在写代码的时候,因为对基础的不了解,就会在不经意间埋下一个雷而不自知,这个雷最终可能会体现为一个线上的偶发问题,在业务量较小时,可能经过屡试不爽的“重启”来解决了,可是当业务量激增百倍时,偶发性问题的严重性就出来了,如何去查找缘由。有时候线索就在你手边,可是却发现不了。
本文是我多年从事.NET开发的一些体会,也并不就是标准答案,由于我水平还不够给出来我题目中的标准答案。能引起讨论就好。我给题目加个问号。
我面试时要问的,就是通用类型系统(CTS),https://msdn.microsoft.com/en-us/library/zcx1eb1e.aspx