如何在GitHub上启动一个开源项目--来自建立我的趋势Repo的提示

187 阅读16分钟

世界各地的开发者都使用GitHub与全球开发者社区分享他们的项目。

在这篇文章中,我将给你一些有主见的提示,帮助你建立一个可以开始使用的优秀开源项目。你也可以把这些技巧用于构建黑客马拉松项目。

最近,我在令人羡慕的GitHub趋势页面上结束了自己的工作。我是整个GitHub上排名第二的开发者--而且还是Python的,这对9月7日上午的我来说是个惊喜。而且这还是基于我在凌晨4点写的代码。

我还在GitHub的每日通讯中发表了文章,这都是在我的一个项目开源之后。

我将在这篇文章中分享一些技巧,你应该能够应用于所有类型的项目,而不仅仅是像我自己的Python包。

你可以在这里查看我的 repo。

我的项目在GitHub的趋势页面上

找到你的动力

要想玩转GitHub的趋势版块几乎是不可能的。

GitHub的定义(趋势)考虑到了对趋势的长期定义,并且使用了比单纯的星星数量更复杂的测量方法,这有助于防止人们在系统中耕耘。

创始人经常根据他们个人遇到的问题创建初创企业。通过开源的代码,你可能会试图解决开发者普遍存在的问题。

由于在GitHub的 "趋势 "部分进行游戏几乎是不可能的,你需要一个强大的动机--一个巨大的、常见的开发者问题--来进行工作。那么,你是如何偶然发现一个开发者问题的呢?

嗯,首先你可以参加黑客马拉松,建立项目,并与其他项目进行实验。你很快就会发现一些可以做成库的东西,一些你可以做成实用程序的东西,等等。

你建立项目的动机可能来自任何地方。就我而言,我每天都在arXiv(一个开放的论文档案库)上探索新的机器学习论文,并阅读我认为有趣的论文。我读到的一篇这样的论文,促使我建立了我的Python包。

还有一次,我在黑客马拉松上训练一个机器学习模型,想参加其他的庆祝活动。我们的团队于是决定建立另一个名为TF-Watcher的开源项目。

所以你看,当你建立一个项目时,你很可能会发现各种可以工作的问题。

而且要注意的是--当我说你应该有强烈的动机时,我并不是说这个项目应该非常巨大或非常复杂。它当然可以是一个简单的项目,可以让开发者的生活更轻松。

这样想吧:如果有一个像你想开发的项目,你会使用它吗?如果答案是肯定的,你就有足够的动力去建立这个项目,不管它的规模和复杂性如何。

加州奥克兰的一名男子上周通过删除11行代码扰乱了全世界的网络开发。-Keith Collins在《一个程序员如何通过删除一小段代码打破了互联网

你可能知道left-pad ,一个非常小的开源npm包,只有11行简单的代码。但它被世界各地的大量开发人员所使用,这正好加强了我上面所说的内容。

研究你的想法

一旦你找到一个你想解决的开发者问题,并且有足够的动力开始工作,你最好花相当多的时间做研究。

我相信,通过研究来回答这些问题是一个很好的做法。

类似的项目或工具是否已经存在?

如果还没有,而且有这个需求,就去开始建立它。

如果类似的东西已经存在,开发得很好,而且也被大量使用,你可能想继续前进。

现在已经有大量的开源项目了,找到一个做类似东西的资源库是很常见的(比你想象的更常见)。但你仍然可以在你的项目上努力,让它变得更好。

如果类似的东西确实存在,你的项目能不能让它变得更好?

如果存在类似的东西,你的目标可以是让它更模块化或更有效。你可以尝试用其他语言实现它,或者用其他任何方式来改进它。

一个很好的方法是看一下现有资源库的问题。试着用现有的解决方案做研究(如果有的话),找出项目的哪方面有可能被改进。你的工作甚至可以是其他项目的衍生品。

在我的案例中,正如我提到的,我从我读到的一篇有趣的研究论文(Fastformer: Additive Attention Can Be All You Need)中得到了灵感。我还发现了该论文的一个官方代码实现和一个社区实现,都在PyTorch中。

最后,我的资源库虽然是研究论文的衍生品,但与现有的代码实现有很大不同

你能像我5岁那样解释你的项目吗?

ELI5,或者说像我五岁那样解释它,是一个很好的练习,我喜欢在我有一个关于资源库的想法时就做。

我试着解释这个项目的目的是什么,或者它是如何工作的,或者为什么它比类似的资源库更好--给一个对这个主题不甚了解的朋友。通常会有一些有用的类比。

通过这样做,可以帮助我发展或清楚地了解我在项目中想要做什么。尝试向朋友解释项目,往往也能帮助我发现我的计划中的任何缺陷或我在项目构思时可能做出的假设。

当我开始项目的开发阶段时,这个过程真的有助于我。这也是我开始创建一个项目板的时候。你可以在GitHub上建立一个项目板,也可以使用Trello、JetBrains Spaces等等。

我喜欢在这个阶段使用GitHub项目和问题清单,以帮助我管理、确定优先次序,并对我需要做的事情有一个清晰的高层概念。

GitHub项目和问题检查表

你能从类似类别的优秀资源库中学到什么?

你经常可以从属于类似类别的软件库中获得灵感和学习。看看他们的代码是如何结构化的。你应该试着去探查其他优秀的软件库,并阅读他们写得很好的代码。

在我的例子中,我真的很喜欢reformer-pytorch的编写方式。它很容易在你的项目中作为一个Python库使用,它希望你最好只关心一个抽象了大量模型构建过程的类,并返回一个torch.nn.Module (在Pytorch中,是所有神经网络模块的基类)的实例,你几乎可以用它做任何事情。我最终以一种相当类似的方式建立了Fast-Transformer

如何开发你的项目的Repo

你可能听说过这句流行的话。

任何傻瓜都能写出计算机能理解的代码。好的程序员会写出人类能理解的代码。-马丁-福勒

如果人们不能理解你的代码,他们就不会使用它。

我在自己的资源库中注意到,当我花更多的时间试图使事情变得简单和容易使用时,这些项目最终会得到更多的关注。因此,试着花额外的时间使你的项目更可用和更直观。

在开发你的 repo 时,作为一个一般的经验法则。

  • 当你启动一个开源项目时,你应该包括一个许可证。这允许人们使用、复制、修改和回馈你的项目,而你保留版权。你可以很容易地在choosealicense.com/ 找到适合你的项目的许可证
  • 创建一个好的README:接下来有一整节是关于这个的,因为它是超级重要的。
  • 使用一致的代码惯例和清晰的函数/方法/变量名称。你可以经常使用一些静态代码分析工具,如blackktlint等。
  • 确保你的代码有清晰的注释,记录你的想法,并包括边缘案例。
  • 确保修订历史、问题或拉动请求中没有敏感材料(例如,API密钥、密码或其他非公开信息)。
  • 如果你正在开发一个应用程序/库,我建议你使用GitHub发布。每次发布新版本时,试着维护清晰的发布说明和变更日志,这样社区就可以追踪到新的内容。记录哪些bug被修复了,等等。这里有一个很好的repo显示了这一点。
  • 最后,你还应该在版本库中加入贡献指南,告诉你的听众如何参与你的项目。你可以包括你所期望的贡献类型,或者如何建议功能请求或错误报告等信息。

如何写好README

一个好的README无疑是版本库中最重要的组成部分之一。它显示在版本库的主页上。

潜在的贡献者通常会先查看 README,如果他们觉得有趣,才会看一下代码,甚至考虑使用这个项目。

另外,这并不是写README的权威指南。你可以随便玩玩,试验一下什么东西适合你的项目。

一般来说,你会想在你的README中包括这些内容。

解释项目是做什么的

试着用3-4行来描述项目。不要担心包括太多细微的细节或功能--你可以在后面的部分添加它们。这也是访问你仓库的人首先要看的东西,所以一定要让它有趣。

有一个伟大的项目封面图片或标志

如果你有一个标志或项目的封面图片,请把它放在这里。它可以帮助贡献者拥有某种视觉效果。

分享你的徽章

README中的徽章

你经常会在README的顶部看到传达元数据的小徽章,例如该项目是否通过了所有测试。

你可以使用shields.io在你的 README 中添加一些。这些通常会给你的项目带来很大的可信度,而不需要访问者去看你所有的代码。

包括视觉效果

你应该总是尝试在你的README中包含视觉效果。这些可以是显示你的项目在运行中的GIF,或者是你的项目的截图。

在README中,好的图形可以真正帮助说服其他开发者使用你的项目。

解释如何安装或设置你的项目

你还应该包括具体的安装指南。包括所有需要的依赖性以及其他开发者为了使用你的项目而需要安装的东西。

如果你在设置项目或安装依赖时遇到任何问题,很可能用户也会遇到这种情况,请确保你谈论它。

这些问题可能是非常直接的。

我的安装部分

给出清晰和可重复的使用例子

我认为这在你的README中是超级重要的。你不应该期望其他开发者做大量的功课或阅读你的代码--要尽可能让他们感到轻松。

一定要确保并反复检查你的代码例子或 "如何做 "部分是容易复制的。另外,要确保它对广大用户来说是可以理解的,不要遗漏任何复制的必要说明。

由于我的项目是一个Python包,我创建了一个附带的Colab Notebook来演示包的使用。这可以让人们轻松地在他们的浏览器上试用,而不必在自己的机器上安装任何东西。

有相当多的产品可以让你这样做,如repl.it、Glitch、Codepen,等等。

解释你能用这个项目做什么

列出你的项目所具有的功能和它能帮助解决的问题往往是有帮助的。你不必涵盖你所做的所有功能,但要分享主要的功能。

这将帮助开发者了解你的项目能做什么,以及为什么他们应该使用它。

分享人们如何获得帮助或为项目做贡献

最后,你应该清楚地说明你是否对贡献开放,以及你对接受贡献的要求是什么。你还应该记录命令,以提示代码或运行测试。

这些步骤有助于确保高的代码质量,并减少更改时无意中破坏某些东西的可能性。

外部文档

假设你认为你的README变得太长。在这种情况下,你可以创建一个额外的文档网站,并在README中链接到它,而不是省略任何重要信息。

因为我经常用Python工作,我一般用Sphinx从Python的文档字符串中生成我的文档。我发现Sphinx相当灵活,容易设置。

有相当多的选择来生成你的文档:mkdocsDocsaurusdocsify,等等。然而,对于我这个开始流行的项目,我不需要一个外部的文档网站。

这里有一个例子,我觉得可能是我自己一个项目的README的一个好的开始。这不是完整的README,只是我在一张图片中可以得到多少内容。

我在README中添加内容的例子

最后,为了获得更多灵感,我建议你尝试使用"制作README "指南

如何将访问者引向你的 GitHub 页面

一旦你创建了一个漂亮的 README,并将项目公之于众,你就需要考虑如何将人们带到 GitHub 页面。

首先,确保为 GitHub repo 添加相关标签。这些标签将使项目更容易被探索GitHub的人发现。

在 Hacker News、Twitter 和 Reddit 上分享你的项目

发布项目信息的好地方是Hacker News和Reddit。请记住,让你的帖子成为这些平台上的头条新闻或头条帖子是一项艰巨的任务。

当我的一个软件库成为头条新闻时,它在几个小时内得到了一百多颗星。

但是,当我最初在Hacker News上发布我的repo时,我没有得到一个人的支持。直到社区里的其他人注意到我的项目并将其发布在Hacker News上,它才成为头条新闻。因此,要让你的项目成为头条新闻,往往需要大量的计划和你的朋友的一点帮助。

在我的案例中,Twitter是一个非常好的地方,可以为我的项目获得第一批访客,并接触到外部受众。

这往往作为一个很好的方式,让人们迅速看到他们是否可能有兴趣检查你的项目。而你只是有有限的字符来向人们推销你的资源库。

以下是我对 "Fastformer.com "的实现。Additive Attention is All You Need "的论文

,它是一个基于Additive Attention的Transformer变体
,可以以线性复杂度有效地处理长序列t.co/jBfyCNGlcN#…

- Rishit Dagli (@rishit_dagli)9月3日, 2021

另外,不要在任何平台上过多地发布你的项目,因为它可能被标记为垃圾邮件。

呐喊很重要,但不是你想的那样

我经常收到关于为项目或书籍呐喊的邮件或信息。但我坚信,这并没有很大的意义。

如果你想让别人喊出你的项目,那么你会希望他们在喊出你的项目之前,已经使用了你的项目并发现它很有用。因此,一个更简单的方法是在README中添加一个 "推送此项目 "的按钮。然后,喜欢这个项目的人就可以自然地把它喊出来。

另外,请记住,呼喊并不能直接给你带来星星。从呼喊中来的人只有在喜欢你的项目时才会给你的项目加星。

这当然不意味着你不应该向人们寻求帮助、反馈或代码审查。事实上,你应该总是试图解决所有类型的反馈:改进、错误、不一致,等等。

总是准备好接受负面的反馈,并思考如何改进它。你可能最终会学到一些新东西 :)

在我的案例中,我注意到有异常多的访问者从Twitter来到这个项目。我的项目是用TensorFlow和Keras实现的,几天后(在我被喊出来之后),我发现Keras的创造者自己喊出了我的项目

几天前发布的加法注意力转化器论文(Wu等人)的TensorFlow/Keras实现t.co/nxYHGlzYDS

- François Chollet (@fchollet)2021年9月4

这很可能是因为我在README的顶部添加了一个 "Tweet这个项目",并让发现者自己来。

来自开发者社区的关于在GitHub上创建项目的提示

作为一个有趣的练习,我试着在Twitter上向社区询问他们可能有的任何提示,以便将其纳入本博客。以下是其中的几个。

(你应该添加)1.文件 2.决策日志决策日志 -Shreyas Patil

好的问题和PR模板。你也可以使用GitHub的问题表单。-Burhanuddin Rangwala

文档(应该是完整的,并且)包括应用架构、包装、风格指南、编码对话、所使用的技术框架库的链接、预先需要的令牌等。

总结

谢谢你坚持到最后。我希望你能为自己的开源项目带回一两件东西,并建立更好的项目。通过吸收这些技巧和实验--以及付出大量的努力--你可以创造一个伟大的项目。

如果你学到了新的东西或喜欢读这篇文章,请分享它,以便其他人能看到它。在那之前,我们在下一篇文章中再见吧!

非常感谢Santosh YadavShreyas Patil帮助我把这篇文章写得更好。

你也可以在Twitter上找到我@rishit_dagli,我在那里发布关于开源、机器学习和一点安卓的信息。


Rishit Dagli

里希特-达格利

高中生,TEDx,2次TED-Ed演讲者


如果你读到这里,请发推特给作者,向他们表示你的关心。鸣谢

FreeCodeCamp的开源课程已经帮助超过40,000人获得了开发者的工作。开始吧