构建开源项目:幕后故事
起点
我最喜欢的爱好之一就是参与开源项目。通常,一切都始于解决我自己的问题。随着时间的推移,我会觉得我的实验成果可能对其他人有用,这时就该把项目开源了。我发现很多人认为只要把代码上传到 GitHub 就足够开源了。从技术上讲,这的确是必要的一步。但这就足够了吗?当然不够。
如果您决定开源您的项目,可以在https://opensource.guide/starting-a-project/指南中找到初步的准备步骤。如果您还没有阅读过,我强烈建议您阅读一下。虽然这还不够,但它是一个很好的起点。
前段时间,我启动了一个名为“ xq ”的项目,这是一个用Go语言编写的命令行XML和HTML美化及内容提取器。我想以这个项目为例,展示我是如何让它更容易被其他人发现和使用的。
动机
你已经把项目的源代码上传到 GitHub 了。接下来你还需要读些什么呢?很快你就会发现,你去年熬夜开发的那些酷炫的东西根本没人用。这可能会让你很失望。
我的项目社区激励着我不断改进和完善它们,他们贡献了许多有趣的想法,甚至还有一些代码。无论是开源项目还是商业项目,都无关紧要。看到自己的工具被成百上千甚至数百万人使用,总是令人振奋。用户越多越好。同时,由于我最初启动这些项目都是为了解决自己的问题,因此不断增长的反馈也让我受益匪浅。
激励我不断前进的另一个重要因素是能够尝试各种新技术和新事物。我有一份稳定的工作,负责商业产品的开发。由于商业产品并非试验场,所以要引入一些新的、不可靠的技术总是很困难的。因此,我参与的开源项目总能帮助我了解一些在日常工作中无法使用或尝试的技术。
目标受众
对项目的潜在目标受众进行详细分析对项目的成功至关重要。我经常看到项目创建者和维护者期望项目用户具备相同的技能水平。在大多数情况下,这是一种误解,最终会给双方带来问题。
例如,我的命令行工具“xq”是用Go语言编写的,用于处理XML。我期望用户了解XML的用途以及如何使用命令行工具。但我并不期望他们了解Go语言、相应的工具链,甚至不需要任何编程技能。
可用性
接下来,要把你的项目看作是一个易于安装和上手使用的产品。理想情况下,最终用户在使用产品的第一秒就能清晰地感受到它的价值。
我们喜欢把开源项目发布到 GitHub 上,但它过于注重代码。我们应该为用户提供清晰易懂的安装说明。这里有个陷阱。我使用 Mac,希望我的“xq”工具可以通过Homebrew安装:
brew install xq
我查看了 Homebrew 的贡献指南,发现如果你的仓库没有“星标”,你就完全没有机会被添加进去。看来需要先找到其他方法。Go 语言就提供了这样的机制:
go install github.com/sibprogrammer/xq@latest
乍一看似乎不错,但它将用户群体限制在已经安装了 Go 工具链的用户。这是一个相当严格的限制。因此,对我来说,一个不错的起点是使用命令行工具的 bash 安装程序:
curl -sSL https://bit.ly/install-xq | sudo bash
在获得最初的 50-70 颗“星”之后,我们将准备好迎接新的挑战,例如……brew或apt install……
但即便在考虑如何简化安装流程之前,我们也需要吸引潜在用户,并展现产品的价值。我非常喜欢那些在 README.md 文件开头就用截图或动画视频演示主要功能的项目。如果是命令行工具,一套完整的使用示例也必不可少。如果是 Web 产品,预装演示服务器的链接更是必不可少。人生苦短,我们都很忙。你可能没有销售团队来服务潜在用户,人们评估你的产品可能只有短短一两分钟。
营销
对我们大多数人来说,“营销”这个词与美好的事物、有趣的事情以及我们想做的事情没有任何关联。但是,仅仅拥有好的产品是不够的,我们还需要以某种方式让其他人知道它。
从朋友和当地社区入手并不难。Twitter、Reddit、Facebook、LinkedIn 和其他社交网络可以帮助你获得初步反馈并吸引第一批用户。我想和你分享一下“xq”的营销案例,向你展示它在现实生活中是如何运作的。
我所在的公司有一项名为“研究日”的活动,其中还包括一个名为“研究日演示”的特别活动。因此,我的第一次演示就是在这个活动上为同事们做的。虽然到场的人不多,但有些人觉得我的演示很实用。我还在公司内部的Slack频道里发布了一篇关于类似活动的简短帖子。
接下来的两次尝试都是在 Reddit 上介绍这个工具。一次成功了(引发了讨论,项目也吸引了一些新用户),另一次则被版主屏蔽了(我至今也不知道为什么)。最终,我获得了足够的“赞”,可以准备一个 pull request 来加入 Homebrew。
之后进入了一段缓慢的自然增长期,期间我们修复了漏洞并实现了新功能。我研究了如何简化在 Linux 上的安装,发行版维护者的帮助也极大地促进了产品的推广。
我后来决定试试Hacker News的强大功能,结果令人印象深刻。除了大量的反馈和功能请求外,点赞数也在不断增长。我平时不太用 Twitter,粉丝也不多,但在 Hacker News 上发帖之后,我发现 Twitter 上有很多机器人试图转发每一条新闻。甚至在这些转发之后还引发了一些讨论。
还有一些其他的想法,比如加入“优秀产品”列表,或者发布一篇专门的文章,详细介绍产品功能和使用案例。总的来说,我认为经过几个月的开发,花些精力在市场推广上,提高产品的曝光度,是个好主意。
节省您的时间
项目开发过程中,各种琐事很容易让人感到枯燥乏味。例如,整理写得糟糕的错误报告、手动测试每一次改动等等,都可能成为不满的主要原因。既然你参与的是开源项目,那就应该把时间花在刀刃上,而且是免费的。保持动力的方法之一,就是专注于如何避免繁琐的杂事,从而节省时间。
GitHub 允许为创建新问题提供自定义模板。不要低估它的作用。它能显著简化问题报告流程,并促使用户回答维护者需要了解的问题。
在我的开源项目中,我最不想遇到的就是回归错误。因此,一套全面的测试用例能够显著节省时间,并带来改进项目的乐趣。如果没有测试,经过五六个版本迭代后,维护或多或少复杂的项目很容易变成一场噩梦。令人惊讶的是,这个道理常常被忽视。
编写一套测试用例是不够的。GitHub Actions 是一个出色的工具,它不仅适用于推送到主分支的代码,也适用于拉取请求,可以有效地组织持续集成 (CI) 流程。否则,在合并他人的拉取请求后发现代码风格甚至测试都存在问题,会非常令人失望。设置 GitHub Actions 并不难。如果你查看一下你最喜欢的开源项目,我猜它们应该都已经建立了 CI 系统。
借助“xq”,我更进一步,使用GoReleaser实现了发布流程的自动化。要发布新版本,我只需创建并推送 Git 标签。相应的 GitHub Action 会触发发布流程,而 GoReleaser 会根据预先设定的规范准备二进制文件和变更日志。整个过程具有高度可预测性,且无需任何人工干预。
福利
开源项目通常并非以盈利为目的,至少不是直接盈利。如果你想开发一款产品,但又不确定如何实现盈利,那么在我看来,一开始就开源可能并非明智之举。
但还有许多其他令人兴奋的好处。其中之一我在“动机”部分已经简要提及:在开源项目的框架下,边做边学和使用前沿技术会更容易。很多时候,在进行此类实验之后,我也会将这些知识运用到商业产品中。
如果谈的是职业发展,我认为几乎所有拥有十年以上经验的开发者都应该能够展示一些自己编写的代码。保密协议并非借口。几乎所有现代软件都高度依赖开源组件。因此,为某个项目贡献修复或改进只是时间和经验的问题。我可能完全错了,但作为过去二十年间进行过数百次技术面试的人,如果能够查看候选人编写的代码,构建他们的个人资料就容易得多。所以,参与开源项目无疑是在为打造你作为开发者的公开形象而投资。
通常,开发产品离不开各种工具。有些工具是免费的,有些则是商业工具。参与开源项目的一大优势在于,许多商业公司会为非商业开发提供特别优惠。以用 Go 语言编写的“xq”工具为例,我使用了JetBrains 的GoLand IDE。我付费使用了几个月,后来尝试申请加入他们的开源计划。他们不仅为我提供了 GoLand 的授权,还提供了整个产品包的授权!另一个例子是CodeCov服务。我希望能够轻松地跟踪代码覆盖率,从而控制代码质量并确保所有主要场景都得到了测试覆盖。CodeCov 对商业产品来说价格不菲(尤其是托管版本,费用约为 5 万美元),但对开源项目完全免费,这真是太棒了!如果您需要项目托管服务(例如,用于演示目的),可以尝试申请加入DigitalOcean 开源计划,当然还有其他一些选择。以上仅举几例。
连接点
总结本文,以下是一些我希望对您有所帮助的要点。
如果你想开发一个开源项目,即使我们讨论的是库,也要从产品的角度来考虑,而不是从项目本身的角度。它应该易于安装和使用。最终用户在使用的最初几分钟内就应该能感受到它的价值。
如果没有市场推广,人们几乎没有机会了解你的酷炫项目。但令人惊讶的是,启动项目其实并不难。而且,它与你的长期动力息息相关,其影响之深远,远超你最初的想象。
你的开源项目不应该变成一项枯燥乏味的工作。实现这一目标的方法之一是自动化所有日常工作并强制执行相关策略。最终,发布应该是一件令人愉悦的事情,阅读用户的功能请求和错误报告不应该因为缺少关键细节而让你感到沮丧。
最后但同样重要的是,参与开源项目是很有成就感的。有时这一点并不那么明显,但如果从长远来看,答案是肯定的。
文章来源:https://dev.to/sibprogrammer/build-an-open-source-project-behind-the-scenes-54ii


