軟體的應用已經遍及社會生活的方方面面,大到宇宙飛船、飛機、飛彈系統等,小到電視機、手機、MP3播放機等,軟體已經形成一個很大的產業,慢慢地成為比較成熟的行業,雖然它還不同於傳統的行業。因此,我們對軟體的依賴性也日益增加,也越來越不能接受品質低下的軟體,更不可能接受那種典型的、忽視品質的態度。到了今天,我們必須面對由來已久但不被重視的問題——軟體的品質需求。
品質的需求是被絕對認可的,但品質在軟體業的地位還不是十分堅固。人們希望開發出有品質的軟體,讓使用者接受它,但多數軟體企業到今天還不想生產出非常高的品質產品,軟體的缺陷可以存在,只要不會危機到產品有效性,只要不引起客戶的過多抱怨,就滿足了。他們認為,如果那樣會降低開發效率,延長開發週期,從而丟掉市場,或降低了投資回報等,實際情況真是那樣嗎? 那麼軟體品質在市場中的作用是什嗎?市場到底是怎麼影響軟體品質的?
市場力量對於軟體品質的影響,既有正面的,也有負面的。如果軟體產品品質非常糟糕,沒有人願意買它,也就是沒有客戶,結果就是得不到任何收入。相反,如果我們窮盡時日、耗盡人力、物力和財力去構造絕對完美的軟體,那麼其過長的開發週期和高昂的成本將決定該企業要麼喪失市場機會,要麼耗盡所有資源、無力去開拓市場、做營銷活動,最終也必然退出市場。所以,置身軟體行業的人們都要努力尋找一個難以把握的平衡點:產品要足夠好,以至它不會在諸如評估等階段就馬上被否定;同時也不追求十全十美、精雕細琢,否則會囿於時間和金錢而無法達到目的。
前面談過,軟體越來越複雜,軟體的複雜性又是軟體品質(包括軟體可靠性)的另一個敵人。這種複雜性,使軟體存在過多的缺陷,即使我們做了很大的努力,構建大型的、讓人滿意的系統的唯一辦法是不要持續地複雜化,必須保持對複雜性的控制力。比如Windows XP系統包含大約4千5百萬行代碼,這完全不是單獨某個人可以理解甚至想象的。如果要想保持對它們的控制,或者說還希望哪怕有一點點可靠性的話,唯一的辦法就是剔除沒必要複雜的部分,而想盡辦法保持對其餘部分的複雜性控制。物件導向方法、對象封裝技術、模組化設計、組件的構造等等就是朝這個方向努力的。
任何一個正在構建大型系統的人,天天面對的中心議題就是:如何剔除不必要的、人為的、自找的複雜部分,並控制好剩下的、無可逃避的複雜性,即去除不必要的複雜性和不得不處理必然的複雜性。可以找到一些工具,如物件導向技術和語言,協助我們處理必然的複雜性。例如,Windows作業系統,如果現在讓微軟公司擯棄過去的一切,重新設計它,肯定沒有現在Windows XP這麼複雜,也不需要四千五百萬程式碼。但是,它是從DOS, Windows 3.0/3.1/3.2 到Windows 95/98/NT/2000,一步一步發展過來,複雜性可想而知。另外,作為作業系統,無論是Windows XP、Linux、IBM AIX和SUN Solaris都必須處理Unicode,必須為上百種語言提供使用者介面,而且還必須相容大量廠商生產的、難以計數的不同型號的裝置。在現實世界中或市場競爭需要,我們不得不面對外界強加給我們的各種要求,這種必然的複雜性又是客觀存在,我們必須通過最佳化組織、分析隱藏資訊和模組化等手段找到辦法來處理。