Wednesday 16 January 2008

如何甄别好的程序员


译自How to recognise a good programmer

作为管理人员,如何甄别好的程序员?

这件事并不像听起来那么容易。来自简历的履历经验信息用处有限,因为伟大的程序员并不是总有“正式的”经验用以展示他们的伟大。实际上,很多来自简历的经验信息还可能误导。然而,即使从简历里,也可以得到不少微妙的线索,用以弄清楚一个程序员到底是不是伟大。

我自认是一个相当好的程序员。而且我在业务管理这边花了相当多的时间,为项目筛选技术简历,面试等。鉴于此,我认为我还是有一点甄别好的程序员的经验的,我也愿意把这些经验通过此文和大家分享,希望其有助于其他的“业务管理人员”来甄别优秀程序员。还有,谁知道呢?也许一些有潜力成为还没有成为优秀程序员的程序员,翻到这篇文章,读过之后认识到应该如何提高才能优秀(尽管,正如我将要分辨的,本文绝对不对所有程序员有效)。


在他的一篇名为18个错误扼杀成长 的文章里,Paul Graham提出如下观点:
“... 什么扼杀了90年代后期大多数电子商务企业的启动?是差劲的程序员。很多那些公司最初由业务人员组成,这些业务人员认为,假如你有了一些好点子,只需雇佣程序员来实现它,就可以完成公司的最初成长。这件事实际上比听起来难许多——几乎难到不可能的地步——因为业务人员不能辨别哪些是优秀的程序员。他们甚至根本就见不到真正优秀的程序员,因为一个真正好的程序员绝不希望自己去做只是实现业务人员的想法的工作。

实际的情况是,业务人员选择他们认为是优秀程序员的人(比如在他的简历里有微软认证开发者证书),但这些程序员并不优秀。于是业务人员发现他们所组建的团队就像二次世界大战时的轰炸机,而他们竞争对手却是喷气式战斗机一样呼啸而过。这种启动就像一个大公司的启动一样,只是没有大公司所拥有的优势。

那么如果你不是一个优秀的程序员,如何挑选优秀的程序员呢?我不认为有答案。我想说你最好去找一个优秀的程序员来帮助你雇人。但既然你不能甄别优秀的程序员,你怎么能找到第一个优秀程序员呢?”

我不同意Graham先生这个观点。我认为一个“优秀程序员”有很多明显的特征(并且,反过来,一个“不那么优秀的程序员”也有明显特征),这些特征很显而易见,以至于甚至业务人员都有能力分辨。在本文末尾,我将把这些关键的加分特征和减分特征总结为一个列表。

#1 激情

在我的从业经验里,我见识过一种以前从未见识过的技术人员:职业程序员。这种人之所以做IT是因为他们认为IT一个好职业。在他们的业余时间里,他们不做任何的编程相关的事。当发现我在家里有一个局域网和三台机器的时候,他们很吃惊。他们只在工作中编程。他们不学新东西,除非参加培训(或者为了得到一个要求那种技术的工作)。他们把编程看作白天的工作。他们并不真正喜欢在工作之外讨论编程。当在工作中讨论编程的时候,他们也特别地没有热情。基本上,他们缺少激情。

我相信好的开发人员对编程总能充满激情。好的开发人员甚至在没人付钱的情况下也写代码。好的程序员讨论他们正做的一些技术细节,能把你的耳朵说飞了(但是,的确,说真的,他们所讨论的是真正值得讨论的)。一些人可能把这看作不善交际(的确是),但如果你想甄别一个好的开发人员,这种以牺牲社交圆滑为代价换取的对他们正在做的技术的激情,是一个优秀程序员的显著特征。你能录用这个兴奋地谈论自己正在用的技术整整半小时而不见停止的家伙吗?如果能,那你就将成为一个赢家。

#2 : 自学和爱学

编程是在打极速运动的靶子。不到一年,不是新技术替代旧的,就是现有标准被废掉,开发世界的半壁江山都跟着变了。这并不是说所有优秀程序员都能够跟上所有这些变化,还冲在最前沿。而是说,有一类程序员是从来不学习新技术的,除非被迫,因为他们不喜欢学习新东西。这些程序员通常在大学学习编程,并且期望在大学和公司指派的培训课程里学会所有的技能。

如果你正在考虑是否雇佣某个程序员,如果他曾经说诸如“我可以胜任,只要送我去培训一个星期,我就会在这方面做得很好”的话,那就别要他了。一个好的程序员学习新技术并不需要培训。实际上,伟大的程序员将是那些讨论某个新技术能把你耳朵说飞的家伙,尤其是,如果你还没有听说这个技术的话,他还会给你解释你为什么必须把这个新技术应用到当前的业务中去,甚至是在你所有员工都对这个技术一无所知的情况之下。甚至是在他自己也不知道如何使用这个技术的情况之下。

#3 : 智力

一些业务人员认为社交技巧的缺乏和智力的缺乏是一样的。实际上,智力有很多方面,而情感、社会方面的智商只是一个方面。好程序员都不傻。从不。实际上,好程序员通常都是你所知道的最聪明的人。事实上他们很多人也有很好的社交技巧。程序员都不善言辞的传言只是个传言而已。我曾经参加过几个伦敦Ruby用户组的会议,我可以说,除了很少几个特例外,大部分人都聪明、善谈、爱交际、有广泛的兴趣爱好等。不可能你打量一下在酒吧里闲谈的他们之后,就会断言他们“真是
一帮极客”——至少直到你进入一个小组讨论并意识到他们正在讨论的是如何使用重UI前端设计REST应用的最好方式的时候,才可能这么想。

这并不意味着他们在各种社交场合都感觉舒服。这也并不意味着,如果场合他们感觉舒服、足够放松,你将和他能有一个绝好的会谈,就像你和那些“社交上很行”人的谈话一样(或许更好,我所认识的大多数好的程序员的交谈都通常围绕实际有用的话题,而不是华而不实)。

可别雇佣一群笨蛋,却认为他们是好的开发人员。他们不是。如果你和他们在一个放松的社交场合下不能很好地交谈,他们很可能不是好的程序员。另外,任何一个显然很聪明的人至少有成为好的程序员或伟大程序员的潜质。

#4 : 隐藏的经验


这一条和“激情”那条有关,但这是一个很强的标志,因此我想着重强调一下。

我大约9岁的时候就开始在Commodore 64上编程。之后我移到PC上,做一些Pascal。当我14岁的时候我用C和汇编写了一个Ray Casting引擎,花了很多时间玩很酷的图形特效,直接操纵计算机的显卡。这就是我所谓的我的“起步阶段”。进入这个阶段的时候,我是一个不好不坏的程序员,缺少做真正复杂系统的那种自信。这个阶段完成之后,我拥有了那种自信。我知道我能胜任任意庞大复杂的编程工作,只要我在上面用心。

这些能在我的履历里出现吗?不能。

我坚信最好的程序员都有一个或两个隐藏的冰山,这些东西并不出现在他们的履历或简介里。有些东西他们认为写在简历里不真正合适,因为那些东西不是“专业经验”,但这些隐藏的经验里往往有一些可敬畏的成绩。在面试一个潜在的好的程序员时,一个好的问题可能是“能不能讲一个个人的项目——甚至就算是无关的也可以——在业余的时间完成的,并且不再你的履历表里的?”如果他们不能(除非他们的履历表有20页长),他们就可能并不是一个好的程序员。甚至有详尽履历的程序员也有非常出色的项目不在记述之列。

#5 : 多种技术


这一条相当简单。因为爱学习,喜欢尝试新技术,任何一个22岁以上好的程序员都能熟练掌握一打不同的技术,这是不可避免的。他们自己想不这样也没办法。学习一个新技术对一个有激情的程序员而言,是他能做的最有趣的事情之一。他们利用所有时间来学习,积累了大堆他们已经“玩过”的东西。他们也许并不是所有这些技术的专家,但所有称职的程序员都会熟练掌握大量的并不相关的技术。

“不相关”这一点正是玄机。每一个半吊子Java程序员都能列出一套技术像“Java、Ant、XML、SQL、Hibernate、Spring、Structs、EJB、Shell scripting”等。但这些都在相同技术之列,每个之间都直接相关。这一点或许对非程序员而言很难认识到,但可以通过和他们讨论,或者问他们技术之间的差别来辨别他们的技术是否多种多样。在一个技术里太专门是一般般的程序员的一个标志。

最后,如果他们所知道的技术有些不太成熟,那是一个好的肯定的标志。例如,今天(2007年11月),诸如Merb、Fex、RSpec、HAML、UJS、和许多其他...请注意这些都是相当接近的技术,因此几年内那些知道这些技术的人就等价于那些熟悉上一段所列的Java相关技术的人。


更新:作为一个对这点的澄清,这里实际有两个标志:多样和前沿。这两个标志是分离的。一个好的有时间跨度的技术多样性是一个加分的标志,无论这些技术是否前沿都是好的。而且前沿的技术也是一个加分标志,他们是否多样都是好的。

#6 : 资格认证

资格认证大多不说明有多好,更不说明有多差。这里列出的关键点是,当你正试图甄别出好的程序员的时候,有资格认证并不意味着他们矮人半头。很多好程序员有计算机科学的学历。很多并没有。认证,像MCSE或SCJP或类似的,也并不意味着什么。这些认证被设计成所有人都可以得到并想得到。他们只是说明拥有认证的人有某个技术一定级别的知识。它们是一个保险栓,使大公司的技术招募人员不用面试就知道“好,这个家伙知道Java,他得到的认证可以证明这一点”。

如果你正为一个小企业招聘,或者你需要真正聪明的开发人员组成强悍的团队实现企业里的敏捷开发,你应该将大多认证作为噪音忽略。对一个程序员是否好这个问题,认证并不能告诉你多少实质。类似的,忽略年纪。一些程序员在18岁的时候就令人敬畏。有些在40岁的时候令人敬畏。你不能把关于程序员品质的判断建立在年龄之上(你可能决定去雇佣一定年龄的人员来平衡公司的年龄比例;请注意年龄歧视在大多数国家都是非法的!)。

最后需要注意的一点,以我的经验看,大多一般般或差劲的程序员都是在大学为了他们的计算机科学课程而开始学习编程。大多数好的程序员很早以前就开始编程,并且是把编程当作他们自然的持续的爱好来看待。如果你的面试人员在大学之前没做过编程,并且他所有的经验都来自他的第一份工作,他很可能不是一个好的程序员。

免责声明


所有上面或下面的标志都不是一定有的。你可能发现一些伟大的程序员并不符合某几条。然而,我的观点是,一个伟大的程序员不大可能不符合所有的标志。类似的,你可能发现差劲的程序员也符合(或可能符合)某几条。但我坚信,一个程序员符合的越多,就越可能是那些难以琢磨的、作为一个业务人员你需要和他一起工作的、好的程序员。

总结

作为总结,以下是有助于你甄别好的程序员的加分标志或减分标志:

加分标志:

  • 对技术有热情
  • 把编程当爱好
  • 被鼓励谈起某项技术主题时能把你耳朵说飞
  • 这些年有一些出色的(并且通常很多)个人的非正式的项目
  • 主动学习新技术
  • 对什么技术用作用途有自己的观点
  • 对使用他认为不“正确”的技术工作感觉很不舒服
  • 聪明,对很多主题都有想法
  • 在上大学很早以前就开始编程
  • 有一些隐藏的“冰山”,很多个人项目躲在履历背后
  • 技术知识很杂,很多技术不相关(也可能不在履历里)

减分标志:

  • 编程只是日常工作
  • 不真正喜欢交谈,即使在被鼓励的情况下
  • 在公司提供的课程里学新技术
  • 无论使用什么技术工作都很高兴,“所有技术都是好的”
  • 似乎看不出聪明来
  • 在大学才开始编程
  • 所有编程经验都列在履历上
  • 主要关注在一个或两个技术领域(例如,与开发Java应用程序相关的一切),没有这一两个领域之外的经验
我希望这些能有所帮助。

Tuesday 15 January 2008

Term的配置


Emacs下的term基本上和其他的term一样。有两个模式,行模式和字符模式。使用C-c C-j进入行模式,C-c C-k进入字符模式。默认是字符模式。进入字符模式会发现C-x啥的不管用了,C-x被映射到了C-c,因此切换buffer就成了C-c b。开始有些不习惯,不过也无所谓。

Sunday 13 January 2008

约翰


失眠了遇上约翰。

他说他换了个常常出差的工作,薪水因此高了些。

我们谈起了孩子。他说他不懂是不是应该要孩子,但身边所有要了孩子的朋友,都很快乐。他说他正在变老,女朋友也正在变老;近半百了,女人这个年纪要孩子有风险。

那就给她买条狗吧,他欢快地说。

他有时的忧郁像他的眼睛,清澈而灰蓝。

人生应该如何我并不知道。

有时和他聊聊,然后就睡了。

Sunday 6 January 2008

Emacs Jabber和IMified Blogger



应该是把内容给了机器人IMified,它收到后帮我贴到博客上。另一个好处是在GMail里多了一个内容的备份——聊天记录权当备份。完美了。但IMified可够忙的,会话是一个有状态的活动;不管到哪都得记着,这不大容易,也比较耗资源。够难的。

慎独



四处无人的时候,才显见道德的力量。

Friday 4 January 2008

Emacs中写Blogger



之前,emaspeak出了一个Google Blogger的客户端。用了用觉得还是麻烦,甚至都不如直接去浏览器里写来得简单;这还是写英文;中文干脆就是不工作的。因此就没有接着用。后来发现可以用imified@imified.com这个GTalk的机器人写博客,又加上是用Emacs Jabber做的GTalk客户端,因此Emacs就和Bogger 很自然地结合起来了。imified@imified.com有时候会有些慢,大多时候反应很迅速的。写Blogger的使用方法也很简单,只是问标题,内容,标签啥的。不像Emacspeak那么繁琐——甚至都要人写XML,因此推荐大家用Emacs + Jabber +
GTalk + imified@imified.com;每个都很独立,每个也都很有用,结合起来完成一个较复杂的任务,而并没有增加复杂度;真是完美的结合。

Thursday 3 January 2008

两只猫都不太高兴



家里的两只猫都不太高兴。拉着脸,谁谁都欠他们猫粮,吃完了还欠下顿的。没个欢喜样,就这个。有时候小的很恍惚地看着我,像说你谁啊,怎么在这里。大的多是哀怨的。绝不快乐。从没见他们怎么笑过。