集市中迷失的一代:FreeBSD核心開發者反思開源軟件質量

摘要:本文作者Poul-Henning Kamp (phk@FreeBSD.org) ,26年的計算機程序員,他編寫的軟件以底層構建塊的形式廣泛被開源和商業產品采用。講述作者在看完《設計原本》這本書后所引發的共鳴!

13年前,新興的草根開源軟件運動如火如荼,而Eric Raymond的《大教堂與集市》(O'Reilly Media, 2001)一書則重新定義了我們的詞匯表,幾乎預言了瀑布模型和大型軟件公司的終結。這本書有煽動性,但卻沒有說服我。與此同時,由于我正全身心投入開源運動,也就情不自禁地寧愿相信他是對的。

而今年夏天我帶到海濱別墅來的這本書,同樣有煽動性,比Raymond那本更甚(但這本書在提到《大教堂與集市》時是相當正面的),那就是 Frederick P. Brooks的《設計原本》(Addison-Wesley Professional, 2010)。Brooks這本書不斷引發我的共鳴,我也越來越佩服他的語言表達能力和他提出的觀點,然而越是有共鳴,就越感到難過和失望。

enter image description here

13年前,正值.COM熱潮涌動,年輕的Web程序員比比皆是,輟學創業的大學生也屢見不鮮。在向其中一些人傳授過去那些編程技巧的同時,我也獲得了很多樂趣。像什么測試恢復備份、寫腳本安裝操作系統、版本控制等等。當然,現在再看,也就那么回事(有些事并不像你印象中那么激動人心,對吧)。而且,我們已經無路可逃,整個.COM時代總體上對IT/CS而言就是一場災難,尤其對軟件質量和Unix來說,更是如此。

好像從來沒有人分析過.COM泛濫那些年,IT行業增長了多少。以我個人的經驗,我估計整個行業(包括IT行業由此新增的就業機會)大概增長了兩個數量級,或者更確切地說,達到了原來的百分之一萬(100倍)。

學會計算機編程很容易,就像學會用釘子把兩塊木板釘到一起一樣簡單。但問題是——打個不恰當的比方,市場對“釘在一起的兩塊木板”的需求,除了“自豪的爺爺”的那點天倫之樂以外,真的是太小了。而且,由此再進一步學習釘椅子或做碗櫥,都需要天分、實踐和訓練。我們增長的這99倍恰恰都來自那些既沒有實踐經驗,又沒有受過良好訓練的人。等這些人有時間學習和接受訓練了,聚會已然結束,大多數人失去了工作。可以樂觀地假定那些堅持下來的人最有天分,而且經驗也最多,即便如此我們還是無路可逃,因為作為IT專業人士,由于缺乏基本功,他們大多數都很濫!

不幸的是,Raymond鼓吹的——與.COM泡沫之前精心建造大教堂的理念恰恰相反的集市模因(meme)1——“對付過去就行”,并沒有隨.COM泡沫破裂死去。今天,Unix這艘大船正因為難堪重負而迅速沉沒。

模因論是基于達爾文進化論的觀點解釋文化進化規律的新理論。參見這里。——譯者注

我剛升級了自己的筆記本電腦。到現在,我運行FreeBSD開發版已經足足有18個年頭了,但從源代碼編譯我的Spartan工作環境仍然要花一整天時間,因為它必須理清頭緒,在Raymond那亂糟糟的軟件集市中建起一座大教堂來。

宏觀上講,FreeBSD的Ports Collection會盡力為這個集市畫一幅地圖,以便FreeBSD用戶輕易找到自己的應用。目前來看,這幅地圖由22198個文件構成,而這些文件就是集市中每個攤位的簡要說明:用寥寥數語告訴你某個攤位賣什么,要了解詳細信息再去哪里找。此外,還有23214個Makefile,告訴你可以對每個攤位上的軟件做什么。這些Makefile還想讓你知道自己都有哪些選擇,要選擇什么,以及不作選擇時用什么默認值比較明智。為方便起見,這幅地圖還提供24400個補丁文件,以便彌補這些玩藝兒在制作工藝上的瑕疵,但一般來說,還是因為它們攜帶(portability)不便,所以才催生了這些補丁。

最后,地圖提供一些建設性意見,比如要是你想要www/firefox,那得先得到devel/nspr、security/nss、databases/sqlite3,等等。在你手拿地圖,查到這些依賴,以及這些依賴的依賴之后,你會發現自己的購物清單上已經記滿了122個包,你必須在能買www/firefox之前買全它們。

當然啦,模塊化和代碼重用都是好主意。可是,就算在最簡單的情況下,CS/IT的代碼重用信條在集市里也沒有用武之地:FreeBSD Ports Collection中的軟件最少都包含1342個復制粘貼加密算法。

如果有人奮不顧身或者偏聽偏信,非要代碼重用,結果真制造出了自身完備且無依賴的軟件包,那要換得這個容易管理的包,享受代碼重用的成果,就算多花點銀子也值啊!但這樣的事并沒有發生過:各種包把Web搞得一團糟, 隨便依賴,互相糾纏,代碼越重用,浪費越嚴重。

舉個浪費的例子吧。Sam Leffler的graphics/libtiff是前面提到在安裝www/firefox之前必須安裝的122個包中的一個,但安裝后的Firefox瀏覽器卻無法渲染TIFF圖片。問題出在哪里我還沒來得及查清楚,但這122個包中的10個需要Perl,7個需要Python;這其中又有一個devel/glib20,同時有賴于Perl和Python,至于為什么,我到現在都沒想通。

繼續往下看你的購物清單,你會不斷會發現滿足彼得定律的應用。所謂彼得定律,就是說在一個根據人的業績、成就和價值來提拔人的組織中,最終會把一些人提拔到他們并不勝任的位置上。這個定律經常被通俗地說成“把員工提拔到他們不勝任的職位上”。軟件行業也一樣,你會發現自己需要三個不同版本的make程序、一個宏處理器、一個匯編器和其他一些必要的包。而在這個“食物鏈”的末端,則是libtool,它試圖掩蓋一個事實,即在Unix中沒有構建共享庫的標準方式。的確沒有適用于所有Unix變體的標準方式——比如給ld(1)命令加個標簽之類的;而此時彼得定律就適用了:這個工作被交給了libtool。此時此刻,彼得定律確實牛,devel/libtool的源代碼達到了414 740行,而其中有一半是測試用例。原則上講,這倒是值得稱贊的,但實際上這卻是彼得定律的結果:這些測試煞費苦心地在那里驗證一個本來就不該存在的問題的復雜方案是否功能齊備!更讓抓狂的是,其中31 085行代碼都保存一個叫configure的shell腳本里,代碼格式之亂,任誰也難看明白。這樣做是想讓configure腳本執行大約200個自動測試,從而免除用戶手工配置libtool之苦。這個想法很濫,早在1980年代剛剛出現時,就招來很多非議。因為源代碼是靠configure腳本的偽裝才讓人感覺它可移植的,而實際上并非真正可移植。可以說它是配置思想的余孽。

1980年代出現過很多不同的Unix實現:Cray-1s及其24位指針、Amdahl UTS主機Unix、來自微機制造商的大量的SysV+BSD混搭、Data General等公司開發的準Unix“墊片”,甚至連油漆廠Mark Williams都有純粹的Unix克隆Coherent。

當時的configure腳本是用手寫的,用于檢測當前系統是BSD還是SysV風格的Unix,然后根據檢測結果把一個或另一個Makefile(有時候還帶一個.h文件)復制到指定位置。后來,這個configure腳本的神通越來越大,而且不折不扣地印證了彼得定律。我們沒有看到Unix采用標準做法來消除對該腳本的依賴,反倒是有人寫了一個叫autoconf的程序,用來自動生成configure腳本。

今天,Unix/Posix一脈的操作系統,就連IBM的z/OS主機版,都跟1980年代那些完全一樣;libtool這個configure腳本中的31 085行代碼仍然還要檢測<sys/stat.h><stdlib.h>是否存在,即便是沒有這兩個文件的Unix變體,在既沒有足夠內存執行libtool,也沒有足夠硬盤保存其16MB源代碼的情況下。

為什么會這樣呢?

由于尚不知曉的原因,autoconf是用晦澀的M4宏語言寫的,因而實際的測試代碼如下:

  1. ##?Whether?`make'?supports?order-only?prerequisites. ?
  2. AC_CACHE_CHECK([whether?${MAKE-make}?supports?order-only?prerequisites], ?
  3. ??[lt_cv_make_order_only], ?
  4. ??[mkdir?conftest.dir ?
  5. ???cd?conftest.dir ?
  6. ???touch?b ?
  7. ???touch?a ?
  8. cat?>confmk?<<?'END' ?
  9. a:?b?|?c ?
  10. a?b?c: ?
  11. ???????touch?$[]@ ?
  12. END ?
  13. ??touch?c ?
  14. ??if?${MAKE-make}?-s?-q?-f?confmk?>/dev/null?2>&1;?then ?
  15. ????lt_cv_make_order_only=yes?
  16. ??else ?
  17. ????lt_cv_make_order_only=no?
  18. ??fi ?
  19. ??cd?.. ?
  20. ??rm?-rf?conftest.dir ?
  21. ]) ?
  22. if?test?$lt_cv_make_order_only?=?yes;?then ?
  23. ??ORDER='|'?
  24. else ?
  25. ??ORDER=''?
  26. fi ?
  27. AC_SUBST([ORDER]) ?

毋庸諱言,這超出了大多數程序員的承受能力。即便有人有這個能力,但給autoconf指定輸入文件都是用復制粘貼的,所以就讓人不容易發現日益膨脹的那些涵蓋諸如前述“標準測試”的標準宏,這些宏都是為了處理20年前并不存在的兼容性問題。

可能這就是為什么針對我系統里根本沒有的Fortan編譯器,libtool的配置探針就有不少于26個名字,而且還要再執行26個測試,檢測這些根本不存在的Fortran編譯器分別支不支持-g選項的原因。

這是由Raymond在其書中稱頌的集市模式導致的悲哀的現實:一坨膿包似的權宜代碼,被一群盲目的根本不知IT架構為何物的所謂IT“專業人士” 永無休止地復制著,粘貼著。這事兒放在今天你也許很難相信,但就是在這令人無比尷尬的混沌之下,沉睡著美輪美奐的Unix大教堂的遺跡,而它正是因設計簡約、功能實用、執行優雅而著稱于世的。(世間榮耀就此消失……)

Brooks提出了很多有見地的觀點,其中一個就是所謂質量,只有在某人對它負責時才有意義,而這個“某人”只能是一個人,不能是幾個人——二重奏除外。我有點奇怪,為什么Brooks不把Unix作為他這個觀點的論據,因為我們可以精確地指出Unix走向分裂的時間點:1990年代初,AT&T拋棄Unix,將其商業化,搶走其架構師的那一刻。

最近幾年,不止一個人像Brooks一樣得出相同的結論。有些人企圖粉飾太平,假裝正經,還有人通過制定技術標準的形式來達到類似立法的目的,希冀著在集市中引入秩序和結構。到目前為止,他們的努力全部以失敗告終,因為集市迷失的這一代.COM神奇小子,從來就沒有見過大教堂,也不可能知道你為什么需要大教堂,更不用說去想象教堂是個什么樣子了。這么挖苦別人,其實我心里也很難過。真的,那些最需要看看《設計原本》的人,可能會發現這本書完全無法理解。但對于那些懷疑過構建一個Web瀏覽器要使用M4宏來配置autoconf,要寫shell腳本,要檢測26種Fortran編譯器,而感覺這怎么說都有點南轅北轍的人,Brooks也謹慎地指出了方向:還有更好的方式。

作者:Poul-Henning Kamp (phk@FreeBSD.org) ,26年的計算機程序員,個人網站http://bikeshed.org/。他編寫的軟件以底層構建塊的形式廣泛被開源和商業產品采用。他最近正在做的項目叫Varnish HTTP加速器,用于加快Facebook這樣訪問量網站的響應速度。

原文出自:A Generation Lost in the Bazaar

譯文來自:圖靈社區


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450858.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

點擊表格彈窗獲取另外一套數據之后,原表格相關數據的調用

用H5新屬性&#xff0c;data-*&#xff0c; $獲取方式&#xff1a; 待續。。。。。。。 轉載于:https://www.cnblogs.com/He-tao-yuan/p/9888316.html

谷歌瀏覽器如何如何禁用彈出窗口阻止程序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在工具欄上使用 Google Chrome 菜單。工具欄上的菜單位于瀏覽器右上角。 選擇“設置”。 在頁面底端找到并點擊“顯示高級設置”。 在“隱…

Python 3 入門,看這篇就夠了

文章目錄 簡介基礎語法運算符變量數據類型流程控制迭代器生成器函數 自定義函數參數傳遞 可更改與不可更改對象參數匿名函數變量作用域模塊面向對象錯誤和異常文件操作序列化命名規范參考資料簡介 Python 是一種高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。Pyt…

面試經歷(二)

前面說到用數據庫中的鎖機制對并發事務進行控制&#xff0c;這節來說說事務方法和事務方法發生嵌套調用時事務如何進行傳播。例如&#xff1a;方法可能繼續在現有事務中運行&#xff0c;也可能開啟一個新事務&#xff0c;并在自己的事務中運行。例如&#xff1a;方法可能繼續在…

最有價值的編程忠告

摘要&#xff1a;本文是來自貝爾實驗室Plan 9操作系統的創始人Rob Pike給大家分享的編程忠告&#xff01;Rob Pike&#xff0c;目前谷歌公司最著名的軟件工程師之一&#xff0c;曾是貝爾實驗室Unix開發團隊成員&#xff0c;締造Go語言和Limbo語言的核心人物。 Rob Pike&#xf…

Column count doesn't match value count at row 1 原因

mysql 提示 &#xff1a; Column count doesnt match value count at row 1錯誤&#xff0c;SQL語句中列的個數和值的個數不等&#xff0c; 如&#xff1a; insert into table1 (field1,field2) values(值1&#xff0c;值2&#xff0c;值3 ) 列只有2個&#xff0c;值 卻有3個…

MarkDowm快捷鍵大全

文章目錄一&#xff1a;菜單欄二&#xff1a;文件三&#xff1a;編輯四&#xff1a;段落五&#xff1a;格式六&#xff1a;視圖一&#xff1a;菜單欄 文件&#xff1a;altF 編輯&#xff1a;altE 段落&#xff1a;altP 格式&#xff1a;altO 視圖&#xff1a;altV 主題&#x…

Kinect2.0-空間長度測量

1. 鼠標左鍵按下選擇起點&#xff0c;拖動鼠標&#xff0c;左鍵放開&#xff0c;確定終點。 實現效果1實現效果22. 在linux下使用libfreenect2開源多平臺驅動來獲取kinect2.0的傳感器信息&#xff0c;得到深度信息&#xff0c;并通過libfreenect2提供的getPointXYZ函數&#xf…

帶數據庫的智能合約

編寫使用數據庫的智能合約 前面一直在搗鼓EOS網絡搭建的相關東西。然而今天比較不走運的是&#xff0c;興致勃勃的把源碼版本升到4.0&#xff0c;在編譯的時候如我所猜想的出現了一系列問題&#xff0c;正一籌莫展的時候&#xff0c;導師突然問了我一個關于合約如何操作數據庫的…

沒有完美的軟件:編程永遠不容易

摘要&#xff1a;很多人想用十全十美來修飾一樣東西&#xff0c;比如軟件&#xff0c;對于客戶來說&#xff0c;當然希望他們的軟件能做到完美。雖然很多專家說利用一些規范可以讓軟件達到更好&#xff01;但是在現實開發中&#xff0c;真的會有那么完美的軟件嗎&#xff1f; 最…

Eclipse斷點調試出現Source not found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的情況是和網上說的都不一樣&#xff0c;我真的也沒有想到這么坑&#xff0c; 我居然無意寫了一個死循環&#xff0c;dao/mapper調sql…

Memory Compression這到底是個什么東西?

Memory Compression這到底是個什么東西&#xff1f; Memory Compression這個進程&#xff0c;經過我的查詢說是內存壓縮功能&#xff0c;作用是壓縮內存讓內存占用更低&#xff0c;但是為什么這個進程瘋狂占用我的內存&#xff0c;我用的Win10 8G&#xff0c;通過資源監視器查看…

MySQL 5.6 for Windows 解壓縮版配置安裝

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 MySQL是一個小巧玲瓏但功能強大的數據庫&#xff0c;目前十分流行。但是官網給出的安裝包有兩種格式&#xff0c;一個是msi格式&#xf…

safari的一些問題

1、圖片過大時&#xff0c;在webview中是不會加載顯示的。2、如果是通過一個地址返回的base64數據給image&#xff0c;記住要在后臺進行base64_decode解析數據&#xff0c;這樣才是真實的圖片數據&#xff0c;后臺保存數據的時候不要保存"data:image/png;base64,"這一…

代碼審查“思維導圖”

摘要&#xff1a;隨著人們對軟件質量要求的不斷提高&#xff0c;軟件開發的每一個環節都應該得到十足的重視&#xff0c;俗話說&#xff1a;“細節決定成敗”&#xff0c;就此&#xff0c;本文提供了一個代碼審查“思維導圖”&#xff0c;希望對所有碼農們有所幫助。 代碼審查&…

thinkCMF----導航高亮顯示

導航高亮顯示&#xff0c;有多種方法&#xff0c;這里給出一個簡單的表示下&#xff1a; <a href"__ROOT__"><span class"text db">網站首頁</span><span class"eng db">HOME</span> </a> …

The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 tomcat啟動報務后訪問頁面報錯&#xff1a; org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/co…

優秀程序員和一般程序員差別在哪?

摘要&#xff1a;在這個世界上有兩種程序員&#xff1a;Day Programmers&#xff08;白班程序員&#xff09;和Night Programmers&#xff08;夜貓子程序員&#xff09;&#xff0c;你知道優秀程序員和一般程序員有哪些差別嗎&#xff1f;你又是哪一類型的呢&#xff1f;俗話說…

7. Oracle數據加載和卸載

在日常工作中&#xff1b;經常會遇到這樣的需求&#xff1a; Oracle 數據表跟文本或者文件格式進行交互&#xff1b;即將指定文件內容導入對應的 Oracle 數據表中&#xff1b;或者從 Oracle 數據表導出。其他數據庫中的表跟Oracle數據庫進行交互。若是少量數據&#xff1b;可選…

Navicat工具導出mySQL數據庫某個視圖結構的.sql腳本

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用Navicat工具怎么都導不出來mySQL數據庫的某個視圖.sql腳本&#xff0c;即使導出來也只是包含視圖記錄&#xff0c;不包含視圖結構。經…