阅读更多
十年前的这周,Linux kernel社区面临着艰巨的挑战。十年后的今天,Git用于成千上万个项目。在这十周年之际,Linux创始人Linus Torvalds为我们分享了Git幕后的故事,并且告诉我们这个工程队软件开发的影响。你会发现他在这个故事背后的评论。我们跟随Q&A追寻Git的轨迹。



为什么要创建Git?

Torvalds:我真的从来没有想过要做资源控制管理,并觉得它在计算机世界里拥有最少的乐趣(可能是除了数据库之外),而且我讨厌所有的SCM。但是随着BitKeeper的出现,我的想法发生了改变。BK (BitKeeper)大多数都是正确的,但有本地副本的存储库与分布式合并是一个大问题。分布式源码管理的一个主要问题是源码管理的分离——谁才可以提交改变。BK让你可以避免这个问题,方法就是给每个人自己的源代码存储库。但是BK有自己的问题,有几个技术选择导致了问题(重命名是痛苦的),而最大的缺陷是它不是开源的事实。有很多人不想使用它,所以当我们最终让几个核心维护人员使用BK时,它对开源项目是免费的,无处不在,所以它帮助了内核开发,即便仍有痛点。

当Tridge(Andrew Tridgell)开始对BK协议实施逆向工程时,这是违反BK的使用规则的。我花了几周的时间(几个月?感觉是这样)试图在Tridge和Larry McVoy之间调解,但是最终它显然无法工作了。所以在某种程度上我确定了我无法再继续使用BK,但是我真的不想再回到那个旧的BK的日子。同时,虽然有些SCM试图获得整个分布式事情,遗憾的是离目标是遥远的。最终我选择自己去写。
你是怎么着手的?时间上是整周都在熬夜编写还是只在常规时间里?

Torvalds:你可以实际的在Git源代码存储库中去看看它是如何成型的。它花费我大约一天的时间来让其“自托管”,这样我就可以使用Git本身来将东西整合到Git中。白天的工作是主要的,但也有一些事在半夜或凌晨两点。最有趣的部分是它如何成型的,第一次提交到Git树种的东西是没有太多代码的,但是它已经做了基础——足以支撑它。编码的诀窍并不是真的那么多,但是需要思考数据如何去组织。

所以我想强调的是当它真的只在大约十天左右的时间里出来,这也并不表示它像某种疯狂的编码。早期代码的实际数量是非常小的,它取决于基础的观念。我在整个项目开始之前考虑了一段时间,包括其他人已经遇到过的问题,我看到我想要避免去做什么。

它辜负了你的期望了吗?你如何评价它如今的工作?对它有哪些限制呢?

Torvalds:它工作的非常好,并且到目前为止仍满足我所有的期望。不过在转换源控制系统中有许多惰性。

为什么会认为其已被广泛采用?

Torvalds:我想很多人也遇到过相同的问题,以致我恨SCM。虽然目前有很多试图解决一两个“小角落”的项目,但是实在没有哪个想Git,可以最终承担大的问题。即使人们没有意思到“分布式”部分有多重要(并且有很多人反对这个部分),然而一旦他们弄清楚它允许简单可靠的备份,并允许人们创建自己的测试库,而不必担心去写访问中心存储库的政纲,他们会离不开它。

Git会永远持续下去吗,或者你预见另一个版本控制系统会出现在另一个十年里?你会是其中的编写者之一吗?

Torvalds:我不会是编写者之一。也许在未来十年里我们会看一些新的东西,不过我相信它会是类似Git的东西。它不是像Git那样让所有事物正确,而是以某种方式解决所有真正的基本问题(其他SCM不曾解决的)。

为什么Git可以很好的工作于Linux?

Torvalds:它显然是被设计用于我们的工作流的,因此这是它的一部分。我已经提过跟多次整个“分布式”部分,但值得重复。不过它也被设计成高效、足够用于一些大的项目,比如Linux,并且它也被设计用于做一些人们认为困难的事情。

举个例子来说,在大多数SCM中,合并的概念被普遍认为是非常痛苦和困难的,你不得不计划合并,因为处理量是巨大的。这是我不能接受的,而且最大的开销不应该在合并上,而是在测试结果上。合并的“git”部分只需几秒结合,它带给我更多的时间。

所以Git基本上是以我的需求来设计和编写的,并且它的表现也是这样。

有人说Git是针对超级聪明的人,甚至连Andrew Morton都曾说Git是“清楚的被设计于让你感觉不那么聪明的东西”。对此你的反应是?

Torvalds:有几个原因让人们有这样的感觉,而我想只有一个,这个原因很简单:“你做事情的方法可以有如此多”。

你可以使用Git做很多事情,而且很多关于你应该做什么的规则当中并没有太多的技术限制,更多的是关于当于其他人一起工作时,什么是可以正常进行的。所以Git是一个非常强大的工具集,不仅仅具有压倒性的那种,它也意味着你可以经常以不同的方式做着相同或相似的事情,而且它们都可以工作。一般情况下,学习Git的最好方法是先做非常基础的东西,甚至就是看一些东西,直到你有熟悉、自信的基础。

这里还有一些历史原因导致Git被认为是复杂的。其中之一就是它是复杂的。很早一批为了工作于内核而使用Git的人们真的不得不为了让一切运行起来去学习非常粗暴的脚本集,所有的努力都用于核心技术工作,只有很少的精力用于简化它,或使它显而易见。所以Git的名誉是当之无愧的,要求你正确的指导你在早期该做些什么,不过这主要适用于6个月或一年。

另一个让人们认为Git困难的原因是Git有很大的不同。有些人使用诸如CVS等事物十年到二十年,Git不是CVS。概念是不同的,命令是不同的,从一开始Git就没试图去像CVS。

但是Git没有不必要的不同,差异是必须的。只是这些让有些人真的认为它比想象中更为复杂,因为来自不同的背景。“CVS背景”的事物已经远去,现在可能有很多程序员从不使用CVS,并且会觉得CVS的方式非常混乱。为什么呢?因为他们先学的Git。

如果不用Git,你认为Linux内核开发速度能够跟上目前的速度吗?原因是?

Torvalds:当然可以,但是这也要求有人去写某些Git等价物,一个可以像Git这般效率的分布式SCM,我们肯定需要些类似Git的事物。

你对GitHub最新的意见是什么?

Torvalds:GitHub是一个优秀的托管服务,我没有任何需要针对它的地方。我要抱怨的是GitHub作为一个开发平台,提交、请求、跟踪问题等不能工作的很好。

请说一说在Git或GitHub上您最感兴趣的用法?

Torvalds:很高兴看到采用git可以很轻松的创建一个项目。以前的代码托管是很难用,有了git和GitHub,创建一些小项目变得非常简单。项目具体是做什么并不重要,重要的是你可以做到了。

您最近还有其它项目吗?有其它可以在未来若干年主导软件开发的项目吗?

Torvalds:目前没有,如果有的话我会告诉你。

英文原文点此查看
  • 大小: 134.6 KB
2
3
评论 共 1 条 请登录后发表评论
1 楼 sleets 2015-04-12 14:37

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 基于java的CRM客户关系管理系统 含源码、数据库、部署教程、论文、答辩ppt一条龙服务.zip

    有部署问题可私信联系 ├── readme.txt ├── 基于Java的CRM客户关系管理系统的设计和实现数据库 │   └── crm.sql ├── 基于Java的CRM客户关系管理系统的设计和实现项目源代码 │   └── MyCrm.zip ├── 基于Java的CRM客户关系管理系统的设计和实现项目运行截图 │   ├── 主界面.PNG │   ├── 产品信息管理.PNG │   ├── 客户信息添加.PNG │   ├── 登录.PNG │   └── 角色管理.PNG ├── 视频 │   ├── 1CRM客户关系管理系统_项目的配置以及启动.url │   ├── 2CRM客户关系管理系统_工作桌面_信息中心_邮箱功能_客户管理_订单管理.url │   └── 3CRM客户关系管理系统_财务管理_产品管理_部门管理_岗位管理_数据回收站_权限管.url └── 论文 ├── 基于Java的现代数字化CRM客户关系管理系统答辩ppt.pptx └── 基于Java的现代数字化CRM客户关系管理系统论文.docx

  • Java基础——Serializable序列化

    Java基础——Serializable序列化

  • Java序列化、反序列化-为什么要使用序列化?Serializable接口的作用?

    把对象转换成字节序列把字节序列恢复成对象。

  • Java之Serializable讲解

    在Java中操作数据库经常会遇到Serializable,那么它具体是什么呢? 我们将从以下四个方面介绍: 1、什么是Serializable? Serializable是Java提供的通用数据保存、读取和传输的接口, 其源码极为简洁,就是一个接口的声明。 2、Serializable作用 通过实现Serializable接口的类,该类所实例化的对象(实例变量)的状态信息在内存中可以持久化保存、传输,该过程称为序列化。 与之相反的是,将序列化的结果变成对象的过程称为反序列化。 3、Serializ

  • 【Java基础知识 1】Java入门级概述,让阿里架构师告诉你为什么要分库分表

    1998年12月8日,第二代Java平台的企业版J2EE发布。 1999年4月27日,HotSpot虚拟机发布。 2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各种版本已经更名,已取消其中的数字2,如J2EE更名为JavaEE,J2SE更名为JavaSE,J2ME更名为JavaME。 2009年,甲骨文公司宣布收购Sun。 2014年3月Oracle发布正式版JDK8,JDK8改进比较多,最大的改进是Lambda表达式(以及因之带来的函数式接口,很多原有类都做

  • 初识Java的理解

    Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和 跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。

  • Java概述

    JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域,负责执行指令、管理数据、内存、寄存器,包含在JDK中对于不同的平台,有不同的虚拟机Java虚拟机机构屏蔽了底层运行平台的差别,实现了“一次编译、到处运行”JDK(Java Development Kit Java开发工具包)JDK = JRE + Java的开发工具(java、javac、javadoc、javap)JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,也包含了 JRE。...

  • Java基础知识总结(超详细整理)

    1.面向对象2.简单好用3.健壮性4.安全性5.平台无关性6.支持多线程7.分布式(支持网络编程)8.编译与解释共存标识符: 用来标识类名、对象名、变量名、方法名、类型名、数组名、文件名的有效字符序列。合法的标识符:关键字:Java语言中已经赋予了特定含义的 保留字: ,Java版本中尚未使用,但以后版本可能会作为关键字使用变量:程序运行期间可以被改变的量。在程序中使用变量,必须先创建它并为它取一个名字,并且指明它能够存储信息的类型,这称为“变量声明”,也叫容器的创建。变量的使用:Java 中的注释有三种

  • java serializable_Java基础之Serializable接口

    Serializable接口介绍Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以...

  • 什么是序列化?

    序列化是指将对象转换成字节序列的过程称为对象的序列化,反序列化则是将字节序列恢复为对象的过程 对象的序列化通常有两种用途 1、把对象的字节序列永久的保存到硬盘上,通常存放到一个文件中 2、在网络上传送对象的序列化  ...

  • Java对象序列化详解

    所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。一、定义  序列化:把Java对象转换为字节序列的过程。      反序列化:把字节序列恢复为Java对象的过程。二、用途  对象的序列化主要有两种用途:      1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;(持久化对象)      2) 在网络上传送对象的字节序列。(网络传输对象)...

  • Java基础——对象的序列化(通俗易懂,排版优美)

    Java基础——对象的序列化什么是对象的序列化(Serialization) “序列化”是一种把对象的状态转化成字节流的机制,“反序列”是其相反的过程,把序列化成的字节流用来在内存中重新创建一个实际的Java对象。这个机制被用来“持久化”对象。通过对象序列化,可以方便的实现对象的持久化储存以及在网络上的传输。大致的过程如下图所示: 对象被转换成“字节流”后可以存入文件,内存,亦或者是数...

  • http://www.javaresearch.org/

    java研究组织者

  • 序列化的两种实现及优劣比较

    序列化我们通常会用在Activity之间进行对象传递的时候使用到,那么序列化有两种,Serializable和Parcelable ,我们该选择哪一种呢?那就要先知道两种区别。      1、作用      Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计

  • Java中如何序列化一个对象

     Java 中如何序列化一个对象 我们都知道java 中无法保存一个对象到文本文件中,但是当我们有这种需求的时候,我们可以通过java 的序列化功能把当前对象的一些属性以二进制的形式保存到文件中。当我们需要这个对象的时,只需要从二进制文件中还原为保存前的对象即可。从这里我们可以得到启发,如果想把机器A 上的一个Student 对象发送到机器B 上,我们可以把Student 对

  • java english site

    http://www.javaalmanac.com - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处. http://www.onjava.com - O'Reilly的Java网站. 每周都有新文章. http://java.sun.com - 官方的Java开发者网站 - 每周都有新文章发表. http://www.develo...

  • java序列化与反序列化

    转自:http://www.blogjava.net/dennydeng/articles/93464.html  1 package  com.test.mainterface;  2

  • 对象的序列化

    Java 中对象的序列化技术  http://publishblog.blogchina.com/blog/tb.b?diaryID=3854827                                      1、含义:将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。2、编程要求:只有实现Serializable接口的类对象才可以被序列化。 Seriali

  • 序列化和反序列化的底层实现原理是什么?

    序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一个问题,自信满满的说了一大堆,什么是序列化、什么是反序列化、什么场景的时候才会用到等,然后面试官说:那你能说一下序列化和反序列化底层是如何实现的吗?一脸懵逼,然后回家等通知! 一、...

Global site tag (gtag.js) - Google Analytics