草庐IT

打造卓越开源项目的12条原则

郭大侠说开源 2023-03-28 原文

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

本文整理自51CTO开源基础软件学习季直播公开课​​《打造卓越开源项目12条原则》​​,更多细节,可点击链接跳转查看。

因为专注开源领域十余年,参与建设过ClickHouse、Dolphin,SeaTunnel等社区,现在是Apache基金会Member,也是Apache孵化器导师,所以常常在私下或公开场合被问及:从您的角度来看,究竟什么样的开源项目更有可能成功?如何把一个开源项目做好?近期,针对过往积累的开源相关碎片化知识进行梳理,归纳总结了打造卓越开源项目的12条原则,本次直播分享给大家。

一、全球开源潮流的分析

在分享打造卓越开源项目的12条原则之前,我们通过三张节选自OpenLogic 2022全球开源报告的三个图表,来看看全球开源潮流是怎样的。



如上二图,可以从中看到一些明显趋势及用户使用开源软件需要面临的挑战:

  1. 在过去 12 个月中,77% 的受访者在其组织中增加了对开源软件的使用,36.5% 的受访者表示他们的使用量显着增加。
  2. 79% 的受访者赞助(sponsor) 开源组织。
  3. 使用开源软件的第一个原因是获得创新,从而将降低成本排在第二位。补丁的安全性和可用性也排名靠前。
  4. 采用开源软件的第一大障碍是缺乏测试、使用、集成和支持的内部技能。
  5. 所有行业的开源软件的第一大支持挑战是人员经验和熟练程度。
  6. 使用率总体增幅最高的是开源 DevOps 工具。云原生 CI/CD 工具的采用率显着提高。
  7. 最令人向往的新技术是容器和 Kubernetes。目前只有 18% 的受访者使用 Kubernetes,39% 有云战略,29% 有容器化战略。
  8. 在所有组织规模中最高的是,41% 的小型组织拥有开源战略。
  9. 银行、保险和金融服务行业的 Innersource 项目数量最多。
  10. 只有 13% 的组织拥有熟悉开源许可的法律团队。
    整个OpenLogic 2022全球开源报告内容有很多,大家能够从中了解到全球诸多开源化的趋势,更多详情可点击查看: [​​2022国际开源趋势如何——速读《2021全球开源趋势报告》​​]

二、打造卓越开源项目的12条原则

对海外开源潮流有一定了解之后,我们来看看打造一个卓越的开源项目所需要的12条原则。这些原则是基于过往的经验积累,针对开源初期规划、开源产品、开源项目推广、开源项目可持续发展这四方面进行深入探究,归纳总结而成,下面我们逐一延展开来。

开源初期规划之初心

开源成功的概率非常小,整个过程遇到的挑战繁多,明确初心尤为重要。在计划做开源项目之前,一定要做好无人问津的准备,当坚持不下去的时候,初心便是动力。

我认为,开源是一种先进的项目开发工具,可以促使某个项目在全球范围里,不用重复造轮子,并且凝聚全球顶级智慧,去集中研究打造这个项目。

所以,我觉得做开源的初心就是把这些全球领先的智慧聚集起来,并且让更多的人知道,是特别有成就感的事情。我们做开源的初心可以不一样,但是一定要有,在后面遇到到坎坷与挑战,才能秉承初心,咬牙坚持下去。

开源初期规划之协议

开源初期做规划的时候,协议是重中之重,用什么样的开源协议去开源,需要慎重取舍。开源协议可以理解为和客户之间的合同,种类不同开源项目,它们的协议也会存在差异。

如上图所示,协议大致分为两个角度,一种是当别人使了你的开源代码,并做了修改,是不是要开源?另一种是当别人使用你的服务/类库,是不是要开源?选择哪种协议,最终的结果截然不同,所以一开始就要慎重思量。

开源初期规划之周期

ClickHouse社区到中国至今,已有六个年头,事实证明前期是需要一段时间积累,这个周期大致需要一年半到两年时间。例如ClickHouse社区,从零到五百用户花费一年多时间,后期随着用户增长,才会聚集很多能力参差不齐的各种用户,找到适合的场景,最终像滚雪球一样,越滚越大,用户会如潮水一样涌进来。

还有技术的迭代周期,纵观过去一些知名开源项目的增长趋势,如下图所示:

通过这组数据,我们发现,每隔五年就会有一个新的开源项目问世,如果技术没有把握好,五年左右就会被其他项目所替代。核心理念、产品理念、核心技术、核心团队直接决定你的开源项目能否一直遥遥领先领先,也直接影响对应的社区是否能经久不衰。

开源产品之定位

在开源初期规划时候,我们明确初心、选好协议、确定周期,接下来就要开始打造开源产品了,这里也有三个原则,分别是定位、调性与团队。

产品定位必须明确,明确知道解决了哪些问题或痛点,解决的究竟是伪需求还是真实存在。不要自我感觉良好,但没用户,社区终究也不会做起来。在这里,需要用一句话描述你开源项目是什么,然后能够清楚明了的知道产品的赛道,解决的问题,产品的边界。只有痛点明确,边界清晰才有利于开源项目的扩展,如果什么都涉及的开源项目,基本上均以失败告终。

开源产品之调性

开源产品的调性是你的开源项目在解决实际问题时,主打的用户感知价值是什么?通俗来说,就是你这个开源项目究竟是做什么的。如果一开始就叫嚣这“我是下一代XXXXX,我要颠覆YYYYYYY”,凡事这样的开源项目,很难做好,因为没有自身的产品调性与价值主张。开源,需要的是全人类的创新,而不是在“内卷”。

产品需要有自己的调性,我们要像“火锅”一样做开源。为什么要像火锅呢?大家想起你这个产品,就能想到它是什么?当我们一说吃火锅,就马上想到热气腾腾的锅子,麻酱,各种肉,蔬菜,放到一起好吃且简单易做。同时,具备强大的有号召力,一说大家都想参与进去。你的产品,也要做的和火锅一样,有自己的调性,特色,以及号召力。

开源产品之团队

开源产品的团队如何组建很有讲究,比如在技术大牛与屌丝众创之间,对于整个团队而言,后者要比前者合适,因为技术大牛精力很有限,万一短时间内有事情要忙,项目也就只能搁浅。你的开源项目一定是有特别多的人参与,大部分人都在勤恳的做贡献,并真正融入到项目中去,才会有活力。团队对开源的理解力,团队的韧性,也是能否做好开源产品很关键的两个因素。

开源的创新主要来源于发动的是群策群力的力量,像用户的反馈、社区的开发者、社区外的专家等,而不是1-2个技术大牛就可以。开源,中高级的社区用户和贡献者往往会大于1-2个技术大牛,否则社区会不稳定。

开源项目推广之借势

开源产品敲定之后,我们来看看如何做推广与运营,这里也是有三大原则,分别是:借势、自传播、影响力。

要如何借势? 这里我们以ClickHouse与SeaTunnel这两个社区的兴起为例。现在,ClickHouse在国内比在海外火爆,那是因为在当年推广过程中,借了当时兴起的“用户行为分析”的势。在这种*客增长的趋势下,ClickHouse恰好适合与这个场景相契合。

而SeaTunnel之所以可以进入Apache孵化器,是因为SeaTunnel在早期是借了ClickHouse的势,因为ClickHouse是个计算引擎,但ClickHouse有个弊端,就是在灌数的过程中经常会出错,SeaTunnel恰好可以解决这个问题,延续到现在,形成了Bulk load模式,灌数到ClickHouse中极其方便。

借势往往比造势简单的多,一般情况下,也可以借基金会的势。无论Apache基金会,CNCF基金会,以及各类的开放原子基金会。

那么这些基金会有哪些“势”呢?大致总结如下几点:

  1. 第三方的保护中立:产权中立,贡献中立,品牌中立,协议确认。
  2. 基金会内的生态:Apache基金会 vs 大数据、AI CNCF vs 云原生。
  3. 基金会内的导师:有经验的领路人,出问题时候的KOL。
  4. 更是多个项目之间会联合Meetup,相互支持,相互发现和帮助。

开源项目推广之自传播

优秀的项目是自传播出来的,而不是通过市场PR,因为自传播的概率在某个小圈子里是爆炸性的,在这里有重要的三个点:产品的口碑,人的口碑,社区的口碑。

产品的口碑,是你的产品究竟是不是真的好用,是否方便,在调性,在解决问题上是否有自己的特性,是否实用。

人的口碑,是产品背后的支持者,是否靠谱,所在的圈子里口碑是否尚佳,也包括核心团队、项目PMC项目管理团队的所有人员口碑也很重要。

社区的口碑,Community over Code,社区胜于代码,社区的氛围是开放的,还是封闭的,能够容纳不同意见的社区,还是独裁专政、就几个大佬在说话?社区的口碑好坏直接影响开源项目最终的成果。

开源项目推广之影响力

影响力这里也是三方面,分别是人、用户和社区。

一般情况下,深耕某个领域的专家做项目开源,相对更容易成功,因为他具备足够的影响力,能够触达更多的用户,找到充足的资源,促使他所负责的项目在初期就发展很快。

有相关领域专家的影响力还远远不够,用户水平也很关键,用户如果大多是来自大厂或有一定知名度,TA们影响力聚合起来就能达到出奇的效果。

社区是否加入基金会,社区里面的大咖与用户级别是怎样的,都直接决定社区的影响力。社区做的不好,不开放,没人气,不够活跃,到最后再好的代码都会付之东流。

开源项目可持续发展之闭环逻辑

开源项目想要持续发展,不能光靠开发者为爱发光,还是需要更多专职开发者,光靠爱好者贡献绝对不行,毕竟大家还是要养家糊口的。

对于开源项目能否可持续发展,你的软件保证体系、商业公司生态、以及商业模型都是决定性因素,这中间的闭环逻辑要想明白。

开源项目可持续发展之商业化

商业化对于开源项目可持续发展来说是必要环节,现在开源在全球范围里,开源项目的商业化逻辑可行性已经过验证,答案是肯定的。一般商业化基本上遵从四大模式,分别是Open-Core 开放核心、Professional Services专业服务、Hosting 托管服与Marketplaces 市场。当然,在实际实施过程中,公司往往会混合多种模式。

时至今日,对于成功的开源公司来说,最常见的模式是开放核心产品,且将与托管、服务作为第二和第三收入来源。如果这种组合对你的产品来说是有效的,那么它可能是一个不错的选择,不过它需要你考虑如何在商业产品和开源产品之间做出明确区分。

当然,在某些情况下,这些模型可能都不适用,你可能需要为自己产品找到独特的商业模式。除了找到一个能够让公司规模发展的模式外,关键在于所选择的模式要与产品的特性相吻合。同样,创业者和整个社区的目标和愿景也很重要。

开源项目可持续发展之社区

可持续发展的开源项目,你会发现人员、工作都是可变的,但是社区是永存的。想要可持续发展,社区不能去依赖某一个人或某几个人,也不能依赖某一个公司,一定是得能够此起彼伏的让社区更有持续的生命活力。

综上所述,是打造卓越开源项目的12条原则的概述,在分享接近尾声之时,以SeaTunnel、ClickHouse、DolphinScheduler等为经典案例,对这些原则进行了验证,更多细致内容请点击观看直播公开课回放:​​《打造卓越开源项目12条原则》​​。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

有关打造卓越开源项目的12条原则的更多相关文章

  1. 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​​

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  4. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  5. ruby - 最佳原则中的原则 - 2

    我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的

  6. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  7. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

  8. ruby - 合并 nanoc 中的项目 - 2

    我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/

  9. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  10. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

随机推荐