附录C 回顾Obtiva学徒训练项目的第一年

Dave Hoover

注解

这是我2008年3月23号发表在自己博客上的文章[1]。在去年的行动号召之后,这些就是我所做的尝试,它包括以身作则的领导,还有把我尝试在Obtiva建立学徒项目时的一些得失分享给大家。自从写下这段回顾,在已有的两名学徒提升之后,我们又雇佣了两名新学徒。

一年之前,我不再做全职的现场咨询工作。我是2004年进入ThoughtWorks时开始做现场咨询工作的,然后伴随着我在Obtiva的第一个客户一直持续到后来。从2007年春天开始,我开始做一些定量的多日工作,但我的大部分时间都是在美国伊利诺伊州(Illinois)惠顿县(Wheaton)一个离家一英里的狭小办公室里度过的。启动Obtiva的“技能工作室”以及后来的学徒培训项目是一次冒险,但在大量的艰苦工作、频繁地犯错以及不完善的管理之后,我可以很自信地说:过去12个月的付出是值得的,未来也是光明的。让我试着解释一下我所谈论的事情,以及为什么我对我们第一年的成功如此自信。(Michael Hunger就这一话题询问了更多信息,顺便表示感谢。)

什么是“技能工作室”(Craftsmanship Studio)?或许我该问:“什么是Obtiva的‘技能工作室’?”因为我目前只有谈论这个的资格。首先,“技能”(Craftsmanship)在这里是指什么?我对这个问题的最佳回复是建议你去读Pete McBreen的《Software Craftsmanship》(软件工艺)的第三部分。作为一名自学出身而且拥有右脑化工作背景的程序员,工艺技能的概念很快引起了我的共鸣。这样,毫不奇怪,当我有机会在Obtiva内部建立自己的实践方法时,我就会按照Pete McBreen书中那些给我灵感的思想来行事。

其次,“工作室”在这里是指什么?字典告诉我们:“工作室”是“艺术家的工作场所”,或者“一个传授或学习艺术的组织机构”。这听起来是对的,也得到了事实证明:“计算机编程作为一门艺术”(Computer Programming as an Art),在我们这个领域的领军人物当中,长久以来一直都是牢不可破的主题。

以上观点基本概括了我们对“技能工作室”的设想:一个编程新手可以跟经验丰富的开发者密切合作,基于真实项目来学习软件开发工艺的地方。事实情况比我们的设想要混乱得多,有太多时间学徒们被孤立起来,或者一起工作但没有人照看。这些混乱可以归因于一个事实:我只是一名熟练工,而不是一名师傅级的工匠;因此,这一年里,在我(通过反复试验)学习项目管理、客户关系、能力规划和人员招聘的过程中,我犯过很多的错误。幸运的是,在那段时间我们有过大约50次的回顾反思,并将敏捷原则改编成一种每周都在持续进步的过程。

如果我们的“技能工作室”是一个新人和老员工工作、学习和进行指导的地方,那么学徒(apprentice)又是什么呢?在Pete的书中,第三部分可以快速地向你介绍学徒期(apprenticeship)的概念:

工艺模型的一个重要特征是:很难仅仅通过说教让别人学会一项技能。实际上,你必须在现实的条件下,在一个能提供反馈的、有经验的从业者的悉心关注下练习这项技能。

这描述了需求和关系,但现实中这些假设的新人又是谁呢?对于处在学徒期中的人,我是这样定义的:一个甚至不惜牺牲其他机会来最大限度地获得学习机会的人。这常常意味着故意将自己置于“只求最差”这样的情景中,我刚加入ThhoughtWorks时就是这么做的。对Obtiva,这意味着我们注重的是潜力和态度,而不是资历背景。在短期内,这些人可以到别处赚更多的钱,但他们是在做一笔投资,来学习可以得到长期回报的东西。

我希望看到我们的学徒项目能够更加成熟,成为一种具有更好的反馈机制和里程碑的正式学徒训练过程。我仍可以说,虽然作为管理者我有很多缺点,但参加我们“技能工作室”的四名学徒都非常成功。这一年的经历进一步印证了我做学徒时学到的一点:学徒期完全是你自己安排造就的。我们有一位Perl Web开发者,到我们这里学习Ruby、Rails和Java,离开时为一家本地的对冲基金公司写了一个支持16核机器的多线程的Ruby/JRuby/Java/JNI应用。有一个人为了重启自己的职业来到我们这里,学习UNIX、MySQL、Perl、Ruby和Rails,现在为工作室最大的客户管理并开发电子商务系统。有一个人从一家本地的Rails血汗工厂来到我们这里,学习诸如Sphinx、rSpec、god、ActiveMerchant、CruiseControl.rb和Perl这样的技术,现在他正把Git引进团队,而且很快就会成为他的第三个Rails电子商务项目的主管了。还有一名网络管理员来到我们这里,后来很快交付多个不同的Rails项目,现在正在处理一个巨大而又混乱的通过rSpec管理的Rails代码库,比我知道的许多经验丰富的开发者做得还要好。

该把我们的成功归功于哪些因素呢?

·共处一地:没有什么能打败面对面的团队合作。

·结对编程:没有什么能打败肩并肩的开发。

·测试驱动开发:没有什么能打败具有微型反馈回路的“乒乓编程”。

·敏捷原则:根据我们坚持的原则,定期重新评估我们的现状,并相应地调整开发过程。

·尊重客户:直接与“目标施主”(常常与“黄金属主”是同一人)[2]一起工作,并使用他们的语言建立用户故事(user story)。

·精良工具:我们使用具有超平板屏幕的Macs机器,并定期引入新技术来促进生产率。

·努力工作:不管条件多么困难,我们都全力关注自己要交付的产品。

·文化:没有什么能打败一个可以在停车场上打雪仗、让创造性的活力四处流淌的即兴团队。

所有这些加到一起就形成了不断增长的服务需求,我们正逐渐变得更善于管理它们,这些因素相互结合,让一切都按照可持续的节奏快步前进。这种节奏是关键的部件,因为这意味着我们同样拥有办公室之外的生活,为第二天的团队协作补充精力。

[1]"Red Squirrel Reflections"(红松鼠沉思录),参见:http://redsquirrel.com/cgi-bin/dave/obtiva/apprenticeship.program.first.year.html.

[2]原作者使用的两个词分别是"Gold Donor"和"Gold Owner"。