「三分鐘學習軟體工程」軟體設計概述

2020-05-05   首席架構師


軟體設計是一個過程,通過這個過程,一個代理創建一個軟體工件的規範,目的是實現目標,使用一組原始組件並受到約束。[1]軟體設計可以指「所有涉及概念化、框架化、實現、調試的活動,最終修改複雜系統「或」遵循需求規範和編程之前的活動,如。。。一個程式化的軟體工程過程

軟體設計通常涉及解決問題和規劃軟體解決方案。這包括底層組件和算法設計以及高層架構設計。

概述

軟體設計是為一組或多組問題設想和定義軟體解決方案的過程。軟體設計的主要組成部分之一是軟體需求分析(SRA)。SRA是軟體開發過程的一部分,它列出了軟體工程中使用的規範。如果軟體是「半自動化」或以用戶為中心的,軟體設計可能會涉及到用戶體驗設計,從而產生一個故事板來幫助確定這些規範。如果軟體是完全自動化的(意味著沒有用戶或用戶介面),那麼軟體設計可以像描述計劃的事件序列的流程圖或文本一樣簡單。還有一些半標準的方法,如統一建模語言和基本建模概念。在這兩種情況下,計劃的某些文檔通常是設計的產物。此外,軟體設計可以獨立於平台或特定於平台,這取決於用於設計的技術的可用性。

軟體分析和設計的主要區別在於,軟體分析的輸出包含要解決的較小問題。此外,在不同的團隊成員或小組中,分析的設計不應該有很大的不同。相比之下,設計的重點是能力,因此同一問題的多個設計可以也將存在。根據環境的不同,設計通常會有所不同,無論是從可靠的框架創建的,還是使用合適的設計模式實現的。設計實例包括作業系統、網頁、移動設備甚至新的雲計算模式。

軟體設計既是一個過程又是一個模型。設計過程是一系列的步驟,使設計者能夠描述軟體的各個方面。創造性的技能,過去的經驗,對「好」軟體的理解,以及對質量的全面承諾,都是成功設計的關鍵因素。然而,需要注意的是,設計過程並不總是一個簡單的過程;設計模型可以與建築師的房屋規劃相比較。它首先表現出要建造的東西的整體性(例如,房子的三維效果圖);慢慢地,這個東西被提煉出來,為建造每個細節(例如,管道鋪設)提供指導。同樣,為軟體創建的設計模型提供了計算機軟體的各種不同視圖。基本設計原則使軟體工程師能夠在設計過程中導航。Davis[3]提出了一套軟體設計原則,這些原則在下面的列表中進行了修改和擴展:

  • 設計過程不應該受到「隧道視覺」的影響。一個好的設計師應該考慮其他的方法,根據問題的需求、可用的資源來判斷每一種方法。
  • 設計應可追溯到分析模型。由於設計模型的單個元素通常可以追溯到多個需求,因此有必要有一種方法來跟蹤設計模型如何滿足需求。
  • 這個設計不應該重新發明輪子。系統是使用一組設計模式構建的,其中許多模式以前可能遇到過。應始終選擇這些模式作為重新改造的替代方案。時間很短,資源有限;設計時間應該投資於通過集成已經存在的模式(如果適用)來表示(真正的新)思想。
  • 設計應該「最小化軟體和現實世界中存在的問題之間的智能距離」。也就是說,軟體設計的結構應該儘可能地模仿問題域的結構。
  • 設計應表現出一致性和集成性。如果設計看起來完全一致,那麼它就是一致的。為了達到這個結果,在設計工作開始之前,應該為設計團隊定義樣式和格式規則。如果在定義設計組件之間的接口時小心,則設計是集成的。
  • 設計的結構應適應變化。下一節討論的設計概念使設計能夠實現這一原則。
  • 即使遇到異常的數據、事件或操作條件,設計也應該被構造成溫和的降級。精心設計的軟體不應該「爆炸」;它應該被設計成適應不尋常的情況,如果它必須終止處理,它應該以一種優雅的方式這樣做。
  • 設計不是編碼,編碼不是設計。即使為程序組件創建了詳細的過程設計,設計模型的抽象級別也高於原始碼。在編碼級別做出的唯一設計決策應該處理使過程設計能夠被編碼的小的實現細節。
  • 設計應該在被創建時進行質量評估,而不是事後評估。在整個開發過程中,可以使用各種設計概念和設計措施來幫助設計師評估質量。
  • 應審查設計,以儘量減少概念(語義)錯誤。在審查設計時,有時會傾向於注重細節,而忽略了森林中的樹木。設計團隊應確保在擔心設計模型的語法之前,已經解決了設計的主要概念元素(遺漏、歧義、不一致)。

設計概念

設計概念為軟體設計者提供了一個可以應用更複雜方法的基礎。一套基本的設計概念已經形成。具體如下:

  • 抽象-抽象是通過減少概念或可觀察現象的信息內容來概括的過程或結果,通常是為了只保留與特定目的相關的信息。它是一種表示基本特徵的行為,不包括背景細節或解釋。
  • 精化——這是精化的過程。層次結構是通過逐步分解函數的宏觀語句來開發的,直到達到程式語言語句為止。在每個步驟中,給定程序的一個或多個指令被分解為更詳細的指令。抽象和精化是相輔相成的概念。
  • 模塊化-軟體架構被劃分為稱為模塊的組件。
  • 軟體架構-它指的是軟體的總體結構,以及該結構為系統提供概念完整性的方式。良好的軟體架構將在項目的預期結果方面產生良好的投資回報,例如在性能、質量、進度和成本方面。
  • 控制層次結構-表示程序組件的組織結構並表示控制層次結構的程序結構。
  • 結構劃分-程序結構可以分為水平和垂直兩種。水平分區為每個主要程序功能定義模塊層次結構的獨立分支。垂直分區建議控制和工作應該在程序結構中自上而下分布
  • 數據結構-它是數據的各個元素之間邏輯關係的表示。
  • 軟體過程-它專注於每個模塊的單獨處理。
  • 信息隱藏-應指定和設計模塊,以便模塊中包含的信息對不需要此類信息的其他模塊不可訪問。

在他的對象模型中,Grady Booch提到抽象、封裝、模塊化和層次結構是軟體設計的基本原則。[4]縮寫PHAME(層次結構、抽象、模塊化和封裝的原則)有時被用來指代這四個基本原則。[5]

設計注意事項

在一個軟體的設計中有許多方面需要考慮。每一個考慮因素的重要性都應該反映出軟體所要達到的目標和期望。其中一些方面是:

  • 兼容性-該軟體能夠與其他產品一起運行,這些產品是為與其他產品的互操作性而設計的。例如,一個軟體可能與它自己的舊版本向後兼容。
  • 可擴展性-新功能可以添加到軟體中,而無需對底層架構進行重大更改。
  • 模塊化-生成的軟體由定義良好的獨立組件組成,從而提高了可維護性。然後,這些組件可以在集成成所需的軟體系統之前單獨實現和測試。這允許在軟體開發項目中進行分工。
  • 容錯-軟體能夠抵抗並從組件故障中恢復。
  • 可維護性-一個衡量bug修復或功能修改的容易程度的指標。高可維護性是模塊化和可擴展性的產物。
  • 可靠性(軟體耐久性)-軟體能夠在規定的條件下在規定的時間內執行所需的功能。
  • 可重用性-在其他項目中使用現有軟體的某些或所有方面而不做任何修改的能力。
  • 穩健性-軟體能夠在壓力下運行,或容忍不可預測或無效的輸入。例如,它可以被設計成具有對低內存條件的彈性。
  • 安全性-該軟體能夠抵禦和抵抗敵對行為和影響。
  • 可用性-軟體用戶介面必須對其目標用戶/受眾可用。必須選擇參數的默認值,以便大多數用戶都能很好地選擇這些值。[6]
  • 性能-軟體在用戶可以接受的時間範圍內執行任務,並且不需要太多內存。
  • 可移植性-軟體應該可以在許多不同的條件和環境下使用。
  • 可擴展性-軟體很好地適應了不斷增長的數據或用戶數量。

建模語言

建模語言是一種人工語言,可以用來表達由一組一致的規則定義的結構中的信息、知識或系統。這些規則用於解釋結構中的組件。建模語言可以是圖形語言或文本語言。軟體設計的圖形建模語言示例如下:

  • 體系結構描述語言(ADL)是描述和表示軟體系統體系結構的語言。
  • 業務流程建模符號(BPMN)是流程建模語言的一個例子。
  • EXPRESS和EXPRESS-G(ISO 10303-11)是一種國際標準通用數據建模語言。
  • 擴展企業建模語言(EEML)通常用於跨多個層的業務流程建模。
  • 流程圖是算法或其他逐步過程的示意圖。
  • 基礎建模概念(FMC)是軟體密集型系統的建模語言。
  • IDEF是一個建模語言家族,其中最著名的包括用於功能建模的IDEF0、用於信息建模的IDEF1X和用於本體建模的IDEF5。
  • Jackson結構化編程(JSP)是一種基於數據流結構和程序結構之間的對應關係的結構化編程方法。
  • LeMP3是面向對象的可視化設計描述語言,是一種形式化的規範語言,主要適用於大型面向對象(java,C++,C語言)程序和設計模式的建模。
  • 統一建模語言(UML)是一種從結構和行為上描述軟體的通用建模語言。它有一個圖形符號,允許使用概要文件(UML)進行擴展。
  • Alloy(specification language)是一種通用的規範語言,用於表達軟體系統中複雜的結構約束和行為。它提供了一種基於一階關係邏輯的簡明語言。
  • 系統建模語言(SysML)是一種新的系統工程通用建模語言。
  • 面向服務的建模框架(SOMF)[7]

設計模式

軟體設計師或架構師可能會發現一個設計問題,這個問題過去曾被其他人訪問過,甚至可能被其他人解決過。描述常見問題解決方案的模板或模式稱為設計模式。這種模式的重用有助於加快軟體開發過程

技術

在軟體中使用「設計」一詞的困難在於,在某種意義上,程序的原始碼就是它所生成的程序的設計。在一定程度上,這是真的,「軟體設計」是指設計的設計。Edsger W.Dijkstra將這種語義層次的分層稱為計算機編程的「根本新奇之處」[9],Donald Knuth用他編寫TeX的經驗來描述在實現之前試圖設計程序的徒勞:

如果我僅僅指定了TEX,而沒有完全參與它的初始實現,它將是一個徹底的失敗。實施過程不斷地讓我產生意想不到的問題,並對如何改進原始規範有了新的見解

用法

軟體設計文檔可以在計算機編程之前進行審查或呈現,以允許對約束、規範甚至需求進行調整。重新設計可能發生在程序模擬或原型審查之後。可以在編程過程中設計軟體,而無需進行計劃或需求分析,[11],但對於更複雜的項目,這將被認為是不可行的。編程前的獨立設計允許多學科設計師和主題專家(SME)與高技能程式設計師協作,開發既有用又技術可靠的軟體。

相關話題

Wikimedia Commons has media related to Software design.

  • Aspect-oriented software development
  • Bachelor of Science in Information Technology
  • Design rationale
  • Interaction design
  • Icon design
  • Search-based software engineering
  • Software Design Description (IEEE 1016)
  • Software development
  • User experience
  • User interface design
  • Zero One Infinity

原文:https://en.wikipedia.org/wiki/Software_design

本文:http://jiagoushi.pro/node/969

討論:請加入知識星球或者微信圈子【首席架構師圈】