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