编程卓越之道(卷3):软件工程化
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 软件匠艺

软件匠艺,是指一个程序员在编程大师的指导下训练和实践各种技能,立志于终身学习并成为最优秀的软件开发人员。按照软件匠艺的定义,一个程序员先要接受良好的教育,完成学徒阶段,再逐渐成为一个熟练的程序员,并努力开发出一款杰出的软件。

1.4.1 教育

学院和大学为编程实习生提供了成为软件工匠的先决条件。如果实习过程能够让一个刚开始接触编程的人(实习生或者学徒),接触到和正规教育一样的信息和体验,那么这个实习过程也可以相当于一个正规教育。遗憾的是,很少有软件工匠有时间或者能力,从头开始培训一个学徒。他们忙于现实世界的项目开发,无暇顾及教给实习生他们所需知道的一切。因此,教育是通向软件匠艺之路的第一步。

此外,在学院或者大学接受正规教育有两个主要目的:首先,你必须学习那些自学时可能会跳过的计算机科学知识;其次,你要向世界证明你有能力完成一个重要的承诺。尤其是当你完成一个正式的计算机程序之后,就可以真正地开始学习软件开发了。

然而,无论是多么高级的大学学位,都不能自动让你成为一个软件工匠。一个拥有研究生学位的人,一开始也只能像本科生一样,作为一个实习生开始学习编程,但是他需要对计算机科学进行更深入、更专业的学习。拥有研究生学位的实习生,虽然其实习时间会短一些,但是他仍然需要经过大量的培训。

1.4.2 学徒阶段

在学徒阶段,完成一个正式的计算机程序,是你开始学习如何成为一个软件工匠的第一步。一个典型的计算机程序会让你学会如何使用编程语言(语法和语义)、数据结构、编译器理论、操作系统等,但是它不会教你如何编写出超出第一学期或者第二学期《编程入门》课程范围的程序。学徒阶段会让你知道现实世界中的编程是什么。学徒阶段的目的是让你用所学的知识,通过各种不同的方式来解决问题,并且尽可能获得各种不同的经验。

学徒会向一个掌握了更高级编程技术的人学习。这个人可能是软件熟练工(见下一节内容),也可能是一个软件工匠。这个“师父”会给学徒分配任务,演示如何完成任务,并检查学徒的工作,在中途进行适当的纠正以完成难度更高的工作。最重要的是,学徒还要经常学习师父的程序——可以采用多种形式,包括测试、结构化浏览代码和调试。重要的一点是,学徒要学会如何维护师父编写的代码[7]。通过这样做,学徒们会一点点学会自学时永远无法掌握的编程技术。

如果一个学徒足够幸运,那么他将有机会跟随几个大师学习,并从他们那里学习到扎实的技术。在高级程序员的指导下,随着每个项目的完成,学徒期也接近尾声,并进入软件工匠路线的下一个阶段:软件熟练工。

从某种意义上说,学徒生涯永远不会结束。你应该经常留意新技术和新技巧。例如,所有在结构化编程中成长起来的软件工程师,都不得不学习面向对象编程。但是,在某种程度上,你会更频繁地使用已经掌握的技能,而不是不断开发新技能。这时,你就开始把自己的智慧传授给别人,而不是再向别人学习。之后,如果与你一起工作的“大师们”觉得你已经准备好,可以在没有帮助或者监督的情况下独自开发项目了,那么就是你成为软件熟练工的时候了。

1.4.3 软件熟练工

软件熟练工会负责软件开发的大部分工作。顾名思义,他们通常会从一个项目转移到另一个项目,运用他们的技能来解决应用程序的各种问题。尽管软件开发人员的教育从未结束,但是软件熟练工更加关注应用程序开发,而不是学习如何开发应用程序。

软件熟练工要承担的另一项重要任务是培训新的软件学徒。他们会经常检查学徒们在项目中的工作,并与他们分享与编程有关的技术和知识。

软件熟练工会不断寻找可以改进软件开发过程的新工具和新技术。通过尽早采用新的(但是经过验证的)技术,他们始终会保持快速学习,并不断跟上当前的技术发展趋势,以免落后。他们会利用行业最佳实践为客户创造高效、经济的解决方案,这正是这一匠艺阶段的标志。软件熟练工的工作效率高、经验丰富,这正是大多数项目经理在组建团队时希望找到的软件开发人员类型。

1.4.4 大师级工匠

成为大师级工匠的一种传统方法,就是创造一个杰作,一个足以让你在同行中脱颖而出的作品。一些(高端)软件杰作的例子包括VisiCalc[8]、Linux操作系统、vi和emacs文本编辑器。这些产品最初都是某一个人的创意,尽管后来有数十个或者数百个不同的程序员参与其中。杰作不一定要出名,例如Linux或者某些GNU工具。但是,你的同行必须认识到这个杰作是有用的并且创造性地解决了某个问题。杰作也不必是一段独立的原始代码。为某个操作系统编写一个复杂的设备驱动程序,或者用一些有效的方法扩展其他程序,这些都可能被称为杰作。杰作的目的是,让你有一个拿得出手的项目来告诉全世界:“我有能力开发真正的软件,所以请认真对待我!”。杰作让别人知道他们应该认真考虑你的观点,相信你所说的话。

一般来说,大师级工匠的责任是确定当前的最佳实践方式是什么,以及发明新的方式。最佳实践指的是完成某项任务最广为人知的方式,但是不一定是最好的方式。大师级工匠需要研究是否有更好的方式来设计应用程序,当某种新的技术或者方法论普及时,他们要了解其作用和效果,以及验证某种实践方式是否是最好的,并将该信息告诉其他人。

1.4.5 软件匠艺的不足

Steve McConnell在他的经典软件工程著作Code Complete(《代码大全》)中声称,经验并不会像人们想象的那样重要:“如果一个程序员在一两年后还没有学会C语言,那么接下来的三年也不会有太大的区别。”接着他问道,“如果你已经工作了10年,那么你是有10年的工作经验,还是把1年的经验重复了10次?”McConnell甚至认为从书本中学习可能比积累编程经验更加重要。他认为,计算机科学领域变化如此之快,以至于一个有10年编程经验的人可能会错过这10年中所有伟大的研究成果,而这些成果正是新的程序员会接触到的。