草庐IT

如何给开源项目做贡献?

英特尔开发人员专区 2024-05-09 原文

作者: Adrian Boguszewski 和武卓

现如今,越来越多的开源软件被应用于千行百业。据统计1,我国在全球最大开源平台GitHub上的贡献者数量已经达到了全球第二。2020年,GitHub平台上中国贡献者数量增加了37%;而在另一个开源平台Gitee上,中国贡献者的数量更是增加了50%,总量超过了600万人。

       以OpenCV这个开源计算机视觉及机器学习库为例。OpenCV于2000年首次公开发布,已经成功地经历了20多年的发展,为全球开发者提供了2500多个优化算法。OpenCV团队团队花费了大量时间,完成了出色的工作,知道吗,其实你也可以这么做。但是,如果你这样做没有为你带来任何直接的经济收入,你还会觉得为开源项目做贡献有什么意义吗?

为什么要为开源项目做贡献?千言万语都说不完

开源项目提供源代码来帮助开发人员免费解决他们的问题,开发人员分享改进的解决方案并为开源项目做出贡献。 因此,双方都受益匪浅,形成了一个良性循环。

现在,让我们来看看为开源项目做贡献有哪些益处:

  • 通过学习他人的源代码来获得个人成长

在开源项目中,你通常可以免费下载或克隆源代码。因此,你可以方便地阅读源代码,了解如何定义函数来实现特定功能,如何建立模型训练流水线等等。通过这种方式,你将学会如何使用开源项目提供的功能和工具,并能通过阅读源代码学到知识,逐步成长为高级开发人员!

  • 建立起自己的名声

如果你使用开源软件,并提出比目前更好的解决方案,欢迎你将你的工作提交给开源项目。提交后,你的工作将得到审查,并会获得有益的反馈。经过几轮修改,你的工作最终可以获得批准并合并到该项目中。最后,你的解决方案被其他人正式接受并使用,这意味着你建立起了自己的名声😊

  • 在简历中增加优秀的开源项目经历

通过贡献一个开源项目,你相当于加入了一个拥有成千上万志同道合的开发者的社区。你还将有机会通过提交你的工作并获得评审,与开发和维护开源项目的专业人员建立联系和互动。同时,你可以通过在开源平台上公开展示你的技能来创建一份优秀的简历。我们希望这将有助于你跳过面试,在5分钟的谈话后被录用!

哪里可以找到“最佳的”开源项目?

    你可以通过各种平台或渠道为开源项目做出贡献。这里有一些成功案例,根据我们的经验,你可以先找到一些有趣的项目和方法,让你成为开源开发者。

    首先,考虑GitHub或任何其他代码托管服务。通常,开源项目有一个存储库来存储代码和相应的介绍文档。你可以通过浏览GitHub找到你感兴趣的项目。有关如何为开源项目做贡献的详细指南,一般可以在名叫“CONTRIBUTING.md”的文件中找到。

    其次,还可以找到一些开发者活动(如针对全日制学生或开源初学者的谷歌代码之夏(GSoC)等)、挑战赛或项目核心开发人员和维护人员组织的竞赛。通过参加这些活动或竞赛,你可以按照组织者指定的方式做出贡献,甚至还可以顺便赢得一些奖金。

    最后,可以借助你当前使用的应用程序。正如文章开头所述,今天常用的许多应用程序都是免费和开放的。你正在使用一些你非常喜欢的应用程序,很有可能是开源的——有了这个想法,你可以寻找这些应用程序的开源代码仓,然后参与这些程序的开发和维护工作,帮助它们变得更好!

接下来,我们将回答最重要的问题,“如何做出贡献?”。

本文基于OpenVINO™ Toolkit–一个来自英特尔的用于优化和部署AI推理的开源项目。对于其它开源项目,请联系社区并阅读他们详细的贡献指南。

好的,现在你决定为OpenVINO ™这个开源项目做点贡献了。 首先,你应该找到该项目的网站和代码库,以了解更多关于项目需求、代码结构和贡献规则的信息。目前,你可以在这里 找到 OpenVINO ™项目的官方文档,整个代码库托管在GitHub上。想要了解这个项目,最佳选择就是把它用起来!如果你不熟悉OpenVINO™, 请克隆并运行OpenVINO Notebooks仓库,并运行其中一些notebooks代码示例来学习并享受其中的乐趣。

我们强烈建议你通过运行:

为开源项目做贡献的典型步骤如下:

第一步:分支(Fork)项目

这个项目需要你工作在自己的仓库副本上,并创建pull request来合并代码。这意味着当你准备好开始你的旅程时,你需要点击“fork”按钮来fork主仓库。

第二步:克隆(Clone)项目

现在你已经拥有了你的远程副本。是时候在你的机器上克隆整个仓库了。你可以通过以下命令来克隆:

git clone git@github.com:<your_nickname>/openvino.git

如果你遇到如下图所示的错误,那可能跟你的SSH密钥有关。请参阅添加密钥指南 或者 通过https克隆 查找相应的解决方法。

第三步:编译(Compile)项目

下一步是建立你的开发环境,包括克隆子模块、安装依赖项和设置选项。我们推荐使用Ubuntu 20.04。请注意,在调试模式下编译代码将占用大约50GB的磁盘空间。如果你是经验丰富的开发人员,可以指定不同的选项来启用或禁用某些模块。请参阅此处的指南

cd openvino/
git submodule update --init --recursive
./install_build_dependencies.sh
sudo apt install cython3 intel-opencl-icd
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_PYTHON=ON -DENABLE_TESTS=ON -DENABLE_FUNCTIONAL_TESTS=ON -DENABLE_DEBUG_CAPS=ON -DENABLE_CPU_DEBUG_CAPS=ON -DENABLE_NCC_STYLE=ON ..

至此,你已经为编译做好准备了。运行以下的“make”命令行,然后等待整个过程运行结束。

make --jobs=$(nproc --all)

比较少见但是有可能出现的情况是,你的操作系统杀掉了你的编译。如果你碰到了如下图所示的情况,请以更少的并发任务,再次运行“make”命令

如果你想学习更多的关于整个编译建立的过程,请参考《如何从 OpenVINO™ 的主分支构建 OpenVINO™ Wheel 包?| 开发者实战》。

第四步:运行(Run)项目

为了确保每一项都正确构建了且 OpenVINO™ 是可用的,你可以运行如下这个名为 hello_query_device 的示例程序,它将打印所有可用的计算设备。

cd ../bin/intel64/Debug
./hello_query_device

你应该能看到所有可以运行 OpenVINO™的设备。在我们这种情况下,包括CPU, GNA以及GPU。

第五步:选择一个问题(issue)

你已经构建了代码。现在,你已准备好进行真正的开发了。一个好的起始点是根据实际需求修复或实现一些东西,使你的工作更有价值,并增加被合并的可能性。Github上有一个Issues标签,在那里你可以找到社区报告的bug和功能请求。

在你非常熟悉代码之前,最好寻找一个容易解决问题(easy-to-fix issues)的地方开始你的开发工作。这些地方通常有特定的标签,比如“good first issue”或类似的标签。

当你决定修复/实现什么时,建议先与开发人员和社区讨论一下,以确认最终的需求并指定你自己来解决这个问题。当一切都知道后,你就可以开始编写代码了。

第六步:代码实现

在你开始之前还有一件事,那就是找到并阅读贡献指南。遵循规则和代码风格是非常重要的。在大型项目中,一致性是至关重要的。然后你可以创建一个新分支(带有有意义的名称的)并切换到它。

git branch <meaningful_branch_name>
git checkout <meaningful_branch_name>

在你喜欢的任何IDE中打开代码,或者使用像vim这样的文本编辑器开始编写代码吧!每隔一段时间测试一下你的修改,以确保它朝着正确的方向推进着。

如果你在实现功能时遇到任何的bug,请创建一个issue来上报这个错误。

第七步:测试代码

如果你实现了一个新特性或修复了一个bug,你应该为它提供单元和功能测试(如果可以的话)。例如,如果你的更改与Python API相关 (src/bindings/python/src),好的做法就在相同的模块中增加单元测试 (src/bindings/python/tests) 。当你的修改影响了推理引擎的时候(src/inference/src ),你就应该增加相应的测试目录 (src/ tests/unit/inference_engine) 。接着再编译一遍 OpenVINO™,与其他人一起运行你的测试,并检查是否一切都通过。

cd ~/openvino/bin/intel64/Debug
./ieUnitTests

第八步:推送(Push)并创建拉取请求(Pull Request)

当 OpenVINO™编译和测试都通过了,你可以将你的分支推送到远程仓库。

git push -u origin <meaningful_branch_name>

创建一个PR(Pull Request),将你的更改拉向主仓库(main repo)是必须的。你可以在Pull requests选项中完成。

记得要为你的修改添加注释以及合适的标签,比如 Python API。

第九步:更新

然后,请等待主要开发团队的评估,当评估准备就绪时,请回答问题,消除开发团队的疑虑,并根据评估结果改进你的代码。同时,你需要确保所有CI测试都通过。如果没有,找到这些问题并解决它们。

第十步:合并(Merge)

最终,你的工作被合并啦!

我们鼓励你与我们长期合作😊 选择下一个issue,记得不时同步你的主分支!

OpenVINO™ 工具包现在是谷歌代码之夏(GSoC)的一部分啦!这可能是开启开源之旅的最佳方式之一。一起关注新闻并期待GSoC 2023吧!

数据来源:

[1] 中国信息通信研究院云计算与大数据研究所《开源生态白皮书》 2021.9

有关如何给开源项目做贡献?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐