前言很多人的“开源”是一个比较时髦、感性的词汇,很多公司也把开源当做一个KPI或者技术推广的手段。但是在我们看来,大部分人都没有做好开源,大部分开源项目都没有很好的维护。比如前段时间微博上流传着一条关于Tengine的讨论。一个优秀的开源项目,不仅发布源代码就OK,还需要大量的后续维护,包括制定RoadMap、开发新功能、与社区沟通、推广项目等。在社区中使用,为用户提供一定程度的支持等。目前国内还没有看到关于如何运营一个开源项目,或者如何做出一个优秀的开源项目的特别好的文章。TiDB项目创建至今已有两年多时间。从开发之初,我们就坚定走开源路线,先后开源了TiDB、TiKV、PD三大核心组件,获得了广泛关注。该项目列在GitHub上的Trending中。上面也多次上过首页。两年来,我们在这方面积累了一些经验和教训。在这里跟大家分享一下我们在做开源过程中的一些感受,以及参与开源项目(至少是TiDB相关项目)的正确姿势。什么是开放源代码开放源代码软件(OSS)是一种计算机软件,其源代码通过许可证提供,版权持有者有权出于任何目的向任何人学习、更改和分发该软件。----来自维基百科本文所讨论的开源是指开源软件。简而言之,开源就是拥有源代码版权的人,允许他人在一定的许可范围内访问源代码,并将其用于自己的某些目的。最基本的要求是其他人可以访问源代码。另外,拿到代码后能做什么,需要专门的license来规范(可以自己写,也可以别人写)。一般规定是否修改代码、增加新代码、后续工作是否需要开源、专利相关事项等。OK,我们写一个main.py,打印一行“HelloWorld!”,连同某个license文件一起扔到GitHub上,就有了一个满足***要求的开源项目。为什么开源?许多人认为代码是软件公司最宝贵的资产。让别人免费获得这些最有价值的资产,对你有什么好处?如果你的对手拿了你的代码并开始一个新的代码来与你竞争怎么办?或者用户直接获取源代码,在自己的环境中使用,那怎么收钱呢?对于一家科技公司来说,最宝贵的资产就是人。对于一个开源项目来说,核心资产是一个活跃的开源社区和其他人对这个项目的背书。我们来看看开源对这两方面的影响。品牌推广显然,开源是一种非常好的公关和品牌推广手段。这也是大部分大公司做开源的目的。它可以以几乎零成本的方式提升公司的知名度,树立以技术为基础的企业形象。知名度高的企业形象对各方面都有好处。比如国外有个知名的技术媒体叫HackNews。我们的产品多次出现在它的主页上,获得了很多关注。其实那几次不是我们自己发的,而是别人关注了我们的产品,自己传播的。TalentAcquisition人才招聘最大的难点就是如何通过刷题的方式识别这个人的能力,能不能工作,能不能通过面试。如果你能和这个人一起工作一段时间,看看他是如何完成日常工作的,那么你就会更加了解这个人的能力。为了达到这个目的,传统的方法是SomeHow找和这个人共事过的人,听听他的意见。这样做首先要看运气,有时候要经过几层关系才能找到这样的人,不一定能得到正确真实的答案。但是如果这个人给你的项目贡献过一些代码,而且代码质量比较高,贡献过程中和你的沟通也很顺畅,那么一方面说明这个人有很好的软硬例子,另一方面,这意味着这个人对你很好。做起来很有趣。TiDB有大量从Contributor转过来的正式员工和实习员工,所以我们担心如果我们不把他们都招进来,社区就没了:)。社区贡献可以说,没有开源社区,整个互联网就不会是现在这个样子。想象一下,如果没有Linux、MySQL、GCC、Hadoop、Lucence等,整个互联网的基础技术栈将不复存在(当然,肯定还会有另外一套东西,但可能没有现在的那么完整)开源集)。开源社区的众多贡献者贡献自己的力量,共同维护这样一个互惠互利的社区,支持社会和技术进步。我们还得到了来自开源社区的大量支持,包括您报告的问题、建议以及来自全球140多个贡献者的代码提交。随着项目的发展,相信社区贡献代码的比例会不断增加。提高项目质量当项目以开源方式运行时,代码质量就是项目的面子。大家在提交代码或者评论别人PR的时候都会非常谨慎,因为你的一举一动全世界都能看到。你看,谁也不想在别人面前表现出胆怯吧?对基础软件的意义对于数据库这样的基础软件来说,最重要的就是正确性、稳定性和性能。前两点尤为重要。要保证这两点,一方面需要在开发和测试过程中尽量提高质量,另一方面广泛使用也很重要。只有当有足够多的人试用你的产品,甚至在生产环境中使用它时,问题和产品建议才能得到足够的反馈。毕竟开发者能做的测试是有限的,很多场景、环境或者业务负载都超出了我们的想象。实际用户的反馈帮助我们提高产品质量,用户的建议帮助我们提高产品的易用性。只有在生产环境中长期运行的基础软件才算是合格的基础软件。因此,我们认为开源是基础软件的大势所趋,无论是Hadoop、MySQL、Spark等知名产品,还是Linux基金会、Apache基金会、CNCF基金会等巨头,都证明了这一点。看法。目前国内大公司的热门开源项目也集中在基础软件领域,如百度的Brpc、Palo、Tera、腾讯的PaxosStore。PingCAP开源了哪些项目这里简单介绍一下我们开源的Repos是干什么的:TiDB:数据库的SQL层TiKV:数据库的分布式存储引擎PD:集群的管理节点Docs:英文项目文档Docs-cn:项目的中文文档,您可以在GitHub上浏览我们的代码,查看我们完整的开发过程。开源模式下PingCAP攻城狮小神典型的一天:早上8:00起床,先登录Slack看看昨晚定时跑的测试任务结果是否正常,然后关注各个渠道,微信Slack上的群,邮箱有没有什么重要消息9:00洗漱+吃完早饭,逗逗我可爱的女儿一会儿(或者被她逗逗),然后上班9:30到公司开始工作.打开电脑看看GitHub上有什么新的issue,看看你的PR有没有被别人评论过。如有意见,第一时间解决;PR需要自己审核,尤其是在的人。戴上耳机,开始在Slack上编写一些代码。有人在找我,请尽快回复。我在Slack上关注的频道中有人正在讨论这个问题。我很感兴趣。加入并讨论一会儿一位同事想要创建一个新功能并编写一份设计文档。我点进去看了看,并提到了一些评论。我在12:00可耻地饿了。叫上小伙伴吃饭,一路上聊技术,聊八卦。13:00吃饭回来查邮件,Slack,微信,处理紧急事情13:30小睡14:00小睡后,喝杯咖啡,开始下午的工作,开始在电脑上打字键盘。....15:30参加同事的设计评审会,通过视频会议系统与远程同事讨论设计方案,做出决定后开始工作16:30休息一下,然后继续敲代码,ReviewPR18:00大部分同事都已经去吃饭了,我20:30开车回家吃晚饭。吃完饭,收拾干净,就无所事事了。打开计算机阅读电子邮件、问题和PR。22:30休息一下,准备洗澡睡觉需求、商业模式等选择开源协议,常见的有GPL、BSD、Apache、Mit。这些开源协议的区别,在阮一峰先生的这篇博客中已经说的很清楚了,推荐大家阅读一下。选择协议后,选择代码托管平台。当前的标准选择是GitHub。注册一个GitHub账号并申请一个Organization后,就可以开始使用了。如果您不需要私人Repo,则无需支付任何费用。开始代码开发,提交第一个Commit,完成Readme的编写(一个好的Readme真的很重要)。后续开发需要通过PullRequest进行,最好不要直接PushMaster。一个严肃的项目需要将Master加入ProtectedBranch,禁止直接Push。为了保证后续提交的代码都是Work,最好在GitHub中至少集成一个CI服务,常用的有TravisCI、CircleCI(CircelCI最近好像老是出问题)。然后在PR的setting页面,要求PR通过CI才可以合并。如果有人在试用项目中发现一些问题,会通过Issue进行反馈,所以需要关注Issue并尽快回复。另外,将Issues按Label进行分类是一个很好的做法,这样大家可以快速搜索和分类Issues。例如,我们会将一些更简单的问题标记为需要帮助。如果刚接触社区的同学想开始贡献代码,那么这些Issues是一个很好的起点。当参与的人越来越多时,就会有人开始贡献代码,Maintainer需要审核其他人的PR,确保项目自身的代码质量要求和编码风格一致。最后,一个好的项目需要配备完备的文档来帮助大家使用项目。包括架构、简要介绍、详细介绍、FAQ、使用示例、接口文档、安装部署、最佳实践等,这也是大部分项目所忽略的。如何参与开源项目1.试用最简单的参与方式就是尝试开源项目,这也是开源***的一个好处,大家随时都可以尝试,也就是很多人帮助项目作者来测试。毕竟如果只是作者自己测试的话,遇到的环境、场景、应用方法都会比较简单,总会出现一些你想象不到的问题。所以每一道试题都非常宝贵,我们会尽快评估并回复。2、您在试用Issue的过程中可能会遇到各种各样的问题,尤其是文档中没有提到的问题。报告问题最好的方式就是在Github上新建一个Issue,这样大家就可以看到了,而且我们也会更加关注通过Issue来反馈,也会有人定期扫描未处理的Issues。当然,在创建Issue之前搜索现有Issue的重复项是一个好习惯。在Issue中尽可能详细的描述遇到的问题,以及可操作的复现步骤,包括使用的Binary版本、部署方式、客户端和服务日志、操作系统日志(如dmesg的输出).如果无法复制,请提供尽可能详细的登录信息。这些对于开发人员追踪错误非常有用。3.提出建议。如果你对项目有什么建议,也可以通过新建Issue来反馈。我们一般会给你是否支持,如果要支持,什么时候支持。4.提交PR。当你遇到TiDB的问题或者需要一个新特性,觉得自己有能力修复或者当前官方没有精力修复的时候,你可以尝试自己修改代码来解决问题。目前,TiDB项目的贡献者超过140人,分布在全球十几个国家。有许多深度参与的用户。如果是一个小功能或者简单的bug修复,可以在相关Issue下喊出来,让大家知道你在做这个,这样就不会有人做重复的工作了。过程中遇到问题,也可以在相关Issue中与Maintainer讨论。如果你要做的是一个比较大的功能,那么最好先和官方商量一下,然后写一个尽可能详细的设计。讨论OK后,开始开发。让我们谈谈一些有趣的事情。在开源项目中,总能发现或多或少的精彩Issues。例如,看到这个Issue,我真的很震惊。【本文为专栏作者《PingCAP》原创文章,转载请联系作者获得授权】点此阅读更多本作者好文
