阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

  • 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

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

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

发布了 1112 篇内容, 共 493.4 次阅读, 收获喜欢 1967 次。

关注

评论 1 条评论

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

如何进行用户故事估算——Ethan分享观后感

Bruce Talk

敏捷 随笔 Agile User Story Product Owner

linux安装XtraBackup8

入门小站

Linux

模块九作业:设计电商秒杀系统

Felix

OpenCV学习(二):环境搭建

轻口味

OpenCV图像处理 10月月更

前端监控:JS监控SDK手摸手教学-原理篇(已开源)

浅端攻城狮

大前端 监控 js sdk

5款良心工具,专治各种流氓顽固软件!

Jackpop

设计千万级学生管理系统的考试试卷存储方案

Rabbit

在线HTML实体转字符串工具

入门小站

工具

Android使用adb工具及root权限完成手机抓包

杨清强

adb

业务中台数据一致性方案

慕枫技术笔记

后端 引航计划

敬畏用户

FunTester

软件测试 测试 用户 FunTester 用户思维

模块九毕业设计

以吻封笺

马拉车算法,其实并不难!!!

秦怀杂货店

数据结构 算法 LeetCode

MacBook的隐藏功能

IT蜗壳-Tango

10月月更

微博评论高性能高可用计算架构

白开水又一杯

#架构实战营

半年时间,拍摄8省市10个案例,我们见到了这样的智能中国

脑极体

一文带你盘点“微服务”中的技术点

Simon郎

微服务 Spring Cloud spring cloud alibaba java

架构实战营 - 模块九作业

思梦乐

Ember Data 之记录操作:创建、更新和删除

devpoint

store ember.js 10月月更

模块九作业

秀聪

架构实战营

stm32-HAL使用stop模式后DMA初始化的问题

良知犹存

stm32

Linux开发coredump文件分析实战分享

良知犹存

Linux

技术公众号小白互助网络

Felix

GitHub 微信公众号 自媒体

10. python入门速通教程之类、继承类、类中的特殊方法

梦想橡皮擦

10月月更

容器 & 服务:Kubernetes API Server访问问题

程序员架构进阶

架构 Kubernetes 容器 Helm Charts 10月月更

012云原生之微服务

穿过生命散发芬芳

云原生 10月月更

【SpringCloud技术专题】「Hystrix源码」分析故障切换的运作流程

洛神灬殇

源码分析 SpringCloud Hystrix 熔断器 10月月更

数据库优化之explain 的使用和常用的SQL优化或索引优化

Regan Yue

数据库 数据库优化 Regan Yue 10月月更

架构实战营模块九作业-毕业设计

子豪sirius

架构实战营

产品经理如何采集需求?

石云升

产品经理 需求分析 10月月更

架构训练营 模块九

小卷儿

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