学徒期是什么
最基本的学习情形是这样:一个人帮助一个知道自己正在做什么的人,从而让他学到东西。
——Christopher Alexander等,《A Pattern Language》,第413页
许多书,包括1945年版的《Fifteen Craftsmen On Their Crafts》(十五工匠学艺,第69页),都描绘了一种学徒训练的老套情景:一个十来岁的小男孩,脸上满是烟灰,在一个铁匠铺子里做工。铁匠,那个粗鲁的、有经验的工匠,在男孩的协助下打造着自己的项目。有时男孩积极地参与到这一过程中;也有时他只是在打扫店铺,但仍然密切注意着正在工作的师傅。最典型的情况是:男孩的学徒期将持续好几年,除了知识、经验和食宿,他很少能得到其他报酬。
最终,男孩将学到足够的技艺来独立承担一个项目,甚至可能离开他的第一位师傅,到另一家店铺中充当责任更多的角色。学徒期结束时,他将获得一份铁匠的营生,靠自己的手艺来为自己遮风雨、充饥肠,并购置工具。在现今世界上,包含一名熟练的软件开发者和一名新手的学徒训练跟这种旧式的学徒训练已经少有相似之处了。那么,我们现在对学徒期的理解是怎样的呢?它又如何超越那种老套的情景呢?
明确一点,在本书中我们并不是要向软件开发新手建议理想的做学徒的方法。如果我们是为团队负责人和项目经理写这本书,那么对于构建理想的学徒期提供一些指导是有意义的,因为这些人确实有力量推动这类训练过程。但本书是为软件开发的新人而写的,这些人处在阵地上,想努力搞清楚怎样才能学到他们需要的东西,从而实现一些目标,比如找一份(更好的)工作、完成项目,或者成为一名卓越的开发者。由于大多数新人的经历并不与一种“理想的”学徒期相似,现代学徒期的概念主要是一种心境:你认识到自己处于起始阶段,哪怕你已编程多年;而且你想采取措施从你所处的环境中建立自己的学徒过程。
大多数人都没有机会参与一次由软件熟练工指导的正式学徒训练。现实中,多数人都只能在不太理想的环境中磨砺他们的学徒过程。他们可能面对傲慢专横或能力不足的经理,精神涣散的同事,无法达成的最终期限,以及条件低劣的工作环境:把新手当苦力,安置在狭窄的长方形隔间里,有一台PC跟一条很卡的网络连接。本书中所有的经验都来自于那些为达到新的技能水平而不得不克服这类低劣环境的人(就像我们)。在这个行业注意到后面所讲的Pete McBreen的建议之前,新手仍将需要像本书的这样书籍来帮他们创造自己的学习机会。
我们可以从容不迫地培养学徒开发者,因为我们面对的是过剩的问题,而不是短缺的问题……如今的开发者数量比我们需要的多,而我们缺少的是好的开发者。
——Pete McBreen,《Software Craftsmanship》,第93页
学徒过程是学习如何成为专业软件开发者的途径。特别地,它是学习如何成为你所找到的技能最高超的软件开发者的途径。它包括寻找好的老师并利用在他们身边工作的机会来学习。它是成为一种不同的软件职业者的道路上迈出的第一步,这种职业者想要的绝不只是“称职”。