[軟體開發] 淺談軟體開發

是不是曾經很納悶, Google、Facebook、Apple 不是世界頂尖的軟體公司嗎?怎麼連這個小東西都會有 bug,這 bug 看起來也太愚蠢了吧~!

今天小弟就稍稍介紹一下軟體開發的世界,希望可以讓各位更瞭解這個世界到底是怎麼運作的。

 

小知識:要快速瞭解一個行業,先瞭解怎麼即可快速入門。

那就從一句話激怒軟體人起手吧!

寫程式不就是一堆 if else 兜一兜?我以前也寫過 blah blah 啊!很困難嗎? 

註: if else 可自行更換其他關鍵字,blah blah 可自行更換為 hello world、列印金字塔、猜數字、計算機、寵物雞、初音 ...。

 

軟體分類。

老實說這句話我一時也不知道該如何反駁,的確就是一堆東西兜一兜阿。那我們先來看看下面這張圖:

此圖中用四個象限來表示不同層次的軟體,圖中的「x N」,表示花費成本為 N 倍。軟體不光光是「大小」,更有這幾種層次之分,就算是兜也有大兜小兜。

簡單說明一下四個象限的意義:

  • 工具軟體 / 程式
    缺乏可擴充性,沒有明確的介面,程式碼呈現高耦合度。
  • 軟體系統
    由組件組成。具有高可擴充性,有明確介面以便擴充組件。
  • 軟體產品
    具有說明文件,與未來版本具有相容性。
  • 軟體系統產品
    軟體系統 x 軟體產品。
這些名詞並沒有很嚴謹的絕對定義,上頭的描述只是一個相對的概念。

 

變是唯一不變的。

軟體除了上述的層次有許多的不同以外,在開發中具有的最大的特色就是。相較硬體開發來說,軟體的變更異動,看起來根本就是零成本,怎麼可能不改呢?老闆要什麼就改什麼,市場端要什麼就改什麼,甚至蓋了十層樓突然想挖個地下室都得硬著拳頭挖呢!「變」就是軟體開發面臨的最大挑戰。

 

軟體成長的關隘。

接下來補充一個可以不知道的冷知識:

軟體的生命也是有盡頭的,工程師只是盡可能地延長他的壽命,期許他在有生之年能夠造福更多的人們。

硬體設備用久了會壞很容易理解,但軟體用久了會壞?嗯...這裡指的並不是用久了會壞,軟體用再久就是這個樣,不壞。壞的是它再也沒辦法擁有更多的功能,到達了開發年限。很難理解是嗎?那就用積木組合來想像,把軟體開發想像成堆積木,這邊說個故事:

  1. 老闆說,經過了市場調查,五層積木高的好棒棒塔是客戶最想要的組合,那就蓋個五層好棒棒塔吧!
    工程師表示游刃有餘,順道加點顏色變化不收費。完美的巧思阿!
  2. A 客戶覺得不錯,但覺得右邊長個長長的藍棒棒應該更好。
    加上了藍棒棒,但為了避免架構崩壞,上頭再壓個灰積木。
  3. 因應新的市場需求,A 客戶覺得希望在左邊也蓋個粉紅棒棒。
    加上了粉紅棒棒,一樣避免架構崩壞,移除了之前保持平衡用的灰積木,蓋上了粉紅棒棒。
  4. 可想而知,接下來相同於 2、3 的需求會一直不斷的出現,終究有一天,任何一小塊積木就再也堆不上去,或是每堆上一塊積木,在不知名處就會有積木位移、崩落。然而,這就是軟體生命的盡頭了,處於一個恐怖平衡,再也無法繼續增加任何功能。

從這個堆積木的故事,可以看見更多軟體開發中有趣的現象。

  • 軟體開發:簡單化、穩定的過程;軟體維護:複雜化、混亂的過程。
    (步驟 1 夠簡單吧,輕鬆愜意;步驟 2 之後開始有挑戰了...)
  • 為了新功能,往往需要變更舊功能的設計。
    (步驟 3 ,舊有的藍棒棒稍稍位移了。)
  • 當新功能不斷的增加,逐漸的,不斷的在修正舊問題所導致的新問題上,而不是在修正原有的架構錯誤。
    (步驟 3 ,只是移除了舊的灰積木,而不是擴大基座提高穩定性。)
根據統計,改 A 壞 B 的機率是 20% ~ 50% 呢!

 

尷尬的開發時程。

小測驗:
​軟體程式碼只有 1000 行的時候,加一個 A 功能要 1 天; 若程式碼長大到 10,000 行的時候,加一個大小與 A 功能相仿的 B 功能,約莫要耗時多久?
A) 1天  B) 10天  C) 30天  D) 100天  E) 300天

 

根據公式:費力程度 = 常數 x (程式碼數量) 1.5,答案是 「C)30天」。但想像一下若今天你是老闆,你會給這個員工 30 天去開發 B 功能嗎?反之,想像一下你是員工,老闆就算給你 30 天,你有能力將 30 天耗費的淋漓盡致確保 B 功能及原來所有功能運作正確嗎?很顯然,答案大多是否定的,這就是為何軟體總是滋生一堆 bug 的原因啊!!

程式碼呈線性成長,但軟體架構複雜度卻是呈指數型上升。
Bug 滋生是系統層級的問題,應該用系統的方式去解決。加班不能解決問題。 

 

困窘的人力需求。

大型的專案要在時限內完成,勢必需要投入更多的人力。然而軟體開發,又是重度依賴溝通的工作。一旦投入大量的人力,溝通成本又是指數上昇。沒錯,又是一個指數!當團隊人數成長到一定的界線時,生產力就不再上昇,反倒會開始下降。

專案很趕嗎?佛心老闆幫你們加人,一招送你們上西天!

 

以上種種看起來挺絕望的,那怎麼辦呢?

這篇文章只是淺談,這就不提了。但也就是存在這些困難,軟體工程師才不會失業,優秀的工程師會解決這一切的!

之後可以再來整理分享我所知道的解決方式。

 

※ 以上文章眾多內容、數據是參考軟體工程經典「人月神話」一書。