我们组的开发人力一直比较紧张,今年春节后,高层终于给了几个headcount,我们可以开始招人了。从三月初我们就开始找简历,渠道有拉钩,内推,我司自己的招聘网站和智联等。简历筛了很多,也打了很多电话,叫过来面试了很多人,可是到目前为止,已经三个月了,我们只招到了两个人,这两个人都是内推来的。

我负责第一次电话面试,如果电话面试觉得可以,我们会叫过来 做一份笔试题,然后我会针对笔试题再进行提问。我们想要招聘的,是一批中级.net开发工程师,工作经验最好在3到6年,在这三个月的面试过程中,这些候选者鲜有我觉得满意的。所以我就想,作为工作了3到6年的.NETer,到底应该掌握哪些知识。

我负责的电话面试和笔试,着重考察.NET基本概念和基础知识,不涉及任何项目经验。在电话面试时,我问的第一个问题就是介绍一下.NET的类型系统,不过很遗憾的是,很多候选者在听到“类型系统”这个词后,完全不知道我的发问点在哪里,他们并不知道“类型系统”指的到底是什么,所以我不得不换个提问方式,转而问“什么是引用类型什么是值类型,有什么区别“,后者的问法,只是前者的一个子集而已。从.NET类型系统,可以发问.NET如何实现跨语言开发,所有类型的共同父类是什么,为什么要分引用类型和值类型,堆和栈的区别,装箱拆箱等等一系列问题,遗憾的是到目前为止还没有人能够说出我想要的答案。关于引用类型和值类型,候选人的回答也是五花八门的,有些人根本没听所过这两个术语,有些人听过,但是搞不清楚栈和堆的区别。而大部分的人,则完全不清楚拆箱和装箱的概念。让我感到吃惊的是,很多人认为拆箱装箱就是父类型和子类型之间的类型转换。最近面试的一个有10年经验的.net开发者,竟然认为装箱拆箱与反射有关。

除去考察类型系统,我电话里还会问到泛型,委托,linq,多线程编程,异步。遗憾的是大部分候选者对于这些在.NET编程中经常用到的技术掌握的也并不好,这几个发问点里,可能多线程和异步编程的问题会有点难度,不过我认为作为一个有五年左右工作经验的人,理应掌握一些多线程和异步编程的技能。当我问道大部分候选者关于多线程和异步编程的问题时,他们都会回答工作中没有用到过所以不清楚,在我看来这根本不是理由。而前三个发问点:泛型,委托,linq,则是非常基本的.NET编程技能,但是很多人仅限于用过,但是却从未进行过一丁点的思考过,为什么.NET要引入泛型,委托和linq,引入它们是为了解决什么样的问题,关于它们的实现原理大致是什么样子的。

在笔试题中,我们会考察进程线程的基本概念,ado.net的使用,闭包,简单的设计模式。遗憾的是,很多人并不能描述清楚进程的概念。在orm大行其道的今天,很多.NETer已经不知道如何使用原始的ADO.NET来访问数据库了,有些工作了五年的候选者从未听说过闭包,有些人无法画出经典设计模式的uml类图。在面试了众多候选者之后我很惊讶,关于这些软件开发的基本技能,竟然有这么多人已经无法掌握。

我面试的这些候选者,有相当一部分人都有在大公司的工作经历,包括微软的,携程的。简历上的title也有不少写的是开发组长,技术经理,架构师之类。简历上的项目经验列出来有好几页,多的我都看不过来。然而他对于基本技能的掌握情况实在令人堪忧。有相当一部分人,满足于做了一个又一个的项目,沾沾自喜。

我在我上一家公司时,我的直属leader对我说“我们是软件工程师,不是码农,不要满足于做成了多少个项目,这些项目都大同小异,能做一个就能做一百个。”这个leader对我的影响非常的大,他教会了我思考问题的方式。任何技术的出现,都是为了解决一类实际问题,并且有个逐步完善的过程。当我们在进行软件开发用到了某种技术手段时,有多少人会去思考一下为什么我要采用这种技术,这种技术解决了什么问题,如果不用会有哪些不便,在这种技术出现之前,是如何解决这类问题的。反过来,能不能自己尝试造个轮子,简单实现一下这个技术手段的功能。论语中说“学而不思则罔思而不学则殆”,学与思结合,收获会有很多。

最后回到题目中来,3到6年的.NETer到底该掌握哪些知识。我认为答案就在clr via 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

3到6年的.NETer应该掌握哪些知识?的更多相关文章

  1. 个人随想:对于一个.Neter来说,如果一直想走技术路线,该怎么走下去

    前言 首先我不是一个合格的.Neter,也许在这里我的技术算是很菜的,不过我也是有想法的人,下面罗列出我的想法和将要实现的技术路线图. 1.学习一门底层语言 比如学习C语言,学习C语言的最终目的我觉得 ...

  2. .netER的未来路,关于基础是否重要和应该自己手写代码吗?

    http://www.cnblogs.com/onepiece_wang/p/5558341.html#!comments 引用"基础知识的学习,一开始可能是背书,但是在后续若干年的工作过程 ...

  3. .Neter玩转Linux系列之一:初识Linux

    一.为什么要学习Linux (1)首先我们欣赏一下,曾经的微软是如何看待Linux的,是不是很惊讶,微软还是很可爱的(#^.^#) 如今的微软看待Linux的态度:有人说微软技术那么厉害,难道微软就不 ...

  4. .Neter玩转Linux系列之六:Linux下MySQL的安装、配置、使用

    一.Linux安装MySQL (1)下载安装包:https://dev.mysql.com/downloads/mysql/ (2)解压并安装 命令:tar zxvf 文件名 解压完成之后,重名一下文 ...

  5. .Neter玩转Linux系列之三:Linux下的分区讲解

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  6. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  7. 《.NETer提高效率——环境部署》

    初衷 兵马未动,粮草先行. 电脑坏了or换工作等需要重装系统. 开发运维一把梭. 与时俱进. 记忆力差,需要文字记录. 因为懒... 目的 通过学习 Linux+docker+kubernetes+C ...

  8. 野路子土鳖ASP.NETer谈互联网的发展趋势

    有些话别在憋在心里太久了,容易伤身体,总得找个借口吐槽一下,今日不小心看到园有关于互联网发函趋势的文章,作为一名ASP.NET程序员,自然要说说什么是趋势,机会找到了,好高兴. http://zzk. ...

  9. .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限

    一.Linux下的文件目录 简介:linux的文件系统是采用级层式的树状目录结构,在此 结构中的最上层是根目录“/”,然后在此目录下再创建 其他的目录.深刻理解linux文件目录是非常重要的,如下图所 ...

随机推荐

  1. 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...

  2. mysql错误一例:ERROR 1030 (HY000): Got error 28 from storage engine

    在使用mysqldump导出一份建库脚本是,发生了下面的错误: 当执行 desc table_name; 时也报错: tag为表名,show index from tag;倒是可以执行. 其实真正的错 ...

  3. 烂泥:centos单独编译安装gd库

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天一直在弄一个商城系统,该系统的源码及数据库都已经上传并创建完毕.但是在安装该系统时,却提示缺少gd库.如下: 使用php探针查看,发现php确实没 ...

  4. Python标准库01 正则表达式(re包)

    python正则表达式基础 简单介绍 正则表达式并不是python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...

  5. Android复制Assets目录下的文件到指定目录

    package com.android.demo; import java.io.File; import java.io.FileOutputStream; import java.io.Input ...

  6. vim linux SecureCRT vim颜色的设置

    解决方法: 1.首先按照环境一的方法检查一下,如果环境一的情况不在进行第二步. 2.修改终端TERM这个环境变量: 1)export命令 临时生效 # echo $TERM xterm   #如果结果 ...

  7. 证明你是你——快速开启Windows Azure多重身份验证

    中国版Windows Azure的多重身份验证(Multi-Factor Authentication)功能已经开放.这个功能说白了就是要“证明你是你”.目前可以支持以下几种验证方式: 手机,短信验证 ...

  8. 《硝烟中的Scrum和XP》:作者主导Scrum过程的实战经验,四星推荐

    本书作者是开发团队Leader,本书记录了他带领团队实施Scurm过程中的经验教训.全书短小精悍,言简意赅. 以下是书中一些观点信息的摘抄: 1:Nokia总结出的迭代开发的基本要求:1.1:迭代要有 ...

  9. Student学生管理系统

    1.定义各个层 2.添加各个层之间的引用 DAL 层调用Model BLL层调用DAL和Model UI层调用BLL和Model层 Model层供各个层调用 3.根据数据库建立实体类,每张表对应一个实 ...

  10. 记录mysql的具体操作明细

    在MySQL中使用init-connect与binlog来实现用户操作追踪记录 2014-07-28 20:55:38 分类: MySQL 前言:测试环境莫名其妙有几条重要数据被删除了,由于在binl ...