第1章 绪论
学徒期(apprenticeship)很重要,因为它能把掌握技能的毕生热情灌输给你。它把永远学习的热情灌输给你,并且在此过程中,使软件学徒变成了卓越的开发者。
——Pete McBreen,《Software Craftsmanship》(软件工艺)
本书是写给软件学徒(apprentice)的——写给对软件开发有一定体验并想继续深入,但同时又需要有人指导的那些人。无论你在享有声望的计算机科学专业拥有大学学历,还是完全靠自学的人,你看到世界上有一些优秀的开发者,而且渴望获得他们所拥有的精湛技能,那么本书就是为你而写的——不是为你的老板,不是为你的团队主管,也不是为你的教授。对于那些位置上的人,我们有很多其他的书可以推荐,但这一本是为刚刚启程的人准备的。
在写作本书的过程中,我们被《Software Craftsmanship》一书中的基本原则和思想深深影响。事实上,本书的书名也反映了这一点。学徒期的概念源于中世纪的手工艺模式,那时一小组从业者在一起工作,经验较少的学徒帮助学徒期满的熟练工(journeyman)和师傅(master)完成工作。我们写作本书的目的之一就是鼓励那些热爱创作软件的人专注于他们的技能。这里我们所讨论的职业过程是从"Hello World!"开始,但它何时结束呢?经常的情况是:一次向中层管理职位的晋升结束了这一过程。太多有才能的人未经深思熟虑就接受了这种职位晋升,然后在短短的几年后发现他们根本不热爱自己的工作,并开始向往退休的日子。而对那些拥有熟练的软件开发技能并热爱学习的人们来说,软件开发将是可以持续一生的职业,而且会是一次风光无限的旅程。
在旅程开始之前,我们想告诉你Dave[1]的故事,并提供一些解说。他的故事展示了一种组合使用各种模式的方式,通过这些方式,不同的学徒模式结合起来产生强大的外力来促进软件开发者的个人成长。另一方面,这些解说是一种尝试,尝试将形成软件技能基础的一整套思想收集在一起,尝试回答跟这些思想有关的常见问题。
Dave的故事(讲述中包含了几个学徒模式的名字)
我的“入门语言”是Perl,但那也是之前两次学习编程失败之后的事。12岁时,在观看了电影Tron[2]之后,受到“一个完整的世界存在于我的电脑中”这种想法的激发,我尝试在自己的Apple IIe机器上自学BASIC。我买来一本由Apple公司出版的BASIC手册,但我想不出如何用这门语言做点让人觉得有趣的事情。当认识到除了基于文本的游戏,我根本写不出任何其他东西时,最终我放弃了。之后在25岁时,我阅读一本傻瓜书[3]来尝试自学Java,并慢慢地做各种练习,创建Java applet。结果我感觉自己真的成了个傻瓜,一切看起来都是那么难,我因此又放弃。直到26岁时,我找到了两位指导者,我的第一门语言才算学会了。那是在伊利诺伊州斯科基市,在"dot-com"泡沫的浪尖上,我在Edventions有限责任公司遇到了这两位指导者。公司的创始人Irv Shapiro知道我想成为一名程序员(他当时雇我做在线内容编辑)而且需要让我学习Perl,扑通一声,他把一本《Programming Perl》(http://oreilly.com/catalog/9780596000271/)(Perl语言编程)放在我的桌子上,并描述了一个“质脆玩具”作为我的练习作业。接下来的几天里,我啃完了《Programming Perl》,虽然对于像我这样的新手来说,这是本相当厚的书。为了继续探究Perl,我从自己的阅读列表中挑了一本消化起来更容易的可视化快速入门指导(Visual QuickStart Guide)系列的书。我的另一位指导者是Steve Bunes,Edventions公司的CTO,他时常坐下来与我“密切交往”,为我演示一些强大的调试技术,直到今天我还使用这些技术。在我完成第一版“质脆玩具”的过程中,最难运用的一个模式就是向旁边工作间中的那些有经验的Perl程序员和系统管理员“暴露无知”。但收起自己的面子是值得的,因为他们给了我一些快速的指导,使我弄清了程序中的一些问题,并理解了UNIX文件权限,这使我很快地完成了“质脆玩具”,让Irv和Steve大吃了一惊。
两年之后,我开始寻找一些机会,让自己的职业生涯超越我心爱的(但也越来越无法升值的)Perl并学习一些新技术。我一头扎进了极限编程(Extreme Programming,XP)和敏捷开发(Agile Development)中,让自己“提高带宽”,那时,极限编程和敏捷开发还处在宣传周期(Hype Cycle)的高潮中。我花了几天时间参加附近一所大学的XP/敏捷讨论会,从那里吸收新的信息。会见和聆听像Ron Jeffries[4]、Martin Fowler[5]、Bob Martin“大叔”、Alistair Cockburn[6]和Kent Beck[7]面对这样的人,简直是一种令人陶醉的享受,我从讨论会中出来后便成了正式的面向对象和极限编程的超级崇拜者。我发现Joshua Kerievsky正在写作《Refactoring to Patterns》(重构与模式),这听起来真让人钦佩,于是我找了个“同道中人”一起学习。很快,我们发现我们都跑在自己前头了,因为我们甚至还不知道重构和模式是什么。于是我开始寻找更适合自己经验水平的书。最终找到了《Object-Oriented Software Construction》(影印版《面向对象软件构造》,机械工业出版社引进)和《A Pattern Language》(建筑模式语言)。我还是想以后再回过头来再看看《Refactoring to Patterns》,于是把它加到了我的阅读列表中。
还是跟那个“同道中人”一起,我从2002年开始学习Ruby,但我无法找到很多在日常工作中使用Ruby的途径,直到出现了Ruby on Rails。2005年,我再次拾起Ruby,努力寻找一些在日常工作中使用它的方法。我开始用它构建一个“质脆玩具”,却发现自己的思维方式太像Perl程序员。对于任何一个精通其“入门语言”的程序员来说,当他学习一门新的语言时,都会遇到求助于已有语言的标准和惯用法的诱惑。Ruby拥有优雅、简洁的美誉,而我所写的代码让人感觉既丑陋又蹩脚,这让我觉得自己是在做错误的事情。我刻意决定系上“白色腰带”,于是把自己的Perl经验丢在一边,开始深入钻研Ruby文档。之后,我很快明白了我需要的是什么,并将那些费解的代码重构成精良、标准的函数调用(Ruby程序员们好奇了?就是String#scan那样的)。为了让所有这些新知识留在我的大脑中,我决定“暴露无知”:在网站上记下了自己学到的东西,让所有的人看。[8]