軟體危機和軟體缺陷的特點和區別

xioacd99 發表於 2021-12-01

軟體危機和軟體缺陷的特點和區別

由於軟體危機和軟體缺陷存在互相促進的可能性,很多情況下較難從事故現場對兩者進行一個清晰、明確的劃分,從軟體開發的5個階段——需求、設計、編碼、測試和維度逐一討論或許是個不錯的嘗試。

需求階段

作為軟體開發流程的排頭兵,這一階段累積的各種錯誤都會以不同的形式遷移轉化為各種地雷在接下來的開發流程中引爆。最明顯的一類就是軟體缺陷需求範圍上的錯誤,如“軟體未達到產品說明書中已經註明的功能”、“軟體未達到產品說明書中雖未指明但應明顯達到的目標”、“軟體功能超出產品說明書指明的範圍”等等。具體分析各個案例可以發現,這些事故往往伴隨著需求不清、需求頻繁變更或需求廣泛等特點。

雖然需求階段的錯誤也會引發軟體危機,但這往往是通過某種間接的機制實現的,不像軟體缺陷一樣是直接作用。如通過影響人事安排、經費預算、時間預期等來促使一線開發人員“走捷徑”、不管“技術債”、瘋狂趕ddl交付專案等。

此外,從交付結果來看,軟體缺陷至少能夠提交一個閹割版的產品,但軟體危機往往導致專案延期,或者從此擱淺,成為“爛尾樓”。

設計階段

在排除設計階段極度壓榨編碼階段的前提下,基本少見軟體危機直接或間接在這一階段產生影響。設計階段出現的多數糟心事都是需求階段進一步遷移轉化而來的。可見連目標都不清楚,即使有鬼斧神工也白搭。

編碼階段

在較為大型、正規的網際網路公司和組織中,這一階段較少見到直接由軟體缺陷造成的影響或故障,更多的案例是由軟體危機導致的。外行領導內行、上級瘋狂push瘋狂pua、ddl越來越近……在這樣的壓力之下,很少還有程式設計師能堅守自己的技術操守繼續做下去,要不提桶走人、要不置“技術債”於不顧,進而出現開發人員和開發過程管理不規範、約定不嚴密、文件書寫不完整等問題。在這樣的溫床下,各種bug、各式的軟體危機怎能不肆意生長。

此外也不能忽略軟體史上的確存在許多由軟體缺陷直接引發的故障(如三星手機的各種故障——截止2021年10月8日11:28:40 Google搜尋“三星 故障”得到13, 900, 000條結果、C++編譯器MinGW錯誤(如圖1所示)等)。這部分案例普遍存在技術難度大、實現細節繁瑣、複雜等特點,產生一些bug是在預期之中的。

圖片

圖1. C++編譯錯誤示例

測試階段

對軟體危機而言,基本沒有測試階段或缺乏嚴密有效的質量檢測手段(中小型網際網路公司和外包公司普遍偏愛全棧工程師、SDE (Software Development Engineer) 可以作為這種情況的一個有力證據)。這種環境下,大家只追求演示的5分鐘內不要出錯,哪還管的上軟體是否好用,使用者以後執行軟體出現的各種bug。雖然有許多公司即使進行了合理的測試工作也難逃軟體缺陷的結果(如IBM censor360作業系統),但他們的確會進行測試工作並反饋給開發團隊、管理團隊一些資訊。(如軟體難以理解、不易使用、使用者反饋軟體使用體驗感較差)至於為什麼還導致了軟體缺陷,這也許是各部分互相角力的最終成果。

維護階段

這一階段少見軟體危機的光顧,具體而言,如果相關核心人員還沒有走光的話,估計也沒人想碰這種維護難度大、幾乎不可能更改、不計KPI或OKR的東西。即使是軟體缺陷,也要具體情況具體分析。比較正規、大型的公司和組織雖然有能力重寫,但更多是選擇直接叫停專案(參見Microsoft、Google等公司);小公司只能直接放棄,進而演變為軟體危機。從這裡也可以看出,軟體缺陷和軟體危機兩者之間存在相互促進的可能性。