写点什么

为什么计算机专业的学生应该为开源项目做贡献?

  • 2021-07-06
  • 本文字数:3925 字

    阅读完需:约 13 分钟

为什么计算机专业的学生应该为开源项目做贡献?

本文最初发布于 acm.org 网站,经原作者Diomidis Spinellis授权,由 InfoQ 中文站翻译并分享。作者声明保留所有权利。


出于许多现实的、历史的和一些空泛的原因,编程可能是所有计算机科学、信息学、软件工程和计算机工程课程的必修课。


数十年来,这项技能都是计算机专业毕业生与其他学科同学的典型区分点所在。本文提出的观点认为,在 21 世纪,编程熟练度既不能涵盖市场对计算机毕业生的技能要求,也不能像过去那样带来强大的职业竞争力。


因此,我建议学校应该鼓励计算机专业的学生通过他们的课程活动为开源软件项目贡献代码。我已经在软件工程课程中实践和打磨这种方法超过 15 年了,在我的课程里开源贡献是强制的打分点(注 2)。


基于这方面的经验,我会在本文中解释为什么做出这种贡献的能力可以反映现代编程技能的一般水平,并介绍学生可以从这些活动中学到什么,具体说明如何将开源贡献练习嵌入到课程中,并总结一些在课程中获得成功的实践。

贡献是新的编程

如今,编程技能只是软件开发人员应掌握知识和能力的一部分。出现这种情况有两个原因。首先,现实实践已经远远超出了 Fred Brooks 在 1970 年代推广的首席程序员/外科医生模型(注 1)所描述的范畴,开发人员今天要面对规模大得多的系统、更先进的工具链、普遍的流程自动化,还要参与复杂的团队合作、工作流程和管理方面的工作。


其次,行业最佳实践与成功的大型开源软件项目所遵循的实践业已趋同。企业界已经吸收并贡献了许多开源开发实践。因此相应的知识和技能对于志愿者项目和企业项目来说是相通的。


正因如此,编程教学必须从课堂实验室教育形态转向基于组织环境的教育方式。学生在为开源项目做出贡献的同时,可以在实践中获得广泛的技能、知识和经验,让他们成为符合现代需求、全面发展的高生产力开发人员,而不是好莱坞电影描绘的那种独狼程序员。在传统的编程课程中最难获得的技能包括以下社交和组织技能:


  • 感知背景和氛围的能力:了解如何在开发工作中融入项目的范围、使命,如何与同事组成团队,发展新的领导形式;

  • 与项目涉及的全球多元化社区互动;

  • 与团队协商特性请求、需求和实现选项;

  • 处理沟通问题,例如无人响应,这在志愿者运营的项目中很常见;

  • 通过问题分类和发布计划等实践,体会将软件视为产品的理念;

  • 接收、讨论和处理代码审查意见。


对应的技术层面学习成果涵盖了从分析和评估到应用和创造的领域,包括以下内容:


  • 浏览项目的资产,例如软件代码、问题、文档和拉取请求;

  • 快速评估软件系统或组件的产品和流程质量,这在现代软件重用实践中是很常见的需求;

  • 配置、构建、运行和调试第三方代码;

  • 设置和运行具有不同软件和硬件需求的软件密集型系统。在我开设的课程中,涉及的平台包括手机、汽车电子、应用服务器、数据库、容器、物联网设备和嵌入式设备;

  • 选择现实的贡献目标。(一开始,学生往往会高估他们为项目做出贡献的能力。)这是敏捷开发冲刺中的一项关键活动;

  • 阅读第三方代码,找到需要添加或修复代码的位置;

  • 通过添加新特性或修复错误来改进大型第三方系统;

  • 编写测试,证明自己的贡献在现在和将来都能按预期运行;

  • 使用由多种编程语言和工具开发的软件系统;学生经常惊讶地发现,只掌握集成开发环境(IDE)的相关知识就想为项目做出贡献是远远不够的;

  • 为他们的工作编写文档,通常使用声明性标记语言,例如 Markdown 或文档生成器代码注释;

  • 遵循复杂的配置管理(版本控制)流程,例如处理问题分支和重新提交代码;

  • 通过预提交和持续集成检查和测试。


上述社交和技术学习成果都与现代行业环境息息相关——它们远远超出了 ACM/IEEE 软件工程课程的推荐学习范围。


同时,这种课程的实践还遵循了许多 ACM/IEEE 课程指南(注 3)的要求,具体包括:


个人技能的锻炼,例如批判性判断、有效沟通和认识到自己的局限性(课程指南 8);培养自主学习的技能(指南 9);理解解决软件工程问题的多个维度(指南 10);使用合适和最新的工具(指南 12);构建一个真实世界的基础(指南 14);并通过各种教学和学习方法进行教育(指南 18)。

在软件工程课程中融入开源开发实践

我的这堂必修的开源软件贡献课程是名为“实践中的软件工程”的三年级课程的一部分。(本课程在 2019 年获得了管理学院的卓越教学奖。)


我们每年向大约 20-50 名学生教授这门课程,他们学习由雅典经济与商业大学管理科学技术学院设置的“软件和数据分析技术”专业。该课程也是这所大学信息学院的推荐选修课。


该课程使用了一种(轻量)翻转课堂方法(注 4)进行教学,并完全通过课程作业评价成绩。开源贡献部分占课程成绩的 50%。学生可以单独或结对完成作业。


结对是为了帮助可能信心不足的学生,不过在这种情况下,结对的学生必须完成比独立学生更多的作业,而且俩人的贡献必须分别放在不同的 GitHub 帐户里。


我们根据学生在线提供的开源项目成果、他们的期末书面报告和课堂演示来评估学生的表现。


我们根据学生在线提供的开源项目成果(代码提交和交互)、他们的期末书面报告和课堂演示来评估学生的表现。三场演示分别安排在大约第 4 周(描述所选项目)、第 8 周(概述准备做出的贡献)和第 14 周(总结贡献的实现)。


让贡献获得项目接收并不是通过考核的先决条件,但贡献通过会有加分。其他考核要素包括学生对他们选择的项目的理解和文档撰写、贡献的广度、实现质量、代码与项目的集成水平、测试实现、与项目开发团队的合作过程、口头陈述、书面报告的质量,以及在版本控制、代码审查、问题管理和文档编写等活动中使用可用工具链的情况。


从理论上讲,作弊(复制他人项目分支的贡献,或者找别人完成作业)是可能存在的问题;为了预防作弊,我们让学生在课堂上展示他们的作品,并让学生认识到他们的(公共)贡献会成为他们工作技能组合的一部分,还可能会被未来的潜在雇主询问。


该课程每年都会安排一两位专职助教,他们会开设针对关键工具的实验室课程,并在办公时间为学生提供常见疑难答复。他们为支持课程付出了很多辛勤劳动,这也意味着如果要增加学生人数,就需要相应地增加助教人数。

实现成功的开源贡献

学生们都是怀着惶恐的心情开始课程学习的,到结课时都非常兴奋。要让学生为开源项目做出有意义的贡献,需要考虑到他们缺乏经验的背景,并与现代开源软件开发的快节奏与复杂性之间取得平衡。


在我教授这门课程的这些年里,我看到为开源项目做出贡献变得越来越容易了。开源项目变得更具包容性。许多项目简化了入门和指导流程,团队也更加多样化(女性领导更多了),公开的联系方式是很常见的,回复也通常很有礼貌,并且大都支持 Windows 构建(尽管一些学生采用 Linux 以避免出差错)。


由于精心设计的拉取请求工作流、持续集成的广泛采用、多样化的代码检查机器人、友好的代码审查流程,以及使用拉取请求草案对工作进程进行增量审查的设计,对开源项目做出贡献变得愈加轻松。


学生们深入参与的开源项目环境与他们在传统学术作业中体验的常见环境相去甚远。


尽管如此,学生们深入参与的开源项目环境与他们在传统学术作业中体验的常见环境还是相去甚远。因此,唯一现实的目标就是只做一些小规模的贡献。让课程作业取得预期效果的关键在于,教师对学生的贡献不能抱(看起来很大的)指望。


对于一个本科生来说,做出开源贡献往往是一件门槛非常高的事情,所以在一个大项目中集成 20 行代码就称得上是一项成就了。我们给学生挑选项目的建议可以总结如下。


  • 选择一个有多个活跃贡献者的项目,这样就有一个社区来指导你并回答你的问题。

  • 选择一个相对流行的项目(一些 GitHub 明星),项目应该证明自己提供了有用的功能并且以相对合理的方式开发。你应该避开 GitHub 上被废弃的那种论文项目。

  • 避开非常受欢迎的项目,这样你的贡献就不会被竞争、噪音和官僚主义淹没。(尽管如此,我们还是有学生参与了一些众人皆知的项目,例如 Tensorflow 和 VisualStudioCode。)

  • 做好验证,确保你可以在自己的计算机上构建和运行项目。

  • 确认项目会定期接受来自外部的拉取请求,这样你才有机会。

  • 尝试提供一个微不足道的修复作为热身练习,并测试你遵循项目工作流程的能力。

  • 查找标记为“Goodfirstissue”的项目问题,这表明项目对新贡献者开放。(有几个在线列表统计了包含这类问题的项目。)


我们将贡献的选择权完全留给学生:他们可以从项目的问题数据库中选择一个开放的任务,或者提出他们自己的增强或修复。学生在与项目的核心团队互动后也经常改变策略。


尽管让他们自由选择自己的贡献路线似乎让作业变得太容易了,但我们发现这种背景下大约一半的学生贡献都能被项目接收。


学生在作业中面临的最常见问题是无法构建项目(通常是由于缺乏经验和平台不兼容)以及项目团队缺乏沟通(学生会产生不必要的焦虑情绪,认为他们的贡献必须被项目接受才行)。


另一方面,学生们发现他们的代码集成到了被全球使用的生产软件中时是最兴奋的。在课程评估中,学生往往非常满意他们在完成开源软件贡献任务后获得的许多实践技能和自信心。


参考文献:


  1. Brooks, F.P., Jr. The Mythical Man-Month. Addison-Wesley, Boston, MA, 1975, 32.

  2. Spinellis, D. Future CS course already here. Commun. ACM 49, 8 (Aug. 2006), 13;https://bit.ly/3bYxSJs

  3. The Joint Task Force on Computing Curricula. Curriculum Guidelines for Undergraduate Degree Programs in Software Engineering. ACM. New York, NY;https://bit.ly/3vn04NP

  4. Tucker, B. The flipped classroom. Education Next 12, 1 (Mar. 2012), 82–83.

作者介绍

Diomidis Spinellis(dds@aueb.gr)是希腊雅典经济与商业大学管理科学与技术学院软件工程课程教授,并在荷兰代尔夫特大学软件技术学院教授软件分析技术。


原文链接:


https://cacm.acm.org/magazines/2021/7/253459-why-computing-students-should-contribute-to-open-source-software-projects/fulltext

2021-07-06 14:322090
用户头像
刘燕 InfoQ高级技术编辑

发布了 1123 篇内容, 共 608.2 次阅读, 收获喜欢 1982 次。

关注

评论 1 条评论

发布
用户头像
学到了,这就通过开源项目提高自己 github 活跃度。
2022-11-02 07:43 · 河北
回复
没有更多了
发现更多内容

模块一

Geek_28cf33

【愚公系列】2022年05月 二十三种设计模式(七)-桥接模式(Bridge Pattern)

愚公搬代码

5月月更

【PIMF】OpenHarmony啃论文俱乐部——拼音输入法原理_从触摸事件到汉字

离北况归

OpenHarmony Openharmony啃论文俱乐部 OpenHarmony应用开发 PIMF团队

上海疫情封控期间,模拟芯片巨头变相裁员后续:补偿是不可能补偿的!

IC男奋斗史

职业规划 裁员 芯片

TypeScript 里的 Reference Type 和 Triple-Slash Directives

汪子熙

typescript 编程语言 angular 5月月更 directive

k8s client-go源码分析 informer源码分析(2)-初始化与启动分析

良凯尔

容器 云原生 #Kubernetes# Client-go

虎符交易所Hoo研究院|币海寻珠 2022年4月下半月区块链投融事件TOP20

区块链前沿News

虎符研究院

【Python】题集 of ①

謓泽

5月月更

Nginx 和 Apache 配置 SSL 文件签名的不同

HoneyMoose

LabVIEW仪器控制:智能示波器(普源DS1000E)

不脱发的程序猿

LabVIEW 串口通信 VISA LabVIEW示波器软件

在线URL解码还原工具

入门小站

工具

Python 实现设计模式之工厂模式

宇宙之一粟

Python 设计模式 工厂模式 5月月更

Flutter 组件渲染模式详解

岛上码农

flutter ios 安卓开发 跨平台应用 5月月更

第八周作业

Asha

用阅读和写作应对未来风险

石云升

写作 阅读 5月日更

网站开发进阶(四十四)input type=“submit“ 和“button“的区别

No Silver Bullet

5月月更 button submit

【刷题第2天】买卖股票的最佳时机

白日梦

5月月更

遇到bug怎么分析,这篇文章值得一看

伤心的辣条

Python 程序人生 软件测试 自动化测试 测试开发

nginx配置系列(十)代理服务(proxy_pass)

乌龟哥哥

5月月更

Intellij官方中文语言包,它来了

FunTester

Mysql的事务操作问题

恒山其若陋兮

MySQL 5月月更

linux时间格式化命令

入门小站

Linux

在线TSV转Excel(xls/xlsx)

入门小站

工具

网站开发进阶(三十九)重磅推出:优良的编码风格!

No Silver Bullet

5月月更 编码风格

观测云产品更新|优化观测云商业版升级流程;新增进程、日志、链路详情页关联网络;场景模块优化等

观测云

运维 可观测性 可观测

飞桨云上沙龙——智能制造专场

百度大脑

信息系统的建设周期

奔向架构师

信息系统 5月月更

渗透测试工具一一Nmap(从初级到高级)

网络安全学海

网络安全 渗透测试 WEB安全 漏洞挖掘 nmap

正向代理与反向代理

HoneyMoose

Docker下的Spring Cloud三部曲之三:在线横向扩容

程序员欣宸

Spring Cloud java 5月月更

从手工测试到自动化测试进阶,需要学什么?结合自身分享我10+年的测试经验!

伤心的辣条

Python 程序人生 软件测试 自动化测试 接口测试

为什么计算机专业的学生应该为开源项目做贡献?_开源_Diomidis Spinellis_InfoQ精选文章