我们还在邮件组里讨论由谁来修复」。

很多人最初接触 GitHub 会以为这是个 Git 仓库的网络公开版本,实际上 GitHub 和 Git 完全是两码事,Git 是类似 CSV 或 SVN 的代码版本管理工具,而 GitHub 提供的是服务能力,除了代码托管,GitHub 还提供了一系列协作功能,帮助开发者或开发团队实现高效率高品质的代码编写。除了开源项目,很多著名的企业都在基于 GitHub 的企业版研发和管理自己的产品和服务。
 
不夸张的说,GitHub 的出现让现代世界的软件开发发生了翻天覆地的变化,说是一场革命也不为过。
 
GitHub 之前,出现过很多协作软件,程序员们虽然「文人相轻」,每次有编程语言之争就冲上去和别人打的灰头土脸满地找 bug,但在工具方面却不会亏待自己,他们开发出了各种各样的版本管理软件、bug 跟踪系统、代码审查工具、邮件讨论组、即时通讯工具等等,为了完成一次良好的协作,程序员们把这些工具组合起来依次使用,其难度系数相当于跳水向后翻腾一周半转体三周半。
 
当二爷这样的产品经理过来询问「上周提了一个 bug 怎么还没修复」的时候,程序员们自豪的说:「我们还在邮件组里讨论由谁来修复」。
 
GitHub 的出现解决了所有的问题,Git 完成代码托管,Issue 用来进行 bug 跟踪和管理,Pull Request 实现了协作开发、Code Review 和 交流功能,Wiki 和 扩展的 Markdown 格式 GFM 可以编写优雅的开发文档……
 
GitHub 服务的出现,为开源世界带来了社会化编程的概念,这个概念影响了全世界众多程序员和技术团队。什么是社会化编程呢?就是在自由、开源、民主的环境下,一群陌生的程序员通过网络和协作的方式共同开发和维护一个软件产品。
 
真正有生命力的开源软件都是基于社会化编程的方式构建出来的,现在很多大公司因为 KPI 也会把自己的一些代码放到 GitHub 上,但那更多是一场代码秀,而不是真正的开源。
 
话外音:一般来说,每个成功的开源项目都有一些核心的开发者来完成代码 Merge 管理和协作平衡等工作,不过 GitHub 上却有个非常有趣的项目叫做 ChaosBot( https://github.com/Chaosthebot ),这是一个完全没人干预的社会化项目实验。
 
项目规则是这样的,首先 Fork 一份代码,然后进行代码修改,提交一个 pull request。如果这个 pull request 在社区里获得了大多数的赞同,这个 PR 就会被自动 Merge,然后 ChaosBot 就自动更新代码并重启自己。如果无法重启就算死亡一次,目前 ChaosBot 已经死亡了 16 次。
 
这个项目获得了 2471 个 Star。
 
GitHub 是如何实现这种社会化编程的模式呢?这里就必须说一说 Pull Request 了。
 
Pull Request
Pull Request 采用了一种精巧的设计,让开发者实现了真正的代码对话:Talk is cheap, show me the code.
 
很多开发者把 GiuHub 当 Git 用,在账户里建个仓库扔些代码就以为是开源了。如果你没用过 Pull Request 与别人协作过,也没有 Merge 过别人的代码,那就不是个真正的 GitHub 程序员。
 
什么是 Pull Request 呢?举例来说,比如你写了一篇论文,想找人做 Review,你保留了原本,他拿走了副本进行修改。这里的原本就是仓库,拿走副本的行为就是 fork,然后人家基于副本进行修改和批注,叫 commit,最后把修改好的副本提交给你,这就是一次 pull request。你根据副本内容修正原本,这叫 merge。
 
程序员们常常管 Pull Request 叫做 PR。一次完整的 PR 过程是这样的: