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