公司一直在招人,可合适的人实在不好招。招了一年多,也就招了五六位。而面试中遇到的各种情况让人唏嘘不已。随便聊聊
1 我们招聘是先在招聘网站上发布信息,然后约投简历的人过来,先做一套题,题做得还可以的当场面试。遇到一些哥们,说自己有N年以上开发经验,不屑于做这些题目。这种人一般直接让HR请回。
如果我招的是管理职位,让你做纯技术问题,或者招C#程序员给做Python问题,那是我们不对。可职位明明是C#高级工程师,做一套C#的题目不是很正常的么。你有能力也没必要通过这种方式来表示,通过解决这些问题来展示你的能力不是更好么。当然如果你是Anders那个级别的人,什么面试都没有意义了。我就找老板亲自出面去请你了。但如果不是,最好还是把心态放得平衡一些。
笔试起的是一个筛选的作用,如果你的简历能够说明你的能力,也可以不用笔试。但是很多人分不清工作经验和能力,十年工作经验并不能保证你的能力就一定达到某个水准。我就碰到许多两三年工作经验的Java程序员不清楚volatile的意思,不知道这个关键字和那个著名的DCL bug的关系。
另外这种情况可能也会让面试官觉得你不好相处与合作,真正有能力的人都是谦逊的,因为他们知道自己不知道,保持一颗谦卑的心才能不断进步。
2 对语言特性掌握不够。.NET3.5,C#3.0出来好些年了,但很多人还是说不出IQueryable和IEnumerable的区别,还有闭包的实现,yield的实现等。工作中用不到不等于你不必去跟踪技术的发展。你不去了解怎么知道这些技术能不能在项目中用上。另外对技术的了解不是说会照着turorial写几个例子就是OK了,实现不说完全了解,也要知道个大概。一个合格的C#程序员JIT, GC,yield, lambda和闭包的关系,Linq中的表达式树等是一定要清楚的,如果你新技术跟进足够快的话DLR中dynamic的实现,TPL库也需要了解,如果能聊下一版C#可能出现的新特性,会更让人刮目相看的。同样,一个C++程序员如果不了解stl,boost, C++0x也不是很妥。你可以不用,但是需要知道有这些优秀的工具供你使用。
3 对阅读优秀代码不够重视。阅读优秀代码是很好的一种学习方式。操千曲而后晓声,观千剑而后识器。如果只是停留于照着一门技术的sample代码或者网上流传的入门教程的地步,显然是不够的。这不是对写入门教程的作者不敬,我很尊重那些原创或者翻译技术入门教程的同学,也从各种入门教程学了很多东西。但一门技术总会有各种教程难以覆盖的细节和无法一一列举的惯用法。C++可以拿来写过程式的代码也能做元编程和函数式编程,ruby中不用||=, each惯用法而用if, for, ASP.NET MVC中不用URLHelper生成url而在view中Html.ActionLInk字符串等,不一道哉。这些都是入门教程没办法教给你的,但可以从优秀的开源项目中去学习。SourceForge, Google Code, CodePlex应该在你的收藏夹中。
4 对其它基础知识掌握不扎实。操作系统、数据库、数据结构和算法是一定要掌握的。一个简单的数据库问题,User表包含UserName NVARCHAR(50) NOT NULL, UserType INT NOT NULL。如何保证在UserType=1时UserName不重复,很多人都告诉我先select,判断username不存在再插入,当我问起如何处理并发时就告诉我用存储过程,把这个逻辑放到事务中去。可见很多人没有清楚理解事务能做什么,不能做什么,并且在工程上考虑不全面,让我很郁闷。当然术业有专攻,如果是做算法或者桌面应用的程序员,数据库不了解是可以接受的。但天天做业务逻辑的程序员不懂SQL, 不了解事务、隔离级别,索引实现与性能调优就说不过去了。但无论哪个方向的程序员,数据结构一定需要有基本的了解。不讨论RB Tree, AVL Tree, Suffix Tree这些较复杂的东西,简单的数组,栈,队列,查询排序啥的应该和九九表一样熟悉。否则,除了做简单的堆砌业务逻辑,复杂一点的东西就很难摆平了。
5 逻辑推理能力有待提高。笔试中一般会有一两个逻辑问题,这种问题虽然不直接对应日常的开发工作,但能体现出一个人的解决问题能力,在交流中还能体现出沟通能力。这篇文章说得更清楚。http://blog.sina.com.cn/s/blog_4caedc7a0100nlx2.html。
6 对工具掌握不够。很多好几年工作经验的人不会用unit test,不会查看code coverage和做Profile,设断点只会F9,编辑代码只会用IDE. 工欲善其事,必先利其器。用好工具可以成倍的提高你的生产率,《程序员修炼之道》和《卓有成效的程序员》都是好书。
聊了这么多面试中遇到的问题,再聊聊技术学习。以下纯属个人见解,不构成指导意见。我不是神人大牛,只是业余写代码的QA, 看法难免错漏,欢迎批评指正。
1 向经典而不是宝典学习。
今年初学Java,办法就是装上JDK和Eclipse,看JDK中concurrent和Collection相关的源代码,然后看了看Spring中IOC实现,cglib和jdk proxy的区别,再用DBUnit和spring中的test框架给组里搭了一个小的数据库测试工具,明白了JUnit的运行原理和spring test中事务是如何实现的。这些东西书店里的各种宝典是不会教给你的。
2 注重原理而非操作手册。
远离插图多,操作多,原理少,剖析少的书。很多东西都是易学难精,因为难精,才更有价值,更需要精。一本 SQLServer书,一步步告诉你怎么在SSMS中创建数据库,创建表,创建index,这就算了,随便找个人3天都能会,3天以后就不需要再看的东西就不要浪费这钱买书了。不如攒下来给女朋友买个ipad啥的更能发挥作用。一定要找像《Iniside Microsoft SQL Server 2005》这种明明白白告诉你一条SQL语句从解释,优化来执行的全过程,一张表是怎么样存储在硬盘上的好书。(非书托)
3 关注第一手材料.
多加入一些邮件组或者订阅一些blog,如VC++ team, C# team, msdn magazine, asp.net等(最近主要关注.NET,只列出了相关的内容)。第一手资料总比第二手新鲜和精确。这两天捣鼓VS2010的C++,去把VC team的blog翻了一遍,受益匪浅。
4 重视基本功
《深入理解计算机系统》,《算法导论》如果能看明白一半,找工作已经不是问题了,什么框架,什么经验都是浮云了。
5 关注新技术
今天的小众技术,明天可能就是主流。比别人先行一步,可能就掌握了先机。但要注意技术的应用前景和生命周期。很多MFC,vxd的拥趸深有体会。还有一点,很多技术都是相通的,用过rails后,再看asp.net mvc,很多时候都会有似曾相似之感。
6 重视工具
工具是双手的延伸,使用得到能为你节省无数时间。会一个条件断点,就能给你节省许多中断,查看,运行,再中断,查看...的时间。更不用说其它工具和工具组合能带来的提高。《程序员修炼之道 》和《卓有成效的程序员》里说得很清楚,就不拾人牙慧了。
http://www.cnblogs.com/MichaelPeng/archive/2010/12/16/1908230.html