2004-2005 学年,Pam Rostal 和 Dave West 在 NMHU(New Mexico Highlands University)启动了一个独特的学位教学计划:要求学生在实际项目中广泛开展敏捷实践。本文讲述的就是有关这个教学计划的故事——虽然此计划目前已经停止,但很可能只是暂时的,他们正在争取 2007 学年重新启动。但不管计划是否重启,这次实践无论是对学术界,还是产业界,都将点燃思想的火花:我们要大胆创新,敢于开展一些以前未曾想及的实践,努力提升我们对开发、测试和项目管理人员的教学成果。
最初,我们是想建立这样一个大的群体——大家可以全身心投入软件开发艺术的学习和掌握,一起为“人人为软件,软件为人人”(译者注:原文为“software by people for people”)的目标努力。
一片雪花,必须有凝结核才能形成其复杂的晶体结构。在我们期望建立的群体中,同样需要这样的催化剂。教育(以及再教育),是形成新群体的基本要求;历史悠久的学校——如最早的古希腊学园和西藏寺院——恰是专门开展群体教育的场所。
对于我们来说,这个凝结核就是在一个较小的(3000 学生左右)公立大学(我们选择的是在新墨西哥州拉斯维加斯的 NMHU)展开的新学位教学计划。这个教学计划在几乎所有方面都有考虑,其基准点,就是我们标识中展示的核心价值观。
下图所示的标识,涵盖了软件开发的核心理念,包括它是一门专注于现实构造(Reality Construction 1 )的规律性艺术、在平台软件上展开工作、以不同但充满热情的人为中心、依靠集体力量、又全体参与贡献的群体实践等等。如果标识中五边形各边所示关注点能彼此维持一个良性关系,那么这个团队就能创造出令人惊讶的软件开发能力,从而实现教学计划的核心目标——由被教育者组成的研发团队,达到 10 倍于平均水准的生产力。
从 2004 年 8 月开始,20 个学生和两位教师开始一起努力。以下就是有关他们的故事了。
为什么现在来讲两年前的故事?因为计算机科学教育工作者和社会需要知道计划的完成情况。当学生发现需要真正掌握,而不是满足于用给定工具实现目标时,需要一个合适的群体环境,引导他们克服困难。即便非学术界也能从这些教训中学到东西,最终,无论是教育机构还是软件开发组织,都需要形成价值群(Value Shop 2 )——拥有能根据用户的实际情况提供解决问题服务的能力。
请到我们的学生活动室来——接待室的门一直是开着的。读书小组会议、拜访名人大家等通知都帖在门上。请注意门左边的微波炉和右边的显示器,即使屋里没人的时候,路人也可以驻足观看 PowerPoint 幻灯片,它展示了我们最近的工作进展和计划中的一些事情。
教学计划
具有开创意义的 NMHU 软件开发学习班(Software Development Apprenticeship,SDA),设在新墨西哥州拉斯维加斯的一个小镇上,这里海拔 6500 英尺,人口约 15000,紧靠崎岖绵延的 Sangre de Cristo 山脉。这些矗立在人们面前的大山,就像我们的教学计划,看起来似乎难以逾越。只有到达山巅的人,才能得到应有的奖赏;常人不可及的美景,属于选择攀登的人。
在新墨西哥北部地区,绝大多数家庭压力大、普遍贫穷,因此这里的学生,在很小年龄时就必须与命运搏击。因此,这些学生非常希望改变自己和自己所在群体的生活面貌。他们能深刻理解家庭和群体的涵义,所以自然也就能认识到成为我们正在建立的群体中一员的潜在价值。我们的标识和 SDA 手册,对这个理想模型做了明确定义:
X*10(意味着 10 倍),即非常有名的、某些开发人员的能力为平均水平的 10 倍——这也是我们对所有毕业生的期望。
- 人(People)——记住,我们的目标最终是服务于人,因此开发人员必须和其他人一样得到尊重。
- 系统(Systems)——我们要改进现有商业和社会系统,而不是去制造过时的老古董。
- 敏捷(Agility)——我们对结果感兴趣,我们不是形式主义崇拜者。
- 工艺(Craft)——我们认为软件开发是一种艺术,而非机械的生产过程。
- 软件(Software)——是我们开展艺术活动的载体。
我们一直在与 ACM 、 IEEE 3 的相关标准鼓吹的能力模型做斗争,保持了对我们自己信念的执着。当然,现有一些好的能力标准成为了我们定义模型的一个子集,此外,在其他很多方面增加了大量超越现有技术和实践规范的要求——毕竟,我们对学生的期望远远超过世界上任何其他学校的教学规划。我们希望学生完成六年的学习计划,其中大部分和培养正规毕业生的目标类似,但同时要求培育对现实中开发工作的深入经验,这在目前任何正规大学的本科学位四年学习计划中,是不存在的。我们计划开设的所有科目,都可以说是跨学科,或者说与具体课程独立的;在很多方面,与传统做法都有很大不同,比如允许多门课程同时规划、在同一个地点由多位教师教授,再如对物理空间的要求等等。因此,我们希望灌输给学生的这种意识,只能通过非传统的、强调责任、反馈、协作和面对问题 4 时创新解决办法的教育模式,才能逐步培养起来。
在目前已经为大家认可的教育模型中,我们选择了系统思想(Systems Thinking 5 )、诚信领导力(Authentic Leadership 6 )等,对这些概念的学习,有利于缩小学生对世界的理想认知和世界实际模样之间的差距。另外,我们还在模拟学生将来真实工作环境方面下了大公司,白板、圆桌、转椅、粉笔等一样都没有少,如下图:
培养模型
第一步,是要为我们的教学计划设计标识——标识会织在用不同颜色表征主人学业等级的衬衫上。具体如下:
-
软件开发新手
-
褐色衬衫
-
资格:所有学生的必经点
-
在资助项目中可获得的报酬:$xxx/ 小时
-
主要目标:熟悉商业应用中的词汇和工具,以及对软件开发文化的适应
-
学徒级软件开发者
-
绿色衬衫
-
资格:取得 75 项资质(或同等水平)
-
在商业项目中可获得的报酬:$xxx+2/ 小时
-
主要目标:掌握应用开发中的基本技能
-
资深软件开发者
-
紫色衬衫
-
资格:获得 150 项资质(或同等水平)
-
在商业项目中可获得的报酬:$xxx+4/ 小时
-
主要目标:获得独立的应用开发项目中的高级技能
-
软件开发管理者
-
蓝色衬衫
-
资格:获得 225 项资质(或同等水平)
-
在商业项目中可获得的报酬:$xxx+6/ 小时
-
主要目标:领导研发活动和与外部软件开发组织的合作
这里所说的资质,指的是 iii 级能力,资质掌握水平的定义如下:
- 概念和词汇(书本知识);
- 在得到指导的前提下对知识的运用能力(类似于自然学科中在实验室的工作);
- 独立的应用开发能力(类似于其他学科中的实地考察、案例研究等);
- 陌生环境中的应用开发能力(类似于实习);
- 在项目环境中指导他人进行开发的能力;
- 创造可供他人利用的材料和工具的能力;
- 能为此资质学科领域带来原创性贡献(如发明工具、创造算法、提出新概念等)的能力(通常在专业会议或刊物上首先提出)。
每个学生毕业至少需要获得 64 个学分,他们可以在每学期的 3-15 个学分中任意选择科目。因此教学计划必须考虑到这一点。为此,我们提出了能力水平的概念,也就是将每学期的 15 个学分对应到 15 个能力等级。一个学生要想在一个学期内拿到 15 个学分,可以在将 3 项能力掌握到等级 5、5 项能力掌握到等级 3、15 项能力掌握到等级 1 等组合中自由选择。
每个学生还需指定个人学习计划(Individual Education Plan,IEP),说明自己将在当前阶段(通常包括 8 周;或每学期分两个阶段)掌握哪些能力。IEP 中的硬指标,是其包含的待学习能力必须反映 7 被指派给他们的项目相关的知识和技能。
因此,课程不是预先指定的。教师必须根据每个学生的 IEP 准备和实施对应的教学计划。如果 IEP 的要求超出了现有教师的专业水平,则外面的大师(世界著名的专家)会来接替。
我们会请求各种客户为学生提供实习项目,但无法保证客户的需求能完全覆盖要求的全部能力资质。因此,我们也会开展一些内部项目,如在商业世界中的一些非热点领域,人工智能、非标准语言(比如 Squeak/Smalltalk)、嵌入式软件等等。
能力的跨度范围很大(如下表),必须保证学生根据自己的 IEP 总能选择到所有合适的科目:
History and Philosophy of Software Development Modeling at All Levels Design & Program Evaluation SDA Mission Building Executables Problem Diagnosis Software Development Community Test Frameworks System Integration Systems Middleware Programming Styles Teams Artificial Intelligence Programming Principles Leadership Server Management Interaction Principles Organizational Change Version Control Interaction Testing Usability Security Fundamentals Interaction Testing Collaboration Network Security Verification and Validation Interpersonal Relations Project Management Professional Communication Hardware Database Fundamentals Principles of Communication Software Programming Languages Communication Theory Networking Literature - Science Fiction and Fiction Software Development Methodology Communicating with People Futurists Analysis and Design Evaluation IDEs Complexity Theory Process Theory Programming Languages Biology Management Overview Programming Frameworks World Decomposition Management Levels Databases Program Decomposition Management Techniques Operating Systems Program Composition Management Tools## 教学工具
我们没有标准的教科书,选择范围很大,比如,第一学期的书目表如下:
- Steve McConnell 的《Code Complete》第二版。
- David West 的《Object Thinking》。
- Ken Schwaber 和 Mike Beedle 合著的《Agile Software Development with Scrum》。
- Robin Williams 的《The Non-Designer’s Design Book》第二版。
- Peter Coad、Eric Lefebvre 和 Jeff DeLuca 合著的《Java Modeling in Color with UML》。
- Kent Beck 的《Extreme Programming Explained: Embrace Change》(第二版)。
- Frederick P. Brooks, Jr. 的《The Mythical Man-Month》。
- Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著的《Design Patterns: Elements of Reusable Object-Oriented Software》。
- Martin Fowler 的《Analysis Patterns : Reusable Object Models》。
- Alistair Cockburn 的《Writing Effective Use Cases》。
- Alistair Cockburn 的《Agile Software Development》。
- Jerry Weinberg 的《Systems Thinking》。
- Jerry Weinberg 的《The Psychology of Programmers》。
- Linda Rising 的《The Patterns Literature》。
其中一些(如《The Mythical Man-Month》)作为经典推荐,其他一些(如《Agile Software Development with Scrum》)则是因为教学计划对这些内容的强制要求。我们采用 Scrum 作为教学和项目中的管理方法。还有一些,被推荐原因是我们认为这些书可以帮助学生了解创新在产业标准和生产工具进步中的应用——比如《Java Modeling in Color with UML》,讲述了颜色在标识原型模式(archetypal pattern)、反模式(anti-pattern)中的应用。
学士学位所要求的非 SDA 课程包括:
- 文科专业标准的核心课程;
- SDA 特别推荐的课程,如技术写作、人类学研究方法等等;
- SDA 定义的但在其他系教授的课程,如现代哲学和哲学解释学。
通过鼓励学生在 SDA 范畴内完成各项课程的学习任务,我们希望能在每天的交流中持续、反复强化跨学科理念。每周的读书小组会议,也为跨学科问题讨论提供了机会。星期三下午或晚上,我们还会聚在一起讨论描绘软件开发历史中激动人心时期大人大事的图书(如《Dealers of Lightning》和《he Dream Machine》)、网络发展过程中做出了巨大贡献的人物(如 Ted Nelson、Jason Lanier)、个性测试(如 Meyers-Briggs Type Index,几乎每个人都作过),甚至与计算机相关的一些散文(如 Alan Kay 的《The Early History of Smalltalk》)。会议可能在咖啡馆、实验室举行,可能是在白天,也可能安排在晚餐时(因为需要和学生们课程外的时间调配)。
师资团队
在每个学期,我们举行两次授职仪式,因为学生已经到达新水平,衬衫和名片可以更换了,其行为准则(Code of Conduct)也需要做相应调整。下图即授职仪式现场,因为学校规定,图中没有出现学生肖像。
授职期间,每个人都有在 3-7 天内与大师分享专业知识的机会。其中一些人在业界可是赫赫大名,如:
- Linda Rising,例理结合,教授敏捷回顾(Agile Retrospectives)和写作知识。
- 他不仅使用 Java 和 Squeak 教授极限编程实践,还会指导那些在痛苦中挣扎的团队如何走出困境。
- Charlie Poole,教授 TDD、FIT(一个集成测试框架),以及结对编程。
其他一些在明尼苏达州当地也是享有盛名的,比如:
- Dion Stewart,帮助我们搭建了此教学计划所需的编程和服务器全套环境。
- Jeff Goodman,精力旺盛者的典范,体验式教育(Experiential Education)的推崇者。
TDD 的好处直接从教室扩散到了我们的用户——新墨西哥州政府办事处、本地一个小型非营利机构和拉斯维加斯城里的一个校区。州工程处办公室可利用我们的客户管理工具直接给我们传递开发相关材料,共同参与任务。这样,通过 Scrum 和 TDD 在此项目中的实施,用户不再需要向以前那样耐着性子,在漫长的发布周期内默默等待。
日常学术和项目活动
我们日常工作重点主要放在学习班上,每周召开一次计划会议,介绍本周的课程情况,并对上周情况作一次回顾。
团队内部的日常会议,不定期举行,因为每个学生也有自己的安排。像 eWaters 组曾规定每天 12:30 举行例会,但因为实际中很少人能参加,白板就逐渐成了主要的信息源。下图展示的是开发中心建设项目——安装 BEA WebLogic、Informix,确保整个脚本能在 Eclipse 中执行,且服务器能访问数据库——的进展过程。图中白板的内容包括每个学生需要完成的任务,还有我们 wiki 的 URL 地址(学生们在这里可以记录他们每天的进展情况)。
学术讨论会是了解学生本周对所学内容掌握情况的极好方式——从学生的学习计划来看,每周安排两次为宜。上图中的白板描述了一次典型的学术讨论会的情况,包括 Java 小应用和 Java 应用开发、向文件和数据库写入数据等内容,展示了应用程序迭代式和递增式的实现过程。讨论会特别注重体验,通常由两或多个学生坐在一起展开。我们发现,一些带有探索性的、非确定性的任务,最好由两个学生先独立学习,直到他们觉得事情有了大致眉目再坐到一起。而确定性的活动和工作讨论会,则最好由两个学生结对完成,特别是其中一个学生比另一个经验丰富的时候。从我们的实践来看,鼓励学生与不同的人结对学习,势在必行;否则,一个学生可能越学越有动力,而另一个越来越被动。在我们的学习班中,尤其在一个是男同学,另一个是经验更少的女同学时,这种情况特别明显。
当然,结对并不仅限于学生,教师结对工作时,也可以像学生结对那样实现师生交流——直率地指出问题,同时也要能提出建设性意见;可以激烈争论,但常常也可以用点小幽默化解大家的情绪。
实践证明,与客户配合是所有结对方式中最为困难的(和学校管理人员结对除外)。最为成功的是维护本地校区计算机实验室 PC 的工作,因为其中的任务是彼此独立的,可以由多个小组在不同学校同步进行,而且任务的要求清楚,几乎所有学生都力所能及。另一个比较成功的项目是为位于 60 公里外圣达菲的州工程处办公室更新 JSP 代码,任务独立且难度不高。我们在这个项目上一个优势是学生开发组在本地搭建了用户的开发环境,因此我们需要安装应用服务器软件、配置连接池、做好版本控制、用异常复杂的 ANT 脚本实现代码编译和发布, 并做好需求整理工作。
第三个项目周期为三年,要求 SDA 为某非营利企业开发一个财务和市场活动管理系统。此项目要求按照企业资源管理计划,实现订单、库存、网站以及帐目管理。开发小组成员会在每天下午 5:00 一起讨论项目进度,评估剩下任务所需的开发时间。在这个项目中,我们遇到了很多困难,比如用户参与少、新手对行业概念理解的难度大、项目组内部压力大,以及平台、过程、角色和责任等任何商业开发组织都会面临的决策问题。但是,项目组成员在这个过程中收获了很多东西,如项目管理、社会交往和用户关系等从来不可能在非真实用户和非真实项目中得到的知识。
自己向自己学习
日常经历是我们每周回顾会的素材。每周五,在团队的回顾会上,将对一周的成果做出总结——我们学到了什么,我们不应该忘记什么,应该忘记什么,下周我们应该有什么改进。一般,回顾会都是紧跟着耗时一小时左右的午餐——匹萨、三明治或者便餐——举行。通过这种方式,可以增进大家感情,畅所欲言。有人会抢占门旁的软椅(见下图),有音乐天赋的学生还可以操起吉他,在角落里低弹慢吟!
每次的周末回顾会都会有不同的特点。比如初期时,他们最关注的是后勤准备工作,因为此时计划的阶段性时间难以确定、没有设备、计算机环境没有搭建好、彼此沟通渠道不明确等。对这些学生来说,有太多不确定性因素了。但慢慢地,他们的分析、表达、决策和根据问题设计解决方案的能力会随着一次次回顾会的延续而逐步提高。
类似“我们知道星期三的讨论会是一种浪费(因为我们当时就做过评估了),因此没有再举行的必要”这样的评论,是实现真实、自然、可用行动或语言在彼此之间,或对教师以及来访人员反映看法的一种尝试。其他系的教师看到我们的学生在自己老师和指导员不在的情况下,能自发举行回顾会议并对下周任务提出建议时,肯定会大吃一惊。
结果
与领导层接触的机会,以及通过阅读、研究课程和项目工作得来的经验,可以直接促成某些学员就业。我们的一个学员,现在澳洲负责一家银行的国际事务(不可否认,她本来就经验丰富,但她认为 SDA 给了她承担这样一个极富挑战性工作的工具——尤其是 Scrum 和用例——和信心。还有两个客户雇用了我们的学员,继续在学习班时启动的工作。有些学员已经在半工半读,不断积累和运用着学到的管理、社交和技术知识。
有一个学员已经去了明尼苏达州,希望推广他在新墨西哥州开发的一项技术——FIT,是他在为州工程处办公室做项目时,在 Charlie Poole 指导下开发的一个测试工具。还有一个去了离家更近的一所加拿大大学,计划完成 M.B.A 学位,并充分开发他在各种环境下让计算机工作方面的丰富知识。其他方面的结果则不太理想。一个助教因为不能适应环境差异而离开了我们。计划本身也已被 NMHU 校长 Manny Aragon(现在已经被学校解雇)停止。绝大多数学员四散离去,不过比较核心的六个人还在继续工作,等着计划在圣达菲的另一所大学重新启动。其他人还彼此保持着联系,如果计划重启,他们还可能再次加入。希望在 2007 年春,我们能梦想成真吧。
意义
在 OOPSLA 2005 上,一些教学模式研究机构负责人和我们一起讨论了他们的模式如何与我们模式的结合,以及还可能存在的缺失等问题。
最后,我们讨论认为的成功模式,主要围绕三个方面展开——团队内交流(Community Interaction)、社会实践(Social Interaction)和学习(Learning)——如下面三图所示。其中蓝色节点未列为模式,与粉红节点并存;六边形节点是模式语言(Pattern Language)而非单个模式。
SDA 模式——团队内交流(Community Interaction)
SDA 模式——社会实践(Social Interaction)
SDA 模式——学习(Learning)
后来对系统思想 8 的研究也证实了我们所列的三个维度在所有社会系统中的通用性;另外,我们忽略的第四维是对市场——如可能参加计划的学生、大学管理者、各团体负责人甚至潜在用户(现存用户已被定义为我们群体的成员)——中风险承担者的外部接口。尽管不对这第四维多加注意看似可以降低计划复杂度和成本,但对它的忽略,其实是暗藏风险的。
计划停止后,我们以系统思想为手段,努力总结归纳我们已经发现和应用的一些模式,希望能给那些渴望提高团队、院系和组织能力水平的人一些帮助。我们用一个叫作 autochthony 的工具整理了我们的研究成果,不过在这里就不赘述了,那又是另一个话题。
在这次会议上,只有我们的学生得到了自我展示机会。观众相继被我们的巨大变化震惊了,羡慕这些学生在知识和能力上取得的巨大成功。
因为在教学计划中强调敏捷原则,并在教学实践中成功运用了这些原则,我们引起了敏捷联盟(Agile Alliance)的巨大兴趣,并得到了支持。在上月于明尼阿波利斯举行的 Agile2006 大会上,很多教师、学者和学生都表示非常希望加入可能在圣达菲重启的 SDA 计划;在这次会议上,该计划的重启成了一个热门话题。
评论