史上最爛的項(xiàng)目:12年,600萬(wàn)行代碼……
你見(jiàn)過(guò)最爛的項(xiàng)目,撐了多長(zhǎng)時(shí)間才完蛋?六個(gè)月?一年?今天介紹的這個(gè)奇葩項(xiàng)目,不但一開(kāi)始就爛得透透的,還硬撐了12年多,直到項(xiàng)目負(fù)責(zé)人被逮起來(lái)丟進(jìn)監(jiān)獄才完事。
到底有多爛?用下面這組觸目驚心的數(shù)據(jù)告訴你↓↓
● 總共 600 多萬(wàn)行 C++ 代碼
● 總共 50000 多個(gè)類
● 受編譯器版本限制,用的 C++ 語(yǔ)法都是陳舊過(guò)時(shí)的,只能在某個(gè)(早就沒(méi)有維護(hù))的操作系統(tǒng)上部署
● 基于 CORBA
● 采用的數(shù)據(jù)庫(kù)軟件來(lái)自一家早就破產(chǎn)的公司
● 好幾層互相疊加的層共同組成了用戶界面,而且這些層沒(méi)有一個(gè)是由原作者維護(hù)的
● 運(yùn)行一個(gè)用戶界面需要啟動(dòng) 40-50 個(gè)子線程
● 在 32 臺(tái)并行的機(jī)器上需要 48 小時(shí)進(jìn)行編譯
● 沒(méi)有采用運(yùn)行庫(kù)動(dòng)態(tài)鏈接技術(shù),一個(gè)可執(zhí)行程序就有好幾百兆那么大
● 啟動(dòng)這玩意大約需要 15 分鐘
● 然后一般 30 秒到 30 分鐘內(nèi)會(huì)崩潰
你從未見(jiàn)過(guò)的“地獄級(jí)”爛項(xiàng)目
十一年前的 2008 年,科技博客 projectfailures 爆料,博主那幾年曾受雇于法國(guó)的一家大型科技企業(yè),參與過(guò)一個(gè)政府機(jī)構(gòu)委托的軟件項(xiàng)目,職位是咨詢顧問(wèn)。在那里,他親眼見(jiàn)證了登峰造極的愚蠢和瘋狂,以及它們?cè)谲浖_(kāi)發(fā)工作中起到的可怕作用。
十年過(guò)去了,這個(gè)地獄般的項(xiàng)目又被人翻了出來(lái),再次炒的沸沸揚(yáng)揚(yáng),而 projectfailures 博客甚至還就此專門出了一篇回顧。
在文章中,他這樣寫到:“這已經(jīng)不僅僅是什么缺乏專業(yè)能力的問(wèn)題了,這個(gè)項(xiàng)目中對(duì)人類尊嚴(yán)的無(wú)情踐踏,已經(jīng)嚴(yán)重到有的時(shí)候讓我感覺(jué)置身于監(jiān)獄之中?!?/span>
啥啥啥?不過(guò)是寫點(diǎn)代碼而已,除了賠上頭發(fā),難道會(huì)連命都搭進(jìn)去嗎!?這個(gè)項(xiàng)目咋這么恐怖??!
這項(xiàng)目到底啥情況?
大約是 1996 年,法國(guó)的一個(gè)政府機(jī)構(gòu)請(qǐng)某個(gè)公司開(kāi)發(fā)一款軟件。總的來(lái)說(shuō)這玩意應(yīng)該不太復(fù)雜,只不過(guò)有一些不太尋常的小問(wèn)題需要解決罷了。
甲方預(yù)付了幾百萬(wàn)歐元,計(jì)劃工期大概2~3年左右。于是公司招了幾個(gè)程序員,開(kāi)始干活。隨著資金陸續(xù)到位,這公司開(kāi)始瘋狂招人,每隔三個(gè)月左右就把隊(duì)伍擴(kuò)大一倍。
結(jié)果,7年過(guò)去了,這個(gè)項(xiàng)目根本還不成型。因?yàn)檠诱`造成的罰金每天都達(dá)幾千歐元。于是管理層決定,要精簡(jiǎn)一下團(tuán)隊(duì),減少項(xiàng)目開(kāi)支 —— 具體做法是,把干活的人都開(kāi)了,另外招一些對(duì)軟件開(kāi)發(fā)沒(méi)啥經(jīng)驗(yàn)的新手來(lái)上班。
項(xiàng)目開(kāi)始10年后,整個(gè)項(xiàng)目已經(jīng)深陷在災(zāi)難的泥潭中,完全是由純粹的混亂所組成。于是項(xiàng)目的中層管理者終于決定要招一些具有軟件工程開(kāi)發(fā)經(jīng)驗(yàn)的人,來(lái)把這個(gè)爛攤子從地獄里拖出來(lái)。
又過(guò)了兩年,這項(xiàng)目居然還在茍延殘喘。這公司通過(guò)給甲方發(fā)送金額不斷提高的“設(shè)計(jì)變更”賬單,來(lái)彌補(bǔ)每天產(chǎn)生的工期延誤罰金。這都 2008 年了喂!
這項(xiàng)目怎么能爛成這樣?
01 代碼質(zhì)量慘不忍睹
在語(yǔ)言選擇方面,沒(méi)人敢說(shuō) C++ 是種簡(jiǎn)明易懂的語(yǔ)言。事實(shí)上,在簡(jiǎn)潔方面,C++可能算是最糟糕的一種編程語(yǔ)言了吧。要知道,它可是復(fù)雜到連它的創(chuàng)造者 Bjarne Stroustrup 本人都不敢說(shuō)自己完全掌握了這門語(yǔ)言。
當(dāng)然,這不能全怪開(kāi)發(fā)團(tuán)隊(duì)。要知道,在當(dāng)時(shí),像 C++ 這樣擁有無(wú)盡復(fù)雜度的思維迷宮還是大有市場(chǎng)的。許多希望成為超級(jí)程序員的年輕人都對(duì)這門聽(tīng)起來(lái)超牛逼的語(yǔ)言趨之若鶩。而事實(shí)上,這些可憐的娃們,最后大部分都被 C++ 虐慘了,多少美好的青春,都耗費(fèi)在反復(fù)調(diào)試一大段晦澀難懂的代碼,耗費(fèi)在探尋為啥這程序會(huì)毫無(wú)理由莫名崩潰這樣的事情上了。
而腦子正常的人,則紛紛轉(zhuǎn)向了其他語(yǔ)言和其他項(xiàng)目上去了。要知道,人生苦短啊。
不過(guò),看起來(lái),這家公司并沒(méi)有跳出這個(gè)圈子,還是一個(gè)猛子扎進(jìn)了 C++ 坑里。退一步說(shuō),不管你用的是什么編程語(yǔ)言,維護(hù)一個(gè)巨大的代碼庫(kù)本身就不是一件容易的事情——而這個(gè)項(xiàng)目的代碼庫(kù)居然有 600 多萬(wàn)行之巨。
那,600 多萬(wàn)行代碼是個(gè)什么概念?
對(duì)比下 Linux 3.13 版內(nèi)核的代碼,在除去內(nèi)核驅(qū)動(dòng)和架構(gòu)之外,在 kernel/ 里的源代碼也不過(guò)就 13 萬(wàn)行左右;另一個(gè)例子是著名的編輯器 Emacs,它因?yàn)楣δ芴嗵嫶?,常被人吐槽成“缺乏一個(gè)好編輯器的操作系統(tǒng)”,但即使如此,它的總源碼規(guī)模也不過(guò)就是 165 萬(wàn) 9 千多行。
就算你特別厲害,一目十行,你大概也要在顯示器前面不眠不休花上7天,才能把全部 600 萬(wàn)行代碼全部過(guò)一遍。
于是我們可以想見(jiàn),維護(hù)這么大一個(gè)代碼庫(kù),可得逼瘋多少程序員呢??纯聪旅孢@兩個(gè)例子,我想,如果我是程序員的話,我也會(huì)先瘋為敬吧。
有一次,項(xiàng)目里的一個(gè)程序員被要求修復(fù)一個(gè)“右鍵點(diǎn)擊界面會(huì)導(dǎo)致整個(gè)應(yīng)用卡死”的 bug,經(jīng)過(guò)連續(xù)幾天的仔細(xì)檢查,消耗無(wú)數(shù)耐心之后,他發(fā)現(xiàn),這個(gè)右鍵響應(yīng)事件其實(shí)工作的很正常,只不過(guò)這個(gè)“正常”過(guò)程需要程序花上 45 分鐘,從某種巨大的(靜態(tài)?。﹥?nèi)容庫(kù)中動(dòng)態(tài)生成每一個(gè)菜單項(xiàng),然后才能把菜單給顯示出來(lái)。如果這時(shí)候你不幸又點(diǎn)了一下右鍵,不好意思,咱再花 45 分鐘重新生成一下菜單項(xiàng)吧…
還有一次,用戶報(bào)了個(gè)“從 CD-ROM 載入數(shù)據(jù)失敗”的 bug 。程序員們花了好幾個(gè)星期來(lái)測(cè)試分析代碼,最后卻直接把這個(gè) issue 標(biāo)成了“已解決”。因?yàn)樗麄儼l(fā)現(xiàn),從 CD-ROM 載入數(shù)據(jù)的功能其實(shí)是好的,問(wèn)題在于,讀取 700MB 的數(shù)據(jù),這程序要花上大概 7 天時(shí)間罷了。
還真是特別考驗(yàn)?zāi)托难健?br />
02 版本控制全都是亂來(lái)
令人難以置信的是,這團(tuán)隊(duì)在完全沒(méi)有版本控制工具的情況下也搞了好幾年,直到團(tuán)隊(duì)里一個(gè)腦子還算清醒的家伙突然想到該用個(gè)版本控制工具來(lái)管理代碼。剛開(kāi)始的嘗試結(jié)果并沒(méi)有讓所有人滿意,所以這個(gè)團(tuán)隊(duì)就換到了另外一個(gè)版本控制系統(tǒng)。就這么將就了一兩年,然后這個(gè)版本控制系統(tǒng)不知怎么又抽了個(gè)風(fēng),把之前所有改動(dòng)的記錄都丟失了。
最后這個(gè)項(xiàng)目選定的版本控制工具,是一團(tuán)帶有圖形用戶界面的禍害,一坨從瑞典直接進(jìn)口的數(shù)字化電子垃圾。他們不得不安排了4個(gè)人組成一個(gè)“版本控制團(tuán)隊(duì)”,全職負(fù)責(zé)維護(hù)這個(gè)版本控制系統(tǒng)的正常運(yùn)行。而這直接導(dǎo)致下列情況的出現(xiàn):
首次從版本控制系統(tǒng)中檢出文件需要向版本控制團(tuán)隊(duì)預(yù)約,一般來(lái)說(shuō)在一周后才能獲得授權(quán)。
想修改文件必須經(jīng)過(guò)中層管理人員審批。你需要提前列出需要修改的文件,把列表告訴你的經(jīng)理,然后打報(bào)告給版本控制團(tuán)隊(duì)申請(qǐng),后者大概兩天左右會(huì)給你反饋。
每次對(duì)文件的修改都會(huì)觸發(fā)分支,這就意味著你得自己去合并這個(gè)文件收到的所有修改。也許你會(huì)覺(jué)得,項(xiàng)目里這么多文件,兩個(gè)人改到同一個(gè)文件里的幾率應(yīng)該不大,然而實(shí)際上,絕大多數(shù)改動(dòng)都集中在同樣的大概100來(lái)個(gè)文件里,所以每次 merge 都保證讓你痛不欲生。
在提交修改(檢入文件)之前,你還將經(jīng)受一次精神折磨:你準(zhǔn)備提交的代碼將被交給一個(gè)所謂的自動(dòng) bug 探測(cè)程序進(jìn)行審閱,通過(guò)之后還要拿給中層管理人員看過(guò),才能成功提交。不用說(shuō),這根本無(wú)濟(jì)于事,bug 還是如雨后春筍一樣不停冒尖,比大家除 bug 的速度塊多了。更有甚者,對(duì)發(fā)現(xiàn)的 bug 數(shù)量進(jìn)行分析后發(fā)現(xiàn),這種“缺陷修正”方式帶來(lái)的新 bug 數(shù)量是它所修復(fù)的 bug 數(shù)量的兩倍…
版本管理過(guò)于簡(jiǎn)單。舊的版本是 1,今天的版本是 2,之后的版本是 3。沒(méi)有人能確切地知道具體發(fā)給客戶的是哪個(gè)版本。
某些時(shí)候,管理層會(huì)定下一個(gè)所謂的官方交付時(shí)間,而這個(gè)時(shí)間安排跟團(tuán)隊(duì)中的任何一種工作計(jì)劃都毫無(wú)關(guān)系。當(dāng)預(yù)定的交付日期到來(lái)的時(shí)候,客戶實(shí)際上收到的是一張帶有安裝教程的……空白CD,因?yàn)橐呀?jīng)有好幾個(gè)星期沒(méi)有人能構(gòu)建可執(zhí)行程序了。于是,客戶發(fā)現(xiàn)自己收到的是空白光盤,然后正式投訴,然后收到一個(gè)舊版的程序光盤作為應(yīng)付。而客戶之所以會(huì)發(fā)現(xiàn)程序是舊版的,是因?yàn)檐浖摹瓣P(guān)于”頁(yè)上還寫著跟去年那個(gè)版本一模一樣的日期…
03 團(tuán)隊(duì)組成更是莫名其妙
團(tuán)隊(duì)里充斥著這么一大群毫無(wú)任何軟件工程經(jīng)驗(yàn)的人,這軟件里要是 bug 不多就還真沒(méi)天理了吧?
還記得上面提到過(guò),管理層曾經(jīng)決定,要精簡(jiǎn)一下團(tuán)隊(duì)的事吧。
按理說(shuō),任何一個(gè)腦筋正常的經(jīng)理都會(huì)發(fā)現(xiàn),對(duì)于這樣一個(gè)純軟件工程的項(xiàng)目來(lái)說(shuō),人員開(kāi)支必定是最主要的開(kāi)支。然而,這個(gè)發(fā)現(xiàn),并不能阻止管理層把所有稍微有點(diǎn)經(jīng)驗(yàn)的程序員都開(kāi)了,換上對(duì)工資要求低得多的菜鳥。相對(duì)的,所有的經(jīng)理們的飯碗倒是都捧得牢牢的,一點(diǎn)都沒(méi)受影響。
這團(tuán)隊(duì)后來(lái)變成什么樣了呢?55 個(gè)人里面,只有 20 個(gè)程序員,剩下 35 個(gè)都是經(jīng)理。對(duì),你沒(méi)有看錯(cuò),這個(gè)陣容真是豪華,給每個(gè)程序員配備了 1.75 個(gè)經(jīng)理!沒(méi)幾個(gè)經(jīng)理有軟件工程方面的經(jīng)驗(yàn)。那時(shí)候,剛好出了 SCO 拿著 Unix 版權(quán)起訴 Linux 用戶的事情,就算這整件事不過(guò)是虛張聲勢(shì),但對(duì)許多人來(lái)說(shuō),當(dāng)時(shí)這事還是挺可怕的 —— 要是突然有天你不得不為自由軟件付費(fèi),那可如何是好啊。
技術(shù)知識(shí)也相當(dāng)缺乏。都 200x 年了,這群人還沒(méi)幾個(gè)了解互聯(lián)網(wǎng)的,少數(shù)幾個(gè)熟悉互聯(lián)網(wǎng)的,也不過(guò)就是拿互聯(lián)網(wǎng)看看小電影而已。要是你提到你在網(wǎng)上看了些啥,得到的都只會(huì)是別人的竊笑而已。
04 行政管理模式變態(tài)的發(fā)指
上面的荒謬情況也許會(huì)讓人捧腹大笑,但如果你知道管理層的那群法國(guó)佬對(duì)員工發(fā)起狠來(lái)就像是奧斯維辛集中營(yíng)里的德國(guó)鬼子,那你估計(jì)就笑不出來(lái)了吧。來(lái)看看這些官僚到病態(tài)的規(guī)定吧:
禁止遲到,所有人必須在上午9點(diǎn)前到崗。有一天,人事經(jīng)理早早就守在公司大門口,把所有9點(diǎn)01分及之后才到公司的人都當(dāng)場(chǎng)開(kāi)除了,程序員、經(jīng)理和銷售,都不能幸免。
咖啡機(jī)時(shí)不時(shí)就斷供,一斷就是好幾天。理由當(dāng)然是跑去喝咖啡的人效率不如坐著干活敲代碼的人。不僅如此,每當(dāng)有領(lǐng)導(dǎo)來(lái)開(kāi)發(fā)部視察的時(shí)候,這臺(tái)咖啡機(jī)還會(huì)被人關(guān)掉,免得讓領(lǐng)導(dǎo)看到有人“沒(méi)在干活”。
廁所的臟亂差程度可以說(shuō)是業(yè)內(nèi)絕無(wú)僅有的惡心與恐怖。想來(lái)這也是管理層避免大家花時(shí)間蹲帶薪廁的“高效”政策使然吧。
你可能要問(wèn)了,這種變態(tài)公司,怎么還有人前仆后繼的來(lái)上班?最主要的是,那段時(shí)間法國(guó)國(guó)內(nèi)經(jīng)濟(jì)正在崩潰的邊緣掙扎(直到現(xiàn)在,法國(guó)還沒(méi)完全走出這個(gè)泥潭),能找到一份足以糊口的工作就已實(shí)屬不易,工作條件苛刻點(diǎn)也就算了。
不可避免的結(jié)局
正如網(wǎng)友評(píng)論的那樣,著整個(gè)項(xiàng)目陷入了死循環(huán)的鏈條之中:缺乏經(jīng)驗(yàn)導(dǎo)致低效,低效導(dǎo)致開(kāi)銷太大,節(jié)省開(kāi)銷又裁掉有經(jīng)驗(yàn)的人,進(jìn)一步降低效率。
那么,為什么管理層還坐視這種情況的不斷惡化呢?歸根結(jié)底還是對(duì)失敗的擔(dān)心。如果你砍掉這個(gè)項(xiàng)目,就意味著這個(gè)項(xiàng)目失敗了,而負(fù)有領(lǐng)導(dǎo)責(zé)任的人就是你。如果這項(xiàng)目還在茍延殘喘,那等你升遷調(diào)任之后,這個(gè)爛攤子自然由繼任者來(lái)收拾啦。
最終,負(fù)責(zé)這個(gè)項(xiàng)目的公司領(lǐng)導(dǎo)因?yàn)榕灿觅Y金等原因被捕,進(jìn)了監(jiān)獄,這個(gè)在地獄的烈焰中掙扎了十幾年的項(xiàng)目,才終于宣告終止。
作為整件事情的親歷者,projectfailures 的博主給剛踏入編程世界的年輕人的建議是:
● 珍愛(ài)生命,沒(méi)事別用 C++ 折騰自己;
● 寧愿接一些不那么穩(wěn)定,但能自由發(fā)揮所長(zhǎng)的小項(xiàng)目,也別貪圖安逸去參加什么看起來(lái)很冠冕堂皇的工程;
● 面向?qū)ο蟮臄?shù)據(jù)庫(kù)并不是什么好東西;
● CORBA 應(yīng)該在烈焰中痛苦的死去;
● 那些愚蠢的產(chǎn)品經(jīng)理,請(qǐng)參照上一條。
最后,如果你覺(jué)得你現(xiàn)在的工作很糟心很窩火,希望這個(gè)項(xiàng)目能讓你開(kāi)心一點(diǎn)。
-END-