做者 申砾html
源码面前,了无秘密
---- 侯捷git
不少人的『开源』是一个比较时髦且有情怀的词汇,很多公司也把开源当作 KPI 或者是技术宣传的手段。可是在咱们看来,大多数人开源作的并很差,大多数开源项目也没有被很好的维护。好比前一段时间微博上流传关于 Tengine 的讨论,一个优秀的开源项目不止是公布源代码就 OK 了,还须要后续大量的精力去维护,包括制定 RoadMap、开发新功能、和社区交流、推进项目在社区中的使用、对使用者提供必定程度的支持,等等。github
目前咱们在国内没看到什么特别好的文章讲如何运营一个开源项目,或者是如何作一个顶级的开源项目。TiDB 这个项目从建立到如今已经有两年多,从开发之初咱们就坚决地走开源路线,陆续开源了 TiDB、TiKV、PD 这三个核心组件,得到了普遍的关注,项目在 GitHub 的 Trending 上面也屡次登上首页。在这两年中,咱们在这方面积累了一些经验和教训,这里和你们交流一下咱们作开源过程当中的一些感觉,以及参与开源项目(至少是指 TiDB 相关项目)的正确姿式。面试
Open-source software (OSS) is computer software with its source code made available with a license in which the copyright holder provides the rights to study, change, and distribute the software to anyone and for any purpose.
---- From Wikipedia数据库
本文讨论的开源是指开源软件,简而言之,开源就是拥有源代码版权的人,容许其余人在必定许可证所述范围内,访问源代码,并用于一些本身的目的。
最基本的要求就是其余人能够访问源代码,另外获取代码后能作什么,就须要一个专门的许可证来规范(能够是本身写的,也能够用一个别人写好的)。里面通常会规定诸如对修改代码、新增代码、后续工做是否须要开源以及专利相关的事项。
OK,咱们写一个 main.py
里面有一行 print "Hello World!"
,再和某个许可证文件一块儿扔到 GitHub 上,咱们就有一个知足最低要求的开源项目了。微信
不少人以为代码是一个软件公司最宝贵的资产,把这些最宝贵的资产让别人免费获取,对大家有什么好处?若是对手拿走了大家的代码,另起炉灶和大家竞争怎么办?或者是用户直接获取源代码,用于本身的环境中,那大家如何收钱呢?
对一个技术型公司来讲,最宝贵的资产实际上是人,对一个开源项目来讲,最核心的资产是一个活跃的开源社区以及他人对这个项目的承认。
咱们从这两方面来看一下开源在这两方面的影响。架构
可是若是这我的已经给你的项目贡献了一些代码,而且代码质量比较高、贡献过程当中和你的沟通很顺畅,那么一方面说明这我的软硬实例都不错,另外一方面说明这我的对你作的事情颇有兴趣。TiDB 有大量的正式、实习员工都是从 Contributor 中转化来的,以致于咱们担忧别把全部的人都招进来,社区没了 :) 。分布式
咱们也从开源社区中得到了不少支持,包括你们报的问题、提的建议以及来自全球一百四十多名贡献者提交的代码。随着项目的发展,我相信社区贡献代码的比例会持续提高。ide
因此咱们认为开源是基础软件的大趋势,不管是 Hadoop、MySQL、Spark 这样的知名产品,或者是 Linux 基金会、Apache 基金会、CNCF 基金会这样的巨头,都证实了这个观点。国内目前大公司比较热门的开源项目,也都集中在基础软件领域,好比百度的 Brpc、Palo、Tera,以及腾讯的 PaxosStore。oop
这里简单讲一下咱们开源的几个 Repo 都是作什么:
PingCAP 攻城狮小申典型的一天:
8:00 起床,先登陆 Slack 看一下昨晚定时跑的测试任务是否结果正常,而后关注一下 Slack 上各类 Channel 以及微信群、邮箱是否有什么重要的消息
9:00 洗漱完+吃完早饭,逗一会可爱的女儿(也多是被女儿逗),而后去上班
9:30 到达公司,开始干活。
12:00 肚子可耻的饿了,呼朋唤友去吃饭,路上顺便讨论讨论技术以及八卦
13:00 吃饭归来,看看邮件、Slack、微信留言,处理一下紧急的事情
13:30 小睡一会
14:00 小睡结束,接一杯咖啡,开始下午的工做,键盘敲起来。。。。。
15:30 参与同事的设计评审会议,经过视频会议系统和远程的同事一块儿讨论设计方案,拍板后开干
16:30 休息一下,而后继续敲代码、Review PR
18:00 大部分同事已经去吃饭了,我准备开车回家吃饭去
20:30 吃完饭,收拾完,没什么事情,打开电脑看一会邮件、Issue、PR
22:30 休息一会,准备洗澡睡觉
首先你须要根据本身的诉求、商业模式等选择一个开源协议,常见的有 GPL 、BSD、Apache 和 Mit ,这些开源协议的区别在阮一峰老师的这篇博客中解释的很清楚了,推荐你们阅读。
协议选定以后,再选择一个代码托管平台,目前的标准选择是 GitHub,注册一个 GitHub 帐号,申请一个 Orgnization 以后,就能够开始用了,若是不须要私有 Repo 的话,那么不须要交任何费用。
开始代码开发,提交第一次 Commit,完成 Readme 的撰写(一个好的 Readme 真的很重要)。
后续的开发都须要经过 Pull Request 进行,最好不要直接 Push Master。一个严肃的项目须要把 Master 加入 Protected Branch,禁止直接 Push。
为了保证后续的代码提交都是 Work 的,最好在 GitHub 中集成至少一个 CI 服务,经常使用的有 TravisCI、CircleCI (最近一段时间 CircelCI 彷佛老是出问题)。而后在 PR 的设置页面上要求 PR 经过了 CI 才能合并。
若是有人试用项目时发现一些问题,会经过 Issue 反馈,因此须要关注 Issue ,尽快给予回复。另外将 Issue 经过 Label 分门别类是一个好的实践,便于你们快速搜索、分类 Issue。好比咱们会将一部分简单些的 Issue 标记为 Help Wanted,若是有新加入社区的同窗想要开始贡献代码,那么这些 Issue 就是不错的起点。
当参与的人愈来愈多,那么会有一部分人开始贡献代码,Maintainer 须要 Review 其余人的 PR,保证能项目自身的代码质量要求、编码风格一致。
最后一点,一个好的项目须要配备完善的文档,帮助你们使用项目。包括架构、简要介绍、详细介绍、FAQ、使用范例、接口文档、安装部署以及最佳实践等等。这点也是大多数项目所忽略的。
最简单的参与方式是试用开源项目,这也是开源最大的一个好处,全部人均可以随时试用,至关于有不少人帮助项目做者作测试。毕竟若是只有做者本身作测试,遇到的环境、场景、应用方式会比较单一,总有一些你想像不到的地方会出问题。因此每个测试出来的问题都很宝贵,咱们都会尽量快的评估和回复。
试用过程当中你们可能会遇到各类问题,特别是文档中没有说起的问题,反馈问题的最佳方式是在 Github 上新建 Issue,这样全部的人均可以看到,并且经过 Issue 来反馈咱们也会更重视一些,有人会按期扫一遍未处理的 Issue。固然,创建 Issue 以前先搜索是否和已有的 Issue 重复是个好习惯。
在 Issue 中尽量详细的描述清楚遇到的问题,以及一个可操做的复现步骤,包括所用 Binary 的版本、部署方式、客户端以及服务的日志、操做系统的日志(如 dmesg 的输出)。若是不能复现,也尽量详细地提供 Log。这些对开发人员追踪 Bug 会很是有用。
若是对项目有什么建议,也能够经过新建 Issue 来反馈, 咱们通常会给出是否会支持,若是要支持的话,大概会在何时支持。
当你使用 TiDB 遇到问题或者须要新的 Feature,而以为本身有能力 Fix 或者是当前官方尚未精力 Fix 时,能够尝试本身修改代码,解决问题。
目前 TiDB 项目的 Contributor 有 140 多个,分散在全球十几个国家。其中不乏深度参与的用户。
若是是小的功能或者是简单的 Bug Fix,能够在相关的 Issue 下面吼一声,让你们知道你在作这个事情便可,这样不会有人作重复的工做。若是作的过程当中遇到了什么问题,也能够在相关的 Issue 中和 Maintainer 讨论。
若是要作的是比较大的功能,那么最好先和官方作一轮讨论,而后写一个尽量详细的 Design,讨论 OK 后,开始开发。