Published on

軟體專案地獄繪圖

Authors

譯者前言

這篇文章是該作者 2008 寫下的見聞。原文刊載於作者個人網站;十年後的 2018,他再次寫下本文張貼後的回響與發展。本譯文謹含 2008 年的首篇內容。

前言

幾年前,我擔任一個法國大型公司的軟體專案顧問。在這段期間內,我見證了超乎想像的軟體工程奇蹟,以及比監獄更沒有尊嚴的鄙視環境(這是比喻;當然我並非真的瞭解監獄)。行文有限,我在此主觀寫下的並非囊括全貌,大家看看就好。

專案內容

政府外包軟體元件開發,低複雜度,但過程有點曲折。

一開始政府給了幾百萬歐元的預算,預期在兩到三年完成整個專案。公司請了幾個人進行開發,團隊規模大約以每三個月倍增的速度增長,資金也隨之流入。

過了七年,專案仍沒有收尾的跡象,每天都要燒掉幾千歐元的預算;管理層於是決定要減少開支,把所有有經驗的人全部開除了,請了一些不太有經驗、甚至入門程度的軟體開發人員進來。

到了第十年,由於專案慘不忍睹的現況,中階管理層決定重請一些有開發經驗的人,試圖讓專案重返正軌。這時的新人平均任期是三個月,也就是法國的法定試用期長度。

十二年過去了,專案仍繼續執行。對於每一次的需求變更,公司都向政府申請一筆全新的專案經費,來彌補每日支出。這年也就是 2008。

現場概況

  • 六百萬行程式碼
  • 用 C++ 寫成
  • 五萬個 class
  • 各式 C++ 不良寫法隨處可見,綁定特定編譯器版本,只能在特定作業系統上使用,而且該作業系統已經不再維護了
  • CORBA 架構
  • 資料庫開發商早已破產倒閉
  • 為了 GUI 而用了一層又一層的軟體架構,而且每一層的原作者都已不再維護了
  • 整個編譯打包過程,需要 32 台機器平行處理 48 小時
  • 光是使用者介面就需要開 40 到 50 個 process
  • 完全沒有動態函式庫:單一執行檔大小就有上百 MB
  • 啟動時間需要 15 分鐘
  • 程式常常崩潰,平均可以活 30 秒到 30 分鐘

沒有一個軟體工程師會說 C++ 很簡單。事實上,就程式語言設計上的複雜度而言,C++ 可能算是最糟的一種。它已經複雜到連最初的創造者都承認自己無法完全駕馭,下面這篇面試惡搞文搏君一笑:http://www-users.cs.york.ac.uk/~susan/joke/cpp.htm

面對 C++ 這樣深不見底的迷宮,有些瘋狂信徒開始試圖證明自己的能力;他們無所畏懼地深入其中,承受著傷害,消耗無數時間,不斷嘗試從各種看似相近的錯誤訊息中間接找出程式崩潰的原因。其中一些人悟道了,於是換個語言,跳去其他專案,人生苦短。

維護大型軟體本身也是個困難的事。單一個團隊必須維護 六百萬行 的程式碼,你馬上可以理解這在軟體工程領域中瘋狂的程度對人類還太早了;六百萬是個大數字:即使你用超快的速度閱讀程式碼,每秒看一行,也需要七天不眠不休盯著螢幕才看得完。

為了讓各位更有感覺,這裡講兩件軼事。

在使用者介面按右鍵,會使整支程式凍結在那邊,於是派了一個人去找出問題根源。經過數日小心翼翼地檢查程式,以及無數次重現問題的耐心等待,他發現其實右鍵功能本身好好的,只是必須花上 45 分鐘等選單跳出;這是因為選單內容是每次按鍵時才動態產生,而內容資料取自於極大量的靜態資料。

另一次是客戶回報,說「從光碟載入資料」的功能不會動。這次也花了好幾週的時間釐清,最後客戶自己把回報項目標上「已解決」;也許你已經猜得到,問題其實只是載入 700MB 的資料需要花七天,如此而已。忍耐是一種美德。

版本控制不受控

在專案開始後的數年,才有個聰明的傢伙,體悟到他們需要引入版本控制。一開始試行的方法並不順暢,所以他們改用另一套工具,然後再過幾年發生了一場意外,把這中間的所有更動歷程全部搞丟了。

最後採用的工具是個有圖形介面的災難,那是一套來自瑞典的產廢。一個四人小組全職處理這套版控系統產生的各種問題,像是:

  • 產生頭一個 checkout 必須事先和這個版控小組約定執行,大概需要一週的時間才能搞定
  • 想要更動任何一個檔案,必須有中階主管的同意才能開始;你必須告訴經理,想要改動哪個檔,然後寄出一份正式申請文件給版控小組,幾天後收到你要的檔案
  • 每次改動程式碼,都會產生新的分枝,意味著你必須自行合併你所收到的每個檔案。先前提到,這個專案的檔案是如此繁多,兩個人同時改動同一處的機率是如此低微;但事實是,常被改的檔大約只有固定百來個
  • 改完後的程式碼,又有另一番痛苦的流程要跑。首先要跑過一套 bug 偵測程式,然後給中階主管審閱。可想而知,這過程不但遲緩,且不可能使得解 bug 的速度趕上 bug 產生的速度。從回報系統的數量可以看出,問題產生的速度大約是修正的兩倍。
  • 版號設計相當隨性。舊的就是第一版,今天就是第二版,某個未來會叫第三版。沒有人知道哪一版是要釋出給客戶的目標版號。

雖然正式的釋出日程是有訂定的,但訂這時程的方式完全獨立在開發團隊的計劃之外。當要釋出的那天到來,客戶會收到一張空白光碟片,裡面除了安裝教學以外沒有任何東西,因為開發團隊沒有辦法短時間編譯程式出來。客戶在收到空白光碟之後當然會提出抗議,然後再寄給他們一張有東西的新光碟,只是裡面的程式其實是舊版現成的。某次客戶終於發現東西沒更新,原因是「關於」頁面裡面的內容跟去年一模一樣。

關於人事

只給花生就只請得到猴子

面對一個龐大且毫無開發經驗的團隊,還會有人對 bug 飛快地產生感到意外嗎?管理團隊裡出現了一個天才,發現這純軟體開發過程中的所有支出都源自於人;這個驚人的事實嚇不了他的,因而下了一個決策:把所有有經驗的開發人員全部開除,留下管理人員。那陣子辦公室隨處可見「C++ for dummies」(譯註:C++ 入門中的入門書)

認識這個團隊

團隊裡一共有 55 人:20 個開發人員,35 個經理

你沒看錯,經理比開發者還多。這些經理日復一日拿著差不多的簡報開著組織會議,同時開發者們在外面聊天消磨時間。

其中一小部份的經理有一點軟體工程經驗。當時適逢 SCO 為 Linux 程式碼侵權對 IBM 提出訴訟,且不論這場官司是否是場鬧劇,至少人們籍此事件認知到使用自由軟體並非毫無代價。在此之前,他們對軟體自由一無所知,但說到軟體免費便無人不曉;不消說,整個專案裡無處不充斥著 GNU 函式庫,當初使用時當然也未能意料 GNU 共享議題;然後,嘿嘿,因為程式碼品質爛到不行,他們也不知道該從何開放原始碼。

技術水準非常低落。非常少數人知道網際網路這種東西,而且這些人對網路的認知也只知道有色色的東西可以看。在這個辦公室裡提到你會使用網際網路,會得到一些曖昧不明的眨眼與微笑。

歡迎來到地獄

這整段經歷看起純粹只是滑稽,但管理高層納粹集中營式的決策使它變成真實的地獄。下面隨便舉幾個例子:

  • 絕對禁止早上 9 點以後才到公司。某日,現場經理等在公司大門後面,把 9:01am 以後才看到的人全部開除,包括一部份經理和銷售人員
  • 抽菸會打斷工作,所以管理層曾強迫所有人戒菸。但是無效
  • 平常每過幾天,咖啡機內的咖啡就會用光。因為喝咖啡必須離開座位,徒然浪費寶貴的寫程式時間
  • 如果有政府官員要來,則咖啡機全面關閉,以製造一種全公司所有人全心工作的印象
  • 我所見過最噁爛的廁所。這也是有理由的:排泄的時間越少,工作的產出越多(也越好)

也許你無法理解為何還會有人應徵這種環境的工作。第一個理由是,法國曾遭受相當沉重的經濟衝擊(時至今日,影響仍在持續)。擁有一個工作與固定的薪水,是人們的第一考量,至於環境什麼的就再說。

另一個理由,對於多數這份工作的約聘人員來說,這是他們人生中第一份工作、第一家企業;在沒有比較對象時,無法評估這份工作究竟有多鳥蛋。大部份新鮮人可能對於遲到就開除這種事感到理所當然,也不會對如此鐵腕的管理階層感到病態。

至於政府為何會放任這種情形發生:你知我知。政府部會的預算管理人員,與許多企業的高層私交甚篤。在法國這樣的國家,公務人員腐敗並非罕事,大多不會被人們查覺,即便曝光也鮮少被起訴。當然這不只在法國,我聽過許多類似的故事,無論是歐洲或是美國。