最好的开发人员是培养出来,而非买来的 来自:zdnet.com.cn
认真考虑一下,得到最有天赋的项目开发人员的最佳方法是培养,而非购买。
在阅读有关敏捷开发的材料时,我发现,无论是传统的软件开发技术,还是敏捷方法,都要高度依赖熟练的开发人员才能确保成功。这一事实让我触动。由于许多因素的影响,具有相似经历的开发人员的表现水平却相差很大,这点已为人们所接受;所以人们对优秀的开发人员比较关注也就不足为奇了。尽管如此,一个或一小群开发人员,利用“英雄模式”开发,通过他们的奉献精神与坚韧毅力,还是完成了许多开发工作。
很明显,我们需要优秀的开发人员。但问题是,到哪去找优秀的开发人员呢?
十几年来我一直参与招聘工作,我可以毫不迟疑地告诉你:有可能找到最优秀的开发人员,但是可能性不大。这不是一件容易的事,即使读完一千份简历,可能也只能找到一两个真正优秀的开发人员。
认真考虑一下,你会发现,只有通过培养,而不是购买,才能得到最优秀的开发人员。
什么造就最优秀的开发人员?
关于是什么造就最优秀的开发人员,大家持不同的看法。不管是敏捷还是传统的开发技巧都需要开发人员拥有稍异于人的东西。但是,无论开发人员应用哪种技巧,这都归结为一个词:思考。
位于Bloom认知技能教育目标分类最底层的是知识。即回想(或识别)数据与信息。应用在开发方面,这就意味着识别C#语法或回想出执行循环的正确语法。
位于认知分类最顶层的是综合与评估。综合指能够合成不同的因素以形成全新的解决方案。而评估是指对观念、方法或材料做出判断的能力。在工作过程中,开发人员需要不断地应用这些高层次的认知能力。
许多人认为,与描述认知过程的差异相比,将这一观念表达为思考更为自然。通常,对高层次的观念(例如如何综合片段来形成解决方案)所做的思考越多,开发人员就更优秀。
海底捞针
在完全放弃招聘(购买)最优秀的开发人员之前,我们先通过检验专业技能来了解一下招聘过程。我例行公事地对应聘开发职位的候选人进行了一次口头测试。由于我面试的大多数开发人员需要能够熟练地操作数据库,我问他们一个简单的问题:
给你一个带客户id域与名称的客户表,以及一个带序号id,客户id与其它细节的序号索引表,用什么查询可返回不带序号的客户表?
此问题的答案需要应用外部连接(outer join)知识。(在SQL-87语法中,你可以应用*=,但这一答案正日益少见。)我的非正式统计表明,答对此问题的人数在10%以下。平均来说,我面试的开发人员拥有大专学历,有1到2年的工作经验。但是,据我的观察,多年的工作经验与他们是否答对此问题关系不大。
对我而言,无力回答此问题表明开发人员并不完全了解SQL所要求的以集合为基础的逻辑方式。我认为这是一个优秀开发人员的基本技能。
另一个问题更有趣,因为它没有正确答案:
你最喜欢微软.NET中的哪项功能?
明显地,你可以在这个问题中插入任何技术。问题的答案可以清楚地告诉你开发人员的思考方向。如果它告诉我是IntelliSense(帮助你记忆对象与方法界面的Visual Studio功能),我就知道他们主要关心如何将代码加入编辑器,这并不是优秀开发人员的思考方式。顺便说一下,如果他们给出那个答案,他们可获得“加击”。(另一击?即“你还喜欢哪项功能?”)
我在寻找一类表明他们正在思考文本编辑框以外的事情的答案。我在寻找这样的答案:“因为运行时间类型的信息,可编写灵活代码的能力。”这样的答案表明他们对工作进行了深入思考,这是成为最优秀的开发人员的基本条件。
“你最不喜欢什么?”这个问题同样富于启示。“忘记C#中的分号”这样的答案让我怀疑候选开发人员是否达到正确的思考层次。“无力有效应用垃圾收集器”这样的答案表明他们既不了解平台的需要,也缺乏处理复杂问题的经验。
问题“你最喜欢/不喜欢什么?”的回答比SQL问题的回答要好得多,但仍然并不乐观。参加面试的开发人员,超过70%回答的是琐碎的问题,其它10%左右的答案表明他们要么编码的水平不高,要么缺乏高层次的思考。
最终的结果表明,要找到最优秀的开发人员几乎是不可能的事情。实际上,我也可能只招聘到2到3个可称之为最佳开发人员的人。
培养优秀的开发人员
找到有潜质,即好奇心强、个性好学的开发人员要更容易一些。这些开发人员确实希望在自己与他人的生活中发挥重要的作用。他们可能并不了解关系数据库,但他们乐于学习。他们带来学习的热情,让周围的人充满活力。
在许多机构,这种热情却以服从的名义受到压制。“我们一样那样做”的心态打消了任何改善状况的尝试。因此,开发人员常常感到困惑。因为组织一方面声明希望组建世界级的开发团队(每个组织都希望拥有这样的团队);另一方面,他们又不愿意做出变革。
但是,我们可以采取行动,以保证新开发人员的干劲与期望不会受到压制。以下是我就培养优秀开发人员提出的一些建议:
指导:指定一个导师来帮助开发人员。这个人必须是一个资深开发人员,开发权威或关心团队和进程改善、乐于助人的构架师。这个人不应是开发人员的直接领导或经理(如果可能的话)。指导交谈应该以开发人员,而不是组织的需求为中心。
代码审查:代码审查是提高开发能力的有效手段。但很多组织却极少这样做。另外,人们很少把它当作是学习机会,而把它当作贬低开发人员的时机。请进行代码审查,把它当作培训与教育,而非压制的手段。
渐进体验:向开发人员提供增量分配来鼓励他们不断成长。由于我们无法控制将来的项目,这可能是最难以执行的方法。但是,提供尽可能多的渐进分配结构将会取得长期回报。
学习挑战:除了渐进分配以外,还要找出其它方式激励开发人员学习尽可能多的知识,即使这些知识不能立即起作用。例如,如果你有一家网络开发商店,鼓励开发人员学习智能客户(Smart Client)技术,以帮助开发人员养成学习习惯。
内部培养
尽管你想为下一个项目找到优秀的开发人员,但优秀的开发人员并不容易找到。项目的成功主要还是依靠现在团队里的开发人员。他们越优秀,你成功的机会就越大。找到技术熟练的可靠人才来完成你的需求肯定会很困难。自己培养开发人员,是获得你所需要的开发人员唯一现实的方法。