本文最初发布于 acm.org 网站,经原作者Diomidis Spinellis授权,由 InfoQ 中文站翻译并分享。作者声明保留所有权利。
出于许多现实的、历史的和一些空泛的原因,编程可能是所有计算机科学、信息学、软件工程和计算机工程课程的必修课。
数十年来,这项技能都是计算机专业毕业生与其他学科同学的典型区分点所在。本文提出的观点认为,在 21 世纪,编程熟练度既不能涵盖市场对计算机毕业生的技能要求,也不能像过去那样带来强大的职业竞争力。
因此,我建议学校应该鼓励计算机专业的学生通过他们的课程活动为开源软件项目贡献代码。我已经在软件工程课程中实践和打磨这种方法超过 15 年了,在我的课程里开源贡献是强制的打分点(注 2)。
基于这方面的经验,我会在本文中解释为什么做出这种贡献的能力可以反映现代编程技能的一般水平,并介绍学生可以从这些活动中学到什么,具体说明如何将开源贡献练习嵌入到课程中,并总结一些在课程中获得成功的实践。
如今,编程技能只是软件开发人员应掌握知识和能力的一部分。出现这种情况有两个原因。首先,现实实践已经远远超出了 Fred Brooks 在 1970 年代推广的首席程序员/外科医生模型(注 1)所描述的范畴,开发人员今天要面对规模大得多的系统、更先进的工具链、普遍的流程自动化,还要参与复杂的团队合作、工作流程和管理方面的工作。
其次,行业最佳实践与成功的大型开源软件项目所遵循的实践业已趋同。企业界已经吸收并贡献了许多开源开发实践。因此相应的知识和技能对于志愿者项目和企业项目来说是相通的。
正因如此,编程教学必须从课堂实验室教育形态转向基于组织环境的教育方式。学生在为开源项目做出贡献的同时,可以在实践中获得广泛的技能、知识和经验,让他们成为符合现代需求、全面发展的高生产力开发人员,而不是好莱坞电影描绘的那种独狼程序员。在传统的编程课程中最难获得的技能包括以下社交和组织技能:
对应的技术层面学习成果涵盖了从分析和评估到应用和创造的领域,包括以下内容:
上述社交和技术学习成果都与现代行业环境息息相关——它们远远超出了 ACM/IEEE 软件工程课程的推荐学习范围。
同时,这种课程的实践还遵循了许多 ACM/IEEE 课程指南(注 3)的要求,具体包括:
个人技能的锻炼,例如批判性判断、有效沟通和认识到自己的局限性(课程指南 8);培养自主学习的技能(指南 9);理解解决软件工程问题的多个维度(指南 10);使用合适和最新的工具(指南 12);构建一个真实世界的基础(指南 14);并通过各种教学和学习方法进行教育(指南 18)。
我的这堂必修的开源软件贡献课程是名为“实践中的软件工程”的三年级课程的一部分。(本课程在 2019 年获得了管理学院的卓越教学奖。)
我们每年向大约 20-50 名学生教授这门课程,他们学习由雅典经济与商业大学管理科学技术学院设置的“软件和数据分析技术”专业。该课程也是这所大学信息学院的推荐选修课。
该课程使用了一种(轻量)翻转课堂方法(注 4)进行教学,并完全通过课程作业评价成绩。开源贡献部分占课程成绩的 50%。学生可以单独或结对完成作业。
结对是为了帮助可能信心不足的学生,不过在这种情况下,结对的学生必须完成比独立学生更多的作业,而且俩人的贡献必须分别放在不同的 GitHub 帐户里。
我们根据学生在线提供的开源项目成果、他们的期末书面报告和课堂演示来评估学生的表现。
我们根据学生在线提供的开源项目成果(代码提交和交互)、他们的期末书面报告和课堂演示来评估学生的表现。三场演示分别安排在大约第 4 周(描述所选项目)、第 8 周(概述准备做出的贡献)和第 14 周(总结贡献的实现)。
让贡献获得项目接收并不是通过考核的先决条件,但贡献通过会有加分。其他考核要素包括学生对他们选择的项目的理解和文档撰写、贡献的广度、实现质量、代码与项目的集成水平、测试实现、与项目开发团队的合作过程、口头陈述、书面报告的质量,以及在版本控制、代码审查、问题管理和文档编写等活动中使用可用工具链的情况。
从理论上讲,作弊(复制他人项目分支的贡献,或者找别人完成作业)是可能存在的问题;为了预防作弊,我们让学生在课堂上展示他们的作品,并让学生认识到他们的(公共)贡献会成为他们工作技能组合的一部分,还可能会被未来的潜在雇主询问。
该课程每年都会安排一两位专职助教,他们会开设针对关键工具的实验室课程,并在办公时间为学生提供常见疑难答复。他们为支持课程付出了很多辛勤劳动,这也意味着如果要增加学生人数,就需要相应地增加助教人数。
学生们都是怀着惶恐的心情开始课程学习的,到结课时都非常兴奋。要让学生为开源项目做出有意义的贡献,需要考虑到他们缺乏经验的背景,并与现代开源软件开发的快节奏与复杂性之间取得平衡。
在我教授这门课程的这些年里,我看到为开源项目做出贡献变得越来越容易了。开源项目变得更具包容性。许多项目简化了入门和指导流程,团队也更加多样化(女性领导更多了),公开的联系方式是很常见的,回复也通常很有礼貌,并且大都支持 Windows 构建(尽管一些学生采用 Linux 以避免出差错)。
由于精心设计的拉取请求工作流、持续集成的广泛采用、多样化的代码检查机器人、友好的代码审查流程,以及使用拉取请求草案对工作进程进行增量审查的设计,对开源项目做出贡献变得愈加轻松。
学生们深入参与的开源项目环境与他们在传统学术作业中体验的常见环境相去甚远。
尽管如此,学生们深入参与的开源项目环境与他们在传统学术作业中体验的常见环境还是相去甚远。因此,唯一现实的目标就是只做一些小规模的贡献。让课程作业取得预期效果的关键在于,教师对学生的贡献不能抱(看起来很大的)指望。
对于一个本科生来说,做出开源贡献往往是一件门槛非常高的事情,所以在一个大项目中集成 20 行代码就称得上是一项成就了。我们给学生挑选项目的建议可以总结如下。
我们将贡献的选择权完全留给学生:他们可以从项目的问题数据库中选择一个开放的任务,或者提出他们自己的增强或修复。学生在与项目的核心团队互动后也经常改变策略。
尽管让他们自由选择自己的贡献路线似乎让作业变得太容易了,但我们发现这种背景下大约一半的学生贡献都能被项目接收。
学生在作业中面临的最常见问题是无法构建项目(通常是由于缺乏经验和平台不兼容)以及项目团队缺乏沟通(学生会产生不必要的焦虑情绪,认为他们的贡献必须被项目接受才行)。
另一方面,学生们发现他们的代码集成到了被全球使用的生产软件中时是最兴奋的。在课程评估中,学生往往非常满意他们在完成开源软件贡献任务后获得的许多实践技能和自信心。
参考文献:
Diomidis Spinellis(dds@aueb.gr)是希腊雅典经济与商业大学管理科学与技术学院软件工程课程教授,并在荷兰代尔夫特大学软件技术学院教授软件分析技术。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货