开始一个开源项目

当公司在开源社区深耕足够长时间并建立了良好声誉后,它就具备了启动自己开源项目的条件。正是在此时,公司能够最大程度地从开放合作中受益。您可以将那些对社区可能有价值的现有项目开放出来。或者,另一种常见做法是从零开始创立一个全新的开源项目,从项目初期便与外部开发者合作。

这份指南旨在协助已经对开源颇为熟悉的企业了解如何启动和管理自己的开源项目。我们会带您了解整个过程,从确定哪些项目适合开源,到预算制定、法务考量等方面。虽然创建开源项目可能对您来说是新颖的,但像 Google、IBM、Facebook、Twitter 和 Microsoft 这样的大企业已经为您铺好了前路。遵循这份指南,您将获得实用的建议,并成功启动您的开源之旅。

为何要创建开源项目?

选择创建开源项目的原因众多。您可能期望更迅速地进行创新,加速产品上市的速度,汲取新的观点,达到互通性或成为行业标准,吸引才华横溢的开发者,或从多元的观点和贡献中获得更高质量的代码和产品。

尽管通过使用和贡献外部的开源项目可以实现以上好处,但一个全面的开源策略也应包括创建和推动您自己的开源项目。

发起新项目或将已有项目以开源方式分享给社区,可以进一步强化您公司在开源领域的声誉,提高公司对开发者的吸引力,并在开源项目中产生更大的影响力。当您寻求与外部生态系统的合作伙伴、供应商和用户合作时,您的代码库可以作为讨论的起点,并带来其他优势。

真正地将您的代码和开发习惯开放给外部使用和贡献意味着您真正拥抱了开放创新,为您的业务充分利用了开源的优势。在开源许可下发布的代码允许任何人进行贡献、查阅、修改和优化。这种合作开发的模式现已成为软件构建的事实标准,并被证明是技术创新的动力。

无论您是金融服务公司、医疗机构、货运公司、实体或在线零售商、交通提供商,还是建筑公司,都同样受益于此。许多企业确实希望保留其为客户创造价值的核心应用和技术,但还有大量的代码和软件并不是组织的核心竞争力。将这些代码以开源项目形式开放给外部,可以为这些代码的增长和完善创造新的机会。

“不管我们公司内部雇佣了多少优秀人才,外面的世界总有更多的人才。我们发现,通过开放源代码分享我们的知识,从外部专家那里得到宝贵的意见,这对我们是非常有益的。” - Jared Smith,开源社区经理,Capital One

当企业希望在可能缺乏专业人才的领域推进其目标时,他们会转向开源。通过这种方式,他们通常能够加快进程,与其他有相似软件目标的团队合作,同时还能降低成本,提高最终产品的质量。

开源项目提供了无约束的合作机会,甚至允许在同行业的竞争者之间进行合作。多方参与可以加速代码开发,通过合作,开发者们可以开放地分享,得到大量反馈,共同创造出可扩展、高效且高品质的代码。

何时创建一个开源项目

决定创建或发布新的开源项目要看你的具体需求。你的公司在发布之前最好已经熟悉了开源软件的使用,并且为已有的项目做过贡献。这是因为使用开源可以教你如何与外部项目和开发者合作来打造你的产品。而参与开源则能让你更深入了解开源社区的习惯和文化。 (具体可参考我们的指南 如何使用开源代码如何参与开源社区) 但当你真正掌握了开源的精髓后,开设自己的开源项目的最佳时机就是“越早越好”和“多多益善”。

从何开始

也许当你遇到了一个技术问题难以自己解决时,或者当你无法找到一个已有的项目能满足你的需求时,就应该考虑创建新的项目了。说到底,这个问题并没有固定答案。当你需要一个项目但找不到已有的解决方案时,就可以自行开启一个。

对于打算开启新开源项目的企业,关键在于明确“为什么要这么做”。首先,你要问的是什么对你的组织真正重要。基于正确的理由开展开源项目是至关重要的。

“我认为公司需要明确他们通过新的开源项目想要实现什么。他们需要考虑这对社区和外部开发者的价值是什么,以及他们想从中得到什么。然后,他们需要明白为了正确推进这个项目需要准备些什么,这包括法律、管理、基础设施和初步的社区建设。当发布一个开源项目时,我总是特别强调这些。” - John Mertic, Linux Foundation 项目管理总监

可以从那些企业并不需要拥有全部权威的代码项目开始,那些可以借助更大的全球技术团队来解决问题的项目。如果它不是核心业务代码,那它很可能适合开源。但同时,它也应该是公司正在积极使用和维护的代码。商业上对这份代码的依赖促进了错误修正、补丁和新功能的反馈循环。

“我们分享的很多项目都是我们内部正在使用的,因此我们想分享那些在生产中被验证过的工具。由于 Facebook 的规模,这些项目已经经受了考验;我们为社区所贡献的都是经验丰富的成果。另外一个关键点是,因为我们仍在使用这些工具,我们不会让它们被遗弃或失去支持,因为我们的工程师都在依赖这些工具。” – Christine Abernathy, Facebook 开源团队开发者布道师

还需要考虑的是,你的项目是否具有独特性,或者是否已经有其他开发者在努力解决类似的问题。你公司想要开源的项目是否是重要内容,同时其他用户是否也在寻找它?如果是,那么这个项目的开源意义可能会很大。

你还需决定是将代码捐给一个供应商中立的非营利组织,还是保留某种控制权并自行管理项目。答案取决于你想要达到的目的。

“开源一个项目,当你发现其中有些内容对公司不那么核心,但你仍想有所掌控。如果你意识到,吸引其他开发者参与可以助力公司更进一步,那就大胆去做。想明白,然后行动。” – John Mertic, Linux Foundation 项目管理总监

项目规划

一旦你开始实施你的计划,为了使你的开源项目取得成功,必须考虑和解决大量的细节问题。让我们逐步考虑这些问题,首先从你如何决定是否发布或捐赠项目的源代码开始。

决定开源或捐赠哪些代码

首先,你得确定是否希望在保留其所有权和项目管理权的情况下开源代码,还是希望将代码捐赠给他人进行维护和管理。如果项目已经开发完成,还需考虑是否要将整个项目的代码或只是部分代码开源。

为了做出这些选择,请首先明确你对代码的期望和目标。

“当我们的工程师打算开源一个项目,我们会考虑几点。首先,这个项目对于外部开发者有价值吗?这个项目能有所突破吗?它是我们可以展示的东西吗?会有一个围绕这个项目的社区吗?而维护它的人能够提供支持吗?” – Christine Abernathy,Facebook 开源团队开发者布道师

例如,你可能想要从其他开发者那里获取有关非核心应用部分的新思路。或者,你可能在寻找其他的实际算法来分析系统监控应用中的日志。与其将整个产品开源,不如只开源与这个算法相关的部分。这样你既可以吸引他人的贡献,也可以帮助那些有相似需求的人,同时还能保护你的核心业务。

开启一个项目并保留大部分管理权使你可以进行有效的指导,确保项目符合你的需求,同时仍然给予其他开发者一定的自由度。

捐赠代码则是另一回事。这意味着你放弃了它,将管理权交给其他人。这或许是因为你的公司不再需要该代码,但它仍对他人有价值。这类代码可能已超出了你公司的维护能力,但却能被开源社区所接纳,进而成为长期的项目。或者,虽然它是你公司的关键代码,但需要一个中立的环境来吸引更多的参与者。

但是,不要只是捐赠对你不再有用或感兴趣的代码,希望社区能够维护它——这并不是正确的做法。不要使用开源作为抛弃旧代码的方式。如果它真的不重要,你在开源界的声誉将会受损。开发者会记得你过去浪费了他们的时间。

“如果你在一年内启动了三个质量很高的开源项目,并吸引了活跃的社区,那比你每年创建10个开源项目的影响要大。说实话,开源社区更注重质量而不是数量。他们会挑选想要参与的项目。如果你推出了10个不合格的项目,没人会关心。你应该开源那些真正有价值的内容。” – Guy Martin, Autodesk 开放创新部主管。

构建商业案例

在你制定了一个稳固的商业案例后,现在也是开始一个开源项目的好时机,就像你推向市场的任何其他产品一样,该案例需要有可以实现的成果来加固。然后还需要得到高层的支持,因为管理层需要理解为什么要进行这一项目,目标和预算是什么,路线图将是什么,哪些知识产权将被开放,以及哪些代码将会或不会被涉及。

资源配置

你需要确定是否能够做出相应的资源承诺,包括为项目分配的开发者工时。开发者所需的时间初步可能与他们在公司内部项目上所花费的相当。你还应思考你的开发者需要投入多少时间、资源或协助,以便帮助新社区的成员更好地理解代码。当你创建可能涉及竞争对手的开源项目时,也要为法务团队提供相应支持。此外,市场投入也是确保项目启动后能够获得支持和贡献的关键。

同时,你也需要为启动和持续维护项目的基础设施规划预算。这包括项目托管和代码版本控制的平台,如 GitHub,其中代码会被存储和维护,以及问题追踪和其他必要工具。

代码质量审查

当你考虑为开源项目准备的代码的状态和成熟度时,这可以作为你启动项目的参考标准。需要确保代码质量上乘,正如先前所提,不能是乱七八糟的代码,以免损害在开源社区的声誉。

但是,你要避免的一个误区是追求代码的完美。如果过于追求完美,你可能从未迈出第一步。从目前最好的代码出发,相信社区的其他成员会帮助你优化它。同时,确保你提交的代码中没有包含商业敏感的注释、对私有接口的引用或不恰当的内容,确保它的质量能够满足社区的标准。

确保其实用性

当你能明确看到项目对他人有价值,并且能证明它能帮助他人解决实际 IT 问题时,你的项目就已经准备好向前发展了。这些认知可以通过传统的市场调研来获得。确保你所做的不仅是你个人需要的,而是大家都会寻找并愿意参与其中的项目。多做调研,向身边的人咨询意见,参与开源活动,与开发者和分享者进行交流,了解他们所面临的挑战和需求。

如果你发现已经有人启动了一个类似的项目来应对相似的问题,那么你可以思考是否愿意加入他们,而不是自己再起一个新的。即使已经存在类似的项目,甚至是由竞争对手驱动的,合作可能会更有意义,因为合作精神是开源社区的核心。

思考与竞争对手在开源项目中的合作也非常关键。当你的公司发起一个开源项目,并且竞争对手也愿意参与其中时,这样的合作不仅可以为整个代码库带来更大的利益,而且还可以确保你处于领先地位,而不仅仅是跟随他人。

听取团队的意见

在每个我们提及的考虑点中,技术团队都能与管理层一同参与决策,共同为流程的成功提供指导。你的开发者和 IT 团队能为你指明在哪些地方和时机进行合作是最有价值的。

“当我们找不到所需的解决方案,或者过去的有效方法在新的情境下不再适用时,我们会考虑启动一个开源项目。有时是基于性能考虑,有时是由于成本或避免供应商绑定。有的时候,仅仅是因为我们正在将大量基础设施迁移到更先进的技术上,而一些传统供应商没有做好准备,或不愿在云或容器环境中运行他们的软件。” – Jared Smith,开源社区经理,Capital One

启动你的开源项目

在你为项目做了充分的规划后,现在是时候采取一些更具体的操作步骤来构建你的项目了。首先是法律方面的准备。这包括进行代码审查和清理,确保代码的安全性和可用性,为你的项目选择合适的开源协议,并制定项目治理策略,确保流程顺畅。接下来的任务包括:搭建合适的基础架构,对代码进行初步准备,最后向社区宣布项目的启动,并提供持续更新的文档。

法律审查

项目中最糟糕的事之一是社区对代码库的法律纯净度表示不信任。确保你发布的代码具有明确的许可和来源非常重要。全面的法律审查通常有助于确保所贡献的内容能够被社区其他成员所接受。此次审查的关键方面是验证您的公司有权发布所有代码。您的法律审查应包括商标尽职调查和注册。注意,如果您要将项目贡献给一个基金会,确保在开源代码库之前在商标策略上达成一致。

你还需要为项目选择合适的开源许可证。记录所有的许可和知识产权要求至关重要。IP策略文档能够明确所有的许可和贡献要求。务必确保每个代码文件都有许可声明或 SPDX 许可标识。另一个好的做法是,要求每次代码提交都附带开发者的 DCO ‘Signed-off-by’ 标记,以确保代码来源清晰。例如,GitHub 提供了一个工具来确保此点,可以在 https://probot.github.io/apps/dco 上查看。

了解各种开源许可证及其利弊非常重要。某些许可证包括明确的专利授权,某些具有防御性终止条款,有些重在保护用户权益,有些则提供修正条款,还有一些在特定行业中可能更受欢迎。你还要考虑你的项目所依赖的其他代码库的许可证,这些库可能与你的软件相结合。

除了软件源代码,还要考虑项目的其他方面的许可要求。如果您预计需要公司承诺进行专利授权,或者以后有能力重新许可项目,您可能需要查看一些更常见的贡献者许可协议(通常称为 CLAs)。并非所有的 CLAs 都相同,所以请仔细考虑这个选项。还要意识到 CLA 可能会成为参与的障碍,因为开发者通常必须经过繁琐的审批流程才能签署它们。

您的项目还可能产生非软件的交付物。如果您的项目正在制作文档,请讨论是否应该为文档使用特定的许可证。例如,许多开源项目将为软件使用一个开源许可证,而为文档使用 Creative Commons 许可证。此外,一些项目试图创建可能由其他人以各种方式实施的规范。这些项目应考虑使用规范许可证的选项。其中一个例子是 Open Container Initiative (OCI),它使用 OWFa 1.0 – Patent Only 规范许可证用于规范,以及 Apache 许可证,版本 2.0 用于他们正在构建的开源软件实现。

在许可中的另一个常见考虑因素是在 Copyleft 和宽松许可之间进行选择。Copyleft 通常用于描述要求互惠分享的许可证,通常试图保证用户获得提供给他们的软件的源代码的权利。宽松许可证倾向于使其他人更容易参与和分享贡献,而不需要下游义务。这尤其有利于软件部分,因为它要求软件生产者能够基于开源代码库分发专有软件,而不用公开他们的更改。

每种许可方法都有其优点和缺点,但请注意您的项目可能会碎片化的潜在性,这对于需要互操作或跨多个供应商解决方案提供可移植性的软件来说是一个特殊的问题。这个问题通常通过创建一致性计划来解决,该计划允许如果商业解决方案通过社区创建的测试或一组要求,就可以使用项目商标。提前考虑这个问题将帮助您为项目提供法律审查和计划。(关于开源法律问题和考虑因素的更广泛阅读,请参阅我们推荐的阅读列表。)

总之,法律审查过程中的步骤包括:

技术审核

技术审核主要检查源代码是否能够独立于其他内部代码或开发习惯正常运行,以及是否包含了公司在开源发布时不能包含的第三方代码。

您要确保您计划发布的代码中没有任何部分侵犯了其他公司的知识产权,如专利。现在有很多专利骗子,他们会对侵犯他人专利的代码穷追猛打。这是一个具有重大负面影响的大问题,您必须从一开始就正确对待。为此,公司通常会使用专门的扫描工具对代码进行扫描,以确保代码是干净的。添加许可证和版权声明,以及说明代码内容和使用方法的文档。

技术审核的内容还应包括核实所有的许可证和版权声明,清理私有的代码注释。具体步骤如下:

项目治理

为了项目的启动做好准备,您还需要为项目治理制定技术规范。治理是关于项目战略、发布、方向及开发优先级的决策制定过程。这些决策应该公开透明,这样可以确保所有参与者都明白项目的变动并保持透明度。同时,您还要思考是否应在治理中包括对升级问题的处理方式。

在项目初期,确定哪些参与者会参与治理是非常关键的。您需要明确治理机构必须满足的标准。应该制定如何跟踪功能和错误、如何提交代码,以及谁负责管理发布流程的明确规定。

您要确保被委派来管理项目的人具备他们操作和维护项目所需的工具和资源。这正是您的开源项目办公室和经理的职责所在。

“您要确保那些负责执行这些任务的人具备成功所需的权限和能力。您还要确保商业层面的项目和技术层面的项目之间有明确的区分和领导。这样,您就能避免事情走到死胡同,避免人们做出与项目背景不符的决策。应该让商业团队协助技术团队,共同取得更大的成功。” - John Mertic,Linux Foundation 项目管理总监

技术流程

在项目启动前,为了定期推出项目维护者的代码更新和优化,制定一个标准的发布流程是十分必要的。应当设定一个时间表,使开发社区和项目的商业层面都能清晰、可见地了解进度。

具体的发布频率取决于您的社区的期待。如果项目主要以企业为导向,并且您追求的产品非常稳固,那么您可能每年发布两次。而如果项目较小、更灵活,并且您希望快速将部分内容推向市场,那么您可能每月甚至每周都会发布代码。时间表的关键在于,社区需要了解这个时间表,并明白它在速度上是如何支持项目的,同时还能满足用户的需求和期望。

如果社区的反馈是发布速度太快或太慢,那么您就需要审视现有流程并作出调整。核心的目标是保持一致性、可预测性和透明性。

领导力

在项目开始前,确定领导角色是十分关键的。对于不同的项目,这可能有着不同的涵义。如果您正在启动的是一个涉及多个公司的项目,且有多个企业级参与者,那么您可能需要更正式的管理结构,例如管理委员会或其他领导团队。而有些项目可能仅需要一个技术委员会来从技术角度监管整个开源项目。委员会成员主要包括技术领袖和与执行团队的联系人,他们会提供关于项目进度和需求的更新。在技术团队和高层认为需要时,法律团队可以介入。

您的首席架构师和了解代码库运作方式的其他人员也会参与其中。总之,委员会成员对项目的方向有明确的愿景,并得到开发者社区的支持。这些都是您希望在讨论和计划过程中参与的关键人员。

“您对于贡献代码的组织承担一定的信任责任,需要确保这与您的董事会、股东以及所有这个知识产权的受托者是一致的。您必须确保他们与此行动保持同步。此外,您还需要考虑潜在的责任、风险以及可能使您陷入困境的因素。这点不容忽视。” - John Mertic,Linux Foundation 项目管理总监

基础设施

在项目正式启动之前,您需要为其建立一个代码仓库。这基本上是项目的代码存放地,让贡献者能够随时访问和使用。许多项目选择使用广为人知的 GitHubGitLab 作为其代码仓库,有些则选择使用如 Gerrit 这样的工具来自行托管。当然还有其他众多选择,但关键是让开发者更容易地加入并参与到您的项目中。选择您的平台,创建账户,为代码找一个存放的地方,设定工作流程,然后让一切开始。

您还应该将错误跟踪、问题反馈和功能请求视为项目基础设施的一部分。为贡献者提供一个方便的场所,他们可以报告需要修复的问题或提出有价值的新功能建议。此外,自动化的构建和测试流程可能也需要整合到您的 GitHub 或其他仓库中,以确保系统和项目的稳定运行,并对代码进行扫描和检查,保证其质量。

官网

接下来,您应该为项目建立一个公司中立的官方网站或 wiki 页面。这为社区提供了一个查询关于项目的各种信息的中心,包括文档、代码下载链接等。这个网站还可以展示关于项目的领导、目标、用户、贡献者、预算和治理等的详细信息。

交流

为您的社区创建沟通渠道以寻求帮助非常关键。您可能需要找一个能够整合进开发流程中的工具(例如,处理支持请求、代码提交、错误日志和其他任务的通知)。同时也要有一个主要的讨论平台,以及一种机制,让社区成员能够迅速从其他参与项目的人那里获得回应。这些都是推动项目实时发展的重要交流方式。

您可以考虑使用 Slack,它是一个在线团队项目管理和沟通平台,用户可以浏览和分享消息与文件、组织工作流、搜索资料等。但是,Slack 是付费工具。还有其他的开源选择,如 IRC、Gitter.im 等。比如,Hyperledger 项目选择了名为 Rocket.Chat 的沟通平台,它是完全开源的,并与 Slack 有相似的功能。如果您在寻找现代化的论坛,Discourse 是一个完全开源且优秀的选择,同时也提供了可选的托管服务。

选择沟通工具时,要考虑到是否有锁定问题、费用,以及未来迁移到新系统的难易度。随着社区的扩大,您需要能够适应任何新的交流方式,比如,不久之前,新闻组就是很多开源项目的主要沟通手段。

“我们的190个不同的开源项目在 GitHub 上的 Autodesk 部分的一个中心位置进行了整合。我们曾经有至少14个专注于 Autodesk 开源项目的部分。通过使用 Twitter 的一些代码,我们将这14个部分整合到一个视图中,访问者可以在其中看到它们。从公司的角度来看,确保人们看到您发布的内容,并且有一个他们可以去找到它并提问的中心地方是很重要的。” - Guy Martin, Autodesk 开放创新部主管

发起与维护

在完成所有的规划、准备,以及途中的各种评审和流程后,你将为启动和维护你的开源项目做好准备。你将通过公开的规划、开放的沟通、完善的基础设施,以及为管理、技术流程和所有中间环节制定的策略来实现这些。

当这些核心部分都准备就绪时,就可以向全世界展示你的项目,并从贡献者那里收集反馈。当潜在的贡献者查看项目,发现它经过深思熟虑、条理清晰且有价值时,他们会急切地想要参与,因为这是他们认为有用的东西。

在启动前需要完成的关键任务有:

不要忘了市场营销!

当然,项目的启动并不意味着你的工作就此结束。为了保持项目的持续进展,还需要关注一系列其他的商务和营销步骤。它们包括推广项目、制定成功的运营策略、提供现实的预算和项目品牌,以及建立活跃的社交媒体账户和有用的域名,以增强其长期成功。

营销评估为品牌制定了指导方针。这尤其重要,因为它有助于确保市场中的信息是一致的。营销评估的步骤包括:

现在你已经有了这个项目,你的任务就是推广它,让人们知道它的存在,这样他们就可以使用它并对其进行工作。作为一名营销人员,这是一个有趣的挑战,因为你在这里的成功测试标准是你能吸引多少人参与项目,加入贡献代码、参与论坛、提供错误修复和报告问题。

“由于社区对此至关重要,你要确保你正在照顾社区。这可以体现在诸如快速响应请求、确保你的项目在帮助的小事情上。因此,当有人访问你的项目时,他们可以看到它并了解它的状况。” – Christine Abernathy, Facebook 开源团队开发者布道师

构建社区

项目一经启动,密切关注外部社群的活跃度变得至关重要。建设社群并不是自然而然的事。在项目初期,你可能需要举办开发者活动或在大型会议上赞助聚会来增加影响力。正确地管理期望值并兑现项目治理及透明度承诺也同样重要。

需要持续进行的活动有:

有了一个多样化的贡献者基础后,你可以考虑与认为这个工作对他们有价值的其他企业和组织进行对话,以看看他们是否愿意投入时间、资金和其他资源,进一步推动你的初始工作。通过集结更多人的资源和意见,项目可以获得扩展和增长,从而为更多的贡献者带来价值。

这种增长也意味着,更多的公司可能愿意增加投资,带入他们自己的开发者团队,进一步推进你已经开始的工作。资金投入可能是10,000美元、250,000美元,甚至更多,这取决于项目的关键性以及它对其他公司的价值。一旦项目启动,其他公司也可能投入更多资金来支持,尤其是如果它可以助力他们的业务。

现在,这种模式已经变得很常见,因为很多公司和组织都意识到,他们面临的技术挑战远远超过他们单独能够应对的。于是,他们看到了与其他公司合作,在供应商中立的、对公众利益有益的联合项目中,来解决他们面临的技术问题的价值。

例如,开源项目 Hyperledger 是由 Linux Foundation 主导的协作项目,目标是推进各种行业的区块链技术。还有 Cloud Native Computing Foundation,它关注创建适用于现代私有和公共云的开源软件。这些大型项目不仅吸引了企业提供开发者参与,而且也获得了大量资金支持来帮助推广和发展这些技术。

结语

开启开源项目的第一步可能会感到困惑甚至有些害怕,至少初次尝试是这样。但当你的公司看到并认识到它在这个过程中可以获得的巨大价值时,首个项目可能只是开始。了解他人如何走这条路,可以为你的下一个开源项目的成功提供宝贵的经验。

开源项目启动清单

考虑因素

商业策略与规划

法律审查

技术审查

治理和流程

品牌和推广

启动和运维