首页 > 其他分享 >如何为开源项目和社区做贡献 -- 你应该知道的十件事

如何为开源项目和社区做贡献 -- 你应该知道的十件事

时间:2024-01-24 13:55:26浏览次数:23  
标签:社区 项目 -- 可以 技术 开源 提交 十件事

1. 前言

  大家好,我叫颜国进,现为英特尔边缘计算创新大使、百度飞桨开发者专家。回溯至2021年12月,那时的我,身为机械专业研一新生,仅在C和Python编程语言上有些许基础,对于深度学习的殿堂还只敢在门口窥探,对于OpenCV图像处理以及模型部署等技术更是所知甚少。然而,通过不懈的努力和对知识的执着追求,如今我已经能够娴熟地运用C++、C#等编程语言进行项目开发,并且能够使用Python和各类深度学习框架来训练自己的模型。值得一提的是,我已经发布并运营了一项名为OpenVINO C# API的开源项目,为在C#平台开发深度学习和计算机视觉应用的开发者提供更便捷的工具。围绕该项目,产出了多篇富有深度的技术文章,分享了我在使用OpenVINO部署深度学习模型过程中的洞见和体会。

  在深入参与开源项目的过程中,我也广泛参考了网上的一些成功项目经验,得到了无数宝贵的经验和技能提升,这使得我的技术层次上升到了全新的高度。经过两年的探索与实践,技术能力得到了显著的提高,而更重要的是,我的努力得到了越来越多人的认可和支持,从而扩大了我在技术社区的影响力。时值我开展开源项目的两周年,我有幸应张晶和李翊玮老师的邀请,以及武卓博士的悉心指导,有机会整理与分享我从一个技术新手逐步成长到拥有自己开源项目的经验与感想。我希望我的分享能为刚刚踏入开源领域的新手们提供一些有价值的参考,帮助他们更迅速地融入这个富有活力和创新精神的开源社区。
下面,我将从四个层面并结合具体的问题分别向大家:

2. 为什么要做开源

问题一、为什么要给开源项目和社区做贡献?

  首先,我们来探讨一下为什么应该为开源项目和社区做出贡献。对于那些还在犹豫不决是否投身于开源项目的小伙伴们,我希望能够提供一个有力的依据。参与开源项目不仅有助于个人的技能提升和职业发展,更能推动整个技术社区的进步。通过你的贡献,我们可以共同创造一个更加开放、协作和创新的技术生态,让每个人都能从中受益。

  • 参与开源项目和社区对个人具有多方面的积极影响。

    • 技术提升——通过参与开源项目,个人能够接触和学习到更多的技术工具和前沿技术,推动自身技术的不断提升。并且开源项目可以获取全部源码,这对你深入了解一项技术实现以及应用,会有很大的帮助。

    • 提升个人的声誉和影响力——通过专注于某一领域并在其中深耕,你可能成为该领域的专家,吸引其他技术专家的关注和求助。这些互动和认可不仅有助于建立个人的专业声誉,还可能带来一些荣誉称号,为未来的发展提供有力的支持。

    • 塑造个人的未来发展轨迹——开源的自由性和包容性使得个人能够自主选择感兴趣的领域进行探索和发展。你可以将开源项目中的经验和技能应用到自己喜欢的领域中,或者通过开源项目发展新的兴趣和专业方向。这将为个人的职业发展带来更多的可能性和机遇。总之,参与开源项目和社区对个人技术提升、声誉建立以及未来发展都具有积极的影响。这是一个充满挑战和机遇的舞台,值得每个有志于技术领域的人积极参与和贡献。

  • 开源还对当前行业以及企业发展带来了更多的红利。

    • 开源已经成为软件行业的基础——开源促进了技术的快速发展和创新,第一点,由于代码是公开的,开发者可以基于现有的项目进行创新,而不需要从零开始,这样的协作和共享精神加速了新技术的诞生和成熟。第二点,开源软件通常是免费提供的,这降低了企业和个人使用和实施新技术的成本,企业可以使用开源软件来构建复杂的系统,而无需支付昂贵的授权费用。第三点,开源软件赋予用户更大的自由度,用户可以自由地修改和改进软件以满足自己的需求,这种灵活性对于需要定制解决方案的企业和开发者来说是非常重要的。第四点,开源项目通常有一个活跃的社区,社区成员可以相互支持,解决问题,分享经验。这种广泛的协作和支持网络是传统闭源软件难以比拟的。第五点,开源项目可以非常迅速地迭代和改进,社区贡献者可以快速响应问题,提交补丁,添加新功能,从而保持软件的活力。基于此,可以看出开源软件已经深刻地影响了软件产业的各个方面,并且在很多情况下成为了技术创新和应用的基石。
      image

    • 开源已经成为当前最前沿技术的发展的强大动力——开源模式鼓励全球范围内的协作和知识共享,由于开源项目可以被任何人审查、使用、修改和改进,这样的透明度和可接触性降低了进入门槛,极大地促进了创新的速度和质量。此外开源社区的参与者可以迅速识别和修复软件中的错误,增加新的功能,并持续改进产品,这种集体智慧的应用使得技术能够快速迭代和演进,经常超出单一组织的开发速度。开源项目往往吸引来自不同组织和行业的贡献者。这种多元化的视角和专业知识结合在一起,可以解决复杂的问题,推动前沿技术的发展。开源项目还是人才发现和发展的平台,许多开发者通过参与开源项目获得实战经验,进而成为行业内的专家。最后开源项目提供了高质量的软件基础设施,许多公司和组织可以直接使用或构建自己的产品,比如Linux操作系统、Apache Web服务器、MySQL数据库、TensorFlow机器学习框架、OpwenVINO模型部署框架等,都是开源项目,它们为最前沿的技术发展提供了坚实的基础。开源项目围绕它们构建了强大的生态系统,这个生态系统是持续创新的土壤,帮助技术不断进步。
      image

  废话了这么多,但也很难完全表述给开源项目和社区做贡献的好处,下面我将从个人经历简单讲述一下做开源项目这两年,到底给我带来了啥?

  • 技术方面:刚开始做开源项目时,我的状态就是一个非计算机专业、没有编程经验和算法基础的新手小白,蜕变成为一个可以实现在C/C++、C#和Python环境下使用多种部署工具套件落地AI设备全流程开发,并且在稳定运行了多个小型开源项目。在这过程中,我学习了C++、C#以及Python编程语言,这样我就可以能够看懂开源新项目的源码;我做的主要领域时深度学习模型部署,因此我自学了OpenVINO、TensorRT、ONNX runtime 等模型部署工具,实现在各种平台下部署深度学习模型。并且由于所做工作为开源项目,为了遵循开源社区规范,自己也养成了良好的编程习惯以及代码规范,学会了开源项目从创建、提交、完善、维护、更新以及发布等全套流程。
    image

  • 开源贡献:结合自己接触的一些开源项目,自己选者了一个方向去做,主要是在C#平台部署深度学习模型。基于OpenVINO模型部署工具创建了OpenVINO C# API项目,并结合该项目,开发了当前流行的模型部署案例。截止到目前,自己已经在开源平台GitHub平台贡献了100,000多行代码,推出了10多个开源项目。除此以外,自己还结合所做的开源项目,在多个平台与开源社区发布了了多篇技术文章,获得了上千人的阅读,并且在CSDN平台打造自己的博客平台,截止目前已经发表了42篇文章,获得了80000+的阅读量以及1400+的粉丝关注,在分享自己案例指导指导其他开发者的同时,也收获了更多人的关注,提升了自己的影响力。同时由于自己专注于英特尔以及百度飞桨的开源项目工作,因此获得了英特尔边缘计算创新大使、百度飞桨开发者专家等荣誉称号。
    image

  上面只是简单总结了自己这两年以来做开源项目所获得的东西,可以看出,给开源项目和社区做贡献,在成就开源社区的同时,更大的就是成就了自己。

3. 如何为开源做贡献

  上面我们讲了这么多给开源项目和社区做贡献的好处,可能有一些小伙伴就开始心动了,下面我们就展开讲述一下有哪些途径可以为开源做贡献,具体是如何做的。

问题二:为开源项目做贡献--如何提Issue?

  首先向大家介绍一下第一种方式,也是入门级别相对简单也是比较容易实现的,就是给开源项目提交Issue。开源项目在发布时尽管发布者或者团队已经做了很详尽的测试,但由于使用对象以及使用环境等因素的影响,使用者难免会出现相关问题以及新的使用需求,因此我们提交Issue可以包括以下内容:

  • Bug报告:你发现了代码中的错误或异常行为。
  • 功能请求:你希望项目中添加一个新功能或改进现有功能。
  • 问题咨询:你在使用或配置项目时遇到了困难。
  • 文档改进:你认为项目的文档需要更清晰或更完整。

  当然,这是是我列出来的常见内容,具体还是看使用者需求,因此提交Issue一定是该开源项目的使用者,再使用时碰到难以解决的问题时我们就可以通过提交Issue方式解决,这样不仅可以帮助自己解决问题,还可以促进开源项目的改进与发展,属于两全其美的事情。

  再确定了你的问题以及你要提交Issue时,你需要先做一步问题检查,检查一下是否有小伙伴提交过相同的Issue,这样可以避免提交重复的问题,给开源项目发布人员带来不必要的负担,也是对做开源工作对其他人员的最起码的尊重。如果你发现这是一个新的问题,之前并没有人提过,那么好,你就可以开始提交你的Issue了,主要包括以下几个步骤:

(1)创建一个新的Issue

此处以OpenVINO厂库为例,创建一个新的Issue。

image

OpenVINO官方提供了不同的Issue类型选择,此处可以根据你所需要的问题类型进行选择。

image

(2)编写Issue标题:

  使用简洁明了的标题来描述你的问题或请求,好的标题可以快速地让维护者了解Issue的主要内容。

(3)详细描述问题:

  官方人员在解决你所提出来的问题时,会首先复现你所出现的问题,因此在提交Issue时,一定要详细描述你所提交的问题复现步骤以及结果输出情况和日志,总的来说可以包括以下几个部分:

  • 上下文:描述你在什么情况下遇到的问题。
  • 重现步骤:如果是bug报告,详细列出如何重现这个问题。
  • 期望结果与实际结果:说明你的期望是什么,以及实际发生了什么。
  • 相关信息:如操作系统、软件版本、依赖库版本等。
  • 附加信息:
    • 日志和错误消息:如果有相关的日志或错误消息,请附加或链接到它们。
    • 屏幕截图和视频:如果它们有助于解释问题,可以附加在后面。

image

  最后就是要使用Markdown格式来组织你的描述,使其易于阅读。并始终保持礼貌和尊重,因为开源维护者是在免费为你提供帮助。

(4)提交并等待回复

  最后在详细描述完问题内容后就可以提交问题了,提交后就可以等待光放人员的回复,如光官方人员在复现时或者解决时有什么问题,也会向你进行反馈,因此可以时刻关注问题的动态。最后在问题解决后一定要礼貌感谢一下官方人员。

** 问题三:为开源项目做贡献--如何提PR?**

  上面我们已经介绍了提交Issue,这对于刚入门的开发者来说是十分容易的,下面我们将介绍一下进阶内容,给开源项目提交PR。提交PR应该属于进阶版内容,因为他是从技术要求、编程能力以及对源码的掌握程度都会有很高的要求,所以这一块内容适合对项目十分熟悉的小伙伴。

  但如果小伙伴们到了这种程度或者是在使用中对项目源码做了修改使其变得更好,就可以开始向项目提交PR了,不过在提交前要先注意以下几点:

  • 第一,确定一下该项目支不支持提交PR,此处主要是通过该项目厂库查看是否PR板块是否开放,以及在项目README中,作者是否表达了欢迎广大开发者对该项目进行改进的意愿。
  • 第二,查看一下项目官方对提交PR的要求,这个要求一般会在项目厂库根目录下的CONTRIBUTING.md文件中,该文件中会规定了具体的提交PR的要求,包括提交PR的规范、代码风格以及编码格式要求和开源许可等内容。

  在确定了以上问题后,就可以开始提交你的PR了,这里有两种方式可以提交PR,一种是在线直接提交,这种方式适合修改内容较少,不涉及源码修改等;第二种是本地修改后提交,这种方式适合有较大的改动,涉及到源码修改等。

方式一:在线直接提交

(1)选择要更新的文件

  通过在 GitHub 中单击它来选择更新,以README.md文件为例:
image

(2)点击“编辑此文件”

  该按钮位于右上角。
image

  如果你没有Fork该项目,需要先Fork该项目。
image

(3)修改文件内容

  此处增加两个

标签:社区,项目,--,可以,技术,开源,提交,十件事
From: https://www.cnblogs.com/guojin-blogs/p/17984535

相关文章

  • 函数
    一、函数的使用在Shell中,你可以创建和使用函数来封装一系列命令,以便稍后可以多次调用它们。函数可以帮助你使脚本更加模块化和可维护。以下是在Bashshell中创建和使用函数的基本语法:functionfunction_name{  #函数体,包含一系列要执行的命令  #可以使用参数$1,$......
  • 结构化命令case和for、while循环
    1、case流程控制语句case是一种流程控制语句,通常用于根据不同的条件值执行不同的代码块。它的语法如下:caseexpressionin pattern1)    #在匹配pattern1时执行的代码   ;; pattern2)    #在匹配pattern2时执行的代码   ......
  • 条件测试语句和if流程控制语句的使用
    1、read命令read是一个在Unix/Linuxshell中用于从用户输入读取数据的命令。它允许您在脚本中接收用户的键盘输入,并将输入存储到变量中,以便后续处理。以下是一些read命令的示例用法:读取用户输入:echo"What'syourname?"readnameecho"Hello,$name!"在这个例子中,read......
  • 整机性能和2D性能测试 Unixbeach
    一.工具介绍前言UnixBench是一款开源的测试unix系统基本性能的工具,是比较通用的测试VPS性能的工具,会测试系统各个方面一系列的性能,然后将每个测试结果和一个基准值进行比较,得到一个索引值,所有测试项目的索引值结合在一起形成一个测试分数值,也支持多CPU系统的测试,默认的行......
  • awk的基础应用
    一、概念awk是一种强大的文本处理工具,用于在文本文件中执行各种文本处理任务。它的基本语法如下:awk'pattern{action}'input_filepattern:用于匹配输入行的模式。如果省略模式部分,awk将对所有输入行执行指定的动作。{action}:在模式匹配的情况下执行的操作。操作可以......
  • Java和C++的区别:传闻这个问题能分辨你是不是科班出生?
    大家好,欢迎来到程序视点!我是小二哥。今天听到一个面试的小伙伴分享了他的面试经历,说面试官第一个问题是:Java语言和C++语言的区别有哪些?坊间流传,早些年间这个问题能区分一个Java程序员是不是科班出身!小伙伴怎么认为呢?缘由由于Java本来就是从C++衍生出来的,而且Java语言......
  • 004java运行机制
    https://edu.csdn.net/skill/java/java-2af8b309ed874ad6bd06c6f2363d098d?category=462&typeId=19830来源csdn技能树一、Java的运行过程二、Java的跨平台的解释一、Java的运行过程......
  • sql自学笔记(一)
    存储数据特点将数据放到表中,表再放到库中一个数据库中可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性表由列组成,成为字段,所有表都是一个或多个列组成,类似于“属性”表中数据是按行存储的,每行类似于对象常见命令查看当前所有数据库showdatabases;打......
  • 21-有参转录组实战7-基因序列提取
    #本教程仿自于“https://zhuanlan.zhihu.com/p/439168788”。#正则表达式教程https://www.runoob.com/regexp/regexp-tutorial.html。#1,提取转录本gffreadPtri_genome.gtf-gPtri_genome.fa-wPtri.transcripts.fa#2,CDSgffreadPtri_genome.gtf-gPtri_genome.fa-xPt......
  • idea easyCode插件与velocity语法
    1,idea安装easyCode插件2,设置模板easyCode的教程:https://gitee.com/makejava/EasyCode/wikiseasyCode会有默认的字段类型的对应关系,也可以根据需要自己修改 下面是我自己写的一套(适用于mybatisPlus)##导入宏定义$!define##保存文件(宏定义)#save("/entity",".java")##......