什么是软件技能
像工艺(craft)、技能(craftsmanship)、学徒(apprentice)、熟练工(journeyman)和师傅(master)这些简单的词汇,字典中的定义无法满足本书的需要。它们经常形成循环解释(“工艺”解释成“一个技师(craftsman)所拥有的技能”,而“师傅”被解释成“表现出技能水平的人”,而“技能”则被解释成“将手工艺传统中的技师连结在一起的一种品质”),很少基于特定国家行会体系的历史,而且常常被泛化到用于描述通过某种技能构建起来的任何东西。简而言之,这些定义没有排除任何东西,于是也就包含了所有东西。而我们需要的不止这些。
关于“软件技能”(Software Craftsmanship),网络搜索引擎列出了61 800条引用,但对一个寻求职业指导的人来说,这些引用很少有提供有用解释的。让人郁闷的是,许多这样的文章都是由一些善意的程序员写出,他们发现在这些混乱的相关概念中隐藏着一些有用的东西,却没有能力把这些东西明确地提取出来。
Pete McBreen的《Software Craftsmanship》是一次尝试,尝试为软件开发的新颖方法整理出一份宣言,一般认为“软件开发是一门工程学科或一门科学”,而McBreen的书所瞄准的是那些做事并不基于此种假设的人。但这份鼓舞人心的工作仍有瑕疵。他没有把今天正在实践着的软件技能跟他希望实践的软件技能区分清楚。他也没有把他的愿景(vision)跟“隐形的行会监控高度成熟的行业”这种中世纪的手工艺观念做一个足够清楚的区分。他犯了一个从软件工程的反方向来定义软件技能,并要求读者在二者中做出选择的错误。而我们认为,一种工艺模型可以用更加积极的方式来定义,人们觉得构建软件工程学科还是有意义的,我们的定义不能把这些人排除在外。
我们从中世纪直到工业革命前盛行于欧洲的手工艺制度(《The Craftsman》(工匠),第52~80页)中获得启示。在那种制度中,行会控制着师傅,师傅控制着那些工作和生活在工场中的人。师傅拥有工场并有绝对的权威。在这种严格的等级制度中,位于他们下方的是熟练工。他们通常都是能工巧匠,但仍需完成他们的“杰作”,以此表明他们的技艺已足够精湛,可以做师傅了。
技工们四处游走,正是借助这一点,新技术才从一个城市传到另一个城市。除了引入新技术,技工们还要监管学徒们的日常工作。学徒们会为一位师傅工作多年,直到他们能证明自己已经掌握了基本技术,并理解了手工艺的价值,从而升级为一名熟练工。不能被安放到行会等级结构中的人是不能合法从业的。
可以想象,这一系统在今天即使没有违法,也肯定要遭到唾骂,而且根本不切实际。我们不想再重复这种将手工艺制度推到了现代社会的边缘的错误。相反,我们相信完全可以放弃匠人工场的传奇式幻想,而采用现代工艺工作室,在那里我们可以在过去的基础上不断改进,而不仅仅是模仿它。
我们从敏捷开发运动中学到的经验之一是:仅仅告诉人们去做事情并不能带来长久和可持续的变化。按照你的要求去做事的人如果遇到你的规则没有囊括的新情况,他们马上就会迷失。相反,还是同样的人,如果理解了支撑规则的底层因素,他们就能想出新的规则来适应任何情况。在这里,我们的目标不是简单地交给人们一本讲解规则的书,而是给予他们针对新情况创造新实践,进而将软件开发学科推向前进的能力。
我们对软件技能的愿景,一部分是价值的提取,针对我们为写作本书所访问的技艺精湛的个人;另一部分是希望的表达,表达我们希望出现的社区类型。书中的思想是这一愿景的起点。因此,当我们使用短语“软件技能”,我们所说的是由一些相互交叠的价值所联结和定义的一整套实践,包括:
·对Carol Dweck所做的研究,即提倡“成长型思维模式”(Growth Mindset)的依属。这带来了一种信念:如果你愿意钻研一件事,你就能做得更好,一切也将得以改善。用她的话说,“努力是使得你聪明能干的东西”(《Mindset》(心理定向与成功),第16页),而失败不过是引导你下次尝试不同方法的激励机制。这跟以下信念是相反的:我们每个人天生都带着固定数量的禀赋,而失败就是我们天资不够的证明。
·基于你从周围世界获得的反馈,始终不断适应并做出改变的要求。Atul Gawande将这说成是一种“从你所做的事情中寻找不足之处并寻求解决办法”的意愿(《Better》(更好),第257页)。
·一种对注重实效而非教条主义的向往。这包括一种肯于牺牲理论上的纯洁性和未来的完美而达到“今天把事情做完”的意愿。
·一种认为分享知识胜过隐藏独享的信念。这常常关联到对自由和开源软件社区的参与。
·一种敢于实验并被证明错误的意愿。这意味着我们可以什么都试试。我们失败了。然后我们在下次实验中运用这些来自失败的经验。正如Virginia Postrel所说:“并非每种实验和想法都是好的,但只有尝试新的想法我们才能获得真正的进步。要做的事情总是可以更多。每一次进步都可以被继续改善;每一种新的想法也会使更多的新组合成为可能”(《Future Enemies》(未来的敌人),第59页)。
·一种心理学家称之为“内控倾向”(internal locus of control)的精神。[9]这包括掌控自己的命运并为之负责,而不是等待别人给我们答案。
·一种对于个体而不是群体的关注。这不是一场“领导者-追随者”式的运动。相反,我们是一群想要提高自身技能的人,我们发现:争论、反对、分歧(而不是盲从于自诩的权威)正是到达目标的途径。我们相信我们都处在同样的旅途中,我们追寻的是自身的改变,而非世界的改变。这也解释了为什么本书不关注团队的调整,而关注提高自身技能的途径。
·一种包容性。我们不抵制企业级软件开发、计算机科学或软件工程(事实上,Ade目前的职位头衔中就含有“工程师”一词)。相反,我们认为,一种有用的系统应该能够从软件开发社区的所有元素中识别并吸收那些最好的思想。
·我们以技能为中心,而非以过程为中心。对我们来说,拥有高超的技能要比使用“正确”的过程更重要。基于这种思想可以得到一些推论。Gawande问,“医学是一种工艺还是一种行业呢?如果医学是一种工艺,那么你应该关注如何教产科医师掌握一套工艺技能……你进行研究以发现新的技术。你承认并非每个人都能把事情搞定”(《Better》(更好),第192页)。这种思想隐含这样的意思:没有哪种过程或工具能使每个人都同样成功。尽管我们都能提高自己,但我们的技能水平总会有差异。
·对Etienne Wenger所谓“情景学习”(situated learning)的一种强烈偏好。[10]这种思想是说,软件社区应该尝试抓住像“听力范围内的专家”(Expert in Earshot)这样的模式。[11]其要旨是:最好的学习方法,就是同那些使用你要学习的技能来达到某种目标的人处于同一个房间里。
这种价值体系针对不同的责任引出了不同的角色,正如后续的部分所讨论的。
做软件学徒意味着什么
谈到做学徒意味着什么,我们的访谈者之一Marten Gustafson说得最好:“我猜它基本上是指拥有这样一种态度:对于已经做完或者正在做着的事情,永远都有一种更好、更聪明或更快的方法来完成它。而学徒期就是这样一种状态或过程:不断演进并寻找更好的方法,找到能使自己学会那些更好、更聪明或更快方法的人、公司和情景。”我们认为,拥有这种“不依赖于任何人向你提供方案,靠自己找到处理问题的建设性方法”的内在动力是非常有价值的。Dweck曾经写过:“它不是一种靠成功来增加并随失败而减少的内在数量……它不是一种我们只需告诉别人他有很高的智商就能给予那个人的东西。它是一种我们为别人提供装备然后让他们自己去获取的东西——方法是教他们重视学习而不是外在的聪明,教他们学会享受挑战,并将错误看作臻于精熟的通道。”(《Self-theories》(自我理论),第4页)
虽然最理想的情况是把你放在一个拥有学徒伙伴、熟练工和师傅的小团队中,我们对于学徒期的理解并不要求这样的安排。你的学徒过程由你自己掌控,而最终的训练成果就是你的责任感。尽管学徒期的进展过程都由你自己来决定,但是否有人指导,以及指导人的品质也会对你的技能产生持久的影响。
作为一名软件技师,学徒期是你旅程的开始。在这段时间里,你将首先内向地关注自身,下决心提高自己的技能。虽然你会受益于同伴的关注和经验更丰富的开发者的关注,但你必须学会自我成长,学会如何学习。做学徒意味着什么?本质就是这种对自身的关注和提高自身技能的要求。
最终,学徒将从一个除了持续学习很少有其他责任的位置成长到一个拥有更多外向型责任的位置,我们一般会相信:这种转变只有在回首往事的时候才能看出来。在某个时间点,学徒得到了师傅或熟练工的评价,并被告知他在社区中的工作和角色已经处在熟练工的位置上了。在这种情况下,其实学徒早已经开始担当更多的责任了,像一只“被水煮的青蛙”,他经历了一种渐进而非离散的转变,从一种状态转到了另一种状态。一些人完成这种转变需要的时间会比别人更长。对某些人来说,这种转变所花的时间甚至超过了整个职业生涯。
[1]本书作者之一David的自称,英语中Dave是David的昵称,同样后面提到的Ade就是本书的另一位作者Adewale的昵称。
[2]Tron,中文名“电子世界争霸战”,Steven Lisberger导演,1983年上映的一部电影。讲述黑客Kevin寻找安全系统程序Tron助自己毁掉主脑操控程序,从而让虚拟世界和现实时界都恢复秩序的故事。
[3]傻瓜书(Dummies)系列是由John Wiley&Sons公司出版的系列书籍,所涉及的学科门类范围很广,如编程语言方面的《C for Dummies》、《C++for Dummies》、《Java for Dummies》等。
[4]Ron Jeffries,XP的3位奠基者之一,“敏捷宣言”最初的17位签署者之一,著有《Extreme Programming Installed》,《Extreme Programming Adventures in C#》等书。
[5]Martin Fowler,企业级软件领域的著名作者、演讲人和咨询师,著有《Refactoring》,《UML Distilled》及《Analysis Patterns》等软件领域的名著,几乎本本都是畅销书。
[6]Alistair Cockburn,敏捷运动的发起者之一,著有《Agile Software Development》、《Writing Effective Use Case》等书。
[7]极限编程和测试驱动开发的缔造者之一,“敏捷宣言”最早的17位签署者之一,著有《Extreme Programming Explained:Embrace Change》、《Test-Driven Development:By Example》等书。
[8]http://redsquirrel.com/cgi-bin/dave/craftsmanship/ruby.white.belt.html.
[9]http://en.wikipedia.org/wiki/Locus_of_control.
[10]http://c2.com/cgi/wiki?LegitimatePeripheralParticipation.