我们为什么需要版本控制系统?
甚至早在踏上程序员的工作岗位的第一天之前,我就开始使用版本控制系统了,那时候,使用的是SVN。而现在工作五年多了,我使用的版本控制系统,换成了Git。现在,我试图通过一个分享,将我的同事,或者一般的小伙伴,带入到Git的世界,这时候,我就必须搞清楚很多基本的问题,比如,这个问题,为什么我们需要使用版本控制系统呢?
上周五,我们公司新加入的工程师,给大伙分享了Git的一点经验心得,谈及这一类的问题的时候,表达了类似非常理所当然的态度,甚至我都不记得他有提及过任何相关的词句。但是,假如我现在必须给一个从来没有用过版本控制,甚至不知道版本控制的人,讲解版本控制系统的必要性的时候,这个问题真的有那么理所当然么?
我想,答案是否定的。(谈及这个东西的时候,我忍不住又想啰嗦了,我在跟人沟通的时候,常常发现,很多人无法分清楚,什么是主观的,什么是客观的,更别提要求他们分清楚,什么是自己已经知道的事实,而这里面哪些东西,站在你对面的人其实并不清楚,也即信息的不对称程度到底达到什么级别?所有这些归结为三个字,就是“想当然”。所以,当你想当然地觉得,这还用说嘛,或者觉得,显然这是个正确的理由的时候,其实,对别人来说,确实没有那么的理所当然)
对这个问题,我想到的第一个理由,竟然是,因为需求是千变万化的。那又怎么样!?我心里那个从来不懂版本控制的伙计,大声嚷嚷。仔细一想,竟然真的没什么必然因果联系。需求怎么变,你代码就怎么写好了。今天需求是这样,你代码就改成这样,明天需求变了,你代码跟着变了,但是这到底关“版本控制”毛事?
第二个不是答案的回答,通过版本控制系统,我们可以记录代码的每个版本。这只是解释了版本控制系统可以干什么,根本没有提及为什么!!我心里的另一个伙计有点不耐烦了,大声吼出来了,“为什么我们要记录每个版本?”
第三个,第四个,……然并卵……
于是,我不得不思索,版本到底是什么东西,版本的意义何在?什么是细思恐极呢?就是这个时候,大脑一片空白,我突然意识到自己的知识是何其贫乏,自己的思维是何其空洞,脑子里根深蒂固认为的一些概念,推敲一下,竟然毫无根基。原谅我,我偷懒了,我翻阅了一下《代码大全》(以前我鄙视过这本书,我现在表示深深的悔意)。
假如,当我改了关于A功能的若干处代码,这时候,我发现B功能无法正常运作了。那么,当我想探究为什么的时候,有一个自然而然的归因(未必正确)——你刚改了代码,系统挂了,所以,是你改挂的——但是你必须证明并定位到这个具体的问题,才可能修复,那就必须精确找出来刚改的这若干处代码,这时候,你需要将代码与上一次还能正常运行时候的代码进行比较。太棒了,版本的概念出现了!!!我无法不欢呼!
故事到这里,就变得非常Resonable了,因为到这里,已经没什么“感觉”,“直觉”的内容了,已经很客观了。某种改变,导致某种结果,无论你要证明有因果关系,还是没有因果关系,最好的方法,就是把这种改变的所有内容,罗列出来,逐一分析。假如我们在系统的每一个可以正确运行的点,都去设立一个版本的话,就可以存在很多的这样用于比较的基准,从而帮助我们快速归因到问题的真正所在,从而解决他们,而这就是版本控制系统存在必要性的其中一个原因!
除此以外,版本控制系统,有很多附加的好处:
代码存储和备份。我用过的每个版本控制系统,都具备代码存储的功能,而因为公司、组织加持的运维管理,导致它们往往可以保障代码不会丢失。
可以回退到上一次正确的版本,完全放弃弄糟的一切。
多人协作场景下,可以保持自己的代码副本最新,可以解决共同编辑一个文件的冲突情况。
OK,到现在为止,我基本已经说服了我自己,我必须要使用版本控制系统的。相信已经有一部分程序员也真的相信了这件事情。但是非程序员呢?真的需要版本控制系统么?或者哪一类工种,需要版本控制系统的支持呢?是否对他们来说真的有必要性?