【转来警醒自己】最近的一些面试感悟

公司一直在招人,可合适的人实在不好招。招了一年多,也就招了五六位。而面试中遇到的各种情况让人唏嘘不已。随便聊聊。

 

1 我们招聘是先在招聘网站上发布信息,然后约投简历的人过来,先做一套题,题做得还可以的当场面试。遇到一些哥们,说自己有N年以上开发经验,不屑于做这些题目。这种人一般直接让HR请回。

如果我招的是管理职位,让你做纯技术问题,或者招C#程序员给做Python问题,那是我们不对。可职位明明是C#高级工程师,做一套C#的题目不是很正常的么。你有能力也没必要通过这种方式来表示,通过解决这些问题来展示你的能力不是更好么。当然如果你是Anders那个级别的人,什么面试都没有意义了。我就找老板亲自出面去请你了。但如果不是,最好还是把心态放得平衡一些。

笔试起的是一个筛选的作用,如果你的简历能够说明你的能力,也可以不用笔试。但是很多人分不清工作经验和能力,十年工作经验并不能保证你的能力就一定达到某个水准。我就碰到许多两三年工作经验的Java程序员不清楚volatile的意思,不知道这个关键字和那个著名的DCL bug的关系。

另外这种情况可能也会让面试官觉得你不好相处与合作,真正有能力的人都是谦逊的,因为他们知道自己不知道,保持一颗谦卑的心才能不断进步。

 

2 对语言特性掌握不够。.NET3.5,C#3.0出来好些年了,但很多人还是说不出IQueryableIEnumerable的区别,还有闭包的实现,yield的实现等。工作中用不到不等于你不必去跟踪技术的发展。你不去了解怎么知道这些技术能不能在项目中用上。另外对技术的了解不是说会照着turorial写几个例子就是OK,实现不说完全了解,也要知道个大概。一个合格的C#程序员JIT, GC,yield, lambda和闭包的关系,Linq中的表达式树等是一定要清楚的,如果你新技术跟进足够快的话DLRdynamic的实现,TPL也需要了解,如果能聊下一版C#可能出现的新特性,会更让人刮目相看的。同样,一个C++程序员如果不了解stl,boost, C++0x也不是很妥。你可以不用,但是需要知道有这些优秀的工具供你使用。


3 对阅读优秀代码不够重视。阅读优秀代码是很好的一种学习方式。操千曲而后晓声,观千剑而后识器。如果只是停留于照着一门技术的sample代码或者网上流传的入门教程的地步,显然是不够的。这不是对写入门教程的作者不敬,我很尊重那些原创或者翻译技术入门教程的同学,也从各种入门教程学了很多东西。但一门技术总会有各种教程难以覆盖的细节和无法一一列举的惯用法。C++可以拿来写过程式的代码也能做元编程和函数式编程,ruby中不用||=, each惯用法而用if, for, ASP.NET MVC中不用URLHelper生成url而在viewHtml.ActionLInk字符串等,不一道哉。这些都是入门教程没办法教给你的,但可以从优秀的开源项目中去学习。SourceForge, Google Code, CodePlex应该在你的收藏夹中


4 对其它基础知识掌握不扎实。操作系统、数据库、数据结构和算法是一定要掌握的。一个简单的数据库问题,User表包含UserName NVARCHAR(50) NOT NULL, UserType INT NOT NULL。如何保证在UserType=1UserName不重复,很多人都告诉我先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,办法就是装上JDKEclipse,JDKconcurrentCollection相关的源代码,然后看了看SpringIOC实现,cglibjdk proxy的区别,再用DBUnitspring中的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,只列出了相关的内容)。第一手资料总比第二手新鲜和精确。这两天捣鼓VS2010C++,去把VC teamblog翻了一遍,受益匪浅。

4 重视基本功

《深入理解计算机系统》,《算法导论》如果能看明白一半,找工作已经不是问题了,什么框架,什么经验都是浮云了。

5 关注新技术

今天的小众技术,明天可能就是主流。比别人先行一步,可能就掌握了先机。但要注意技术的应用前景和生命周期。很多MFC,vxd的拥趸深有体会。还有一点,很多技术都是相通的,用过rails后,再看asp.net mvc,很多时候都会有似曾相似之感。

6 重视工具

工具是双手的延伸,使用得到能为你节省无数时间。会一个条件断点,就能给你节省许多中断,查看,运行,再中断,查看...的时间。更不用说其它工具和工具组合能带来的提高。《程序员修炼之道 》和《卓有成效的程序员》里说得很清楚,就不拾人牙慧了。

 

——————————————————————————————————————————————————————————————————————————————

 

读后感:

     有些片面,设计原则(模式),架构设计(IOC, AOP,分布式,Map-Reduce),框架(Spring, struts),业务,对某个产品(比如Sql Server, BI, Reporting service)的深入经验,还是很有必要的。这些也是不可或缺的因素。

     另外English对于外企来讲,包括自己看E文书,也是需要的。

     团队合作,创新意识,抗压能力,改进意识,这些都是优秀程序员的基本素质。

 

     虽然片面,但是也揭开了.net甚至大部分程序员的硬伤——不深入!!!我自己就是不够深入,基础的东西也是还给老师了,流行的吃饭的技术(C++, Javasctrip, SQL)掌握的也不扎实,只会个C#,这些都是失业的征兆。

 

  深入这些东西,对一个普通程序员来讲,需要消耗很大的精力和时间的,而且日常工作中还要处理大量的工作。甚至日常工作中,不太可能出现让你解释一下SQL Server Index的原理以及B+ Tree。但是,但是,作为一名专业IT技术人员,如果想从事资深技术程序员的路,这些都是必备的。看这些书和文章,都是必经之路,不可跳过。

 

     我觉得程序员的核心就是:解决实际问题的能力 & 学习能力。 方向要正确,广而深,千万不要杂而肤浅。Java, C#, Js, Ruby, 什么都搞过,但是说不出个123来,这就是悲剧。4.0用上了,对dynamic和var的区别,Linq Expresstion Tree, Dyanmic Query, 自定义DynamicObject来扩展等等,这些都不会的话,别谈自己是高级程序员,更别说架构师了。我觉得这些都是基本素养,如果你精力有限,可以作为了解,不必深入,但是如果你连听都没听过,见都没见过,那也太悲哀了。

 

      再说一次,这些知识和原理都不懂的话,别谈什么架构师,CTO的。要不然你就是个大忽悠,最讨厌不懂技术的人瞎指挥,做错方案,让下面的程序员受累。

 

      对我来讲,研究员是我最喜欢的工作,虽然目前不是,但是我还是很想去百度这样的大公司工作的。而百度要进去,这些算法什么的都是必须得。所以上面说的对我来讲还是很受用的。我不想当很“嘘”的架构师,我只想做一个手艺精湛的工匠。路要向上走,但是每一步都要牢靠,否则会摔下去,死的很惨!

 

      不要提什么 ”懂业务的比懂代码的收入高“”只会.net 2.0的,照样在金融、电信拿着 2-3W每月的高薪“之类的话。评价每个人的角度不同,结果就不同。我不能说我比乔布斯长的高,我就可以BS乔布斯。这里是技术乐园,只从技术角度来评价人,所以你只会.net 2.0,就是低端程序员,谈不上什么架构师。

 

      最后,不要故意难为人。比如说你不懂Reporting service, Oracle, WPF, Caliburn,也没用过IdeaBlade, MEF, Ado.net EntityFramework,非得要求你在面试时候说出个123来,这就是2B面试官。面试里面,要么是这些你有经验,然后问你深入原理知不知道,以前是怎么做的,它里面的实现机制懂不懂,懂多少?要么就是你都没用过,然后问你懂什么,说一下你懂的技术,然后考一些基本题目,比如算法,数据结构,和数据库,甚至数学智力题都可以。没经验的话,就是看这个人有没有基础,有没有潜力。

 

      “今天工作不努力,明天努力找工作”。我很喜欢的一句话,送给自己。

 

      多一些会思考的程序员,少一些只会用鼠标和现成的API搭积木的人吧。

 

原文:最近的一些面试感悟 

posted @ 2011-10-31 15:10  primeli  阅读(247)  评论(0编辑  收藏