开源模式

企业开源模式

开源的四个时代:

  • 弱版权时代。哪来的闭源。Unix 在 AT&T 诞生,它以低廉甚至免费的许可分发源码。
  • 自由软件时代。开源就是自由。理查德·斯托曼(RMS)发起了 GNU 计划,发起了『自由软件运动』。
  • 开源运动时代。开源为了对抗。Mozilla 开创的开源运动重塑了整个技术界。
  • 云原生开源时代。开源可以赚更多的钱。云厂商为了扩大市场份额,开始运用开源战略。

对于企业来说,企业使用开源可以:

  • 提高软件质量
  • 降低总拥有成本
  • 改善安全防护
  • 为云技术云原生设计
  • 能安全利用开源技术
  • 获得最前沿创新技术

开源盈利模式

直接盈利

  • 付费版本。如开源的 Nginx,以及更多功能的 Nginx Plus。双重许可、商业使用收费、部分组件收费等。
  • 咨询/服务。如 JBoss、Spring 通过提供技术支持、培训、二次开发支持等技术服务而获得收入。
  • 托管模式。通过免费开源的 MongoDB 吸引用户。推出 MongoDB 数据库托管服务等,增加创收渠道。

间接获利

  • 建立内部协作。增强组织内技术氛围,共享团队间的技术资源。
  • 打造雇主品牌。在技术社区建立品牌形象,和杰出贡献者保持良好的关系,有助公司技术招聘。
  • 构建合作生态。与上下游供应链建立合作,建立在该领域的权威定位。
  • 参与标准制定。借助于社区力量,一起促进行业建立标准。
  • 推广技术理念。将新的技术理念融入开源项目中,促进整个行业往前发展。

四种模式

使用开源参与开源走向开源构建生态
准入条件协议审核采用“上游优先”策略企业开源指南
开源政策指导
法务支持
良好的工程实践
社区的设计与运营
技术支持服务
核心运行能力
扩展与混合能力
收益提升开发效率
降低开源使用门槛
了解开源世界的游戏规则
熟悉开源社区文化
引入先进的技术实践
拥抱开放式创新
建立在开源社区的声誉
对人才更具吸引力
突显自身的影响力
建立行业标准
借助开源进行市场扩张
盈利方式(N/A)(N/A)付费版本、托管模式、咨询/服务技术支持服务、云服务

大公司采用策略示例

参与开源走向开源构建生态转折事件
微软GitHub 上开源参与人数最多的企业开源 .NET 平台、VS Code、TypeScript 等收购运营 GitHub、DevOps 开源项目管理与支持平台、云能力2014 年新任 CEO 提出 “微软爱 Linux” 全面支持开源
谷歌GitHub 上开源参与人数前 5 位的企业开源 Android、Chromium、GO、TensorFlow、Angular 等投资 GitLab、云能力2007 年开源 Android 源代码,加速了 Android 的普及
苹果GitHub 上开源参与人数第 25 位的企业开源项目相比其他大厂不多,比较知名的有 Webkit、LLVM1996 年 OS X 操作系统是基于开源的 Darwin BSD Unix
IBMGitHub 上开源参与人数前 5 位的企业开源 QisKit、Kabanaro、Eclipse、POWER 指令集、HyperLedger fabric 等收购 RedHat 提供开源技术咨询服务、建立开源基金会 Linux, Eclipse, Apache, CNCF 等
阿里巴巴GitHub 上开源参与人数第 12 位企业,中国地区第 1 位。在内部有开源布道师、开源办公室等组织在芯片、物联网、云计算、硬件、微服务框架、数据库、AI 等方面有众多开源项目2010 年发布第一个开源项目 Dubbo

企业开源五大支柱

  • 组织支持。开源是一种开放创新型的组织模式,需要自上而下的支持。
  • 工程能力。开源项目的工程能力是对外展示工程能力的渠道。
  • 开源文化。开源世界有独特的文化基因:开放、协作、透明等。
  • 产品思维。每个开源项目都是一个产品,都需要像产品一样对待。
  • 社区与生态。活跃社区,构建生态,是一个开源项目强大的必由之路。
组织支持

发布开源指南

设立开源协议指南

制定开源投资战略

建立开源项目部门

建设度量指标

工程能力

充分测试

整洁代码

DevOps 流程一体化

文档体验设计

采用社区标准的技术实践

开源文化

建立内部开源文化

寻找开源倡导者

开放式地管理

鼓励参与、协作

公开透明开源软件流程

产品思维

和产品策略一致

设立项目里程碑

制定营销策略

项目管理

管理请求意见稿(RFC)

社区与生态

对生态进行战略投资

培养关键意见领袖(KOL)

招募技术布道者

构建开发者生态

反馈驱动开发

企业开源能力全景图

| 组织支持 | 工程能力 | 开源文化 | 产品思维 | 社区与生态 |

组织支持 工程能力 开源文化 产品思维 社区与生态
使用开源
制定开源使用指南
开源合规审查
参与开源
引入开源技术实践
制定开源参与指南
开源治理策略
建议团队回馈开源
参与社区建设
走向开源
内部项目开源共享
社区推广策略
敏捷测试实践
和产品策略一致
制定贡献指南
设计成熟度模型
开源项目管理部门
制定开源项目营销策略
构建生态
技术布道
创建开发者社区
开发者体验
去中心化的社区管理
透明决策和讨论
社区参与多样性
生态战略投资

使用开源

开放技术构架

优点:

  • 更容易招到适合的人才
  • 开放技术降低研发成本
  • 社区己有拥有丰富的资料
  • 技术已被验证过
  • 易于寻找迁移方案
  • 关注于高优先级的部分
  • 无需担心『供应商-锁定』

运营挑战及风险

阅读开源软件源码

最近的一段时间里,我在研究 Android 配套工具和 Android Studio 相关的实现,以及它们如何配合完成一个 APK 的构建。因为整个系统各个模块之间的关系过于复杂,除此,不同模块之间也包含了大量的代码 —— 无论是从行数上,还是从函数长度上来说。(PS:顺便吐槽一句, @google.com 的一部分人写的代码也是又臭又长)

从总体的思路上来说,在进入代码阅读之前,我们需要:

  1. 理解代码背后的业务流程
  2. 理解架构设计的思想

从而我们才能理解主流程(脉络)。针对于此,我们会发现一些不同的模式:

  1. 借鉴他人。从他人的学习笔记中,理解整体的思路和过程。如 Android APK 的构建,Android 资源如何优化,从中理清代码阅读的思路。
  2. 源码学习。
  3. 借助测试调试。
  4. fork 主流程。

它们并不是互相独立的,往往是结合一起使用的。

借鉴他人

这种模式,可以实现快速地学习。它存在的一些明显的缺点是:

  • 学到的东西是二手加工过的。
  • 部分的代码可能与真实的情形脱节。

所以,它适用于你想快速了解某一部分的功能,从而了解全貌,随后我们就可以深入某一部分进行了解。

在这种模式之下,我推荐:通过购买、阅读书籍的方式来学习。如果能买到书便是一件幸运的事,因为它已经经过了系统性的加工。唯一的问题可能是上面的代码有些老旧。但是,它更加的系统化、完整,方便我们理解,并减少搜索资料的成本。

为什么不是网上找资料?

  1. 找资料需要投入时间成本
  2. 资料不一定详细

如果你能直接找到详细的资料,毕竟花费的时间足够短的话,那么也是没问题的。

源码学习

源码学习是一个需要花费大量时间和精力的事情,除非万不得已,否则我也不想用这种方式。因为,我们会缺少大量的上下文,这些上下文可能导致我们理解出现一些误差。

前期准备:

  1. 合适的工具。最好是~~收费的(🐶)~~能用上的。
  2. 合适的存储空间。像 Android 这样的系统,clone 下来就要 120G,编译的话,估计得达到 200G 吧;而像 Android Studio 的源码,clone 下来也要 60G。
  3. 寻找阅读的模式。
  4. 尝试去构建应用。它不一定可行,但是如果可以的话,会节省你大量的时间。

源码学习是一个非常重的学习模式。我们要花费大量的时间:

  1. 在代码间跳转
  2. 梳理业务逻辑

所以,还有一些不错的犯懒的姿势:

  1. 通过书籍来加强。我一直觉得对于学习来说,阅读书籍是最理想的方式。因为寻找资料需要成本,而多数的书都会起到一个索引的目的。
  2. 寻找相似的轮子。一个有意思的技术,必然有很多公司、很多人都研究过。他们都会尝试去创造类似的轮子。唯一的问题是,我们要学习到什么程度,如果只是理解的话,那么看看别人重复的轮子也是可以的;如果是为了深入的话,那么还得回过头去看看源码

借助测试调试

对于调试来说,我们还会面临的一个挑战是:诸如我这样的入门级 MBP 配置,对于大型系统来说编译根本不够用。应对这种问题的一个比较良好的姿势是:通过 IDE 调试测试来完成对部分代码的调试。(PS:这种方式也适用于业务代码的开发)

如果我们可以在应用的入口中创建某一模块对应的测试,那么我们就可以快速调试整个应用了。

fork 主流程

对于我来说,我觉得只阅读源码是一种只为了解决一时问题的方式。同时,像我这样的凡人,对于某些知识和内容,只要不使用,我可能隔个十天半个月,我就忘光了(虽然我一直觉得这是一件好事)。

边阅读代码,边 fork 项目,我们还会有一些挑战:

  1. 语言的熟练度和模式。对于熟悉的语言来说,比如日常编写业务代码的时候,我们并不需要理解于诸如类加载器、元编程、字节码这一类的复杂模式。
  2. 新的框架、工具或语言的学习成本。比如,我在过程中就遇到需要理解和学习 Gradle 插件的一些构建机制。
  3. 代码中大量的、无用的异常处理的代码。
  4. 别人的代码都是 💩。(PS:一个月后自己的代码也是屎)

所以,还有一些模式:

  1. 划分模块边界。寻找架构图,通过架构图来划分模块。
  2. 切片化运行。一个模块,一个模块来理解整个系统。如 IDEA 插件的编写、IDEA 插件与 Gradle 如何交互,Gradle 插件的原理与编写,Gradle 如何调用其它命令行工具,命令行工具的原理与编写。
  3. 通过测试运行。如针对于 ApkAnalyser 这样的工具,我们可以通过单元测试而非构建一个 CLI 的方式来运行。
  4. 选择另外一门语言。因为别人用 Java、Groovy、Kotlin 编写的应用,如果你用 Rust、Go 再写一遍的话,那么你就能一次学到两个东西了:一个是新的编程语言,一个是这个开源项目的代码。

README 输出

为了方便我们查阅和其他/她人使用,我往往会把相关的内容记录到项目的 README 上。

  • 相关的文档资料
  • 相似的开源项目
  • 过程中的内容产出
  • 代码简要说明
  • ……

这样一来,其他/她人在学习的过程中还能 GET 到相似的思路。

结论

最后,简单做一些成本对比:

模式成本性价比主要场景
借鉴他人学习
阅读源码学习理解思想
fork 主流程理解、模仿
借助测试调试较高理解、模仿

一些结合模式:

  1. 阅读二手资料,根据二手资料理解主脉络
  2. 编写主流程调用链,理解架构设计理想
  3. 借助开源软件的测试调试,理解参数及流程
  4. ……

你呢,你有什么好用的模式?

开发者体验

关注开发者体验之前,应该确保核心功能:完善 + 稳定。即你需要提供可用、稳定的特性,再去提升总体的用户体验。除非,对于你的系统来说,你在一开始就不缺用户。

开发者体验六要素

错误呈现文档体验易用性交互式触点支持
错误描述开发者门户一键式安装低配置/零配置文章问题反馈渠道
报错即文档发布日志自动化版本迁移工具声明式使用演讲/分享问题响应时间
报错即修改建议代码生成文档自助式搭建可交互文档Hackathon开发者即服务
版本迁移指南沙盒及产品环境开发者社区

开发者门户成熟度模型

在编写这篇文章的过程中,刚好看到了一篇对于门户的度量模型,《How Mature Are You? A Developer Experience API Maturity Model》简单地翻译了一些国内适用的部分(详细见原文):

Level 1Level 2Level 3Level 4
封闭的系统门户是自服务的,但是不连贯的完全自服务可个性化的统一门户
文档缺乏成功调用 API 的信息1 天内可以调用 API10 分钟内可以调用 API分钟级 API 调用
API 和功能没有正确对应快速开始指南、修改日志和教程提供沙盒和生产环境认证流程
响应问题需要一周的时间交互式文档代码示例和库
问题在 2 ~ 3 天内被回答24 小时回答问题