NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 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:321438
用户头像
刘燕 InfoQ高级技术编辑

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

关注

评论 1 条评论

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

DevSecOps软件安全开发实践

华为云开发者联盟

开源 DevSecOps 安全开发 华为云DevCloud 软件研发

怎么样判断显卡性能好坏?

InfoQ IT百科

前端食堂技术周刊第 34 期:Node.js v18 、Nuxt 3 RC1、Parcel v2.5.0、计算机程序的构造和解释、Linux 命令行世界生存指南

童欧巴

JavaScript 前端 技术周刊

http server源码解析

爱好编程进阶

Java 面试 后端开发

java 使用Html2Image将html转图片

爱好编程进阶

Java 面试 后端开发

【网络安全】8个网络安全名词解释看这里!

行云管家

网络安全 防火墙 数据安全 堡垒机

聊一聊龙蜥硬件兼容性 SIG 那些事儿 | 龙蜥 SIG

OpenAnolis小助手

开源 sig 硬件兼容 龙蜥操作系统

Dubbo如何处理业务异常,这个一定要知道哦!

爱好编程进阶

Java 面试 后端开发

git(1) 起步

爱好编程进阶

Java 面试 后端开发

电脑硬件中光驱的作用是什么?

InfoQ IT百科

与操作系统性能最相关的组件是什么?

InfoQ IT百科

java程序员的AI之路-大数据篇 hadoop安装

爱好编程进阶

Java 面试 后端开发

一文看懂“低代码,零代码,APAAS”是什么?怎么选?

优秀

低代码 零代码 aPaaS

Java 集合容器篇面试题(上)-王者笔记

爱好编程进阶

Java 面试 后端开发

跟我读CVPR 2022论文:基于场景文字知识挖掘的细粒度图像识别算法

华为云开发者联盟

图像识别 推理 视觉 文字检测 语义信息

如何调节鼠标的灵敏度?

InfoQ IT百科

【等保】二级等保常见问题解答汇总

行云管家

网络安全 等保 等保2.0 二级等保

Elasticsearch 中为什么选择倒排索引而不选择 B 树索引

爱好编程进阶

Java 面试 后端开发

如何实现迭代快速排序算法(iterative quicksort algorithm)?

InfoQ IT百科

复杂度守恒定律与计算哲学|Authing CEO 谢扬

Authing

开发者 云原生 身份云 生产力 Idaas

纯 JS 实现 WebRTC 视频通话

杨成功

音视频 WebRTC

Java并发关键字-volatile

爱好编程进阶

Java 面试 后端开发

Kubernetes 中数据包的生命周期 -- 第 2 部分

Se7en

不同操作系统之间的应用是否可以兼容?

InfoQ IT百科

电脑分区C盘格式化会怎样?

InfoQ IT百科

Google 出品的 Java 编码规范,权威又科学,强烈推荐

爱好编程进阶

Java 面试 后端开发

Flink SQL Client综合实战

爱好编程进阶

Java 面试 后端开发

Java中使用Spring-security(一)

爱好编程进阶

Java 面试 后端开发

“迈向元宇宙的一小步”鲁班会开发者深度论坛落地北京

华为云开发者联盟

音视频 opengauss 华为云 元宇宙 鲁班会

Java中return和finally到底哪个先执行

爱好编程进阶

Java 面试 后端开发

一文深入Java浅拷贝和深拷贝

芝士味的椒盐

Java 大数据 Java 开发 深拷贝 浅拷贝

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