阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

  • 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

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2021-07-06 14:321430
用户头像
刘燕 InfoQ高级技术编辑

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

关注

评论 1 条评论

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

史上最全Spring Cloud Alibaba全套笔记,嘎嘎顶

程序知音

Java 程序员 微服务 SpringCloud 后端技术

毕业季,说一说自己从学生初入职场的感受

海风极客

10月月更

深入理解Kubernetes Pod调试

俞凡

最佳实践 云原生

不愧是阿里新产SpringSecurity+OAuth2实战笔记,(用户+案例+认证+框架)打造企业级认证与授权

程序员小毕

程序员 程序人生 springsecurity java面试 安全框架

花2个月面过阿里Java岗,拿个25K不过分吧?

程序知音

Java java面试 后端技术 秋招 Java面试八股文

清华毕业大牛带你深入解析JVM,附五大实战技术文档,总计1024M

Geek_0c76c3

Java 数据库 开源 程序员 开发

“我学数学,是为了拯救公主!”

图灵教育

小说 数学 奇幻

面试突击88:加入事务和嵌套事务有什么区别?

王磊

Java 面试

【Meetup 明天见】OpenMLDB+37手游:一键查收特征计算场景案例及进阶使用攻略

第四范式开发者社区

人工智能 数据库 开源 时序数据库

阿里打工4年被裁,国庆七天系统查漏补缺期间我总结出了一条对标阿里P5~P7Java程序员体系学习路线

Java永远的神

程序员 程序人生 后端 Java 面试 学习路线

还是 “月饼” 后续,玩转炫彩 “月饼” 之 问题说明

矜辰所致

开发板 ESP32-C3 10月月更

阿里最新分享 SpringCloudAlibaba 实战小抄(第五版),一代更比一代强

Geek_0c76c3

Java 开源 程序员 数据 开发

阿里微服务架构到底多牛逼:深入解析Apache Dubbo与实战

Geek_0c76c3

Java 数据库 开源 程序员 架构

公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档

Geek_0c76c3

Java 数据库 开源 程序员 架构

性能测试知识科普(三):压测工具

老张

性能测试

阿里最新产物:亿级流量高并发系统设计(全彩版小册开源)

Java全栈架构师

程序员 程序人生 系统架构 中间件 java面试

推荐一个人工智能应用落地的应用

felix

“我学数学,是为了拯救公主!”

图灵社区

小说 数学 奇幻

GitHub无抗手!MySQL DBA攻坚指南一出,阿里数据库专家都解脱了

Geek_0c76c3

Java 数据库 开源 程序员 开发

OpenMLDB Meetup No.6 回顾 | OpenMLDB+37手游:一键查收特征计算场景案例及进阶使用攻略

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

GitHub下载量从19暴涨到5W,这份架构师学习路线只用了一晚

Geek_0c76c3

Java 数据库 开源 程序员 开发

GitHub上惊现阿里大佬手记,这是真把微服务、容器和K8S讲清楚了

Geek_0c76c3

Java 开源 程序员 数据 开发

初识Java,一个简单的自我介绍

Aion

Java 后端 10月月更

贡献者任务第五期,炫酷登场!

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

开源3天获得业界一致好评!阿里最新产Spring全家桶速成笔记真香

程序员小毕

spring 后端 Java 面试 spring-cloud spring-boot

当下的网络安全行业前景到底怎么样?还能否入行?

网络安全学海

程序员 黑客 网络安全 信息安全 渗透测试

深度思考:为什么需要泛型?

海风极客

10月月更

AICon 2022 | 来杭州和 OpenMLDB 见面吧

第四范式开发者社区

人工智能 机器学习 数据库 时序数据库 特征

高并发系统简单玩!Alibaba全新出品亿级并发设计速成笔记真香

Geek_0c76c3

Java 数据库 开源 程序员 开发

SQL优化思路+经典案例分析

程序知音

OpenMLDB 进阶使用攻略和高级特性介绍

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

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