天天看點

Software Construction學習——軟體的品質屬性

軟體的品質是衡量軟體好壞的一個重要的名額;在軟體構造的過程中需要了解如果達不到品質名額,會有什麼後果;還需要了解有哪些面向品質名額的軟體構造技術。

一.軟體系統的品質屬性

外部品質因素(External quality factor):外部品質因素比如軟體使用的速度和難易度,這些因素都會被使用者所探查到。

内在因素(internal factors):内部品質因素比如子產品化程式設計、代碼可讀性。内部因素一般隻對于那些能接觸到軟體代碼本身的開發者而言。

綜上,隻有外部品質因素起到了作用;但是達到外部品質因素的關鍵是内部品質因素。即外部品質取決于内部品質。

***********分割線*************

(一)外部品質因素

正确性(Correctness):正确性是指軟體能準确地按照所提供spec執行。正确性是最主要的品質名額。

保證正确性的方法:

1.分層——一個真正的軟體系統涉及了許多領域,是以同對于多個要素進行分析,進而確定正确性是不太可能實作的。取而代之的是一種分層的方法,每一層都依賴于較低的一層。假設軟體系統是層狀的,每一層保證自己的正确性,同時假設其下層是正确的。 

Software Construction學習——軟體的品質屬性

2. 測試和調試(Testing and debugging)——發現不正确,消除bug(JUnit)

3. 防禦式程式設計(Defensive programming)——在寫程式的時候就保持正确性(assert)

4. 形式化方法(Formal approach)——數學技巧來驗證代碼的正确性

健壯性(Robustness):軟體對于異常輸入能否做出合理的反應。如果軟體接受到了異常輸入,健壯性保證軟體并不會産生災難性的反應,而是産生一些合理的錯誤資訊,然後終止程式的執行。

與正确性的差別:

1. 健壯性是對正确性的補充

2. 正确性是指對spec内合理的輸入做出的合理的反應,而健壯性是要求對于spec聲明之外的非法輸入做出合理的反應。(異常輸入:未被spec所覆寫的情況)

Software Construction學習——軟體的品質屬性

可擴充性(Extendibility):對軟體的spec進行修改,是否容易?一般來說,軟體規模越大,軟體擴充起來越不容易。大的軟體系統就像一個用紙牌搭成的房子,抽取出任何一張都有可能導緻整個房子的坍塌。但是擴充是必須的,因為軟體要應對變化。

增加可擴充性的兩個必要原則:

1. 簡約設計主義(Design Simplicity):一個簡潔的軟體架構能更加容易的适應變化。

2. 分離設計主義(Decentralization):更多的自主的子產品,就有可能使得變化的影響局限在幾個子產品之内而不是引起整個系統的變化。

可複用性(Reusability):軟體在開發之後能适用于多個不同的應用領域。可複用性的出現是因為軟體系統經常出現一些重複的模式,這就可能從其中抽取共性,并且對于那些已經遇到過的問題,要避免重新設計解決方案。

相容性(Compatibility):不同軟體之間可以很容易的結合,而不引起沖突。軟體的相容性之是以重要是因為我們不是在一個“真空”的環境之中進行軟體的開發,軟體之間是需要進行互動的。

相容性的關鍵是——保持設計的同構性,并遵守标準。

方法包括:

1. 标準檔案格式——就如同在Unix系統下,所有檔案都是一連串簡單的字元。

2. 标準資料結構——在Lisp系統下,所有的資料和程式都表示為二叉樹。

3. 标準使用者界面——Windows,MacOS,所有與使用者互動的工具都基于一個簡單的範例。

效率(Efficiency):在實作同樣目标下,時間複雜度、空間複雜度較低,對于硬體的需求越低越好。

    性能毫無意義,除非有足夠的正确性。對于性能的關注要與其他品質屬性進行這種。有時候過度的優化會導緻軟體不再适應變化和複用。
“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.”  ——Donald Knuth

可移植性(Portability):軟體可以友善的在不同環境下進行移植,不僅僅是硬體不同,還包括不同的作業系統。

易用性(Ease of use):對于不同水準和年齡的人而言,軟體是容易安裝、操作的;并且給使用者提供了詳細的指南。

    結構的簡易性(Structural simplicity):一個更加簡潔的、全面的結構,通常會比那些複雜的要更容易使用

    了解使用者(Know the user):一個好的設計者必須要了解軟體的使用者群體。

功能性(Functionality):系統所提供的可能性的範圍(Functionality is the extent of possibilities provided by a system不是特别了解)。程式設計中一種不适宜的趨勢,即軟體開發者增加越來越多的功能,企圖跟上競争,其結果是程式極其複雜、不靈活、占用過多磁盤空間。與此同時,還存在一個更加困難的問題是開發者在關注功能性的同時,忽略了其他的品質屬性。

Software Construction學習——軟體的品質屬性

及時性(Timeliness):軟體能在使用者的需求被了解到之前就已經存在了。一個軟體如果出現的太晚,那就有可能失去它的目标使用者。

其它的外部品質屬性:

    可驗證性(Verifiability):能簡單的提供測試資料,并且容易跟蹤錯誤

    完整性(Integrity):軟體能保護自身的代碼和資料,防止非授權的途徑對其進行通路和修改

    可修複性(Repairability):有促進修複的能力

    經濟性(Economy):及時性的附加,能在預算之内完成軟體的構造

(二)内部品質因素

複雜度(Complexity)基本上是所有外部品質因素的敵人。

源代碼相關:LOC(Lines of Code)和圈複雜度(Cyclomatic Complexity)……

Software Construction學習——軟體的品質屬性

架構相關:耦合度,内聚程度

可讀性(Readability)        可了解性(Understandability)        簡潔性(Clearness)        大小(Size)

(三)品質屬性的權衡

· 完整性 vs 易用性——如果要保證程式的完整性,就必須要加入各種各樣的保護措施,而這些措施勢必會降低程式的易用性

· 經濟型 vs 功能性——實作更多的功能意味着要花費更多的資金

· 效率 vs 可移植性、複用性——最佳的效率要求對于特定的硬體和軟體環境有着合适的相容程度,但同時就代表軟體隻能在特定的環境下使用,違背了可移植性。而對于spec的最佳的适應情況,就有可能使得複用性受損。

· 及時性 vs 可擴充性——及時性有可能要求開發者去進行“迅速的開發”,進而導緻軟體并沒有那麼強的可擴充性。

綜上,軟體的開發者需要對品質屬性進行一個權衡(Tradeoff)

    - 一般來說,軟體開發者會隐式的去進行各種品質屬性的權衡,而效率通常占據了主導

    - 一個真正的軟體工程方法意味着有一個明确的标準,并且要有意識的做出選擇

    - 正确的軟體開發過程中,開發者應該将不同品質因素之間如何做出折中的設計決策和标準明确的寫下來

有一個因素是絕對不能被放入權衡範圍之内的:正确性

在如今的軟體工業之中,有四個品質屬性是最重要的:

· 正确性和健壯性:可靠性(reliability)

    系統的軟體建構方法

    正規的spec

    在開發過程中進行自動檢查

    更好的語言機制

    持續的檢測工具

· 可擴充性和複用性: 子產品化( modularity)    

(四)在軟體構造過程中五個需要注意的品質目标

1.“優雅而美麗”的代碼 -> 更容易了解(Understandability)

Software Construction學習——軟體的品質屬性

2. 重複使用的設計方案 -> 降低開發成本(Reusablility)

Software Construction學習——軟體的品質屬性

3. 低複雜度 -> 适應變化,更容易擴充(Extendibility, Maintainability)

Software Construction學習——軟體的品質屬性

4.健壯性和正确性 -> 遇到bug程式仍能夠正常運作(Robustness, Correctness)

Software Construction學習——軟體的品質屬性

5. 程式的行為和效率 -> 更加有效率的運作(Efficiency,Performance)

Software Construction學習——軟體的品質屬性

繼續閱讀