开源的四个时代:
对于企业来说,企业使用开源可以:
使用开源 | 参与开源 | 走向开源 | 构建生态 | |
---|---|---|---|---|
准入条件 | 协议审核 | 采用“上游优先”策略 | 企业开源指南 开源政策指导 法务支持 良好的工程实践 | 社区的设计与运营 技术支持服务 核心运行能力 扩展与混合能力 |
收益 | 提升开发效率 降低开源使用门槛 | 了解开源世界的游戏规则 熟悉开源社区文化 引入先进的技术实践 | 拥抱开放式创新 建立在开源社区的声誉 对人才更具吸引力 突显自身的影响力 | 建立行业标准 借助开源进行市场扩张 |
盈利方式 | (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、LLVM | 1996 年 OS X 操作系统是基于开源的 Darwin BSD Unix | |
IBM | GitHub 上开源参与人数前 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
的一部分人写的代码也是又臭又长)
从总体的思路上来说,在进入代码阅读之前,我们需要:
从而我们才能理解主流程(脉络)。针对于此,我们会发现一些不同的模式:
它们并不是互相独立的,往往是结合一起使用的。
这种模式,可以实现快速地学习。它存在的一些明显的缺点是:
所以,它适用于你想快速了解某一部分的功能,从而了解全貌,随后我们就可以深入某一部分进行了解。
在这种模式之下,我推荐:通过购买、阅读书籍的方式来学习。如果能买到书便是一件幸运的事,因为它已经经过了系统性的加工。唯一的问题可能是上面的代码有些老旧。但是,它更加的系统化、完整,方便我们理解,并减少搜索资料的成本。
为什么不是网上找资料?:
如果你能直接找到详细的资料,毕竟花费的时间足够短的话,那么也是没问题的。
源码学习是一个需要花费大量时间和精力的事情,除非万不得已,否则我也不想用这种方式。因为,我们会缺少大量的上下文,这些上下文可能导致我们理解出现一些误差。
前期准备:
源码学习是一个非常重的学习模式。我们要花费大量的时间:
所以,还有一些不错的犯懒的姿势:
对于调试来说,我们还会面临的一个挑战是:诸如我这样的入门级 MBP 配置,对于大型系统来说编译根本不够用。应对这种问题的一个比较良好的姿势是:通过 IDE 调试测试来完成对部分代码的调试。(PS:这种方式也适用于业务代码的开发)
如果我们可以在应用的入口中创建某一模块对应的测试,那么我们就可以快速调试整个应用了。
对于我来说,我觉得只阅读源码是一种只为了解决一时问题的方式。同时,像我这样的凡人,对于某些知识和内容,只要不使用,我可能隔个十天半个月,我就忘光了(虽然我一直觉得这是一件好事)。
边阅读代码,边 fork 项目,我们还会有一些挑战:
所以,还有一些模式:
为了方便我们查阅和其他/她人使用,我往往会把相关的内容记录到项目的 README 上。
这样一来,其他/她人在学习的过程中还能 GET 到相似的思路。
最后,简单做一些成本对比:
模式 | 成本 | 性价比 | 主要场景 |
---|---|---|---|
借鉴他人 | 低 | 高 | 学习 |
阅读源码学习 | 高 | 低 | 理解思想 |
fork 主流程 | 高 | 低 | 理解、模仿 |
借助测试调试 | 较高 | 中 | 理解、模仿 |
一些结合模式:
你呢,你有什么好用的模式?
关注开发者体验之前,应该确保核心功能:完善 + 稳定。即你需要提供可用、稳定的特性,再去提升总体的用户体验。除非,对于你的系统来说,你在一开始就不缺用户。
错误呈现 | 文档体验 | 易用性 | 交互式 | 触点 | 支持 |
---|---|---|---|---|---|
错误描述 | 开发者门户 | 一键式安装 | 低配置/零配置 | 文章 | 问题反馈渠道 |
报错即文档 | 发布日志 | 自动化版本迁移工具 | 声明式使用 | 演讲/分享 | 问题响应时间 |
报错即修改建议 | 代码生成文档 | 自助式搭建 | 可交互文档 | Hackathon | 开发者即服务 |
版本迁移指南 | 沙盒及产品环境 | 开发者社区 |
在编写这篇文章的过程中,刚好看到了一篇对于门户的度量模型,《How Mature Are You? A Developer Experience API Maturity Model》简单地翻译了一些国内适用的部分(详细见原文):
Level 1 | Level 2 | Level 3 | Level 4 |
---|---|---|---|
封闭的系统 | 门户是自服务的,但是不连贯的 | 完全自服务 | 可个性化的统一门户 |
文档缺乏成功调用 API 的信息 | 1 天内可以调用 API | 10 分钟内可以调用 API | 分钟级 API 调用 |
API 和功能没有正确对应 | 快速开始指南、修改日志和教程 | 提供沙盒和生产环境 | 认证流程 |
响应问题需要一周的时间 | 交互式文档 | 代码示例和库 | |
问题在 2 ~ 3 天内被回答 | 24 小时回答问题 |