谈谈开源(一)

做者 申砾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 上,咱们就有一个知足最低要求的开源项目了。微信

为何要开源

不少人以为代码是一个软件公司最宝贵的资产,把这些最宝贵的资产让别人免费获取,对大家有什么好处?若是对手拿走了大家的代码,另起炉灶和大家竞争怎么办?或者是用户直接获取源代码,用于本身的环境中,那大家如何收钱呢?
对一个技术型公司来讲,最宝贵的资产实际上是人,对一个开源项目来讲,最核心的资产是一个活跃的开源社区以及他人对这个项目的承认。
咱们从这两方面来看一下开源在这两方面的影响。架构

  • Branding
    很明显,开源是一种很是好的 PR、Branding 的手段,大多数大公司作开源也是这个目的,能够以一种成本几乎为零的方式宣传企业名,树立技术型企业形象。一个知名且良好的企业形象,对于各个方面都颇有好处。好比国外有一个知名的技术媒体叫 HackNews,我司的产品曾经屡次登上其首页,得到了大量的关注。其实那几回都不是咱们本身发的帖子,而是其余人关注到咱们的产品,自行作的传播。
  • 人才获取
    人才招聘最大的难处就是如何鉴别这我的的能力,他是否能干活、是不是靠刷题经过了面试。如何能和这我的工做一段时间,看到他是如何完成平常工做,那么对于这我的的能力了解会更进一步。为了实现这个目的,传统的手段是 Some How 找到和这我的共事过的人,听取他的意见。这样作首先要看运气,有的时候要转几层关系才能找到这样的人,而且不必定获得的是正确、真实的答案。

可是若是这我的已经给你的项目贡献了一些代码,而且代码质量比较高、贡献过程当中和你的沟通很顺畅,那么一方面说明这我的软硬实例都不错,另外一方面说明这我的对你作的事情颇有兴趣。TiDB 有大量的正式、实习员工都是从 Contributor 中转化来的,以致于咱们担忧别把全部的人都招进来,社区没了 :) 。分布式

  • 社区贡献
    能够这么说,若是没有开源社区,整个互联网都不会是如今这样。想象一下若是没有 Linux、MySQL、GCC、Hadoop、Lucence 这些东西,那么整个互联网的基础技术栈将不复存在(固然,确定会出现另一套东西,可是可能不会像开源的这套这么完善)。无数的开源社区贡献者贡献本身的力量,共同维持这样一个互助互利的社区,支撑社会技术进步。

咱们也从开源社区中得到了不少支持,包括你们报的问题、提的建议以及来自全球一百四十多名贡献者提交的代码。随着项目的发展,我相信社区贡献代码的比例会持续提高。ide

  • 提高项目质量
    当一个项目以开源方式运营时,代码质量是项目的脸面,你们不管是在提交代码的时候,仍是在 Comment 别人的 PR 的时候,都会很是谨慎,由于你的一举一动全世界都能看到,毕竟谁也不想人前露怯是吧。
  • 对基础软件的意义
    对于一个数据库这样的基础软件,最重要的就是正确性、稳定性和性能。前两点尤为重要,要保证这两点,一方面须要在开发和测试过程当中尽量提升质量,另外一方面普遍的使用也很是重要。只有当你的产品有足够多的人试用,甚至用于生产环境,才可能有足够多的问题反馈以及产品建议。开发人员能作的测试毕竟是有限的,不少场景、环境或者是业务负载是咱们想象不到的。来自实际用户的问题反馈有助于咱们提高产品质量,来自用户的建议有利于咱们提高产品易用性。只有长期在生产环境中运行过的基础软件的,才算是合格的基础软件的。

因此咱们认为开源是基础软件的大趋势,不管是 Hadoop、MySQL、Spark 这样的知名产品,或者是 Linux 基金会、Apache 基金会、CNCF 基金会这样的巨头,都证实了这个观点。国内目前大公司比较热门的开源项目,也都集中在基础软件领域,好比百度的 Brpc、Palo、Tera,以及腾讯的 PaxosStore。oop

PingCAP 开源了哪些项目

这里简单讲一下咱们开源的几个 Repo 都是作什么:

  • TiDB:数据库的 SQL 层
  • TiKV:数据库的分布式存储引擎
  • PD:集群的管理节点
  • Docs:项目的英文文档
  • Docs-cn:项目的中文文档
    你们能够在 GitHub 上浏览咱们的代码,看到咱们完整的开发过程。

开源模式下的开发流程

PingCAP 攻城狮小申典型的一天:

8:00 起床,先登陆 Slack 看一下昨晚定时跑的测试任务是否结果正常,而后关注一下 Slack 上各类 Channel 以及微信群、邮箱是否有什么重要的消息

9:00 洗漱完+吃完早饭,逗一会可爱的女儿(也多是被女儿逗),而后去上班

9:30 到达公司,开始干活。

  • 打开电脑看看 GitHub 上面有什么新的 Issue
  • 看看本身的 PR 有没有被别人 Comment,若是有 Comment 的话,尽快解决;若是还没人看的话,at 一下相关的同窗,求 Review
  • 看看有没有别人的 PR 须要本身 Review,特别是 at 本身的那些 PR
  • 带上耳机开始写点代码
  • Slack 有人 at 我,赶忙回复一下
  • Slack 上我关注的 Channel 中有人在讨论问题,我很感兴趣,加入进去讨论一会
  • 同事要作一个新的 Feature,写了设计文档,我点进去看了一遍提了几个 Comment

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、使用范例、接口文档、安装部署以及最佳实践等等。这点也是大多数项目所忽略的。

如何参与开源项目

试用

最简单的参与方式是试用开源项目,这也是开源最大的一个好处,全部人均可以随时试用,至关于有不少人帮助项目做者作测试。毕竟若是只有做者本身作测试,遇到的环境、场景、应用方式会比较单一,总有一些你想像不到的地方会出问题。因此每个测试出来的问题都很宝贵,咱们都会尽量快的评估和回复。

报 Issue

试用过程当中你们可能会遇到各类问题,特别是文档中没有说起的问题,反馈问题的最佳方式是在 Github 上新建 Issue,这样全部的人均可以看到,并且经过 Issue 来反馈咱们也会更重视一些,有人会按期扫一遍未处理的 Issue。固然,创建 Issue 以前先搜索是否和已有的 Issue 重复是个好习惯。

在 Issue 中尽量详细的描述清楚遇到的问题,以及一个可操做的复现步骤,包括所用 Binary 的版本、部署方式、客户端以及服务的日志、操做系统的日志(如 dmesg 的输出)。若是不能复现,也尽量详细地提供 Log。这些对开发人员追踪 Bug 会很是有用。

提出建议

若是对项目有什么建议,也能够经过新建 Issue 来反馈, 咱们通常会给出是否会支持,若是要支持的话,大概会在何时支持。

提 PR

当你使用 TiDB 遇到问题或者须要新的 Feature,而以为本身有能力 Fix 或者是当前官方尚未精力 Fix 时,能够尝试本身修改代码,解决问题。

目前 TiDB 项目的 Contributor 有 140 多个,分散在全球十几个国家。其中不乏深度参与的用户。

若是是小的功能或者是简单的 Bug Fix,能够在相关的 Issue 下面吼一声,让你们知道你在作这个事情便可,这样不会有人作重复的工做。若是作的过程当中遇到了什么问题,也能够在相关的 Issue 中和 Maintainer 讨论。

若是要作的是比较大的功能,那么最好先和官方作一轮讨论,而后写一个尽量详细的 Design,讨论 OK 后,开始开发。

讲一点好玩的事情

在开源项目中总能或多或少的发现奇葩的 Issue,好比这个

看到这个 Issue 真的是震惊了。

相关文章
相关标签/搜索