哈工大软件过程与工具复习1——第1-2讲 概论与核心思想
目錄
一、概論
1. 軟件的基本概念
(1)什么是軟件
(2)軟件的發展
2. 軟件工程的基本概念
(1)軟件工程產生的歷史根源
(2)軟件工程的基本概念
(3)軟件工程的知識體系
?3. 軟件工程工具
二、軟件工程核心思想
1.?軟件工程的本質:不同抽象層次之間的映射與轉換
2.?軟件工程所關注的目標
3.?軟件開發中的多角色
4. 軟件工程 = 最佳實踐
5.?軟件工程的四個核心理論概念
一、概論
1. 軟件的基本概念
(1)什么是軟件
軟件(Software):一組對象或項目所形成的一個“配置”,由程序、文檔和數據等部分構成。 –程序(program):可被計算機硬件理解并執行的一組指令,提供期望的功能和性能; –數據(data structure):程序能正常操縱信息的數據結構; –文檔(document):與程序開發、維護和使用有關的圖文材料 軟件的四大特征: 1.?復雜性(complexity):軟件要解決的現實問題通常很復雜,數據、狀態、邏輯關系的可能組合導致了軟件本身的復雜性。軟件無法以“制造”的方式被生產,只能采用手工開發方式,這是一種人為、抽象化的智能活動(智力密集型),與人的水平密切相關,人類思維的不確定性導致了開發過程的復雜性 2.?不可見性(invisibility):尚未完成的軟件是看不見的,無法像產品一樣充分呈現其結構,使得人們在溝通上面臨極大的困難,難以精確的刻畫和度量 3. 易變性(changeability):軟件所應用的環境由人群、法規、硬件設備、應用領域等因素匯集而成,而這些因素皆會頻繁快速的變化 4.?一致性(conformity):各子系統的接口必須協同一致,而隨著時間和環境的演變,要維持這樣的一致性通常十分困難(2)軟件的發展
1960-70年代:結構化方法——結構化程序設計方法、瀑布模型、螺旋模型等,好比建平房或用建平房的技術建造復雜建筑
1980:面向對象的方法——面向對象方法、面向對象模型及建模工具等,好比建高樓,可以更方便地構建復雜建筑
1990:構件化方法——軟構件方法、Web Services、軟件復用方法等,好比堆積木、造預制件等,可以批量地、快速地構建更為復雜的建筑
2000:面向服務的體系結構SOA方法——基于Internet與云計算的軟件開發方法
1950-1960年代:
軟件 = 程序(Program)
面向過程的軟件 = 算法(Algorithm) + 數據結構(Data Structure)
1970年代:
軟件 = 程序(Program) + 文檔(Document)
軟件 = 程序(Program) + 文檔(Document) + 數據(Data)
1980-1990年代:
面向對象的軟件 = 對象(Object) + 消息(Message)
1990年代-至今:
面向構件的軟件 = 構件(Component) + 框架(Framework)
面向服務的軟件 = 服務(Service) + 消息(Message) + 總線(Bus)
2. 軟件工程的基本概念
(1)軟件工程產生的歷史根源
軟件危機(Software Crisis):計算機軟件的開發和維護過程所遇到的一系列嚴重問題;?
(2)軟件工程的基本概念
(3)軟件工程的知識體系
?3. 軟件工程工具
計算機輔助系統工程工具 - CASE
制圖、建模工具:Rational Rose / Microsoft Visio / StarUML
原型制作工具:Balsamiq Mockups / ExtJS / ?jQuery / EasyUI /墨刀
集成開發環境:Visual Studio.NET / Eclipse
數據庫設計工具:PowerDesigner / ERWin
代碼生成工具:Rational Rose(含)
項目管理工具 - Microsoft Project
?
二、軟件工程核心思想
1.?軟件工程的本質:不同抽象層次之間的映射與轉換
任何軟件系統開發的共同本質在于:從現實空間的需求到計算機空間的軟件代碼之間的映射與轉換
單步映射與多步映射
軟件工程本質:用嚴格的規范和管理手段來縮小偏差,通過犧牲“時間”來提高“質量”
概念映射:問題空間的概念與解空間的模型化概念之間的映射?
業務邏輯映射:問題空間的處理邏輯與解空間處理邏輯之間的映射
為了實現以上兩個映射,軟件工程需要解決以下問題:
1. 需要設置哪些抽象層次——單步映射?多步映射?幾步?
2. 每一抽象層次的概念、術語與表達方式——公式?圖形?文字?
3. 相鄰的兩個抽象層次之間如何進行映射——需要遵循哪些途徑和原則?
需求分析:在一個抽象層上建立需求模型的活動,產生需求規約(Requirement Specification),作為開發人員和客戶間合作的基礎,并作為以后開發階段的輸入
軟件設計:定義實現需求規約所需的系統內部結構與行為,包括軟件體系結構、數據結構、詳細的處理算法、用戶界面等,即所謂設計規約(Design Specification),給出實現軟件需求的軟件解決方案
實現:由設計規約到代碼的轉換,以某種特定的編程語言,對設計規約中的每一個軟件功能進行編碼
驗證/確認:一種評估性活動,確定一個階段的產品是否達到前階段確立的需求(verification),或者確認開發的軟件與需求是否一致 (validation)
現實空間的需求 →?需求規約?→ 設計規約?→?代碼
2.?軟件工程所關注的目標
產品:各個抽象層次的產出物
過程:在各個抽象層次之間進行映射與轉換
軟件工程具有“產品與過程二相性”的特點,必須把二者結合起來去考慮,而不能忽略其中任何一方
功能性需求(Functional Requirements):軟件所實現的功能達到它的設計規范和滿足用戶需求的程度(功能1、功能2、…、功能n)
完備性:軟件能夠支持用戶所需求的全部功能的能力
正確性:軟件按照需求正確執行任務的能力,正確性描述軟件在需求范圍之內的行為
健壯性:在異常情況下,軟件能夠正常運行的能力,包括容錯能力和恢復能力。健壯性描述軟件在需求范圍之外的行為。
可靠性:在給定的時間和條件下,軟件能夠正常維持其工作而不發生故障的能力
非功能性需求(Non-Functional Requirements):系統能夠完成所期望的工作的性能與質量
效率:軟件實現其功能所需要的計算機資源的大小,“時間-空間”
可用性:用戶使用軟件的容易程度,用戶容易使用和學習
可維護性:軟件適應“變化”的能力,系統很容易被修改從而適應新的需求或采用新的算法、數據結構的能力
可移植性:軟件不經修改或稍加修改就可以運行于不同軟硬件環境(CPU、OS和編譯器)的能力
清晰性:易讀、易理解,可以提高團隊開發效率,降低維護代價
安全性:在對合法用戶提供服務的同時,阻止未授權用戶的使用
兼容性:不同產品相互交換信息的能力
經濟性:開發成本、開發時間和對市場的適應能力
商業質量:上市時間、成本/受益、目標市場、與老系統的集成、生命周期長短等
不同類型的軟件對質量目標的要求各有側重:
實時系統:側重于可靠性、效率
生存周期較長的軟件:側重于可移植性、可維護性
3.?軟件開發中的多角色
客戶單位(Client,甲方):
決策者(CXO)、終端用戶(End User)、系統管理員(Administrator)
軟件開發公司(Supplier,乙方):
決策者(CXO)
軟件銷售與市場人員
咨詢師、需求分析師
軟件架構師、軟件設計師
開發人員:開發經理/項目經理、程序員
維護人員
(曾經的我還會負責地把右下角的東西P掉,現在的我只想要躺平擺爛)?
4. 軟件工程 = 最佳實踐
軟件系統的復雜性、動態性使得:高深的軟件理論在軟件開發中變得無用武之地。即使應用理論方法來解決,得到的結果也往往難以與現實保持一致
因此,軟件工程被看作一種實踐的藝術。做過越多的軟件項目,犯的錯誤就越少,積累的經驗越多,承接項目的成功率就越高。對新手來說,要通過多實踐、多犯錯來積累經驗,也要多吸收他人的失敗與教訓與成功的經驗。
在軟件工程師試圖解決“軟件危機”的過程中,總結出一系列日常使用的概念、原則、方法和開發工具。這些實踐經驗經過長期的驗證,已經被證明是更具組織性、更高效、更容易獲得成功。大部分的這些實踐都沒有理論基礎!
5.?軟件工程的四個核心理論概念
核心概念:概念和形式模型、抽象層次、大問題的復雜性:分治、復用、折中、一致性和完備性、效率、演化
分而治之
將復雜問題分解為若干可獨立解決的簡單子問題,并分別獨立求解,以降低復雜性。然后再將各子問題的解綜合起來,形成最初復雜問題的解
核心問題:如何的分解策略可以使得軟件更容易理解、開發和維護?
復用
在一個新系統中,大部分的內容是成熟的,只有小部分內容是全新的,構造新的軟件系統可以不必每次從零做起。復用已經成功使用的架構、框架、同類經驗的團隊,直接使用已有的軟構件,即可組裝成新的系統,復用已有的功能模塊,既可以提高開發效率,也可以改善新開發過程中帶來的質量問題。
折中
不同的需求之間往往存在矛盾與沖突,需要通過折中來作出的合理的取舍,找到使雙方均滿意的點
核心問題:如何調和矛盾(需求之間、人與人之間、供需雙方之間、…)
演化
軟件系統在其生命周期中面臨各種變化
核心問題:在設計軟件的初期,就要充分考慮到未來可能的變化,并采用恰當的設計決策,使軟件具有適應變化的能力
即:可修改性、可維護性、可擴展性
總結
以上是生活随笔為你收集整理的哈工大软件过程与工具复习1——第1-2讲 概论与核心思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享15款漂亮的WordPress企业主
- 下一篇: python交互式日历制作_python