-
2006-03-26
招聘杂感(二)
关于招聘,我这周干了两件事,面试别人和被人面试。
从招聘开始到现在,面试了几个人,但是这周面试的一个人给我留下了深刻的印象。他的入司时间和我一样,对底层技术也有强烈的向往,对个人的发展也颇为不满,还有一点,骨子里透着狂妄,这一切都让我感觉坐在自己面前的是自己。他是第一个在我们问问题之前问我们问题的人,这出乎我们的意料,他为我们列出了自己能为部门做什么,以及部门的这次机会能为他带来什么。我们可以清楚的感受到,他的自我感觉有些太过良好,于是,我们把问题转向到了技术上。如我们所料,他并不像自己想得那么好,对于我们问的问题,虽然基本上他都能够做答,但答案总是不够准确,一旦深究,他就开始不敢较真了。
在《招聘杂感》中,我提到过,如果我来应聘,恐怕是无法通过的。同样,我们最终没有下定决心把这个人招进来,当然,不是因为他的简历。几个参与这次面试的人都认为他恐怕无法很好融入我们的团队,因为他太过于自我。这一点在招聘过程体现得很明显,而且通过了解,我们知道,他在从前部门也是很难于大家相处。其实,我很清楚这样的人,因为我也曾是个这样的人:觉得自己能力很强,所以,眼很高,殊不知,一来自己能力并不像自己想那样强,二来生活在社会中就需要与人共处。这样的性格需要改变,否则会严重影响自己的发展,我如果不是遇到了一些事,恐怕我现在依然是这样我行我素。
说过了面试别人,再说别人面试。
因为要与别的公司合作,所以,他们希望能看到我们这边工程师的素质,于是,我们千里迢迢跑去让人面试。我戏称,公司出钱让我们到千里之外上半天英语角。我们之所以在招聘过程中要求英语,主要就是为了这个项目。
同我们关心别人的经历一样,我们最受人关注的也是自己的经历。如果我们的经历中一旦有与人项目相关的部分,他们肯定会多问几句,甚至不惜问到一些细节的问题。在这个过程,我再一次的感受到自己的经历和目前这个项目的差异。你再有水平也很难展现,因为面试的进程控制在别人手中,而且,用英语表达自己总不如汉语那样流利。
不过,让我印象最深的是一个人让我们在纸上写了一个折半查找的算法。我们四个一起去的人没有一个完全正确的。我相信,如果给我们一个开发环境,我们每个人都能把这个算法准确的实现出来。但是,就是用笔用脑,我们就开始出现这样那样的错误,其实,就是基本功不够扎实。记得领导曾经教育我们,他的那个年代,因为机器资源稀缺,大家都是现在纸上把算法写好,在脑子里跑上几遍,然后输到计算机中执行。现在是一个计算资源相当丰富的年代,而编程前的思考却少了。
一个同事感慨,报应啊!谁让我们招聘时尽难为别人了。
-
2006-03-18
招聘杂感
由于部门发展的需要,我干了几天招聘的活。
按说这次的技术要求并不算高,只要有两年的C语言编程经验就可以,当然,我们要找到的是底子比较好的,所以,如果“数据结构、操作系统、编译原理基础良好”,我们会优先考虑。可能有些人会忽略这句话,但是对于喜欢技术的人来说,这是一条看着就让人心动的广告词,因为这意味着需要做一些系统级的工作。如我们所料,有几份简历就是冲着能做这句话来的。
真正的“高”要求是良好的英语听说读写能力。读写能力对于一个大学生来说,或许还是比较容易通过的一关,但听说绝对是让很多人栽跟头的地方。我很清楚,对于包括我自己在内的许多人而言,大学英语意味着哑巴英语。事实也证明了这一点,即便可以轻松的通过技术面试的人,到了英语这一关,也就意味着开始给人留下不好的印象了。
很多人和我们强调,自己读英文文档的能力没有问题,我很清楚,因为英语也是我的一块短板,读写问题都不大,一旦到了听说,就开始抓瞎。我身边有几个朋友在前几年纷纷开始学英语,那时,我也想学,不过更多的精力放在了技术上。后来看着人家能够用英语很好的表达自己,也着实羡慕了一番。我心里很清楚,无论是工作还是技术,英语都是我进一步提高的障碍,于是,今年年初,我和两个朋友互相怂恿,一起投了一笔钱,强迫自己学英语。两三个月下来,有了些长进,能够进行一些简单的听说。我得出的一个结论是,对于像我这样的大学毕业生,学习英语真正的障碍是懒惰和心理,毕竟底子在那里摆着。只要去学,听懂基本的东西是没问题的,只是自己总愿意强调一些客观理由,给自己的懒惰找些借口。至于说,完全是心理问题。我一开始也怀疑自己说的东西人家是否能听懂,语法是否正确等等,但我后来发现,就像我们能听懂外国人蹩脚的中文一样,只要我们能把大概意思表达出来,他们也能听懂。至于流利的表达,那是又一个层次的要求。
通过这次招聘,我很清楚看到经历对一个人的影响有多大。有些对我们招聘感兴趣的人给我们投了简历,但简历告诉我们,他们并不是我们需要的人。我们希望找的是来之能战的人,或许他们个人确实很希望能够做这个方向,但缺乏相关的工作经验可能会使他们甚至连面试的机会都无法赢得,这样,即便再优秀的人也是无法一展身手,这或许就是与招聘应届毕业生的不同吧!所以,如果可能,还是尊重一下自己的经历。其实,写下这些内容的时候,我有些站着说话不腰疼。按照我们筛选的标准,按照我自己的工作经历,我可能都无法通过简历初筛,毕竟,我前几年的工作都在Java上。
由于这个招聘广告也在外部刊出,所以,也有了一些来自外部的应聘简历。怎么形容呢?相当让人心动。不是说这些应聘者的能力有多强,而是他们对于薪资的期望让我们几个看简历的人心动。公司以工资低闻名,不过,相对于公司的体系,我们对这个职位给出的薪资并不算低,但几倍的差距使我们干脆放弃了对于这几份简历的过滤。不过,从这些简历上反应出的个人能力来说,它给了大家一个强烈的信号,让大家对自己有了些许信心。
有一个应聘者号称精通C/C++,于是,我给他出了一个简单的问题,就是我在《Java基本功——Reference》里面讨论过那个问题,只不过是用C语言的形式表达,结果,他很轻松就被这个问题绕了进去。我的一个同事原本比较看好他,所以,在一旁不断提示,结果,他还是没能从中走出来。通过了解,我们发现,他编程的基础并不是那么好,在校跟导师做项目时,用C51写过一些程序,工作后真正编程的时间只有几个月。他对自己比较有信心,只是他不像自己想象的那么好。
招聘,跟人打交道,长见识!
-
2006-03-16
跟着感觉走?
一个做项目负责人的朋友感慨,质量难以把握。为了更改发布目录,居然需要重新编译代码。于是,他感慨,下次一定要在项目加强评审的环节,对此,我表示支持。自从开始理解测试驱动开发,我愈发体会到检查这个环节的重要性,因为我们首先要做正确的事。如何才能做正确的事,不断的检查。在我们通常的认识中,软件项目的检查就是测试,而实际上,这个检查应该贯彻于开发始终的,比如需求阶段的检查确保我们没有错误的理解需求,设计阶段的检查让我们知道选择了一条适合自己的开发之路。
接下来的话题是如何做检查。以代码评审为例,那位朋友所在的部门是这样做的。找来一些在编程方面有经验的人,拿出一段代码,由他们来找问题,通常,这种评审是很热闹的,大家各抒己见,初来乍到的人会惊讶于这些“高手”的水平,暗自佩服。然后,心中不禁疑惑,为什么他们就知道这些问题,而我不知道。我为什么会知道这些,因为我就有过这种经历,新人和“高手”的角色我都扮演过。
之所以会出现这样的问题,原因在于,所谓的衡量标准都在这些“高手”的心中。为什么现在的教育越来越值钱?我想原因之一,教育的内容是成体系的,而不仅仅是零散的存在于人们的脑海之中。我参加过一些培训,或许这些老师在某些方面的理解并不见得有多高超,但他们的知识是成体系的,所以,他们可以用自己的知识换钱。如果想了解体系与零散的差别,用心写本书试试,那与写blog是完全不同的感觉。
刚好就同样问题和一个同事讨论过,他来自公司内过程做得最好的部门。他们的评审是这样做的,把一个checklist分成几个部分,交给不同的人,就同一段代码分别进行检查。检查的人可能是个新手,但他所需要关注的只是他手中checklist的内容,所以,他可以轻松的完成这项工作。这就是工作方式的差异,这就是成体系的工作方式。
我很愿意将编程称为艺术,换言之,讲究的是一种感觉,不过,感觉是一个没准的东西,也就是零散的。比如我们做代码评审的时候,可能我会凭感觉发现一些问题,但下次再做评审,我可能不会发现同样的问题,因为感觉这东西是在不同的情况下会有差异。当我们需要创意的时候,可以靠感觉,但有一些基本的工作,仅凭感觉是远远不够的。
-
2006-03-12
追求高性能
Intel在IDF上宣布了它的计划,由双核CPU迈向四核,更为长远的计划是百核CPU。刚好最近的精力开始转向高性能计算,对Intel的CPU也有了多一些的了解,所以,对这件事也是格外的关注。
站在CPU的层面上,如果希望得到更高的计算性能,有怎样的路可以选择呢?
排在第一位的自然是CPU的时钟频率,这也正是Intel矢志不渝的追求。CPU频率高,证明了它做事快,在做事效率相当的情况下,做得快也就等同于做得多。在Moore's Law的感召下,各CPU厂家不遗余力的提升着CPU的时钟频率。终于,他们发现,Moore's Law也有尽头,在现有的体系结构下,CPU的时钟频率不会无限膨胀下去。于是,在末日到来之前,他们开始各寻出路。
我们的最终目标是更高的计算性能。当一个因子迫近极限时,目光自然被转向了另外的因子,于是,人们开始打起了CPU办事效率的主意。
Intel为了不断提高CPU的办事效率做了很多努力,但是,有些努力对我们软件开发人员来说,只需坐享其成即可。比如减少某个运算的时钟周期,比如引进流水线,比如引入乱序执行等等。当然,深入理解这些内容可以让我们编写出更好的程序,但归根结底,算不上什么根本性的变革。
在我看来,真正的变革应该始于Pentium带来MMX(Multimedia Extension),这是Intel向SIMD(Single Instruction Multiple Data)迈出的第一步。如果你做的是普通应用,可能你很难理解MMX所带来的好处。如果你深入到图像处理、图形学、视频处理等多媒体处理领域,你就会知道问题所在了。举个简单的例子,把一副RGB图像转为灰度图像,一种实现大概会是这个样子:
for (i = xStart; i < xEnd; i++) {
for (j = yStart; j < yEnd; j++) {
gray[j, i] = (R[j, i] + G[j, i] + B[j, i])/3;
}
}
运算本身很简单,但是数据量会非常大,而这就是一些多媒体运算的特点。正是因为操作的相似性,所以,如果一次能够处理更多的数据,运算性能自然会得到提高,这也就是SIMD最初的动机。事实上,在硬件提供支持前,软件开发人员已经在这方面做了一些尝试。云风在《游戏之旅——我的编程感悟》中举了一个Alpha混合的例子,就是在软件一级实现的SIMD。作为SIMD的第一步,MMX走得并不是很远,它甚至没有新增寄存器,只是利用了已有的浮点运算寄存器,因为,浮点运算寄存器是64位的,也就是普通整数运算的2倍,所以,可以一次处理2个整型数。正是因为这样,在每次调用MMX指令之前,需要清空一下寄存器,以免与浮点运算冲突,同样的原因,MMX只支持整数的SIMD,而不支持浮点数。MMX的成功引入对于需要构造高性能应用的人来说无疑是一个福音,它也改变着软件开发人员在这个问题上的处理方式。
初战成功之后,Intel再接再厉,在PIII中引入了SSE(Streaming SIMD Extension),这次的处理长度是128位。为此,在CPU中专门增加了8个128位的寄存器(XMM0到XMM7)。正是因为寄存器的扩展,使浮点运算的SIMD成为了可能,至于后来的P4引入的SSE2和P4HT(超线程)引入的SSE3都是在128位这一体系上的扩展。
前面所讨论的SIMD技术都是在CPU内部不断挖潜,与此同时,Intel开拓了另一条路:加入更多的运算单元。第一个尝试应该算是超线程,这是在不改变已有体系的一种尝试,因为通常在Intel的CPU中同时包含整数运算单元和浮点运算单元,在最初的结构中,二者是一忙一闲。所以,Intel打起了闲人的主意,于是就有了超线程的概念,也就是让整数运算单元工作的同时,浮点运算单元也在干活,这样,二者就并行起来。当然,如果只有一种运算形式,那CPU也是干着急没办法。
如果说HT增加的只是逻辑上运算单元,Intel接下来所做的就是增加物理运算单元,这也就是我们现在了解到的多核的概念,在一个处理器中封装多个运算单元。多核CPU可以同时执行更多的运算,这样可以让CPU的办事效率更高。如果运用前面提高的SSE技术,一次处理128位,那么双核的CPU就可以处理256位。当然,这只是理论上的预期。
不过,多核的技术就现阶段而言,潜力还远远没有得到挖掘。Herb Sutter那篇著名的《The Free Lunch Is Over》说明了这一点,那种“什么都不做,只待CPU升级就能拥有性能提升”的游戏已经没有多少潜力了。我们原本所开发的应用都是按照单内核开发的,所以,根本无法充分发挥多内核的威力,这就好比把飞机当汽车开一样,也许速度也不错,但远没有发挥它应有的潜力。不过,这个进步不是一朝一夕,毕竟,改革要一点一点来。或许,再过一段时间,在底层结构重新建设后,那种“只待CPU升级”的舒适又会重回我们身边,不过,那时我们要期待的是CPU中加入更多的内核。
从上面的分析我们可以看出,Intel在进步。不过,客观的说,在某些高性能计算的领域中,Intel的CPU没有任何优势,主要就是CPU的办事效率还远远不够。前面举的那个彩色转灰度的例子中,如果图像很大,那么Intel理论上所能提供的提升也是很微不足道的。某些专用的CPU一次处理能力会更强。Intel在努力,至少它现在公布的四核CPU,甚至未来的百核CPU都是在为提升运算性能努力。正是这种不断的进步,我们的生活才会更加幸福。
-
2006-03-05
感受“大学生找工作难”
近距离的感受了一次大学生找工作难。
周末回了趟家,一个邻居阿姨带着儿子来串门。她的儿子是今年的应届生,学的是计算机,距离毕业还有四个月左右的时间,工作还没有搞定。来访的目的很简单,看看我能不能帮上什么忙,毕竟我现在所在的公司还有招应届毕业生的习惯。如果可行,我还是愿意帮这个忙的,因为内部推荐一旦录取,是有奖金可拿的。
这位阿姨一开口,就向我介绍了一大堆她儿子的优点:做过学生干部,组织能力强,已经是预备党员等等。本着对人对己负责的态度,我问了几个问题。
“你想做什么工作?”
“我想做管理工作,说实话,我对编程不感兴趣。但是我的专业限制了我只能从编程干起。”
“你的一些基础课学得怎么样?比如数据结构。”
“我们大三学的Java,我对Java有一些了解。”
“那你对面向对象有多少了解?”
“我只会用一些基础类,对于J2SE还不是很了解。”不知道看了这些对话,您会做何感想。至少给我留下的印象不太好,对编程不感兴趣决定了他不会成为一个很好的程序员,答非所问,证明了他的基础不够扎实。后来,我试图引导他正确的理解并回答我的问题,我的尝试失败了,他根本不明白我的意思。
为了找份工作,这位阿姨和他的儿子没少费心。为了增加工作经验,这个小伙子在一个公司内实习了一段时间。这段实习不但是分文不拿,而且三个月下来花掉了一万大洋,结果,依然是如今这样,几乎一无所知。去年,我做了一次招聘考官(20050129),那些应届毕业生给我留下的感觉非常不好。这次与这位阿姨的儿子交流,更加加深了这个印象。
人们都在感慨大学生越来越不值钱,可如果大学毕业生不能用自己的实力作证,想值钱也难。与其说这是某个人的悲哀,不如说是中国教育的悲哀。原本严进宽出至少还可以在入口把把关,现在扩招的结果是,连入口都松了。
良心发现,我给这个小伙子一些简单的忠告,比如,加强一些基础知识的准备,给他的简历提了一些修改意见,比如突出一下与应聘职位相关的东西。剩下的,我只能祝他好运了,至少他的表达能力还不错。







