如果你是一个程序员,稍微工作一点时间,应该都不会对git陌生。这是一款版本控制软件,对它的由来并不是所有人都熟悉。这是网上一则小故事(转载自https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137402760310626208b4f695940a49e5348b689d095fc000):
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
这篇文章看了之后,大家都知道Linus有多牛了。是的,一个大牛发明一个全世界认可的软件,已经是可望不可求的了。他一下就做了至少两个。如果一个公司得到这样的程序员是不是无往不利了呢?可惜,这种级别的大牛全世界也没多少,对于浩如烟海的公司数量,将这些大牛碾成粉末,怕是也分不到一小勺。那我们怎么自己培养出这样的大牛呢?或者换成个更直接的问题,我们怎么能做出如git一样好的产品呢?
不着急,我们就一起来分析分析,看看有没有机会。
1.git是什么?
Git是一款版本控制软件。
2.版本控制软件,那么它没有竞争对手吗?git有哪些亮点呢?又有哪些缺点呢?
git有很多竞争对手。如svn, cvs,hg, clearcase,还有上文提到的bitkeeper等。git的突出特点是分布式的版本管理。svn、cvs、clearcase属于集中式管理,需要一台集中的服务器。hg、git属于分布式管理,不需要服务器,支持离线提交,相对独立不影响协同开发。而且采用了压缩和文件管理技术,大部分操作都是在本地完成的,速度比svn这种需要服务器的版本库快很多。可以离线上传版本库,开发好了再同步到别人那里。数据的完整性也很高。
Git的优缺点:
优点:1、公共服务器压力和数据量都不大。(相对于svn) 2、速度快、灵活。3、任意两个开发者之间可以很容易的解决冲突。
缺点:1、学习周期相对而言比较长。不符合常规思维。2、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。虽然可以架设严格的控制平台,但也把git的精华带走得差不多了。
3.git为什么会流行?在竞争中胜出呢?
上文的小故事里,已经透露了几个非常基本重要的信息:
a.git是开源免费的;
b.git是为linux之类的开源软件准备的。
首先,使用git的潜在人群有那么多。
linux这样的团队可不是一个人两个人,而是全球的爱好者,数以万计,分布在全球各个地方。Linux是系统软件,玩linux的人,会使用大量的开源软件,这些软件也都需要git管理,结果就是整个开源世界,基本上就被git统一了。
其次,git真的很好的解决了linux团队所有在意的问题。主要在意的问题:1.速度速度速度!(重要的事情说三遍) 2.分布式,去中心化,不需要服务器,有需要再和别人同步工作结果。3.不需要联网就可以提交,这个使得版本库真正成为一个工作的照相机。这是svn不具备的功能。
最后,免费好用,有谁想和自己的钱包过不去呢?
4.作者有哪些思想深刻的影响了该产品?
首先,像Linux这些大牛们,为了提高工作效率,为了多写几行代码,用尽了一切办法。对速度的追求超过了任何人。编译的耗时、下载的耗时,在他们看来是不可忍受的。所以这也成就了git产品的速度。也许是被svn、cvs这些软件折磨的。普通人,觉得下载个svn,正好可以去泡杯茶……
其次,我认为最核心的东西,是git带来了工作流程的提升。传统的,如果我们使用svn开发代码,每个开发者是这样的:
如果有多个人合作,上传代码时要做版本合并。表面上看这个流程没什么问题,其实是很蛋疼的。如果修改的代码多了,简单测试内容多了。程序员不能有效管理的话,自然效率就下降了。如果同时有其他程序员提交了未经验证的代码,同时,程序员合并时又不得不对这部分更新的话,结果是灾难的。这在多人团队中,屡见不鲜的案例了。对比一下git的流程:
这里,使用git的工程师在修复一个大问题的时候,自己建立一个分支自己任意提交自测,不受别人影响。如果项目经理要改更紧急的问题,当前工作提交停下来,再开一个分支修改即可。反观SVN,什么都需要服务器,虽然也可以开分支,但是麻烦,速度慢。搞几下,程序员就不干了。所以一般都是自己修复,一个问题一个问题修复,本地自己做备份。效率可想而知。遇到复杂的问题的时候,由于缺乏Git这样中间的多次提交测试,光靠脑子,是很难记住当中的测试点与修改点,自然效率也高不起来。
事实上,git 里还有stash 功能,类似于紧急将代码备份。便于隔离管理复杂的代码。所有这些,都是为了将复杂问题、大问题的修改切分成小的修改,小的问题,逐步迭代解决。是一种高效率的办法。这应该是大牛在工作总不断总结,不断被痛苦折磨出来的感悟。
最后,git 产品与svn 产品的视角不同,git考虑是怎么让程序员用起来爽,能应对程序员遇到的很多场景;而svn 的逻辑简单,应对场景单一,适合公司集中式管理,有点从公司角度考虑的味道。git突出的是个人的体验,颇有些个人英雄主义色彩。这也是这种开发者行业的特殊现象,脑力工作往往是管用的一个,不顶用的100个都没用。
5.我们如何仿照Git设计出好的产品?
一个好的产品应该有好的灵魂。这是产品开发人员要考虑的问题。git首先是一款开发工具软件,工具软件承载的是客户工作的流程。没有好的流程,就没有好的工具。先进的流程,需要对应的工具来保证。这是相辅相成的。对于一款工具,有多个维度:a.工具本身的效率,自然越高越好;b.使用该工具,需要输入及准备。这个输入与准备不应比现有的方案麻烦,甚至要大大简化才对;c.对于工具的结果(质量)我们应该是有预期的,不能低于这个预期;d.工具在使用中,应固化先进的流程,以提高工具对复杂问题的效率。
Linus本身是开发者,也是使用者。他能充分的考虑到自身的需求。linux这个平台又是一个非常大的舞台,后面有千万量级的代码要管理,这注定Linus针对linux代码管理的感悟是一个世界级的感悟。在linux遇到的复杂代码管理问题,应该覆盖了各种奇葩场景。这些问题解决了,本身就注定了这个产品是个好产品。
我并不认为linus能设计出好的金融软件,好的行业软件。毕竟不是什么场合他都是使用者。所以,行业的深入调研,需求的整理整合就非常重要了。需求的实现,实际上暗含了解决问题的流程和思路,如果流程和思路不正确,在牛的程序员也拉不回来。这里我认为是需要深刻学习的点。
综合下来:1.清晰定义出好的产品是什么,定义好了,目标自然明确;2.深刻的行业调研,明白自己解决的问题处于行业什么位置,解决的有多到位;3.需要一个好的执行团队保证。
领取专属 10元无门槛券
私享最新 技术干货