Skip to main content

巴菲特演讲

· 39 min read

1998年10月15日

我先简单说几句,把大部分时间留下来回答大家的问题。我想聊聊大家关心的话题。

请各位提问的时候一定要刁钻。你们问的问题越难,才越好玩。什么都可以问,就是不能问上个月我交了多少税,这个问题我无可奉告。

各位同学,你们毕业之后未来会怎样?我简单说说我的想法。

各位在这所大学能学到大量关于投资的知识,你们将拥有成功所需的知识。

既然各位能坐在这里,你们也拥有成功所需的智商,你们还有成功所需的拼劲。你们大多数人都会成功地实现自己的理想。

但是最后你到底能否成功,不只取决于你的头脑和勤奋。我简单讲一下这个道理。

奥马哈有个叫彼得•基威特的人,他说他招人的时候看三点:品行、头脑和勤奋。

他说一个人要是头脑聪明、勤奋努力,但品行不好,肯定是个祸害。

品行不端的人,最好又懒又蠢。

我知道各位都头脑聪明、勤奋努力,所以我今天只讲品行。为了更好地思考这个问题,我们不妨一起做个游戏。

各位都是 MBA 二年级的学生,应该很了解自己周围的同学了。假设现在你可以选一个同学,买入他今后一生之内 10% 的收入。

你不能选富二代,只能选靠自己奋斗的人。请各位仔细想一下,你会选班里的哪位同学,买入他今后一生之内 10% 的收入。

你会给所有同学做个智商测试,选智商最高的吗?

未必。

你会选考试成绩最高的吗?

未必。

你会选最有拼劲的吗?

不一定。

因为大家都很聪明,也都很努力,我觉得你会主要考虑定性方面的因素。

好好想想,你会把赌注压在谁的身上?

也许你会选你最有认同感的那个人,那个拥有领导能力,能把别人组织起来的人。

这样的人应该是慷慨大方的、诚实正直的,他们自己做了贡献,却说是别人的功劳。

我觉得让你做出决定的应该是这样的品质。

找到了你最钦佩的这位同学之后,想一想他身上有哪些优秀品质,拿一张纸,把这些品质写在纸的左边。

下面我要加大难度了。

为了拥有这位同学今后一生 10% 的收入,你还要同时做空另一位同学今后一生 10% 的收入,这个更好玩。

想想你会做空谁?你不会选智商最低的。

你会想到那些招人烦的人,他们可能学习成绩优秀,但你就是不想和他们打交道,不但你烦他们,别人也烦他们。

为什么有人会招人烦?

原因很多,这样的人可能自私自利、贪得无厌、投机取巧或者弄虚作假。

类似这样的品质,你想想还有什么,请把它们写在刚才那张纸的右边。

看看左右两边分别列出来的品质,你发现了吗?这些品质不是把橄榄球扔出 60 米,不是 10 秒钟跑完 100 米,不是相貌在全班最出众。

左边的这些品质,你真想拥有的话,你可以有。

这些是关于行为、脾气和性格的品质,是能培养出来的。

在座的各位,只要你想要获得这些品质,没一个是你得不到的。

再看一下右边的那些品质,那些令人生厌的品质,没一个是你非有不可的,你身上要是有,想改的话,可以改掉。

大多数行为都是习惯成自然。

我已经老了,但你们还年轻,想摆脱恶习,你们年轻人做起来更容易。

常言道,习惯的枷锁,开始的时候轻的难以察觉,到后来却重的无法摆脱。

这话特别在理。

我在生活中见过一些人,他们有的和我年纪差不多,有的比我年轻十几二十几岁,但是他们染上了一些坏习性,把自己毁了,改也改不掉,走到哪都招人烦。

他们原来不是这样的,但是习惯成自然,积累到一定程度,根本改不了了。

你们还年轻,想养成什么习惯、想形成什么品格,都可以,就看你自己怎么想了。

本•格雷厄姆,还有他之前的本•富兰克林,他们都这么做过。

本•格雷厄姆十几岁的时候就观察自己周围那些令人敬佩的人,他对自己说:“我也想成为一个被别人敬佩的人,我要向他们学习。”

格雷厄姆发现学习他敬佩的人,像他们一样为人处世,是完全做得到的。

他同样观察周围遭人厌恶的人,摆脱他们身上的缺点。

我建议大家把这些品质写下来,好好想想,把好品质养成习惯,最后你想买谁 10% 的收入,就会变成他。

你已经确定拥有自己 100% 的收入,再有别人的 10%,这多好。

你选择了谁,你都可以学得像他一样。

Q1:有传言说您是救赎长期资本管理公司的买家之一,到底发生了什么,能给我们讲讲吗?

巴菲特:这件事非常耐人寻味。

长期资本管理公司的由来,相信在座的大多人都知道,实在太令人感慨了。

约翰•梅里韦瑟、艾瑞克•罗森菲尔德、拉里•希利布兰德、格雷格•霍金斯、维克多•哈格哈尼,还有两位诺贝尔奖桂冠得主罗伯特•默顿和迈伦•舒尔兹,把他们这 16 个人加起来,他们的智商该多高,随便从哪家公司挑 16 个人出来,包括微软,都没法和他们比。

第一,他们的智商高得不得了。

第二,他们这 16 个人都是投资领域的老手。他们不是倒卖服装发的家,然后来搞证券的。

他们这 16 个人加起来,有三四百年的经验了,一直都在投资这行摸爬滚打。

第三,他们大多数人都几乎把自己的整个身家财产都投入到了长期资本管理公司,他们把自己的钱也投进去了。

他们自己投了几亿的钱,而且智商高超,经验老道,结果却破产了。

真是让人感慨。

要让我写一本书的话,书名我都想好了,就叫《聪明人怎么做蠢事》,我的合伙人说我的自传可以叫这个名字。

但是,我们从长期资本这件事能得到很多启发。

长期资本的人都是好人。

我尊重他们。

当我在所罗门焦头烂额的时候,他们帮过我。

他们根本不是坏人。

但是他们为了赚更多的钱,为了赚自己不需要的钱,把自己手里的钱,把自己需要的钱都搭进去了。

这不是傻是什么?绝对是傻,不管智商多高,都是傻。

为了得到对自己不重要的东西,甘愿拿对自己重要的东西去冒险,哪能这么干?

我不管成功的概率是 100 比 1,还是 1000 比 1,我都不做这样的事。

假设你递给我一把枪,里面有 1000 个弹仓、100 万个弹仓,其中只有一个弹仓里有一颗子弹,你说:“把枪对准你的太阳穴,扣一下扳机,你要多少钱?”我不干。

你给我多少钱,我都不干。

要是我赢了,我不需要那些钱;要是我输了,结果不用说了。

这样的事,我一点都不想做,但是在金融领域,人们经常做这样的事,都不经过大脑。

有一本很好的书,不是书好,是书名好。

这是一本烂书,但是书名起得很好,是沃尔特•古特曼写的,书名是《一生只需富一次》。

这个道理难道不是很简单吗?

假设年初你有 1 亿美元,如果不上杠杆,能赚 10%,上杠杆的成功率是 99%,能赚 20%,年末时你有 1.1 亿美元,还是 1.2 亿美元,有区别吗?

没一点区别。

要是年末你死了,写讣告的人可能有个笔误,虽然你有 1.2 亿,但他写成了 1.1 亿。

多赚的钱有什么用?一点用没有。

对你、对你的家人,对别人,都没用。

要是亏钱了的话,特别是给别人管钱,亏的不但是钱,而且颜面扫地、无地自容,把朋友的钱都亏了,没脸见人。

我真理解不了,怎么有人会像这 16 个人一样,智商很高、人品也好,却做这样的事,一定是疯了。

他们吃到了苦果,因为他们太依赖外物了。

我临时掌管所罗门的时候,他们和我说,六西格玛的事件、七西格玛的事件伤不着他们。

他们错了。

只看过去的情况,无法确定未来金融事件发生的概率。

他们太依赖数学了,以为知道了一只股票的贝塔系数,就知道了这只股票的风险。

要我说,贝塔系数和股票的风险根本是八竿子打不着。

会计算西格玛,不代表你就知道破产的风险。

我是这么想的,不知道现在他们是不是也这么想了。

说真的,我都不愿意以长期资本为例。

我们都有一定的概率会摊上类似的事,我们都有盲点,或许是因为我们了解了太多的细枝末节,把最关键的地方忽略了。

亨利•考夫曼说过一句话:“破产的有两种人,一种是什么都不知道的,一种是什么都知道的。”

说起来,真是令人扼腕叹息。

同学们,引以为戒。

我们基本上没借过钱,当然我们的保险公司里有浮存金。但是我压根没借过钱。

我只有 1 万块钱的时候都不借钱,不借钱不一样吗?

我钱少的时候做投资也很开心。

我根本不在乎我到底是有 1 万、10 万,还是 100 万。

除非遇上了急事,比如生了大病急需用钱。

当年我钱很少,但我也没盼着以后钱多了要过不一样的生活。

从衣食住行来看,你我之间有什么差别吗?

我们穿一样的衣服,我们都能喝天赐的可口可乐,我们都能吃上麦当劳,还有更美味的 DQ 冰淇淋,我们都住在冬暖夏凉的房子里,我们都在大屏幕上看橄榄球赛。

你在大电视上看,我也在大电视上看。

我们的生活完全一样,没多大差别。

要是你生了大病,会得到良好的治疗。

如果我得了大病,也会得到良好的治疗。

我们唯一不一样的地方是我们出行的方式不同。

我有一架小飞机,可以飞来飞去,我特别喜欢这架飞机,这是要花钱的。

除了我们出行的方式不同,你说有什么是我能做,但你做不了的吗?

我有一份我热爱的工作,但我一直都在做我喜欢的工作。

当年我觉得赚 1000 美元是一大笔钱的时候,我就喜欢我的工作。

同学们,做你们喜欢的工作。

要是你总做那些自己不喜欢的工作,只是为了让简历上的工作经历更漂亮,那你真是糊涂了。

有一次,我去做一个演讲,来接我的是一个 28 岁的哈佛大学的学生。

我听他讲完了他的工作经历,觉得他很了不起。

我问他:“以后你有什么打算?”

他说:“等我 MBA 毕业后,可能先进一家咨询公司,这样能给简历增加一些分量。”

我说:“你才 28 岁,已经有这么漂亮的工作经历了,你的简历比一般人的漂亮 10 倍。你还接着做自己不喜欢的工作,不觉得有点像年轻的时候把性生活省下来,留到岁数大的时候再用吗?

或早或晚,你们都应该开始做自己真心想做的事。

我觉得我说的话,大家都听明白了。

各位毕业之后,挑一个自己真心喜欢的工作,别为了让自己的简历更漂亮而工作,要做自己真心喜欢的。

时间久了,你的喜好可能会变,但在做自己喜欢的事的时候,早晨你会从床上跳起来。

我刚从哥伦比亚大学商学院毕业,就迫不及待地希望立刻为格雷厄姆工作。

我说我不要工资,格雷厄姆说我要的薪水太高了。

我一直骚扰他。

回到奥马哈后,我做了三年股票经纪人,一直给格雷厄姆写信,告诉他我发现的投资机会。

最后,我终于得到了机会,在他手下工作了一两年。那是一段宝贵的经历。

总之,我做的工作始终都是我喜欢的。

你财富自由之后想做什么工作,现在就该做什么工作,这样的工作才是理想的工作。

做这样的工作,你会很开心,能学到东西,能充满激情。

每天会从床上跳起来,一天不工作都不行。

或许以后你喜欢的东西会变,但是现在做你喜欢的工作,你会收获很多。

我根本不在乎工资是多少。

不知怎么,扯得有点远了。

总之,如果你现在有1块钱,以为将来有2块钱的时候,自己能比现在过得更幸福,你可能想错了。

你应该找到自己真心喜欢做的事情,投入地去做。

别以为赚10倍或20倍能解决生活中的所有问题,这样的想法很容易把你带到沟里去。

在不该借钱的时候借钱,或者急功近利、投机取巧,做自己不该做的事,将来都没地方买后悔药。

Q2:您喜欢什么样的公司?

巴菲特:我喜欢我能看懂的生意。

先从能不能看懂开始,我用这一条筛选,90% 的公司都被过滤掉了。

我不懂的东西很多,好在我懂的东西足够用了。

世界如此之大,几乎所有公司都是公众持股的。

所有的美国公司,随便挑。

首先,有些东西明知道自己不懂,不懂的,不能做。

有些东西是你能看懂的。

可口可乐,是我们都能看懂的,谁都能看懂。

可口可乐这个产品从 1886 年起基本没变过。

可口可乐的生意很简单,但是不容易。

我不喜欢很容易的生意,生意很容易,会招来竞争对手。

我喜欢有护城河的生意。

我希望拥有一座价值连城的城堡,守护城堡的公爵德才兼备。

有的生意,我看不出来十年后会怎样,我不买。

一只股票,假设从明天起纽约股票交易所关门五年,我就不愿意持有了,这样的股票,我不买。

我买一家农场,五年里没人给我的农场报价,只要农场的生意好,我就开心。

我买一个房子,五年里没人给我的房子报价,只要房子的回报率达到了我的预期,我就开心。

人们买完股票后,第二天一早就盯着股价,看股价决定自己的投资做得好不好。

糊涂到家了。买股票就是买公司,这是格雷厄姆教给我的最基本的道理。

买的不是股票,是公司的一部分所有权。

只要公司生意好,而且你买的价格不是高得离谱,你的收益也差不了。

投资股票就这么简单。

要买你能看懂的公司,就像买农场,你肯定买自己觉得合适的。

没什么复杂的。

这个思想不是我发明的,都是格雷厄姆提出来的。

我特别走运。

19 岁的时候,我有幸读到了《聪明的投资者》。

我六七岁的时候就对股票感兴趣,11 岁时第一次买股票。

我一直都在自己摸索,看走势图、看成交量,做各种技术分析的计算,什么路子都试过。

后来,我读到了《聪明的投资者》,书里说,买股票,买的不是代码,不是上蹿下跳的报价,买股票就是买公司。

我转变到这种思维方式以后,一切都理顺了。

道理很简单。

所以说,我们买我们能看懂的公司。

在座的各位,没有看不懂可口可乐公司的,但是某些新兴的互联网公司呢,我敢说,在座的各位,没一个能看懂的。

今年在伯克希尔的股东大会上,我说要是我在商学院教课,期末考试时,我会出这样的题目,告诉学生一家互联网公司的信息,让他们给这家公司估值。

哪个学生给出了估值,我就给他不及格。(笑)

无论什么时候,都要知道自己在做什么,这样才能做好投资。

必须把生意看懂了,有的生意是我们能看懂的,但不是所有生意我们都能看懂。

Q3:能否讲讲您在商业中犯的错误?

巴菲特:对于我和我的合伙人查理•芒格来说,我们犯过的最大的错误不是做错了什么,而是该做的没做。

在这些错误中,我们对生意很了解,本来应该行动,但不知道怎么了,我们就在那犹豫来犹豫去,什么都没做。

有些东西我们不明白就算了,但有些东西是我们能看明白的,本来可以赚几十亿、几百亿的,却眼睁睁看着机会溜走了。

我本来可以买微软赚几十亿,但这不算数,因为我一直搞不懂微软。

但是医药股,我本来是可以赚到几十亿的,这些钱是我该赚到的,我却没赚到。

当克林顿当局提出医疗改革方案后,所有的医药股都崩盘了。

我们本来可以买入医药股大赚特赚的,因为我能看懂医药股,我却没做这笔投资。

至于各位能看到的错误,几年前我买入美国航空优先股是个错误。

当时我手里闲钱很多。手里一有闲钱,我就容易犯错。

查理让我去酒吧喝酒去,别在办公室里待着。

但我还是留在办公室,兜里有钱,就做了傻事。

每次都这样。当时我买了美国航空的优先股。

没人逼我,是我自己要买的。

现在我有一个 800 热线电话,每次我一想买航空股,就打这个电话。

电话那边的人会安抚我。

我说:“我是沃伦,又犯了想买航空公司的老毛病。”

他们说:“继续讲,别停下,别挂电话,别冲动。”最后那股劲就过去了。

我买了美国航空以后,差点把所有钱都亏进去,真是差一点全亏了。

我活该亏钱。

我买入美国航空,是因为它是一只很合适的证券,但它的生意不好。

对所罗门的投资也一样。我根本不想买它的生意,只是觉得它的证券便宜。

这也算是一种错误。

本来不太喜欢公司的生意,却因为喜欢证券的条款而买了。

这样的错误我过去犯过,将来可能还会犯。

最大的错误还是该做的没做。

我想告诉大家,人们总说通过错误学习,我觉得最好是尽量从别人的错误里学习。

不过,在伯克希尔,我们的处事原则是,过去的事就让它过去。

我有个合伙人,查理•芒格,我们一起合作 40 年了,我们从来没红过脸。

我们对很多东西看法不一样,但是我们不争不吵。

我们从来不想已经过去的事。

我们觉得未来有那么多值得期待的,何必对过去耿耿于怀。

不纠结过去的事,纠结也没用。人生只能向前看。

你们从错误里或许能学到东西,但最重要的是只投资自己能看懂的生意。

如果你像很多人一样,跳出了自己的能力圈,听别人的消息买了自己毫不了解的股票,犯了这样的错,你需要反省,要记得只投资自己能看懂的。

你做投资决策的时候,就应该对着镜子,自言自语:“我要用每股 55 美元的价格买入 100 股通用汽车,理由是……”

自己要买什么,得对自己负责。

一定要有个理由,说不出来理由,别买。

是因为别人在和你闲聊时告诉你这只股票能涨吗?

这个理由不行。是因为成交量异动或者走势图发出了信号吗?

这样的理由不行。

你的理由,一定是你为什么要买这个生意。

我们恪守这个原则,这是本•格雷厄姆教我的。

Q4:和身处华尔街相比,住在偏远的小城市有什么好处?

巴菲特:我在华尔街工作过一两年,我在东西海岸都有朋友。

我喜欢拜访他们。每次和他们见面,都能得到一些灵感。

思考投资的最佳方法还是独自一人待在房间里,静静地想。

要是这样不行,别的办法也都没用。

在任何类似市场的环境中,你都很容易受到影响,做出过激的反应,华尔街是个典型的市场环境。

在华尔街,你觉得每天不做点什么都不行。

钱德勒家族花了 2000 美元买下了可口可乐公司,选中了可口可乐这样的公司,别的什么都不用做了,该做的事就是不做别的。

1919 年都不应该卖,但是钱德勒家族后来把他们的股票卖了。

你该怎么做呢?一年找到一个好的投资机会,然后一直持有,等待它的潜力充分释放出来。

在一个人们每五分钟就来回喊报价的环境里,在一个别人总把各种报告塞到你面前的环境里,很难做到持有不动。

华尔街靠折腾赚钱。你靠不折腾赚钱。

要是在座的各位每天都相互交易自己的投资组合,所有人最后都会破产,所有的钱最后都会进到中间商的口袋里。

换个做法,你们都持有一般公司组成的投资组合,50 年里你们都一动不动,最后你们都会很有钱,你们的券商会破产。

券商像这样一个医生,他让你换药的次数越多,他赚的越多。

他要是给你一种药,把你的病根治了,他只能做成一笔买卖,一笔交易,然后就没了。

如果他能让你相信每天换各种药吃对健康有益,这对他有好处,对卖药的有好处,你会亏很多钱。

你的身体好不了,还会破财。

任何刺激你瞎折腾的环境,都要远离。

华尔街无疑就是这样的环境。

我回到奥马哈之后,每半年都去大城市一次。

我每次都列一个清单,把自己要做的事写下来,比如要调研的公司等等。

这些路费都没白花,该做完的事,做完了,我就回到奥马哈思考。

Q5:请讲讲您对分散投资的看法?

巴菲特:这个要看情况了。

如果不是职业投资者,不追求通过管理资金实现超额收益率的目标,我觉得应该高度分散。

我认为 98% 到 99% 的投资者应该高度分散,但不能频繁交易,他们的投资应该和成本极低的指数型基金差不多。

只要持有美国的一部分就可以了,这样投资,是相信持有美国的一部分会得到很好的回报,我对这样的做法毫无异议。

对于普通投资者来说,这么投资是正路。

如果想积极参与投资活动,研究公司并主动做投资决策,那就不一样了。

既然你走上研究公司这条路,既然你决定投入时间和精力把投资做好,我觉得分散投资是大错特错的。

那天我在 SunTrust 的时候,说到过这个问题。

要是你真能看懂生意,你拥有的生意不应该超过六个。

要是你能找到六个好生意,就已经足够分散了,用不着再分散了,而且你能赚很多钱。

我敢保证,你不把钱投到你最看好的那个生意,而是再去做第七个生意,肯定会掉到沟里。

靠第七个最好的主意发家的人很少,靠最好的主意发家的人很多。

所以,我说任何人,在资金量一般的情况下,要是对自己要投资的生意确实了解,六个就很多了,换了是我的话,我可能就选三个我最看好的。

我本人不搞分散。

我认识的投资比较成功的人,都不搞分散,沃尔特•施洛斯是个例外,沃尔特的投资非常分散,他什么东西都买一点。

Q6:如果能重新活一次,为了让生活更幸福,您会怎么做?

巴菲特:希望我的回答,大家听了不会觉得不舒服。要是我重新活一次的话,我只想做一件事,选能活到 120 岁的基因。

我其实是非常幸运的。我经常举一个例子,觉得可能会对各位有启发,所以花两分钟时间讲讲。

假设现在是你出生前 24 小时,一个神仙出现了,他说:“孩子,我看你前途无量,我现在手里有个难题,我得设计你出生后生活的世界,我觉得太难了,你来设计吧。

你有 24 小时的时间,社会规则、经济规则、政府规则,这些都给你设计,你还有你的子孙后代都在这些规则的约束下生活。”

你问了:“我什么都能设计?”

神仙说:“对,什么都能设计。”你说:“没什么附加条件?”

神仙说:“有一个附加条件。

你不知道自己出生后是黑人还是白人,是富有还是贫穷,是男人还是女人,是身体健壮还是体弱多病,是聪明过人还是头脑迟钝。

你知道的就一点,你要从一个装着 58 亿个球的桶里选一个球。”

我把这个叫娘胎彩票。你要从这 58 亿个球里选一个,这是你一生之中最重大的决定,它会决定你是出生在美国还是阿富汗,智商是 130 还是 70。

选出来之后,很多东西都注定了。你会设计一个怎样的世界?

我觉得用这种思维方式可以很好地看待社会问题。

因为你不知道自己会选到哪个球,所以在设计世界的时候,你会希望这个世界能提供大量产品和服务,你希望所有人都能过上好日子。

你会希望这个世界的产品越来越丰富,将来你的子孙后代能越过越好。

在希望世界能提供大量产品和服务的同时,还要考虑到有的人手气太差,拿到的球不好,天生不适合这个世界的体系,你希望他们不会被这个世界抛弃。

我天生非常适合我们现在的这个世界。我一生下来就具备了分配资金的天赋。这其实没什么了不起的。

如果我们都被困在荒岛上,永远回不来,我们所有人里,谁最会种地,谁最有本事。

我再怎么说我多擅长分配资金,你们也不会理我。

我赶上了好时候。

盖茨说,要是我生在几百万年前,早成了动物的盘中餐。

他说:“你跑不快,也不会爬树,什么都不行,刚生下来就得被吃了。你生在今天是走运。”

既然我运气这么好,我就要把自己的天分发挥出来,一辈子都做自己喜欢的事,交自己喜欢的人。

只和自己喜欢的人共事。

要是有个人让我倒胃口,但是和他走到一起,我能赚 1 亿美元,我会断然拒绝,要不和为了钱结婚有什么两样?

无论什么时候,都不能为了钱结婚,要是已经很有钱了,更不能这样了,你们说是不是?我不为了钱结婚。

我还是会一如既往地生活,只是不想再买美国航空了!

谢谢。

Git的故事:这一次没这么好玩

· 50 min read

Linus Torvalds 曾写了一本提到,当初创造 Linux 只是因为好玩,却意外掀起一场革命。Git 是 Linus 的第二代表作,同样也是意外的革命,是现在软体工程师的标配,但至少对 Linus 本人来说,它的起源可就没这么好玩了。

Linus 扩展不了

1998 年是 Linux 风光的一年,许多大公司,如昇阳、IBM 和甲骨文,都纷纷投入 Linux 的业务。那年春天,Linus 的二女儿出生,他们一家从芬兰搬到美国加州也差不多一年,生活步入正轨。虽然 Linux 还尚未给 Linus 带来什么收益,但 Linus 也可算是事业家庭两得意。

反观 Linux Kernel 的开发者社群,随著愈来愈多人加入开发,既有的合作方式开始力不从心。Linus 开始显得没办法跟上开发者们修改程式码的速度,逐渐成为瓶颈。

1998 年 9 月 28 日,Linus 和往常一样,读著 Linux Kernel 邮件列表上的信。

请不要浪费时间送修补了,这些在 vger 上早就修好了。

Linus 看到这句不太高兴。一直以来,Linux 程式码的修改重度仰赖 Linus 本人,Linus 本人就是版本控管。如果你要修改程式码,寄封信到邮件列表上,Linus 看到了并认可,就会将你的修补送进他自己的版本,然后不时在 FTP 上释出新版本。Linus 喜欢这样的合作方式,因为他可以掌控一切变更,大家也信任 Linus,觉得 Linux 本来就该由 Linus 掌控。

但自从 David Miller,一位 Linux Kernel 的资深开发者,架设了一个名为 vger 的 CVS 伺服器,有些人就以为可以绕过 Linus 本人,将变更送到 vger 就没事了。这不是 Linus 第一次遇到同样的问题,他在邮件列表上不悦的回应

“在 vger 上就不要浪费时间”这个说法完全是愚蠢的,因为 vger 上很多东西可能永远都不会进 2.2。

于是几个开发者与 Linus 展开一场激烈的笔战,他们开始陈情,说 Linus 回信太慢,甚至有时候要寄三次才会得到这个“仁慈独裁者”的亲回。

“这些家伙也不照照镜子,”Linus 心想:“我一天要看多少信,如果连寄三次信都嫌麻烦,那这个修补我宁可不要。” Linus 在讨论串留下这个讯息随即怒离:

这次的讨论只是让我烦燥,增加我的压力。走开吧,不要再 CC 我了,我要度假去了,我不要再听到任何有关它的事。总之,滚出我的信箱就对了。

Linus 情绪性的发言反而让一些人开始提出正面的帮助。

开源运动代表人物之一 Eric S. Raymond,著名文章《大教堂和市集》就是他写的。看到 Linus 的怒离文,他冷静地呼吁

各位,这些是职业倦怠的早期征兆。Linus 一直以来的毅心确实令人敬佩,但他也是有极限的。我们所有人(是的,也包括你 Linus)要一起想办法帮这个重要人物减少压力,而不是增加压力。

另一位伸出援手的是 Larry McVoy,在一篇标题为“成长痛的解决方案”的邮件,他这么写:

问题症结在于 Linus 扩展不了(“Linus doesn’t scale”)。我们不能期待 Linus 一个人能跟上 Kernel 变化的速度,我们也不想看到 Linus 失去对 Kernel 的掌控,他已一再证明自己非常适任此职。

(解决方案基本上是)将工作分担给 Linus 身边的几个人,要做到分担,我们要导入新工具。

(这个新工具是)一个分散式版本控管系统⋯⋯

Larry 当时正好在开发一套新的版控软体,叫做 BitKeeper。

BitKeeper 的起源

在 1990 年代早期,昇阳导入了一套名为 Network Software Environment (NSE) 的内部工具来管理程式码,但 NSE 太慢了,使用体验极差,有些工程师甚至为此愤而离职。

Larry McVoy 不仅是个资深的作业系统开发者,过去也做过许多效能相关的工作,所以昇阳的主管就找上了 Larry 来调教一下 NSE 的效能。

Larry 一看 NSE 的程式码吓了一跳,“这东西很多地方当初设计时都没有考量到效能。”他还发现 NSE 的底层其实是 SCCS,SCCS 是 1970 年代的版本控管软体,出现比 CVS 和 Subversion 还早。与其修改体质不良 NSE,Larry 选了另一条路:他用 Perl 写了 NSElite,在 SCCS 之上实作了 resync/resolve 指令,基本上类似现今 Git 的 clone/pull/push 指令。

NSElite 比 NSE 快多了,所以昇阳的工程师一个一个背弃 NSE,改用 NSElite。昇阳某 VP 见状,觉得有商机,就组了一个八人团队,想要用 C++ 重写 Larry 写的 Perl 脚本,将其产品化为 TeamWare

TeamWare 大概是最早的分散式版控系统,后来昇阳 Solaris 作业系统的开发全是借助于它。工程师们用过 TeamWare 都表示回不去了:不同于 CVS 和 Subversion,TeamWare 让你将整个专案复制到你自己的机器,你可以尽情地在本地端提交变更,等到准备好再将你自己本地的版本合并回远端版本。

这八人团队的成员本来是写 C 语言的,当时 C++ 是新的火热语言,他们边学 C++ 边开发 TeamWare。在 TeamWare 还未完成前,Larry 曾尝试继续开发 NSElite,但这无疑是给 TeamWare 团队难堪:一个人用 Perl 竟然比八个人用 C++ 还来得快,VP 见状便告诉 Larry:“这件事已经上报给 Scooter(即 Scott McNealy,昇阳的执行长),如果你再发布一次,你就被解雇了。”

为此,1991 年,Larry 停止 NSElite 的开发,但建造一个分散式版控软体的念头始终在他心中挥之不去。他本来以为会有其他商用软体会跟进 TeamWare 的脚步,但并没有。1997 年 Larry 开始著手开发一款名为 BitKeeper 的分散式版控软体。然而,直到 1998 年 9 月,当他看到邮件列表上 Linus 处于崩溃边缘,这才真正激励他开始认真看待 BitKeeper 这个专案。

Linux Kernel 采用 BitKeeper

1998 年秋天某日,Larry 邀请了 Linus Torvalds、David Miller、Richard Henderson 来家中,吃完晚餐后,他们席地而坐,开始协商对策要如何减少 Linus 的工作量。他们在地板画了三、四个小时的图,这些图大致上就是 TeamWare 在昇阳内部行之有年的运作方式,Larry 对此十分熟悉。

在这个框架中,开发者们可利用 BitKeeper 各自开发,不互相干扰,而且在 Linus 这边做最后整合时,能够不失去修改的历史记录,让 Linus 能看出一个变更的来龙去脉,审查程式码时更容易。

“好吧,如果你做出来,而且跑起来跟你说的一样,我就会用它。”Linus 说道。
“没问题,这我以前做过,大概需要六个月。”Larry 回答。

Larry 马上就意识到他低估了问题的复杂度,所以他成立了一间名为 BitMover 公司,找了几个熟悉版控系统的好手,一起打造 BitKeeper。19 个月后,2000 年 5 月,BitKeeper 公开释出第一版,此时 BitMover 是一个七人团队。

第一版的 BitKeeper 有一个命令列工具 bk,也有一些图形介面的工具。其中 bk clone/pull/push 命令作用有犹如 git clone/pull/push

当时昇阳的 TeamWare 已是有口皆碑,而 BitKeeper 更是 TeamWare 的强化版。例如,TeamWare 只允许在 NFS 档案系统间传递资料,而 BitKeeper 可以走 HTTP 来传输档案,实现了真正的分散。因此不久后,BitKeeper 就为 BitMover 带来充沛的现金流,到了 2002 年,BitMover 团队成长到了 25 人,完全自给自足,没靠外部资金。

Larry McVoy, Linux Expo, 1999

Larry McVoy, Linux Expo, 1999

2002 年 1 月,Linus 工作量太大的问题又再度浮现,开发者送出的修补不是等很久才迟迟回应,不然就是被忽略。有人写了一篇“小小的提议”尝试改善这个问题。讨论串中,有人随口提到“bitkeeper 真是个好工具”,唤醒了三年前,Larry 家中的那顿晚餐,在 Linus 脑中种下的那颗种子。Linus 问道:“有多少人在用 bitkeeper 做 kernel 开发?”

果不其然,当时已经有些 Kernel 开发者早就在使用 BitKeeper。Linux PowerPC (PPC) 团队早在 1999 年 12 月就开始试用 BitKeeper,BitMover 为了帮助他们,架设了 bkbits.net 伺服器。

过没几天,2002 年 2 月 5 日,邮件列表上就看到 Linus 开始在测试 BitKeeper。此后,Linux Kernel 主要开发者们也跟进开始采用 BitKeeper。你不一定要用 BitKeeper 才能参与开发,但如果你是 BitKeeper 的使用者,流程大概是:

<span style="display:flex;"><span><span style="color:#75715e"># 下载仓储(repository)</span>
</span></span><span style="display:flex;"><span>bk clone bk://linux.bkbits.net/linux-2.5 linux-2.5
</span></span><span style="display:flex;"><span>bk clone linux-2.5 alpha-2.5
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 从另一个地方下载变更</span>
</span></span><span style="display:flex;"><span>cd alpha-2.5
</span></span><span style="display:flex;"><span>bk pull bk://gkernel.bkbits.net/alpha-2.5
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 编辑档案并将变更上传回远端</span>
</span></span><span style="display:flex;"><span>bk vi fs/inode.c
</span></span><span style="display:flex;"><span>bk push bk://gkernel@bkbits.net/alpha-2.5
</span></span>

若要将变更送给 Linus,你就再寄封信到邮件列表上,内容大致是:

Here is an update for something something...

Please pull from: bk://gkernel.bkbits.net/alpha-2.5

example/file1.c | 6 ++++++
example/file2.c | 4 ----
2 files changed, 6 insertions(+), 4 deletions(-)
-----

没有免费的 BitKeeper 了

Larry McVoy 让 Linux Kernel 开发者免费使用 BitKeeper,但免费是有代价的。例如,他们的免费用户的使用执照里规定:

  • 你不可以关掉 Open Logging──此机制会将使用纪录传送至 BitMover 伺服器。
  • 如果你从事的是版控软体的业务,你不可以免费使用 BitKeeper。
  • 如果你要让 BitKeeper 和其他同类软体一起运行,你必须征求 BitMover 同意。

Linux 是开源软体的始祖,社群里有很多自由软体的拥护者,对这些条款不是嗤之以鼻,就是敬而远之。可是对 Linus 和主要的 Kernel 开发者来说,重点是 BitKeeper 减轻了他们的工作量,况且当时没有更好的替代工具,他们也就接受 BitKeeper 的使用条款,以换取它的便利。

以 Linus 来说,他对专用软体(proprietary software)一直持开放态度,他当初会选用自由软体 GPL 作为 Linux Kernel 的授权协议,纯粹是因为他不乐见商业市场“玷污”了 Linux,他的方法就是让 Linux 保持开放,而GPL 刚好在那边符合他的需求,他就拿来用了。但他从不觉得所有软体都该走自由软体的路线,他觉得作者有权以任何他想要的方式散布软体,怎么使用软体不应该是社会运动。

自由软体的拥护者可不这么想,比较极端的甚至会认为专用软体都是邪恶的。这群骇客宁可拥有修改软体的自由,也不要 BitKeeper 的“便利”。

Larry 备受来自社群的压力,为解决此问题,BitKeeper 团队在 2003 年架设了一个 BitKeeper 至 CVS 的镜像,让那些不想装 BitKeeper 的人,也可以透过 CVS 来取得程式码的修改历史。但从 CSV 取得的历史资料和 BitKeeper 上的并不完整,人们还是不满意:“为什么我们的资料要被锁在 BitKeeper 的专用格式里,而且还明文禁止我们用其他程式去读取我们自己的资料?”

有鉴于此,Samba 和 rsync 的作者,澳洲程式设计师 Andrew Tridgell(简称 Tridge),在 2005 年 2 月开始著手写一个免费的 BitKeeper 客户端程式,要解决自由软体用户面临的问题。

Tridge 做了以下尝试。

“这里有一个 BitKeeper 位址,bk://thunk.org:5000,用 telnet 连上去试试看。”

$ telnet thunk.org 5000
Trying 69.25.196.29...
Connected to thunk.org.
Escape character is '^]'.

“连上去了,何不输入 help 命令?”

help
? - print this help
abort - abort resolve
check - check repository
clone - clone the current repository
help - print this help
httpget - http get command
[...]

“BitKeeper 伺服器居然这么好心,列出所有指令。”
“所以 clone 应该就是下载仓储用的指令吧?”

他接著输入 clone,发现输出仅是一连串 SCCS 格式的档案。至此,“反向工程”的工作已大功告成,剩下的只是把程式写出来。

不知 Linus 是从何得知 Tridge 在干的事,或许是 Tridge 自己私下告诉他的。总之,Linus 得知后就将这件事告诉他的好朋友 Larry。Larry 听到后无法接受,因为一个免费的第三方客户端会毁了 BitKeeper 的商业模式,于是 Larry 连手 Linus 和时任 OSDL(即现在的 Linux 基金会)执行长的 Stuart Cohen,要求 Tridge 停手。

Stuart Cohen 选择冷处理,觉得这不关 OSDL 的事。但 Linus 非常不想失去 BitKeeper,所以很努力地居中调解,试著找到出双方都能接受的折衷方案。Tridge 坚定地认为他没错,他甚至认为有一个第三方客户端对 BitKeeper 和 Kernel 开发者们是双赢 。他在 2005 年 4 月在 Freshmeat(后来并到 SourceForge)发布 SourcePuller,里面的 README 文件写道:

有一个开源的客户端本应是一大进步,BitMover 可以在商业环境继续成长,自由软体社群也能使用并从中受益。

BitMover 有权为 BitKeeper 制定使用规范。当然,BitMover 这样描绘我,我很失望。但请理解他们承受了很大的压力,而在压力大的情况下,人们会说错话。

Larry 不认同这会是双赢,支持 Kernel 的开发是要成本的,没收钱的就算了,还可能会违害到既有的商业模式,所以为了维护 BitMover 的生计,他选择撤下 BitKeeper 的免费使用执照。

Linus 交涉了几个礼拜,也不想再当和事佬了。这下没有免费的 BitKeeper 可以用,Linus 怒了,他公开在论譠上责备 Tridge,说他“破坏别人的创新”、“恶搞别人”。当然,Linus 大可付钱,但他没办法要求其他 Kernel 开发者也付钱使用 BitKeeper,所以他必须另辟途径。贴文中他写道:

现在,我得收拾善后。因为最好的版控工具不能用了,我会自己写一个给 Kernel 用。但没关系──我自己的问题,我自己解决,谢谢你了(Tridge)。

2005 年 4 月 6 日,Linus 在邮件列表上宣布 Linux Kernel 与 BitKeeper 要分手的消息。他首先感谢 Larry 和他团队这三年来的帮助。接著他说他会离线一个礼拜,找出一个替代方案。最后他提到:

用不著跟我说 subversion 了,如果你真的想给建议,去看看 monotone,它应该是最可行的替代方案。

Monotone

Monotone 的原作者是 Graydon Hoare。2001 年,住在加拿大的 Graydon 和他澳洲朋友为了让跨时区合作更容易一些,他们打造了一个类似现在的持续整合(CI)系统(当时 CI 还不是显学),确保程式码无时无刻都通过测试。

2002 年,Graydon 开始对版本控管结合 CI 产生兴趣,当时他找到只有 Aegis 有这样的概念。同时,Graydon 又看到朋友使用 BitKeeper,他想到 Aegis 结合分散式版控应该是不错的机会,Monotone 就此应运而生。

值得一提,Graydon 后来加入 Mozilla,并创造了 Rust 程式语言。

好巧不巧,Linus 挑了一个坏的时机点来把玩 Monotone。原本 Monotone 0.7 性能还算快,但自 0.14 开始,Monotone 的开发者开始加入许多验证机制。就在 Linus 下载 Monotone 前,原作者 Graydon 发布 0.17 后就跑出度假了,里头加了一堆严谨的检查程式码,以确保资料写入资料库前是正确的,但这些程式码尚未优化,反而拖慢了性能。在 0.17 的发布纪录提到

pull 命令可能会非常慢,而且占用很多 CPU

有人测试用 Monotone 下载它自己,竟然花了两小时,其中 71 分钟是 CPU 时间。“没有腿的树懒可能都比它快。”那位人士如此形容

Linus 向 Monotone 的开发者回报性能问题。2005 年 4 月 10 日,Monotone 0.18 释出,许多操作都至少快了一倍。虽然 Linus 也名列在 0.18 的贡献名单中,但根据 Monotone 开发者之一 Nathaniel Smith 的说法

Linus 其实没有对 Monotone 贡献过任何程式码,或者据我所知,他也没有对 git 以外的任何版控软体贡献过程式码。除了“这太慢了!”之外,他也没有提出什么实质建议 ;-)。他之所以名列为贡献者,是因为在与他的讨论中,我找到了一个测试案例,追踪到一个重大性能瓶颈。我曾犹豫是否应该把他的名字列上去,因为这可能会让人产生奇怪的想法,但我想,如果是其他人我也会这么做,所以⋯⋯(耸肩)。

与此同时,受到 Monotone 的设计启发,Linus 也从零开始,开始著手写了一些 C 程式码。

Git v0.01 初探

2005 年 4 月 7 日,Linus 上传了一个名叫 Git 的东西,他在邮件列表写道

这边有一个小小的挑战要给疯狂的骇客们,如果你有想玩玩看很乱(但非常快)的东西,看一下 kernel.org:/pub/linux/kernel/people/torvalds/

第一个将 sparse-git 的变更纪录树寄给我的,将会得到一个金色星星和公开表扬,我在里头放了很多线索。

这是 Linus 第一次在公开场合提到 Git。

该网址有以下档案和目录:

git.git/                  09-Apr-2005 16:09    -
sparse.git/ 07-Apr-2005 20:07 -
git-0.01.tar.bz2 07-Apr-2005 14:25 39K
git-0.01.tar.bz2.sign 07-Apr-2005 14:25 248
git-0.01.tar.gz 07-Apr-2005 14:25 40K
...
sparse-git.tar.bz2 08-Apr-2005 17:26 15M

git-0.01.tar.bz2 里的 C 程式码加起来大约 1000 行:

---------------------------------------------------------------------
File blank comment code
---------------------------------------------------------------------
./read-cache.c 31 14 219
./update-cache.c 32 23 198
./commit-tree.c 23 26 128
./show-diff.c 8 5 73
./cache.h 17 23 53
./write-tree.c 11 7 53
./read-tree.c 4 5 39
./init-db.c 4 14 38
./Makefile 14 0 26
./cat-file.c 2 5 21
---------------------------------------------------------------------
SUM: 146 122 848
---------------------------------------------------------------------

有别于现在的 Git 有一个单一执行档 git,Linus 最早上传的 Git ,编译后会产生七个独立执行档:

  • init-db
  • update-cache
  • show-diff
  • write-tree
  • read-tree
  • commit-tree
  • cat-file

init-db 做的事情很单纯,它会在当前目录下建立一个名为 .dircache/objects 的目录,然后在 .dircache/objects 里,再建立 256 个以十六进位数字编号的子目录,依序为 00, 01, 02, …, 0f, 10, …, ff

.dircache/objects 目录代表著一个物件资料库,物件的种类有:

  • 二进位资料(blob)──即档案内容。
  • 树(tree)──即目录,本质上是一些档案(二进位资料)和目录(树)的名称。
  • 变更集(changeset)──由两棵树的名称定义而成,意义上代表的是 A 树变更成为了 B 树。“变更集”是 Git 早期的用词,之后成为“提交”(commit)。

这里物件的名称不是档名或目录名,而是物件内容压缩后的 SHA-1 杂凑。这个设计是 Linus 从 Monotone 学来的,差别在于 Monotone 底层使用 SQLite 储存 SHA-1 物件名称和内容,而 Linus 选择直接使用系统呼叫和档案系统。

SHA-1 几乎具有唯一性,因此我们可以假设 Git 资料库中不会有两个不同名、但相同内容的物件。假如有个物件的名称是 ba93e701c0fe6dcd181377068f6b3923babdc150,Git 就会将它储存在 .dircache/objects/ba/ 目录下,一个名为 93e701c0fe6dcd181377068f6b3923babdc150 的档案。

这七个执行档就是以这个“内容可定址”(content-addressable)档案系统为中心的七种操作。例如:

  • write-tree 建立一个树物件,即将某个时间点树的样子写到资料库。
  • commit-tree 建立一个变更集,即在资料库中连结两棵树,类似现今的 git commit 命令。
  • update-cache 加一个档案到 .dircache/index 索引中,类似现今 git add 将档案加到预存区(staging area)。

Linus 当时看到 Monotone 是如何利用 SHA-1 为物件命名,就立刻爱上这个点子,原因无他,就是“简单”二字。“简单”也是 Linus 欣赏 Unix 的原因。在《只是为了好玩》一书,他这么形容 Unix:

Unix 让我(和大多数人)著迷的地方,就是它简单的设计。在 Unix 中,几乎所有事都可以用六个基本操作(称为“系统呼叫”)来完成。

它给你几种不同形状的积木,足以用来建造所有东西,干净的设计就该是这个样子。

Git 也是如此,它的资料模型比 CSV、Subversion、BitKeeper 都要简单。它储存的东西基本上就是改变前和改变后的树,如此而已。它没有在管哪个档案、在哪一行做了什么改变,它也不需要,因为改变前后的树就埋有这些资讯。

Linus 用两天写出来的 Git 原型,功能简单,没有多馀的验证,没有关联式资料库,只有 C 程式码、SHA-1 杂凑、系统呼叫,完全针对 Linus 自己的需求订制。而 Monotone 专案当时迈入第三年,功能完善,还要应付各种场合需求。再加上 Monotone 原作者 Graydon 加了一堆未优化的程式码后跑去度假,家里没大人。因此在速度上,Monotone 当时自然是比不过 Git 。

Linus 当初上传的档案 sparse-git.tar.bz2,应该是史上第一个 Git 仓储。Sparse 是 Linus 于 2003 年写的一个 C 语言的静态分析器。如果你还对 Linus 出的挑战题有兴趣,sparse-git.tar.bz2 解压缩后稍微修改就可以用现今的 git log 命令去读取变更纪录:

# 假设你在 sparse-git 目录下
mv .dircache .git
mkdir .git/refs
git log

Git 早期贡献者

初版 Git 引来热烈讨论,过没几天,Linus 就开设了 Git 专用的邮件列表,这让 Linux Kernel 邮件列表能够稍微回归正题。头一个月,Git 邮件列表就出现了约 2600 则讯息,而 Linux Kernel,史上合作人数最多的软体专案,同期每月有 7000-9000 则讯息。

对在版本控管领域耕耘已久的专家们来说,Git 只是“另一个专案”,因为 Linus 最初上传的 Git 只有一些低阶操作,连 clone 和 merge 的命令都没有,离真正可用的版控软体还差得远。而 Linus 在说 Git 多快多棒时,无意间贬低了其他版控软体,这让以 BitTorrent 闻名的 Bram Cohen 很不满意,杠上 Linus

Bram 当时正在推广他自己的同类产品 Codeville。Codeville 在当时已经是个成熟的版控软体,媲美 Monotone,并且内建十分聪明的合并演算法。看到 Linus 如何与 Git 的早期追随者讨论合并演算法,Bram 觉得 Linus 根本就是门外汉在重造轮子,称 Git 只是个“周末小专案”。

Bram 说的有道理,但这个小专案不是一般人的小专案,它是 Linus Torvalds,Linux Kernel 创始人的小专案。身为开源软体界的民间英雄,Linus 的一举一动都是万众瞩目,年轻开发者景仰他,视他为榜样。因此在 Linus 上传 Git 后,随即吸引到一群新血参与讨论和开发。

其中一个早期贡献者是来自捷克的 Petr Baudis。Linus 宣布 Git 的消息当天,Petr 就下载了程式码,为之著迷,并开始贡献。首先,鉴于早期的 Git 很难用,Petr 在 Git 的基础上开发了 git-pasky(pasky 是 Petr 的别名),这个专案后来成为 Cogito。如果将 Git 的基础是水管工程(plumbing),Cogito 就是陶瓷(porcelain)马桶和洗手台,它将 Git 包装得更容易使用。

在软体开发用语中,将低阶基础建设比喻成水管工程的用法已不可考,但“陶瓷”一词用来指高阶的包装工作最早起源自 Git 邮件列表。至今,Git 内部仍使用 plumbing 和 porcelain 二词来称呼低阶和高阶命令。

此外,Petr 还架设了 Git 第一个专案首页 git.or.cz,以及源码托管服务 repo.or.cz。这两个网址一直算是 Git 的“官方”网站──直到 GitHub 取代了它们。

Petr 是从外部贡献,在 Git 基础之上向上堆叠,向外架设服务。另一个早期贡献者,滨野纯(Junio Hamano)则是从内部切入,直接贡献 Git 本身。后来他是更从 Linus 手上接下 Git 维护人的工作,直到今天。

接班人

滨野纯(Junio Hamano)是一个来自日本的软体工程师。大概是 1995 年,毕业后工作不到一年,他就被他任职的公司 Twin Sun 派到洛杉矶,从此在美国定居。在那里,他遇到了当时也在同公司工作的 Paul Eggert。

Paul Eggert 维护过许多自由或开源软体专案,包括 RCS(一个更早的版控软体)和 Tar。目前,他是 UCLA 大学的教授,也是时区资讯资料库的维护人。

滨野纯受到 Paul 的影响,对开源软体的世界产生兴趣。尽管他并非 Kernel 开发者,他仍订阅了 Linux Kernel 等开源专案的邮件列表,纯粹因为好玩

2005 年 4 月,滨野纯在邮件列表上看到 Linux Kernel 与 BitKeeper 要分手的消息。滨野纯一直想要在开源软体界大展身手,而这个叫做 Git 的东西便是个好机会──全新专案,没有历史包袱,好上手。他下载了压缩档,花了约两个小时,一口气读完 Git 初代程式码,发现写得很漂亮,感到由衷佩服。

初版 Git 出现后,Linus 马上又加入了提交(commit)和检视差异(diff)的命令,但还没有合并(merge)的功能。

Linus 之前没有写过版控软体,但他用过三年的 BitKeeper,在那之前,他更有十年“版控人体”的经验,他知道自己想要的合并演算法应该长什么样。但合并的逻辑较为复杂,Linus 觉得可能使用脚本语言会比较合适,他写道

我一直在避免做 merge-tree,因为我希望有其他人来做我所描述的。我不擅长写脚本语言,这东西用 C 语言来写会很冗长,所以没意义。

过了一星期,谁也没上钩。滨野纯刚好正值两个专案的空窗期,有多馀时间,于是他用 Perl 把 Linus 想要的东西写出来,发布到邮件列表上。

我现在有一个 Perl 脚本利用了 rev-tree、cat-file、⋯⋯还有 merge(从 RCS 来的),又快又脏。

滨野纯大概从他的导师 Paul 那边有学到一些 RCS 的知识,对版控软体略懂。在邮件中,他还详细写了大约 30 个测试用例,涵盖各种分支情况。

当时已是深夜一点,而小孩早上七点起床,所以 Linus 平常十点就睡了。但看到滨野纯的 Perl 脚本,Linus 龙心大悦,忍不住回复

这就是我想要的,“又快又脏”才会让事情有进展。

他热切地继续与滨野纯讨论。

和 git-pasky 合并 II”这个讨论串原本是 Petr 问 Linus 要不要合并他的版本,后来离题变成讨论合并演算法,其间 Linus 也向众人解译为什么 Git 底层不需要处理档案改名。

从 4 月 14 日半夜的往后 48 小时,滨野纯与 Linus 在该讨论串上通了十几封信。滨野纯耐心的修改程式码,要做到 Linus 心目中的合并。字里行间不难发现滨野纯是 Linus 的忠实粉丝。例如,滨野纯会引用 Linus 四年前说过的金句“我永远是对”,也会适度地拍 Linus 的马屁。

在 4 月 16 日半夜,Linus 突然灵机一动,说他想到一个“狡滑的计划”。

该死,我的狡滑计划真是好东西。

或者也许因为它狡猾了,连我自己都感到困惑。但看起来它确实有效,而且几乎能瞬间完成合并。

Linus 巧妙的重用既有的索引,在其上引入了“阶段”的概念,大幅简化合并演算法的实作。

看到 Linus 的解法,滨野纯赞叹

我很喜欢这个解法,它非常简单、干净、灵活,而且优雅。这是那种我会心甘情愿地说“天啊!为什么我之前没想到!!!”的东西。

这意味著滨野纯之前写的 Perl 程式码将沦为白工,但新的解法实在太漂亮,滨野纯心服口服。

合并演算法只是个开端,之后滨野纯陆续向 Linus 贡献更多修补,逐渐赢得 Linus 的信任。

Linus 曾说过他不会长期维护 Git,等到时机成熟,他会将 Git 交给别人,然后回去做他的 Linux Kernel 本业。滨野纯是最明显的人选,Linus 欣赏他写程式的“好品味”。于是,三个多月后,7 月 26 日,Linus 宣布将 Git 维护人的工作交棒给滨野纯。

滨野纯也贴了一篇公告

正如有些人在 Linus 宣布之前似乎已经注意到的那样,kernel.org 上的官方 GIT 仓储现在由我拥有。如同 Linus 在他的讯息中所说,这并不意味著他要离开我们,所以请不要惊慌。

我也要感谢 Twin Sun(我的雇主)和 NEC,他们承诺将支持我以兼职方式开发 GIT。我预计每周会有 8 到 12 小时的工作时间,晚间和周末仍然是我的自由时间。我暂定的计划是将星期三和星期六作为主要的 GIT 工作日。

之前,每当想到一个点子,我就把修补丢邮件列表上,看哪个能被接受,完全依赖上游某个有好品味的人来筛选掉不好的。虽然这样和 Linus 一起工作很有趣,但遗憾的是,我浪费了他很多时间。

从今开始,身为“主仓储的牧羊人”,我会放慢速度,变得更加谨慎。至少目前,你会看到我的修补会像其他人一样,在进入主仓储之前,先在邮件列表上发布。

后来,在滨野纯的带领下,Git 1.0.0 正式在 12 月 21 日释出。19 年后的今天(本文发布于 2024 年 7 月),滨野纯任职于谷歌,至今他仍是 Git 的维护人。

本文提及 Linus 的次数比滨野纯多,不过 Git 之所以是现在的样子,最大功臣还是默默耕耘多年的滨野纯和其他开发者。“1% 的天分加上 99% 的努力”或许是老梗,但在 Git 与 Linux Kernel 等成功专案里都是事实。

GitHub 与 Ruby 人

虽然 Git 在早期引来不少关注,但仍是小众。2006 年 1 月,X Window System 团队放弃 CVS,改用 Git,滨野纯得知后还感到很惊喜,他没料到像 X Window System 这像的大专案会愿意大费周章转换版控系统。

自 BitKeeper 之后,分散式版管系统如雨后春笋般冒出,除了 Monotone 之外,还有 Mercurial、Darcs、Bazaar、Arch、Fossil 等。声势最不容小覻的是 Mercurial,作者 Olivia Mackall 晚了 Git 几天发布它,但功能已比当时的 Git 完整,而且更为使用者友善,之后更有 Google Code 和 BitBucket 的背书。总之,版控市场犹如战国时代,每家都占有一席之地。

真正把 Git 推上巅峰、变成主流的是 GitHub。或者根据 Linus 所述,是 Ruby 人,一群奇怪的人,让 Git 一夕爆红。

2007 年 2 月,Git 1.5 释出,Git 总算变得好用一点。当时在旧金山的 Ruby 聚会口耳相传著 Git 这个“新”东西。而 GitHub 的共同创办人 Tom Preston-Werner,最早是从他的同事 Dave Fayram 听到 Git。Tom 认为 Dave 是在 Ruby 社群传播 Git 的“零号病人”。

尽管在 Ruby 社群中 Git 广受好评,但当时唯一一家 Git 托管服务是 Petr Baudis 的 repo.or.cz,它功能阳春。例如,你的程式码在上面只能公开,没有私人仓储的选项。Tom 觉得其中大有商机。

2007 年,社群媒体当道,Facebook、YouTube、Twitter 都先红了一波。Tom 萌生了一个名叫 GitHub 的点子:一个给程式设计师用的社群媒体,一个让程式设计师分享 Git 仓储,交流意见的集散地(hub)。

2007 年 10 月某天,Tom 在一间旧金山的运动酒吧遇到 Chris Wanstrath。他们之前在 Ruby 聚会上认识,但不算熟识。Tom 主动向 Chris 打了招呼,他们聊了起来,Tom 谈起 GitHub 这个点子。Chris 听到后觉得有趣,就同意加入了。

当时 Tom 和 Chris 都还有正职工作,所以他们每晚和星期六用来开发 GitHub。Tom 设计介面,并使用一个名为 Grit 的 Ruby 套件来操作 Git 仓储;Chris 则使用 Ruby on Rails 开发网站。

三个月后,他们开始发送邀请给朋友们试用 GitHub。2008 年 2 月,第三个共同创办人 PJ Hyett 加入。4 月 10 日,GitHub 正式开站,它的副标题是 Social Code Hosting。

GitHub,2008 年 8 月

GitHub,2008 年 8 月

Ruby 的杀手级应用 Rails,在 GitHub 开站前夕就从 Subversion 移到了 GitHub,这无疑是帮 Git 在 Ruby 社群注入更大量的强心针。因为当时在写 Ruby 的人,八成都是在开发 Rails 应用。看到自己赖以为生的框架也用 GitHub ,更多 Ruby 人也欣然跟随。

Git 与 GitHub 有冲突的合并

Scott Chacon 不是一个寻常的 Git + Ruby 人,除了写 Ruby 程式外,他还是一个出色的讲师/写手/传道者。他会录制影片、写文件,教大家怎么使用 Git。不只如此,他对 Git 内部运作也有深入研究,曾经写过《Git Internals》这本电子书。

三年来,Git 的“官方”首页一直是 Petr Baudis 在 2005 年架设的 git.or.cz,而 Scott 想设计一个更为新手友善的 Git 首页。2008 年 7 月,他将 git.or.cz 上的内容整理过后,开设了一个新的首页 git-scm.com,并在 Git 邮件列表上询问 Git 核心开发成员(尤其是 Petr)的意见。

Git 在 Ruby 社群里虽然已流行了一阵子,但 Git 邮件列表上却鲜少出现 Ruby 人的踪迹。Git 核心开发成员,大部分是资深的 C 程式设计师,出没在邮件列表;而 Ruby 人,大部分是年轻一代的网页开发者,出没在实体聚会、网页式的论譠及 GitHub,搞不好一辈子都没用过邮件列表。两个族群互不来往,而 Scott 在 Git 邮件列表上那篇关于 git-scm.com 的讯息,是两个族群早期的少数几次接触之一。

另一个让 Git 核心成员伤脑筋的地方是 Tom 未经讨论,擅自用 Erlang 客制 Git Daemon,以满足 GitHub 单方面的需求。这是因为第一,Tom 对 C 语言不熟;第二,在邮件列表张贴讯息是一件吓人的事,列表上都是比你聪明的人,如果你写的东西没好好断行,就会看起来像个白痴。这过程实在太缓慢了,Tom 才会自己来。

git-scm.com 上有一个“托管由 GitHub 赞助”的标语,于是就有人质疑 Scott 背后的动机不单纯,也有人借此表达 GitHub 用 Git 赚钱,Git 核心开发者却分不到一杯羹的不满。但整体来说,正面回应居多,最终 git-scm.com 成为 Git 的官方首页,git.or.cz 功成身退。

Tom 是在某次 Ruby 聚会认识 Scott 的,当时 Tom 心想:“这家伙未来不是强大的盟友,就是危险的对手。”2008 年 10 月,Scott 加入 GitHub,继续他的 Git 传道之路。他写更多文件,提供顾问服务,到其他公司教大家使用 Git。他还写了一本书《Pro Git》,为 Git 官方推荐书。GitHub 的大外宣策略骤效了,它成功将 Git 发扬光大到 Ruby 以外的社群,GitHub 自己就是最大受惠者。

2008 年 10 月,谷歌赞助了第一届 GitTogether 会议,Git 和 GitHub 两组人马 20 馀人齐聚在谷歌总部山景城。他们放下之前的成见,因为他们很清楚,合作才会让彼此变得更强大。

GitTogether 2008

GitTogether 2008

后记

无法与 Git 和 GitHub 竞争,BitKeeper 后来被迫退出市场,它的团队在 2016 年将其程式码开源。这个祖父级的版控软体,曾经是 Git、Mercurial、Monotone 等软体的灵感来源,如今成了历史文物,供人观赏与研究。被问到有何感想,Larry McVoy 这么回应

事后诸葛亮最简单了。BitKeeper 的生意经营得很好,我们运营了 18 年,赚的钱足够让我和我的商业伙伴退休,不过还不够让每个人都可以选择退休。

我们曾经有一个类似 github 的服务,现在看来我们应该投入大量资金到那个服务,然后开源 BitKeeper。

我只能说,当你已经有一个金鸡母,要割舍它是很困难的。

早知道、早该、早会,我最大的遗憾不是钱,而是 Git 是个糟糕的版本控管系统。它让我抓狂的是,它的模型只是个压缩档伺服器。甚至 Linus 也曾向我承认这个设计很烂。它满足了 Linus 的需求,但他的需求不代表这是这个世界所需要的。

现在,Larry 享受他的退休生活,他平时喜欢和他的孩子们出海钓鱼。

Stack Overflow 在 2022 的调查中,Git 市占率高达 94%,以至于隔年 Stack Overflow 干脆放弃问大家用什么版控系统。

历史上从来没有一个版控软体能如此称霸市场,下一个能取代 Git 的会是什么?不少人说可能会与 AI 有关,但没人说得准,不过可以确信的是,过程中一定会有一连串的偶发事件和一群杰出的骇客。

卖米

· 19 min read

天刚蒙蒙亮,母亲就把我叫起来了:“琼宝,今天是这里的场,我们担点米到场上卖了,好弄点钱给你爹买药。”

我迷迷糊糊睁开双眼,看看窗外,日头还没出来呢。我实在太困,又在床上赖了一会儿。

隔壁传来父亲的咳嗽声,母亲在厨房忙活着,饭菜的香气混合着淡淡的油烟味飘过来,慢慢驱散了我的睡意。我坐起来,穿好衣服,开始铺床。

“姐,我也跟你们一起去赶场好不好?你买冰棍给我吃!”

弟弟顶着一头睡得乱蓬蓬的头发跑到我房里来。

“毅宝,你不能去,你留在家里放水。”隔壁传来父亲的声音,夹杂着几声咳嗽。

弟弟有些不情愿地冲隔壁说:“爹,天气这么热,你自己昨天才中了暑,今天又叫我去,就不怕我也中暑!”

“人怕热,庄稼不怕?都不去放水,地都干了,禾苗都死了,一家人喝西北风去?”父亲一动气,咳嗽得越发厉害了。

弟弟冲我吐吐舌头,扮了个鬼脸,就到父亲房里去了。

只听见父亲开始叮嘱他怎么放水,去哪个塘里引水,先放哪丘田,哪几个地方要格外留神别人来截水,等等。

吃过饭,弟弟就找着父亲常用的那把锄头出去了。我和母亲开始往谷箩里装米,装完后先称了一下,一担八十多斤,一担六十多斤。

我说:“妈,我挑重的那担吧。”

“你学生妹子,肩膀嫩,还是我来。”

母亲说着,一弯腰,把那担重的挑起来了。

我挑起那担轻的,跟着母亲出了门。

“路上小心点!咱们家的米好,别便宜卖了!”父亲披着衣服站在门口嘱咐道。

“知道了,你快回床上躺着吧。”母亲艰难地把头从扁担旁边扭过来,吩咐道,“饭菜在锅里,中午你叫毅宝热一下吃!”

赶场的地方离我家大约有四里路,我和母亲挑着米,在窄窄的田间小路上走走停停,足足走了一个钟头才到。

场上的人已经不少了,我们赶紧找了一块空地,把担子放下来,把扁担放在地上,两个人坐在扁担上,拿草帽扇着。

一大早就这么热,中午就更不得了,我不由得替弟弟担心起来。

他去放水,是要在外头晒上一整天的。

我往四周看了看,发现场上有许多人卖米,莫非他们都等着用钱?

场上的人大都眼熟,都是附近十里八里的乡亲,人家也是种田的,谁会来买米呢?

我问母亲,母亲说:“有专门的米贩子会来收米的。他们开了车到乡下来赶场,收了米,拉到城里去卖,能挣好些哩。”

我说:“凭什么都给他们挣?我们也拉到城里去卖好了!”其实自己也知道不过是气话。

果然,母亲说:“咱们这么一点米,又没车,真弄到城里去卖,挣的钱还不够路费呢!早先你爹身体好的时候,自己挑着一百来斤米进城去卖,隔几天去一趟,倒比较划算一点。”

我不由心里一紧,心疼起父亲来。

从家里到城里足足有三十多里山路呢,他挑着那么重的担子走着去,该多么辛苦!就为了多挣那几个钱,把人累成这样,多不值啊!

但又有什么办法呢?家里除了种地,也没别的收入,不卖米,拿什么钱供我和弟弟上学? 我想着这些,心里一阵阵难过起来。

看看旁边的母亲,头发有些斑白了,黑黝黝的脸上爬上了好多皱纹,脑门上密密麻麻都是汗珠,眼睛有些红肿。

“妈,你喝点水。”

我把水壶递过去,拿草帽替她扇着。

米贩子们终于开着车来了。他们四处看着卖米的人,走过去仔细看米的成色,还把手插进米里,抓上一把米细看。

“一块零五。”

米贩子开价了。

卖米的似乎嫌太低,想讨价还价。

“不还价,一口价,爱卖不卖!”

米贩子态度很强硬,毕竟,满场都是卖米的人,只有他们是买家,不趁机压价,更待何时?

母亲注意着那边的情形说:“一块零五?也太便宜了,上场还卖到一块一呢。”

正说着,有个米贩子朝我们这边走过来了。

他把手插进大米里,抓了一把出来,迎着阳光细看着。

“这米好咧!又白又匀净,又筛得干净,一点沙子也没有!”母亲堆着笑,语气里有几分自豪。 的确,我家的米比场上哪个人卖的米都要好。

那人点了点头,说:“米是好米,不过这几天城里跌价,再好的米也卖不出好价钱来。一块零五,卖不卖?”

母亲摇摇头:“这也太便宜了吧?上场还卖一块一呢。再说,你是识货的,一分钱一分货,我这米肯定好过别家的!”

那人又看了看米,犹豫了一下,说:“本来都是一口价,不许还的,看你们家米好,我加点,一块零八,怎么样?”

母亲还是摇头:“不行,我们家这米,少说也要卖到一块一。你再加点?”

那人冷笑一声,说:“今天肯定卖不出一块一的行情,我出一块零八你不卖,等会散场的时候你一块零五都卖不出去!”

“卖不出去,我们再担回家!”那人的态度激恼了母亲。

“那你就等着担回家吧。”那人冷笑着,丢下这句话走了。

我在旁边听着,心里算着:一块零八到一块一,每斤才差两分钱。

这里一共150斤米,总共也就三块钱的事情,路这么远,何必再挑回去呢?我的肩膀还在痛呢。 我轻轻对母亲说:“妈,一块零八就一块零八吧,反正也就三块钱的事。再说,还等着钱给爹买药呢。”

“那哪行?”母亲似乎有些生气了,“三块钱不是钱?再说了,也不光是几块钱的事,做生意也得讲点良心,咱们辛辛苦苦种出来的米,质量也好,哪能这么贱卖了?”

我不敢再说话,我知道种田有多么累。

光说夏天放水,不就把爹累得病倒了?

弟弟也才十一二岁的毛孩子,还不得找着锄头去放水!

毕竟,这是一家人的生计啊!

又有几个米贩子过来了,他们也都只出一块零五。有一两个出到一块零八,也不肯再加。 母亲仍然不肯卖。

看看人渐渐少了,我有些着急了。

母亲一定也很心急吧,我想。

“妈,你去那边树下凉快一下吧!”我说。

母亲一边擦汗,一边摇头:“不行,我走开了,来人买米怎么办?你又不会还价!” 我有些惭愧。

“百无一用是书生”,虽然在学校里功课好,但这些事情上就比母亲差远了。

又有好些人来买米,因为我家的米实在是好,大家都过来看,但谁也不肯出到一块一。 看看日头到头顶上了,我觉得肚子饿了,便拿出带来的饭菜和母亲一起吃起来。 母亲吃了两口就不吃了,我知道她是担心米卖不出去,心里着急。

母亲叹了口气:“还不知道卖得掉卖不掉呢。” 我趁机说:“不然就便宜点卖好了。” 母亲说:“我心里有数。” 下午人更少了,日头又毒,谁愿意在场上晒着呢。 看看母亲,衣服都粘在背上了,黝黑的脸上也透出晒红的印迹来。 “妈,我替你看着,你去溪里泡泡去。” 母亲还是摇头:“不行,我有风湿,不能在凉水里泡。你怕热,去那边树底下躲躲好了。” “不用,我不怕晒。” “那你去买根冰棍吃好了。”

母亲说着,从兜里掏出两毛钱零钱来。 我最喜欢吃冰棍了,尤其是那种叫“葡萄冰”的最好吃,也不贵,两毛钱一根。 但我今天突然不想吃了:“妈,我不吃,喝水就行。” 最热的时候也过去了,转眼快散场了。 卖杂货的小贩开始降价甩卖,卖菜,卖西瓜的也都吆喝着:“散场了,便宜卖了!” 我四处看看,场上已经没有几个卖米的了,大部分人已经卖完回去了。 母亲也着急起来,一着急,汗就出得越多了。

终于有个米贩子过来了:“这米卖不卖?一块零五,不讲价!” 母亲说:“你看我这米,多好!上场还卖一块一呢……” 不等母亲说完,那人就不耐烦地说:“行情不同了!想卖一块一,你就等着往回担吧!” 奇怪的是,母亲没有生气,反而堆着笑说:“那,一块零八,你要不要?” 那人从鼻子里哼了一声,说:“你这个价钱,不是开场的时候也难得卖出去,现在都散场了,谁买?做梦吧!” 母亲的脸一下子白了,动着嘴唇,但什么也没说。

一旁的我忍不住插嘴了:“不买就不买,谁稀罕?不买你就别站在这里挡道!” “哟,大妹子,你别这么大火气。” 那人冷笑着说,“留着点气力等会把米担回去吧!” 等那人走了,我忍不住埋怨母亲:“开场的时候人家出一块零八你不卖,这会好了,人家还不愿意买了!” 母亲似乎有些惭愧,但并不肯认错:“本来嘛,一分钱一分货,米是好米,哪能贱卖了?出门的时候你爹不还叮嘱叫卖个好价钱?”

“你还说爹呢!他病在家里,指着这米换钱买药治病!人要紧还是钱要紧?” 母亲似乎没有话说了,等了一会儿,低声说:“一会儿人家出一块零五也卖了吧。” 可是再没有人来买米了,米贩子把买来的米装上车,开走了。 散场了,我和母亲晒了一天,一粒米也没卖出去。 “妈,走吧,回去吧,别愣在那儿了。” 我收拾好毛巾、水壶、饭盒,催促道。 母亲迟疑着,终于起了身。 “妈,我来挑重的。” “你学生妹子,肩膀嫩……” 不等母亲说完,我已经把那担重的挑起来了。

母亲也没有再说什么,挑起那担轻的跟在我后面,踏上了回家的路。 肩上的担子好沉,我只觉得压着一座山似的。 突然脚下一滑,我差点摔倒。 我赶紧把剩下的力气都用到腿上,好不容易站稳了,但肩上的担子还是倾斜了一下,洒了好多米出来。 “啊,怎么搞的?”母亲也放下担子走过来,嘴里说,“我叫你不要挑这么重的,你偏不听,这不是洒了。多可惜!真是败家精!”

败家精是母亲的口头禅,我和弟弟干了什么坏事她总是这么数落我们。 但今天我觉得格外委屈,也不知道为什么。 “你在这等会儿,我回家去拿个簸箕来把地上的米扫进去。浪费了多可惜!拿回去可以喂鸡呢!”母亲也不问我扭伤没有,只顾心疼洒了的米。 我知道母亲的脾气,她向来是“刀子嘴,豆腐心”的,虽然也心疼我,嘴里却非要骂我几句。 想到这些,我也不委屈了。 “妈,你回去还要来回走个六七里路呢,时候也不早了。”我说。 “那地上的米怎么办?” 我灵机一动,把头上的草帽摘下来:“装在这里面好了。” 母亲笑了:“还是你脑子活,学生妹子,机灵。”

说着,我们便蹲下身子,用手把洒落在地上的米捧起来,放在草帽里,然后把草帽顶朝下放在谷箩里,便挑着米继续往家赶。 回到家里,弟弟已经回来了,母亲便忙着做晚饭,我跟父亲报告卖米的经过。 父亲听了,也没抱怨母亲,只说:“那些米贩子也太黑了,城里都卖一块五呢,把价压这么低!这么挣庄稼人的血汗钱,太没良心了!”

我说:“爹,也没给你买药,怎么办?” 父亲说:“我本来就说不必买药的嘛,过两天就好了,花那个冤枉钱做什么!” 晚上,父亲咳嗽得更厉害了。 母亲对我说:“琼宝,明天是转步的场,咱们辛苦一点,把米挑到那边场上去卖了,好给你爹买药。” “转步?那多远,十几里路呢!”我想到那漫长的山路,不由有些发怵。 “明天你们少担点米去。每人担50斤就够了。”父亲说。

“那明天可不要再卖不掉担回来哦!”我说,“十几里山路走个来回,还挑着担子,可不是说着玩的!” “不会了不会了。”母亲说,“明天一块零八也好,一块零五也好,总之都卖了!” 母亲的话里有许多辛酸和无奈的意思,我听得出来,但不知道怎么安慰她。

我自己心里也很难过,有点想哭。 我想,别让母亲看见了,要哭就躲到被子里哭去吧。 可我实在太累啦,头刚刚挨到枕头就睡着了,睡得又香又甜。

-- 张培祥

1979年生于湖南醴陵一个山区农户,1997年考入北京大学法学院,是北大有名的才女,2003年非典期间患白血病,三个月后,年仅24岁的张培祥去世。

网文编年史

· 11 min read

网文二十年,每年通现出的网文神作,你都通宵追过几本?

2000年,第一本网文巨制《悟空传》横空问世,被誉为网络第一书,作者今何在,让我们从今往后一万年都记住了他的名字,齐天大圣孙悟空。

2001年,“树下野狐”写就《搜神记》,一举拿下“网络版北大蒲松龄”的美誉。同年,罗森也奉献了被誉为第一本玄幻小说的《风姿物语》。

2002-2003年,网文四大名著相继面世,《小兵传奇》、《紫川》、《诛仙》,还有同期的神作《佣兵天下》。这一时期可称网文史诗时代。此外还有奇幻小说鼻祖《天魔神谭》,和第一本半路夭折的神作《赫氏门徒》。

2004年,《坏蛋是怎样炼成》风靡各大高校,甚至以极少页数就让读者热血沸腾。这一年,《升龙道》让血红成为首个年入百万大神。同期,还有一本《魔法学徒》,据说当年网文界就靠他和《小兵传奇》一起撑场子。

2005年,烟雨江南的《亵渎》一举击碎了人们对网文的刻板印象,原来网文也可以堪比纸质文学。同年的《七界传说》成为大家补完《诛仙》后,仙侠领域的最佳选择,只可惜热度只持续了几年。另一部《邪风曲》当年虽然就有些无脑,但其传奇气息至今难以复制。

2006年,静观笔下,《兽血沸腾》里的刘震撼成为网友心目中最有种的男人标杆。《鬼吹灯》则成就天下霸唱,从此网文世界又新增了一个摸金流。还有《邪神传说》更是让一件兵器成为主角,让人大开脑洞。

2007年,《回到明朝当王爷》从出道开始就是现象级神作。而Z大的《无限恐怖》则开创网文仙河,奠定无限流的基调。当然更少不了禹岩的《极品家丁》,至今仍是架空历史小说的经典神作。

2008年被称为诸神之战,因为这年出现的《恶魔法则》、《星辰变》与《琴帝》可谓三巨头并立,各领风骚。

2009年,唐家三少最终问世了《斗罗大陆》,踏出了他成为神征程上至关重要的一步。然而,就我个人而言,我吃西红柿的《盘龙》真的比这本书更出色。就在三少和番茄激烈竞争的时候,烟雨江南以他的《狩魔手记》成为当年网文圈的黑马,赢得点赞无数。

2010年,《斗破苍穹》横空出世,宛如陨石落海,掀起万丈波涛。那句“莫欺少年穷”成为近十几年来最鼓舞人心的座右铭。同年,梦入神机创作了自己的巅峰之作《阳神》,还有一位名叫忘语的大神,熬了40万字,最终把他的《凡人修仙传》送上了封神的宝座。

2011年,耳根凭借《仙逆》彻底将凡人流发展成了最受欢迎的小说流派。同年,我吃西红柿创作了《吞噬星空》,不得不承认,作为升级流网文教父的番茄在那几年绝对是他的巅峰时刻。然而,令人遗憾的是,那年他们碰到的是梦入神机的《永生》,这本书的点击量高达2.7亿次,堪称神一般的数据,碾压一切。

2012年,叶凡的九龙拉棺让天下皆见识了《遮天》的宏伟。如果说《遮天》叙述的是万古长河里的史诗,那么天蚕土豆的《武动乾坤》则在讲述人间情谊。当然还有《傲世九重天》,虽然名气一直被前两本所压着,但其内容足以让人惊艳。

2013年,我吃西红柿的《莽荒纪》凭借着6000多万的读者,在当时所有已有的小说中总成绩排名第三。与此同时,耳根的《求魔》中的苏铭成为了网文圈里最让人心疼的悲情人物。这一年也标志着网游小说的崛起,蝴蝶兰的《全职高手》红遍整个圈子,将千万级网文从传说照进了现实。

2014年,荒天帝和石昊在《完美世界》里独领风骚,孤独的身影一时间吸引了大量粉丝。尽管有人对网络爽文中女主倒贴的情节提出质疑,但在那一年,鹅是老五所写的《最强弃少》却被评为对一众女主关系处理最出色的存在。同年,天蚕土豆的《大主宰》在封神的同时,也被调侃,将萧炎、林动、牧尘这三位主角的暧昧关系推向了高潮。

2015年,耳根的《我欲封天》凭借一整年占据热销总榜榜首的成绩,成为当时仙侠小说中名副其实的第一。甚至在书还未完结之际,游戏版权已经被提前签出。

永恒之火灵光一现,创作了《儒道至圣》,以风雅的诗词御敌,开创了儒道流的先河。而当年最低调的神作之一要数善良的蜜蜂以及其作品《修罗武神》。在这个时候,他已经不声不响地开始侵占海外市场,使许多外国青年再也无法割舍对古老东方神秘文学的依赖。

2016年,烽火戏诸侯创作了《雪中悍刀行》,烈马黄酒八千里,每一行每一个字都如江湖叹息,为人们带来无尽的宽慰。而中原五青则如江湖中的侠客,坚守着一片净土。我吃西红柿显然已过了自己的高光时刻,他的《雪鹰领主》成为一代天骄最后的绝唱。当时网文四大B王都熟悉吧,《重生之都市修仙》中的陈北玄在这一年被封神。

2017年,辰东的《圣墟》屡次刷新了网络文学的记录,然而可惜的是,口碑却如同银河倒挂一般,直线下滑。耳根在转型之作《一念永恒》刚刚问世不久,版权就以一千万的高价被抢购卖走。四大B王之一的张悬,成为《天道图书馆》中的灵魂,凭借一已之力收割了大洋彼岸的韭菜,让他们为之疯狂。

2018年,烽火戏诸侯再次以《剑来》刷新了网络文学的上限,《大王饶命》则巧妙地偏离寻常,以贱字成就了一代搞笑神作。有人认为这一年最值得推荐的小说莫过于《牧神记》,因为在这部作品中,宅猪的人设之出众简直令人叹为观止。

2019年,天蚕土豆的《元尊》以不依赖平台,自主全网发布的方式,第一次打破了网文的壁垒。爱潜水的乌贼则以《诡秘之主》证明了根本不存在小众题材,并以一已之力将克苏鲁类西幻小说推向了炙手可热的地位。而老鹰吃小鸡创作的《全球高武》,仅用11个月完成580万字的壮举,可谓是人形打字机的典范。

2020年,《一剑独尊》以一句“你家在哪指个方向”成为最为霸气的小说之一。老鹰吃小鸡的作品《万族之劫》再一次向书虫们展示了什么是量大管饱且下饭。

2021年,《大奉打更人》让“今日无事,勾栏听曲”成为书虫最新的调侃式口头禅。此外,《逆天邪神》让人不禁在催更时,对火星引力送上家人的问侯。

有人被喷,必然也有人黄袍加身。比如,飞天鱼凭借《万古神帝》成功晋级为白金大神。

2022年,《道诡异仙》告诉你,没有一些精神病,是写不出这样的奇葩之作,作者与读者总得疯一个。《深空彼岸》让红毛老怪重新回到巅峰,《夜的命名术》则将赛博朋克写到了极致,从上架的第一天开始就一直占据榜首。还有宅猪的《择日飞升》,上线首日就开始屠榜夺魁。

那么,2023年你心目中的神作又是哪一本?

欢迎各位分享,让我们一同见证历史的继续…