从版本库看开源项目的发展史
http://antkillerfarm.github.io/
前言
自從發(fā)現(xiàn)git和github之后,由于git方便的查看版本歷史的功能,使我能夠?qū)σ恍┲_(kāi)源項(xiàng)目的發(fā)展史有一定的了解。并以此為契機(jī),一定程度的揭開(kāi)開(kāi)源項(xiàng)目的運(yùn)作之謎。
PS:不要提svn的版本歷史,那個(gè)在局域網(wǎng)里查看還算方便,對(duì)于互聯(lián)網(wǎng)的查看來(lái)說(shuō),即使只看最近1000條,也要耗費(fèi)非常非常多的時(shí)間,而且還是每次查看都是這樣費(fèi)勁。
從git log看linux的發(fā)展史
linux穩(wěn)定版本的git地址:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
這個(gè)版本的提交那叫一個(gè)多啊,截止2014年12月25日,已經(jīng)有482338次提交。這個(gè)次數(shù)多到什么程度呢?直接讓gitk的內(nèi)存占用超過(guò)2.5G,即使這樣也才加載到40W次左右,還剩下8W次沒(méi)有加載呢。。。
所以在萬(wàn)般無(wú)奈的情況下,只好使用原始的git log命令,這才統(tǒng)計(jì)出剛才的數(shù)字。相關(guān)命令如下:
git log --pretty=format:'%h by %an at %cd'
可能是git時(shí)間一長(zhǎng),就太大了的緣故吧,所以還有一個(gè)更古老的git地址:
git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git
這里面是2002年至2005年期間的代碼,估計(jì)以當(dāng)時(shí)的網(wǎng)絡(luò)條件,傳這么個(gè)165M的龐然大物,也是件浩大的工程了。
(PS:了解BitKeeper和Git的恩恩怨怨的同學(xué),估計(jì)看到“2002年至2005年”,應(yīng)該就能猜出這個(gè)git是怎么回事了吧。我好奇的是,在BitKeeper之前,Linus用什么來(lái)管理代碼。2015.3.20)
這里有一個(gè)發(fā)現(xiàn),Linus早先在Transmeta公司干活,這也是他打工時(shí)間最長(zhǎng)的公司,有興趣的同學(xué)可以自行wiki一下相關(guān)的信息。
最后再吐槽一下git,這么大的庫(kù),居然不支持?jǐn)帱c(diǎn)續(xù)傳,也不支持object的原子下載。。。相比之下,svn雖然也不能斷點(diǎn)續(xù)傳,但是這次下載一個(gè)文件,下次就不用再下載了。考慮到代碼文件也不可能太大,這樣也就基本夠用了。
從git log看git的發(fā)展史
Linux源代碼由于歷史久遠(yuǎn),最初的版本歷史已不可考證,至少無(wú)法從git log考證。但git本身的歷史,則是一筆筆的都記錄在git log中。
網(wǎng)上的說(shuō)法,git是Linus一個(gè)周末的產(chǎn)物。但從log來(lái)看,項(xiàng)目開(kāi)始的時(shí)間——2005.4.8,那是個(gè)周五。所以這個(gè)說(shuō)法不成立。不過(guò)看了下代碼的長(zhǎng)度,也就是2000多行吧,理論上的確是一個(gè)周末的工作量。
從初始版本還可以看出,最早的git并不是單個(gè)可執(zhí)行文件,而是一個(gè)子命令對(duì)應(yīng)一個(gè)可執(zhí)行文件。而且命令的名字也不是clone、pull之類的東西。
git-pull是在2005.4.19添加的,是個(gè)bash腳本。實(shí)際上,git所采用的設(shè)計(jì)思路和通常的教科書(shū)里的自頂而下的方法相反。它是自底而上,首先設(shè)計(jì)基本數(shù)據(jù)結(jié)構(gòu)和算法,然后再在使用中,根據(jù)實(shí)際的需求,編寫(xiě)各種腳本,以使之便于使用。這種設(shè)計(jì)思路在當(dāng)時(shí)看不出有多大的好處。但時(shí)至今日,隨著各種項(xiàng)目的進(jìn)展,版本庫(kù)的規(guī)模日益增長(zhǎng),某些項(xiàng)目的提交總數(shù)甚至達(dá)數(shù)十萬(wàn)之巨,而git仍能高效處理。這不得不使人佩服Linus的設(shè)計(jì)功力。
2005.4.24 添加了網(wǎng)絡(luò)傳輸?shù)墓δ?#xff0c;這樣git才算是個(gè)完整的分布式版本控制系統(tǒng)。
2005.6.8 添加cvs到git的工具。
2005.7.11 第一個(gè)里程碑版本0.99發(fā)布。
2005.12.21 v1.0發(fā)布。
從上面的歷程可以看出,即使參與項(xiàng)目的人都是牛人,git也差不多經(jīng)過(guò)了8個(gè)多月,近3000次commit,才達(dá)到了基本可用的水平。絕不是什么天才人物一周時(shí)間的作品。
從git log看svn的發(fā)展史
這個(gè)標(biāo)題并沒(méi)有錯(cuò)。眾所周知的,svn查看修改歷史是需要遠(yuǎn)程登錄服務(wù)器的。而這對(duì)于一些歷史悠久的版本庫(kù)來(lái)說(shuō),簡(jiǎn)直是是個(gè)災(zāi)難。因此這里的log實(shí)際上是從Apache官方的git服務(wù)器上git下來(lái)的。
svn的開(kāi)端實(shí)際上和git是有區(qū)別的。這個(gè)項(xiàng)目從2000.3.1開(kāi)始。但是最先動(dòng)手的,并非代碼,而是文檔。三個(gè)作者足足討論了3個(gè)月,才在2000.6.10提交了第一行代碼。而git一開(kāi)始就是代碼。
這實(shí)際上是有原因的。svn的目的是替代cvs,因此它的主要任務(wù)是修補(bǔ)cvs設(shè)計(jì)中不好的地方。因此它在設(shè)計(jì)階段花費(fèi)的時(shí)間較長(zhǎng)。
而git在設(shè)計(jì)之初,有BitKeeper和Monotone作為參考,且從功能角度而言,BitKeeper并無(wú)重大問(wèn)題,因此設(shè)計(jì)的任務(wù)并不是很大。
反倒是開(kāi)源社區(qū)急需一個(gè)產(chǎn)品用以擺脫BitKeeper,因此git一上來(lái)就是代碼,也就不難理解了。
順便說(shuō)一句,Mercurial只比git晚了10天誕生。可見(jiàn)那時(shí)候開(kāi)源社區(qū)對(duì)于分布式版本控制系統(tǒng)的需求之迫切了。
從git log看sqlite的發(fā)展史
第一版發(fā)布于2000.5.29,已經(jīng)有相當(dāng)多的代碼。
項(xiàng)目的committer只有9人,其中九成以上的代碼出自一個(gè)人。
這個(gè)項(xiàng)目最初使用CVS管理代碼,2009.8.12開(kāi)始該用fossil管理代碼。順便提一句fossil使用sqlite作為對(duì)象存儲(chǔ)的工具。
從git log看emacs的發(fā)展史
很遺憾,早期的歷史在log中,已經(jīng)殘缺不全了,
按照wiki的說(shuō)法:
- GNU Emacs最早廣泛發(fā)布的版本是15.34,出現(xiàn)于1985年。
而現(xiàn)有代碼庫(kù)的第一個(gè)可用的版本是從大約1990年開(kāi)始的,之前的歷史版本雖然有,但是根本不可編譯使用。
當(dāng)時(shí)這個(gè)項(xiàng)目使用RCS管理代碼,這也是發(fā)展至今的諸多開(kāi)源軟件中很少見(jiàn)的一例。因?yàn)橥瑫r(shí)期大部分的軟件,都已經(jīng)成為了歷史。而像emacs這樣,至今仍然相當(dāng)活躍的項(xiàng)目實(shí)在是鳳毛麟角。
從git log看SDL的發(fā)展史
SDL盡管使用廣泛,但從代碼來(lái)看基本上是Sam Lantinga的個(gè)人作品。
Sam Lantinga早年創(chuàng)建了Loki Software,專門(mén)將Windows游戲移植到Linux平臺(tái)上,SDL正是這個(gè)時(shí)期的產(chǎn)物。著名的《英雄無(wú)敵3》Linux版就是Loki Software制作的。
后來(lái)他先后供職于Blizzard Entertainment和Valve Software,是暴雪的主力程序員之一。
MiniGUI
MiniGUI雖然是開(kāi)源項(xiàng)目,但是并沒(méi)有提供版本庫(kù),也就沒(méi)有版本歷史了。
作為一個(gè)曾經(jīng)輝煌的國(guó)產(chǎn)開(kāi)源項(xiàng)目,MiniGUI在00年代曾與LVS、SCIM并稱為三大國(guó)產(chǎn)開(kāi)源軟件。更是當(dāng)時(shí)嵌入式GUI開(kāi)發(fā)方面不多的幾個(gè)選擇之一,江湖地位也很高。
但是自從Android橫空出世之后,MiniGUI的日子就不太好過(guò)了。其主線版本停在了v3.0.12(2012年),距離它的配套開(kāi)發(fā)工具產(chǎn)品mStudio的推出不過(guò)3年時(shí)間。等于是辛辛苦苦將產(chǎn)品的版圖擴(kuò)充完整,卻發(fā)現(xiàn)產(chǎn)品本身已經(jīng)沒(méi)有市場(chǎng)前途了……
出現(xiàn)這種情況的原因,其實(shí)與MiniGUI本身沒(méi)有太大關(guān)系。當(dāng)年的主要競(jìng)爭(zhēng)對(duì)手Qt和GTK在嵌入式領(lǐng)域同樣一敗涂地。這一方面是由于Android實(shí)在是太強(qiáng)太好了,另一方面更重要的是硬件的進(jìn)步,導(dǎo)致原先的這些資源消耗較小的GUI系統(tǒng),變得不是那么非用它不可了。而比較功能的話,一個(gè)單純的GUI和一個(gè)全功能的框架之間根本就沒(méi)有可比性,就連最重量級(jí)的Qt也一樣不行。
MiniGUI的作者魏永明所創(chuàng)建的飛漫公司,我曾經(jīng)在2009年的時(shí)候,去那里面試過(guò)。當(dāng)時(shí)的考官是個(gè)中年人,也不知道是不是魏老師本人。應(yīng)該說(shuō)筆試面試的情況還是很好的。這家公司的筆試題比較基礎(chǔ)細(xì)致,在那次找工作的筆試中算比較難的,超過(guò)了騰訊。但給的薪水卻非常低,甚至比我畢業(yè)時(shí)的第一份工作還低。可見(jiàn)在國(guó)內(nèi),以開(kāi)源軟件開(kāi)發(fā)為主業(yè)的公司,日子過(guò)的還是很困難的。
MiniGUI慘淡之后,飛漫公司轉(zhuǎn)戰(zhàn)移動(dòng)APP領(lǐng)域,但從網(wǎng)站上的版本更新?tīng)顟B(tài)來(lái)看,這次的轉(zhuǎn)型似乎并不成功。
由此延伸開(kāi)去,Android興起前后,一大堆公司的命運(yùn)都被隨之改變。
1.博望科技。我所關(guān)注的牛人李先靜之前所在的公司。當(dāng)初為了開(kāi)發(fā)彩信相關(guān)的功能,找到了牛人李的博客,于是也就持續(xù)關(guān)注了這個(gè)公司好幾年。博望科技早先的目標(biāo)是基于GTK搭建一個(gè)智能手機(jī)平臺(tái)。
可惜直到Android出來(lái)的時(shí)候,完工度也不高。后來(lái)及時(shí)掉頭,研究Android技術(shù),成為最早的一批國(guó)產(chǎn)Android手機(jī)制造商和解決方案提供商。可惜從根本來(lái)說(shuō),Android的目的是降低智能手機(jī)的門(mén)檻。隨著會(huì)的人越來(lái)越多,這類解決方案商就變得可有可無(wú)了。
同樣的例子還有德信無(wú)線。
牛人李由于過(guò)度勞累,大病一場(chǎng),大概3年前離開(kāi)了該公司,至今仍處于半修養(yǎng)狀態(tài)。
應(yīng)該說(shuō),Android最開(kāi)始的思路,實(shí)際上就和博望不同。Android盯著的是未來(lái)的硬件,或者說(shuō)是硬件期貨,所以一開(kāi)始硬件的規(guī)格就比較高。尤其在最初的時(shí)候,不是頂級(jí)配置根本跑不了Android。而飛漫、博望的思路是如何利用現(xiàn)有的硬件做出好的產(chǎn)品,或者說(shuō)是用盡可能少的錢(qián)(這通常意味著硬件的規(guī)格是向下的,或者至少是維持原狀的)做出產(chǎn)品來(lái)。
但硬件的規(guī)格總是向上發(fā)展的,于是最初頂配才能跑的Android,現(xiàn)在隨便什么硬件都能跑的了。這個(gè)時(shí)候,飛漫、博望之類的產(chǎn)品也就無(wú)人問(wèn)津了。畢竟GUI應(yīng)用,在嵌入式中還算是重量級(jí)的,真的低端設(shè)備,如傳感器之類的,也用不上這個(gè)。
我之前的公司,早先還曾經(jīng)有個(gè)單核跑雙系統(tǒng)的AP+BP融合方案,目標(biāo)是造出千元級(jí)別的Android手機(jī)。可惜也是逆了技術(shù)潮流,后來(lái)的AP都已經(jīng)是雙核的了,根本不需要你這樣的方案來(lái)節(jié)省內(nèi)核數(shù)。而最終,千元或以下的Android手機(jī)被造了出來(lái),但根本就和這個(gè)方案無(wú)關(guān),完全得益于硬件制造成本的下降。
但單核跑雙系統(tǒng)的虛擬化方案本身還是很有技術(shù)含量的,國(guó)內(nèi)當(dāng)時(shí)根本沒(méi)人會(huì)。這個(gè)項(xiàng)目主要是法國(guó)的團(tuán)隊(duì)主導(dǎo)的。
2.播思通信。中移動(dòng)為了搞OMS成立的公司,我有同事在那里工作,本人也曾經(jīng)去那里面試過(guò)。可惜由于技術(shù)實(shí)力太差,縱有中移動(dòng)在背后站臺(tái),也還是爛泥扶不上墻。很快就被Google半年一次的更新甩在了身后。當(dāng)然這也是Google的江湖地位使然。雖然播思也做出了輸入法框架,但不是你主導(dǎo)的項(xiàng)目,你的再好,我也不用,很快就讓你的勞動(dòng)成了無(wú)用功。總的來(lái)說(shuō),這些Android改的系統(tǒng),越深度定制越死的快,反倒是換皮的MIUI之類的,活的挺好的。
3.魅族。魅族在Wince時(shí)代,曾有一款深度定制的M8,當(dāng)初曾寄望于成為國(guó)產(chǎn)的iPhone。事實(shí)上,如果沒(méi)有Android的話,這個(gè)目標(biāo)差不多就實(shí)現(xiàn)了。并不是說(shuō)達(dá)到iPhone的水平,而是說(shuō)除了iPhone之外,別人都沒(méi)有我的好。
可惜Android的出現(xiàn),使得一般的手機(jī)廠商也能造出現(xiàn)代的智能手機(jī),于是魅族的這番努力,其實(shí)并沒(méi)有得到多少的回報(bào)。總算魅族并不是手機(jī)解決方案商,而是制造商,沒(méi)辦法標(biāo)新立異,卻也不至于被別人甩下來(lái)。因此,魅族現(xiàn)在的日子,也還說(shuō)的過(guò)去。
總結(jié)
以上是生活随笔為你收集整理的从版本库看开源项目的发展史的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux内核研究(一)
- 下一篇: 浮点运算和代码优化, 音频常识, 并行计