官术网_书友最值得收藏!

1.2 細(xì)說軟件質(zhì)量屬性

1.2.1 正確性

正確性是指軟件按照需求正確執(zhí)行任務(wù)的能力。這里“正確性”的語義涵蓋了“精確性”。正確性無疑是第一重要的軟件質(zhì)量屬性。如果軟件運行不正確,將會給用戶造成不便甚至損失。技術(shù)評審和測試的第一關(guān)都是檢查工作成果的正確性。

正確性說起來容易做起來難。因為從“需求開發(fā)”到“系統(tǒng)設(shè)計”再到“實現(xiàn)”,任何一個環(huán)節(jié)出現(xiàn)差錯都會降低正確性。機器不會主動欺騙人,軟件運行出錯通常都是人造成的,所以不要找借口埋怨機器有毛病。開發(fā)任何軟件,開發(fā)者都要為“正確”兩字竭盡全力。

1.2.2 健壯性

健壯性是指在異常情況下,軟件能夠正常運行的能力。正確性與健壯性的區(qū)別是:前者描述軟件在需求范圍之內(nèi)的行為,而后者描述軟件在需求范圍之外的行為。可是正常情況與異常情況并不容易區(qū)分,開發(fā)者往往要么沒想到異常情況,要么把異常情況錯當(dāng)成正常情況而不做處理,結(jié)果降低了健壯性。用戶才不管正確性與健壯性的區(qū)別,反正軟件出了差錯都是開發(fā)方的錯。所以提高軟件的健壯性也是開發(fā)者的義務(wù)。

健壯性有兩層含義:一是容錯能力,二是恢復(fù)能力。

容錯是指發(fā)生異常情況時系統(tǒng)不出錯誤的能力,對于應(yīng)用于航空航天、武器、金融等領(lǐng)域的這類高風(fēng)險系統(tǒng),容錯設(shè)計非常重要。

容錯是非常健壯的意思,比如UNIX的容錯能力很強,很難使系統(tǒng)出問題。而恢復(fù)則是指軟件發(fā)生錯誤后(不論死活)重新運行時,能否恢復(fù)到?jīng)]有發(fā)生錯誤前的狀態(tài)的能力。

從語義上理解,恢復(fù)不及容錯那么健壯。

例如,某人挨了壞蛋一頓拳腳,特別健壯的人一點事都沒有,表示有容錯能力;比較健壯的人,雖然被打倒在地,過了一會還能爬起來,除了皮肉之痛外倒也不用去醫(yī)院,表示恢復(fù)能力比較強;而虛弱的人可能短期恢復(fù)不過來,得在病床上躺很久。

恢復(fù)能力是很有價值的。Microsoft公司早期的窗口系統(tǒng),如Windows 3.x和Windows 9x,動不動就死機,其容錯性的確比較差。但它們的恢復(fù)能力還不錯,機器重新啟動后一般都能正常運行,看在這個份上,人們也愿意將就著用。

1.2.3 可靠性

可靠性不同于正確性和健壯性,軟件可靠性問題通常是由于設(shè)計中沒有料到的異常和測試中沒有暴露的代碼缺陷引起的。可靠性是一個與時間相關(guān)的屬性,指的是在一定環(huán)境下,在一定的時間段內(nèi),程序不出現(xiàn)故障的概率,因此是一個統(tǒng)計量,通常用平均無故障時間(MTTF, mean-time to fault)來衡量。

可靠性本來是硬件領(lǐng)域的術(shù)語。比如某個電子設(shè)備在剛開始工作時挺好的,但由于器件在工作中其物理性質(zhì)會發(fā)生變化(如發(fā)熱、老化等),慢慢地系統(tǒng)的功能或性能就會失常。所以一個從設(shè)計到生產(chǎn)完全正確的硬件系統(tǒng),在工作中未必就是可靠的。人們有時把可靠性叫做穩(wěn)定性。

軟件在運行時不會發(fā)生物理性質(zhì)的變化,人們常認(rèn)為如果軟件的某個功能是正確的,那么它一輩子都是正確的。可是我們無法對軟件進行徹底的測試,無法根除軟件中潛在的錯誤。平時軟件運行得好好的,說不準(zhǔn)哪一天就不正常了,如有千年等一回的“千年蟲”問題、司空見慣的“內(nèi)存泄露”問題、“誤差累積”問題,等等。因此把可靠性引入軟件領(lǐng)域是很有意義的。

軟件可靠性分析通常采用統(tǒng)計方法,遺憾的是目前可供第一線開發(fā)人員使用的成果很少見,大多數(shù)文章限于理論研究。我曾買了一本關(guān)于軟件可靠性的著作,此書充滿了數(shù)學(xué)公式,實在難以看懂,更不知道怎樣應(yīng)用。請寬恕我的愚昧,我把此“天書”給“供養(yǎng)”起來,沒敢用筆畫一處記號。

口語中的可靠性含義寬泛,幾乎囊括了正確性、健壯性。只要人們發(fā)現(xiàn)系統(tǒng)有毛病,便歸結(jié)為可靠性差。從專業(yè)角度講,這種說法是不對的,可是我們并不能要求所有的人都準(zhǔn)確地把握質(zhì)量屬性的含義。

有必要搞清楚“故障”和“錯誤”這兩個容易混淆的概念。

在《現(xiàn)代英漢詞典》里,“故障(Fault)”一詞的定義是:使設(shè)備、部件或元件不能按所要求的方式運行的一種意外情況,可能是物理的也可能是邏輯的。

那些潛伏在代碼中的錯誤往往是不明顯的,之所以在測試的時候沒有暴露,是因為測試時的環(huán)境和條件不足以使之暴露,更何況我們無法對代碼進行最徹底的測試。由此可見,故障是在經(jīng)過日積月累,滿足了一定的條件之后才出現(xiàn)的。例如,“千年蟲”問題,“內(nèi)存泄漏(吃內(nèi)存)”導(dǎo)致內(nèi)存耗盡,“誤差累積”導(dǎo)致計算錯誤進而導(dǎo)致連鎖反應(yīng),“性能開銷累積”導(dǎo)致性能顯著下降,等等。因此,故障通常都是不可預(yù)料的、災(zāi)難性的。

“錯誤”的含義要廣泛得多,例如,語法錯誤、語義錯誤、文件打開失敗、動態(tài)存儲分配失敗等。一般說來,程序錯誤是可以預(yù)料的,因此可以預(yù)設(shè)錯誤處理程序,運行時這些錯誤一旦發(fā)生,就可以調(diào)用錯誤處理程序把它干掉,程序還可以繼續(xù)運行。因此,錯誤的結(jié)果一般來說不是災(zāi)難性的。

1.2.4 性能

性能通常是指軟件的“時間—空間”效率,而不僅是指軟件的運行速度。人們總希望軟件的運行速度快些,并且占用資源少些。舊社會地主就是這么對待長工的:干活要快點,吃得要少點。

程序員可以通過優(yōu)化數(shù)據(jù)結(jié)構(gòu)、算法和代碼來提高軟件的性能。算法復(fù)雜度分析是很好的方法,可以達(dá)到“未卜先知”的功效。

性能優(yōu)化的目標(biāo)是“既要馬兒跑得快,又要馬兒吃得少”,關(guān)鍵任務(wù)是找出限制性能的“瓶頸”,不要在無關(guān)痛癢的地方瞎忙活。例如,在大學(xué)里當(dāng)教師,光靠賣力氣地講課或者埋頭做實驗,職稱是升不快的。有些人找到了突破口,一年之內(nèi)“造”幾十篇文章,爭取破格升副教授、教授。在學(xué)術(shù)上走捷徑,這類“學(xué)者”的質(zhì)量真讓人擔(dān)憂。

性能優(yōu)化就好像從海綿里擠水一樣,你不擠,水就不出來,你越擠海綿越干。有些程序員認(rèn)為現(xiàn)在的計算機不僅速度越來越快,而且內(nèi)存越來越大,因此軟件性能優(yōu)化的必要性下降了。這種看法是不對的,殊不知隨著機器的升級,軟件系統(tǒng)也越來越龐大和復(fù)雜了,性能優(yōu)化仍然大有必要。最具有代表性的是三維游戲軟件,如《Delta Force》、《古墓麗影》、《反恐精英》等,如果不對軟件(關(guān)鍵是游戲引擎)做精益求精的優(yōu)化,要想在一臺普通的PC上順暢地玩游戲是不太可能的。

1.2.5 易用性

易用性是指用戶使用軟件的容易程度。現(xiàn)代人的生活節(jié)奏快,干什么事都可能想圖個方便,所以把易用性作為重要的質(zhì)量屬性無可非議。

導(dǎo)致軟件易用性差的根本原因是開發(fā)人員犯了“錯位”的毛病:他以為只要自己用起來方便,用戶也一定會滿意。俗話說“王婆賣瓜,自賣自夸”。當(dāng)開發(fā)人員向用戶展示軟件時,常會得意地講:“這個軟件非常好用,我操作給你看,……是很好用吧!”

軟件的易用性要讓用戶來評價。如果用戶覺得軟件很難用,開發(fā)人員不要有逆反心理:哪里找來的笨蛋!

其實不是用戶笨,是自己開發(fā)的軟件太笨了。當(dāng)用戶真的感到軟件很好用時,一股溫暖的感覺就會油然而生,于是就會用“界面友好”、“方便易用”等詞來夸獎軟件的易用性。

1.2.6 清晰性

清晰意味著工作成果易讀、易理解,這個質(zhì)量屬性表達(dá)了人們的一種質(zhì)樸的愿望:讓我花錢買它或者用它,總得讓我看明白它是什么東西。我小時候的一個伙伴在讀中學(xué)時就因搞不明白電荷為什么還要分“正”和“負(fù)”,覺得很煩惱,便早早地輟學(xué)當(dāng)了工人。

開發(fā)人員只有在自己思路清晰的時候才可能寫出讓別人易讀、易理解的程序和文檔。可理解的東西通常是簡潔的。一個原始問題可能很復(fù)雜,但高水平的人就能夠把軟件系統(tǒng)設(shè)計得很簡潔。如果軟件系統(tǒng)臃腫不堪,它遲早會出問題。所以簡潔是人們對工作“精益求精”的結(jié)果,而不是潦草應(yīng)付的結(jié)果。

在生活中,與簡潔對立的是“啰 唆”。廢話大師有句名言:“如 果我令你過于輕松地明白了,那你一定是誤解了我的意思。”中國小說中最“婆婆媽媽”的男人是唐僧。有一項民意調(diào)查:如果世上只有唐僧、孫悟空、豬八戒和沙僧這四類男人,你要嫁給哪一類?請列出優(yōu)先級。調(diào)查結(jié)果表明,現(xiàn)代女性毫不例外地把唐僧?dāng)[在最后。

很多人在讀研究生時有一種奇怪的體會:如果把文章寫得很簡潔,讓人很容易理解,投稿往往中不了,只有加上一些玄乎的東西,把本來簡單的東西弄成復(fù)雜的,才會增加投稿的命中率。雖然靠這種做法可能有效,可千萬不要把此“經(jīng)驗”應(yīng)用到產(chǎn)品的開發(fā)中!

1.2.7 安全性

這里的安全性是指信息安全,英文是Security而不是Safety。安全性是指防止系統(tǒng)被非法入侵的能力,既屬于技術(shù)問題又屬于管理問題。信息安全是一門比較深奧的學(xué)問,其發(fā)展是建立在正義與邪惡的斗爭之上的。這世界似乎不存在絕對安全的系統(tǒng),連美國軍方的系統(tǒng)都頻頻遭黑客入侵。如今全球黑客泛濫,真是“道高一尺,魔高一丈”啊!

對于大多數(shù)軟件產(chǎn)品而言,杜絕非法入侵既不可能也沒有必要。因為開發(fā)商和客戶愿意為提高安全性而投入的資金是有限的,他們要考慮值不值得。究竟什么樣的安全性是令人滿意的呢?

一般地,如果黑客為非法入侵花費的代價(考慮時間、費用、風(fēng)險等多種因素)高于得到的好處,那么這樣的系統(tǒng)就可以認(rèn)為是安全的。

1.2.8 可擴展性

可擴展性反映了軟件適應(yīng)“變化”的能力。在軟件開發(fā)過程中,“變化”是司空見慣的事情,如需求、設(shè)計的變化,算法的改進、程序的變化等。

由于軟件是“軟”的,是否它天生就容易修改以適應(yīng)“變化”?

關(guān)鍵要看軟件的規(guī)模和復(fù)雜性。

如果軟件規(guī)模很小,問題很簡單,那么修改起來的確比較容易,這時就無所謂“可擴展性”了。要是軟件的代碼只有100行,那么“軟件工程”也就用不著了。

如果軟件規(guī)模很大,問題很復(fù)雜,倘若軟件的可擴展性不好,那么該軟件就像用卡片造成的房子,抽出或者塞進去一張卡片都有可能使房子倒塌。可擴展性是系統(tǒng)設(shè)計階段重點考慮的質(zhì)量屬性。

1.2.9 兼容性

兼容性是指兩個或兩個以上的軟件相互交換信息的能力。由于軟件不是在“真空”里應(yīng)用的,它需要具備與其他軟件交互的能力。例如,兩個字處理軟件的文件格式兼容,那么它們都可以操作對方的文件,這種能力對用戶很有好處。國內(nèi)金山公司開發(fā)的字處理軟件WPS就可以操作Word文件。

兼容性的商業(yè)規(guī)則是:弱者設(shè)法與強者兼容,否則無容身之地;強者應(yīng)當(dāng)避免被兼容,否則市場將被瓜分。如果你經(jīng)常看香港拍的“黑幫”影片,你就很容易明白這個道理。所以WPS一定要與Word兼容,否則活不下去。但是Word絕對不會與WPS兼容,除非WPS在中國稱老大。

1.2.10 可移植性

軟件的可移植性指的是軟件不經(jīng)修改或稍加修改就可以運行于不同軟硬件環(huán)境(CPU、OS和編譯器)的能力,主要體現(xiàn)為代碼的可移植性。編程語言越低級,用它編寫的程序越難移植,反之則越容易。這是因為,不同的硬件體系結(jié)構(gòu)(如Intel CPU和SPARC CPU)使用不同的指令集和字長,而OS和編譯器可以屏蔽這種差異,所以高級語言的可移植性更好。

C++/C是一種中級語言,因為它具有靈活的“位操作”能力(因此具有硬件操作能力),而且可以直接嵌入?yún)R編代碼。但是C++/C并不依賴于特定的硬件,因此比匯編語言可移植性好。

Java是一種高級語言,Java程序號稱“一次編譯,到處運行”,具有100%的可移植性。為了提高Java程序的性能,最新的Java標(biāo)準(zhǔn)允許人們使用一些與平臺相關(guān)的優(yōu)化技術(shù),這樣優(yōu)化后的Java程序雖然不能“一次編譯,到處運行”,仍然能夠 “一次編程,到處編譯”。

一般地,軟件設(shè)計時應(yīng)該將“設(shè)備相關(guān)程序”與“設(shè)備無關(guān)程序”分開,將“功能模塊”與“用戶界面”分開,這樣可以提高可移植性。

主站蜘蛛池模板: 祁门县| 临海市| 阿勒泰市| 乌拉特中旗| 阜平县| 萍乡市| 历史| 古田县| 西充县| 大厂| 丹东市| 青神县| 宁阳县| 同德县| 安图县| 文登市| 鹰潭市| 九江县| 常熟市| 弋阳县| 莱芜市| 东辽县| 泰来县| 沈阳市| 饶平县| 延长县| 玉溪市| 拉孜县| 成都市| 侯马市| 萨迦县| 岱山县| 鲁甸县| 鹤山市| 大石桥市| 永清县| 嘉祥县| 乌恰县| 台山市| 静安区| 茂名市|