“我50多岁了,已经做了30多年的程序员,现在找不到工作了。”2015年的时候,我在一篇博客里以这句话作为开头。今年年初,我的另一篇博客“On Getting Old(er)”获得了空前的关注。我从1983年以来一直从事编码工作,直到一起荒唐的竞业诉讼让我失业了一个月。我在博客上发表的文章把我推向风口浪尖,我似乎就这么成为了老程序员的代言人。我在纽约2017 QCon大会上做过演讲,InfoQ希望我能够就大龄工作者的话题写一些文章。
我将从我的经验出发来讲讲关于招聘和被招聘的那些事。我希望有两类人能够看到这篇文章:正在找工作的“老人”和负责招聘的“年轻人”。
首先,请原谅我使用了“年轻人”和“老人”这样的词汇。或许“老人”这个词用得不是很恰当,那么用“上了年纪的人”或“有经验的人”怎么样?或许你更希望通过数学的方式来定义:老人的年纪应该是你的1.37倍,而年轻人的年纪应该是你的0.63倍。在我看来,年轻人应该要比我的孩子(31岁至35岁)年轻。
对老程序员的需求不旺盛
为什么公司不聘请老程序员?我想他们主要存在如下几个误区。
老程序员的技术不能与时俱进,也学不了新技术
他们不愿意加班
他们无法与年轻程序员打成一片
因为有多年的经验,所以会要很高的薪水
他们只是想找一份糊口的工作
他们在GitHub上不够活跃,可能缺乏有用的实战经验
终身学习
现实不同于意想,实际上很多老程序员都具备终身学习的能力,反而是一些年轻人在大学毕业几年并拿到相对有竞争力的薪水之后就停止了学习。老程序员其实是可以加班的,因为他们的孩子都已经长达成人,不再需要他们的照顾了。更何况,不管年纪大小,每个人每天都需要8个小时的睡眠来保持生活与工作的平衡。
融入团队
让老程序员与年轻开发者共事会给公司文化的多元化发展带来好处。那么什么样的公司文化才算得上是好的文化?晚上大家一起去运动酒吧喝酒就算是好的文化吗?或许对于有些公司来说是这样的,但其实还有很多优秀的程序员并不喜欢这样。一个好的公司文化应该充满学习的热情,大家互相促进,互相学习,员工能够接受他人的建议,并拥抱变化。团队气氛飘散着幽默的气息,人们有机会表达自己的个人兴趣。
我曾经与以下这些人共事。
一个印度工程师,他乐于接受家庭的包办婚姻。
一个哥伦比亚女固件工程师独自带大两个小孩。
一个牙买加Cobol/Java程序员在1984年奥林匹克奥运会上代表美国参加跨栏比赛。
我发现,年轻的开发者很希望那些既懂新技术又有过大型机经验的人能够给他们带来一些不同的视角。开放的公司文化能够让我们了解其他同事的生活,他们也能从像我这样的老程序员身上了解过去的东西(我曾经做过6个月的监狱看守员)。
薪水和管理工作
因为年龄方面的歧视,老程序员对薪水的期望已经有所下降了。如果他们真的想要很高的薪水,那他们应该去应聘更高的职位。要知道,老程序员其实并不想做管理岗位。他们可能在过去就已经从事过管理岗位,他们只是不想继续走这条路。事实上,老程序员认为写代码更有意思。
当然,这并非意味着老程序员多年的团队经验就毫无价值。事实上,年轻的管理者应该向老程序员取经。
问他们事态可能会怎么发展。
其他开发人员应该做些什么,他们能够提供哪些帮助。
对于网络上出现的或其他开发人员热衷的技术作何反应。
在我的职业生涯里,我与很多团队共事,有些事情我能考虑到,但团队的领导(经理、主管等)却想不到或意识不到。例如,几年前我参与了一个世界财富100强公司的大项目。我所在的子团队主管是一个年轻人,他在这个公司工作了好多年。这是一个基于Groovy和Grails的项目,我一直跟主管讲,我与那些刚来的人不一样,我有8年多的Groovy和Grails经验,但他只分配给我一个很简单的任务——将Java 1.4的代码迁移到Groovy(简单,但很耗时)。后来又来了一个开发者,他四十多岁,相对于主管来说也算是老程序员了。他没有Groove和Grails经验,不过我看得出来他很聪明。然而,主管却让他做与项目不是很相干的工作。我强烈建议主管让这个人重构乱糟糟的代码,但主管对我的建议视而不见。在项目进入集成测试的时候,猜猜是哪部分代码出了问题?没错,就是原来那团乱糟糟的代码。那么最后是谁修复了这些代码?没错,就是那个新来的。我想说的是:不要低估了老程序员的编码能力,要试着去发现他们身上的闪光点。
GitHub活跃度
一些用人公司希望应聘者在GitHub上有公开的项目,这似乎已经成为一种趋势了。这样他们就可以看到你的代码,一些招聘广告甚至要求应聘者提供GitHub个人信息。我们这些老程序员习惯了使用CVS或Subversion,Git用得相对较少。当我们忙于生计的时候,那些年轻人在学校里有大把的时间参与开源项目,或者至少会写一些应用示例。即使我们当中有人使用Git,那些代码仓库也都是私有的。
如果用人公司基于GitHub活跃度来筛选候选人,那么他们会因此漏掉一大批好的开发者。如果他们要看代码,完全可以直接向候选人要。我在GitHub上的确有三四个项目,但它们的所有权是属于雇主的,他们付钱给我,我给他们开发了这些应用。我建议面试官可以在面试过程中考察候选人的编码能力,而不是一定要求提供GitHub项目代码。
求职信
对老程序员说的话
求职信是你展示自己的好机会,不过一页纸也只能容下几个段落的内容,所以第一段既要简短又要有说服力。你可以在这里说明为什么想到应聘的公司工作,以及为什么你觉得自己一定会给他们的团队带来贡献,你也可以表达出希望到他们那里学习和成长的强烈愿望。亮出你的真实身份,让他们知道你是个老程序员,你可不希望在面试的时候因为皱纹和白发(不过这些也是你宝贵经验的象征)直接被淘汰。
不要对你的过去说个没玩没了,它们已经写在简历上了,看过简历的人要么已经把它们忽略掉,要么已经表示默许了。相反,你要表现出对学习的强烈兴趣和继续追求成功的强烈愿望。简而言之,不要谈论你的过去,而是要谈论你的未来。
我发出过很多随意编写的求职信,像撒大网一样,但反馈率很低。但神奇的是,每次我努力把求职信写得简短而有说服力的时候,总能收到反馈。所以我总结了一个经验——花点时间写好求职信。
对年轻人说的话
如果你不确定是否要聘请一个老程序员就不要让他们来面试了,不要浪费他们宝贵的时间。在面试中因为年龄问题就把他们忽略掉对于他们来说是件令人丧气的事情(有时候甚至会给他们的职业生涯带来伤害)。摒弃对老程序员的偏见吧,如果你对他们的简历感兴趣,就按照正常的面试流程来面试他们吧。
简历
对老程序员说的话
首先,我们要明白,我们不能使用简历来挑选员工,我们只能用它们来过滤候选人,没有人会因为他们的简历而直接被录用。
在简历里写明与职位有直接关系的工作经验,例如,我在简历里详细描述了我在Web 2.0之后的工作经验。虽然我也写了之前的其他经验,但我只是想通过它们展示我过去丰富的IT经验。
不要在简历上写太多你做过的任务、项目和ROI(投资回报率)。如果你在一个公司工作多年,可能做过多种职位。如果你在一个职位上干了好多年,那么就列出你做过的最成功的项目。
从非技术角度说明你的工作给公司带来了哪些好处。下面是从我的简历里摘抄的几个例子。
为一个批发供应商开发了一个零售网站,在第一年给他们带来100万美元的营收。
设计开发了一个具有专利权的“学习分析器”,它可以从网站上抓取商品的名称和价格。
救活了一个将死的初创应用,这个应用是由承包商开发的,耗时三年,花掉了100万美金,却给公司造成了滞销困境。
不要太在意头衔,头衔是很虚无缥缈的。公司发明了很多头衔,希望HR借此吸引更多好的开发者。我清楚地记得我在Circuit City办公室写代码的时候,有个访客问我的头衔是什么。我说我不知道,我不关心这个。访客看着窗户说:“你有一个带窗户的办公隔间,所以你至少是一个高级……”我不关心这些,我只想回去写我的C++代码。我曾经跟人们说我的头衔是“码农”,但现在我觉得我是老程序员的代言人,我在简历上写的头衔是“高级码农”。综上所述,我认为在简历上要体现出你的工作成果,而不是头衔。
面试
面试老程序员的年轻人
我一直认为很多年轻人不喜欢管理老程序员,也不喜欢面试老程序员。要记住,你们的任务就是招到有学习热情、有追求卓越愿望的人。如果老程序员的简历看上去很漂亮,那就把他们请见来面试吧。
我不得不承认自己也是个对老程序员有偏见的人。有整整十年时间,我与多个公司的老程序员一起工作,他们大部分人的技术都退化了,他们之所以还能留在公司,仅仅是因为他们了解公司的系统,而不是因为他们的技术水平。不过,如果要想知道一个老程序员是否宝刀未老,可以问他们几个问题。
他们最近学了哪些热门技术?
他们是怎么看待持续学习的?
他们经历过哪些失败,并从中学到了什么?
你可以从他们的回答中判断出他们是否还保持着一颗年轻的心,或许你会发现他们仍然在持续学习,对成功仍然有着强烈的渴望,对于你的团队来说会是一个潜在的宝藏。
我发现有很多年轻人喜欢吹嘘那些很酷的技术,但实际上这些技术并没有给项目带来成功。个人而言,我已经厌烦了应用重构,比如从NoSQL转回到MySQL或Postgres,或者把微服务重新整合成单体。如果一个候选人说他们正在使用最热门的技术(比如NoSQL或微服务),那么就问他们为什么要用这些技术以及他们是怎么做的。
从面试者那里了解新东西,这是多年来我一直在用的面试技巧。我不会去问他们封闭式的问题。如果我不能从他们那里了解到任何新东西,那就有问题了。他们应该能够给团队带来崭新的视野。我不断切换话题(编程语言、框架、设计模式等),直到能够从他们身上了解到新的东西。举个例子,一年前我面试了一位女士,她应聘的职位要求懂Ruby and Rails或Python和Django框架。这位女士只有.Net和PHP经验,几乎不懂Ruby或Python。我先问她.Net问题,然后慢慢转向PHP。我最后接触PHP那会儿还是PHP 4的时候,PHP 5也才刚刚发布。在面试过程中,她讲了很多PHP新语法和特性,以及在升级过程中碰到的问题。我从她身上了解到了很多新知识,所以投了她一票。
老程序员在被年轻人面试的时候
之前我表达了我对年轻人在面试老程序员这一事上的看法,而对于老程序员,我也有一些看法。我想很多老程序员不知道该如何在面试中表现好自己。
首先,你可能很久没有参加面试了。多年前,你可能刚刚走出校门,很年轻,所以能够得到很好的工作。现在,时间过去了好几年。你知道自己还很优秀,你也知道你的经验对于用人公司来说是就是筹码。但请不要因为积累了多年经验就嚣张气焰,相反,你要表现出对未来想要达成目标的自信,对自己技术能力的自信,对近期学到的新技术的兴奋之情,以及你的适应能力。让他们看到你将会给他们的公司带来成功。在我被面试的时候,我一般会说,我很高兴能够学习他们要求的技术,尽管当前还没有太多的相关经验。总之,让他们看到你的学习热情是非常重要的。
不过要注意一点,不要试图去掌控整个面试局面。掌控一屋子人的场面对于老程序员来说不在话下,更不用说是一对一的面试了。不过人家毕竟是经理,所以还是让他们来掌控局面吧。如果你这么做了,那些年轻人会认为你会对他们造成威胁。
你可能会被问到一些计算机科学方面的封闭性问题,可能在之前的面试中没有被问到过,会涉及你没有用过的技术。比如,我没有计算机科学学位,但我在一个公司做了5年的程序员,并开发出了在AS/400上使用的第一个非IBM C编译器。我当时的第一个任务就是为AS/400开发性能调优器,要开发这个工具需要懂统计分析算法,我向公司半打拥有计算机硕士学位的开发者请教,但他们没有人记得算法的细节,都只是说书上有。所以,你最好能够找到正确的算法,然后有能力去实现它,而不是从书上生搬硬套。我使用C语言开发出了这个工具,使用了排序、各种数据结构和复杂的算法。这个工具(ASNA Activ8)为公司赚了几百万美元。在今天,那些年轻的面试官可能都没有真正用过一些技术,如果我们只是生搬硬套一些答案可能就会有问题。
但不管怎样,你肯定会被问到计算机科学相关的问题,我建议你们读一读Rob Connery写的“The Imposter's Handbook”。Rob在书中写道:“没有计算机科学学位?我也没有!所以我写了这本书来弥补我的职业短板。结果呢?这本700多页的书成为每一个开发者必读的经典。”
关于面试的最后一点建议:如果你很久没有参加过面试,那么就找一个懂技术的朋友来一场模拟面试。
代码考察
对老程序员说的话
你的求职信和简历让你顺利进入了面试。面试进行得很顺利,不过当中可能会有代码考察。我很讨厌代码考察,毕竟我已经写了30年的代码。如果我平均一年可以赚5万美金,那么我迄今已经通过写代码赚到了150万美金了。但现在这个年轻人却要我做代码考察?不过不要着急,毕竟人家是要招一个能写代码的人,而不只是一个在面试中表现良好、在工作中只会运行简单程序的人。招错了人需要付出高昂的成本。要知道,那些年轻的应聘者也需要参加代码考察。而且你要更加地努力,因为那些年轻的应聘者可能有更多参加代码考察的经验。下面是两个关于代码考察的建议。
在考察过程中使用编辑器或白板
当场完成或者带回家
我是一个很有自信的程序员,但在场的面试官看着我写代码会影响我的发挥。所以,我们要做一些练习。有很多网站提供了各种级别的代码考察练习。
EXERCISM
CodeKata
Codility for Programmers
HackerRank
要记住,现场代码考察与大学考试不一样,它需要与其他人一起写代码。向别人要反馈,问他们问题,也把你的想法告诉他们,甚至打电话问朋友或者使用Google搜索。总而言之,就是使用开发人员平常使用的技术把问题给解决了。
现场的考察项目都是用人公司的真实项目,一般你会得到报酬。而带回家完成的项目一般是虚拟的项目,你一般不会得到报酬。我很讨厌这种带回家完成的项目,因为你有可能花了很多时间在上面,但最后却不会被录用。
在完成代码考察项目时要使用lint工具做测试,你不会希望你的代码因为没有遵循常规格式而通不过验收。
对年轻人说的话
要让老程序员知道代码考察需要和别人合作才能完成,让他们知道思考问题的方式和写代码的方式才是考察的重点。可以考虑使用有偿的项目来考察他们,Jeff Atwood在“如何招聘程序员”中写道:
“如果你想招到好的员工,那么就用有偿的项目来考察他们。我指的不是泛泛的编程题,而是你当前项目中急需解决的问题。这算得上是一份临时的咨询任务,以小时为单位,而且要定义好任务的边界。”
更明智地招聘和应聘
年轻人,不要错过了拥有才能和经验的老程序员。站在他们的角度纵观他们的职业生涯,让有终身学习欲望和追求卓越渴望的老程序员加入你的团队,一定会给你的团队增色不少。
老程序员,准备好求职信,带着年轻的心态去面试。好汉不提当年勇,关注未来,而不是过去。表现出渴望与年轻人共事的热情,努力为各种风格的面试做好准备。