本書聚焦于金融軟件的開發(fā)理論、技術和方法,并注重實踐,強調(diào)使用正確的工程方法開發(fā)出成本低、可靠性好并能高效運行的金融軟件,為金融軟件的開發(fā)維護培養(yǎng)復合人才。本書以軟件生命周期為順序,分別介紹問題的定義和可行性分析、軟件需求分析、軟件設計、程序編碼、軟件測試、軟件的發(fā)布維護和重構。并在現(xiàn)有軟件工程的技術基礎上,介紹金融科技項目實踐。結合新興的大數(shù)據(jù)、云計算、人工智能、區(qū)塊鏈等技術,構建金融科技產(chǎn)業(yè)生態(tài),并通過分析發(fā)展面臨的挑戰(zhàn),對未來趨勢進行展望。
前 言
背景和動機
目前我國金融行業(yè)正處于經(jīng)濟增長的前沿,證券、銀行等金融產(chǎn)業(yè)占據(jù)著越來越重要的地位,各種金融產(chǎn)品影響著每個人的生活。金融行業(yè)需要大量既懂軟件技術又掌握金融知識的專業(yè)軟件開發(fā)人員。因而,學科的交叉融合是當前環(huán)境下的必然趨勢,其基本指導思想是寬基礎、重實踐、求復合、創(chuàng)模式,即融合兩個專業(yè)的學科基礎,在有限的學習時間內(nèi)奠定復合型人才的學科基礎,并將復合人才的實踐實訓落到實處,強調(diào)內(nèi)容重構和教學手段創(chuàng)新,力爭形成既符合學科內(nèi)涵又體現(xiàn)學科交叉的融合培養(yǎng)新模式。
自2016年以來,針對學科交叉融合建設中軟件工程課程教學的需求,南京大學計算機科學與技術系進行了系統(tǒng)、深入的教學改革,落實金融計算機人才培養(yǎng)方案,加強學生軟件工程能力培養(yǎng),以適應專業(yè)和產(chǎn)業(yè)交叉融合發(fā)展,從而滿足金融科技崗位需求。這次教學改革涉及面廣、幅度大、要求高,包括計算機學科和金融工程學科的交叉融合、知識結構的重組優(yōu)化、教學方式方法的改進、在線教學平臺的開發(fā)應用、考核評價方法的適應調(diào)整等。本書在此背景下應運而生。
軟件工程課程的目標是培養(yǎng)學生借助工程化的手段綜合運用多方面知識來解決復雜問題和開展創(chuàng)新實踐的能力。目前軟件工程在一些行業(yè)、領域已普遍應用(如MIS、GIS、ERP等),但軟件工程與金融領域交叉,其關鍵是數(shù)據(jù)處理和金融模型算法。開發(fā)維護這類軟件系統(tǒng)時,需要在內(nèi)容、流程和工具支撐上更有針對性,以融合軟件工程和金融工程之間的認知差異。同時,通過針對性的軟件系統(tǒng)工程化開發(fā)實踐,學生可深入理解和掌握抽象的軟件工程知識,并學以致用,在開發(fā)、維護軟件系統(tǒng)的過程中克服困難、解決問題,進而積累經(jīng)驗、提升能力。
另外,跨學科的計算機金融實驗班面向全校不同專業(yè)招生,學生編程基礎相對薄弱,缺乏軟件項目經(jīng)驗,需要開發(fā)維護的又是專門領域的軟件,對金融和計算機兩個專業(yè)的知識要求都很高。例如,金融軟件需要在大量數(shù)據(jù)的基礎上結合科學計算、機器學習等技術,對數(shù)據(jù)進行清洗、去重、規(guī)格化和針對性的分析,這涉及多個學科的多項專業(yè)技能。目前,互聯(lián)網(wǎng)技術蓬勃發(fā)展并有效助力軟件開發(fā)大環(huán)境的改善,各種開源軟件、社區(qū)日新月異。總體來看,挑戰(zhàn)與機遇并存。
本書以軟件生命周期為序,分別介紹問題定義和可行性分析、軟件需求分析、軟件設計、程序編碼、軟件測試、軟件的發(fā)布/維護/重構等內(nèi)容,并在現(xiàn)有軟件工程技術的基礎上,結合新興的大數(shù)據(jù)、云計算、人工智能、區(qū)塊鏈等技術,介紹了金融科技項目實踐,最后通過分析金融科技發(fā)展面臨的挑戰(zhàn),對其未來趨勢進行展望。本書可作為計算機類和金融類專業(yè)本科軟件工程課程教學或實踐課程教學的教材,也可作為金融領域金融科技工程師的參考用書。
繼程序設計教材后,本書有助于提高學生的軟件開發(fā)能力。要求學生在學習本書前應掌握信息管理系統(tǒng)、數(shù)據(jù)結構、結構化程序設計、面向對象程序設計以及程序設計方法論等知識。學生通過學習本書將在項目開發(fā)、畢業(yè)設計等方面奠定良好的基礎。
教材組織思路
本書的組織思路是以項目驅動的方式讓學生完整體驗金融軟件產(chǎn)品上線的全過程。例如:建設一個在線銀行網(wǎng)站(存取款),從基本靜態(tài)頁面到動態(tài)交互頁面、關聯(lián)到數(shù)據(jù)庫,再到考慮終端設備的多樣性等;結合專業(yè)特點,完成一個融合信息獲取、處理和表達等多方面設計的投顧系統(tǒng);根據(jù)校園生活的衣、食、住、行各方面,實現(xiàn)App的開發(fā)和運維。但更重要的是做真實的項目,即有真正用戶的軟件,這樣才能有真實的需求、場景和測試用例。
在需求分析階段,要明確所需開發(fā)軟件的需求(可采用思維導圖,事先確定好what、why、how、who、when等要素),采用一系列技術和措施來保障實施推進工作的順利開展,并高度重視所實現(xiàn)軟件的質(zhì)量檢驗。
在實施推進階段,要求目標明確、方法得當、穩(wěn)步推進?梢酝ㄟ^草圖來細化軟件設計,并充分了解現(xiàn)有的技術,包括基礎的編程語言、算法、數(shù)據(jù)結構以及各種流行的框架、包、API等。在項目管理方面,關注各種文檔的版本控制、需求變動,強調(diào)流程的規(guī)范性目前流行的GitHub可以有效處理項目的托管。
在質(zhì)量檢驗階段,可以設計功能、性能、可用性、安全性等方面的檢查列表(Checklist),并學習分析(靜態(tài) 動態(tài))及測試(黑盒 白盒)技術,在度量時考慮內(nèi)聚度 耦合度,維護時考慮需求變動 重構。
章節(jié)構成
第1章從軟件工程的基本概念出發(fā),介紹工程、軟件的概念,以及軟件的特點、軟件的類型和軟件危機;進而介紹軟件工程的發(fā)展歷史,包括軟件開發(fā)歷程、軟件工程定義、軟件工程生命周期模型以及軟件工程的經(jīng)濟觀點;最后介紹金融軟件工程的產(chǎn)生背景及特點、內(nèi)容等。
第2章從計算機及軟件的發(fā)展歷程出發(fā),介紹軟件開發(fā)計劃的制訂過程,包括問題定義、可行性分析、可行性分析報告和系統(tǒng)的開發(fā)計劃,另外還介紹了個人軟件流程與團隊軟件流程,以及敏捷過程、軟件生命周期、軟件體系結構。
第3章從軟件需求入手,介紹了需求工程,重點是需求獲取以及需求分析與建模。需求分析是軟件定義時期的最后一個階段,基本任務是準確回答系統(tǒng)必須做什么。另外還介紹了需求規(guī)格說明書的撰寫以及需求驗證。
第4章介紹有關軟件設計的基本概念、設計技術和設計方法,包括圖形建模、控制流、UML等,并介紹軟件設計的過程、任務和步驟。
第5章著重考慮怎樣實現(xiàn)軟件系統(tǒng),即對系統(tǒng)的各個模塊進一步細化,分析各個模塊的子模塊,給出各子模塊的算法和數(shù)據(jù)庫設計等。該章介紹了各種過程設計工具以及數(shù)據(jù)庫選擇策略,并以ATM系統(tǒng)設計為例,展示了基于UML的分析設計過程。
第6章首先明確界面設計的概念,然后分析用戶界面設計,接著說明界面設計的基本類型以及界面設計風格,最后分別介紹數(shù)據(jù)輸入界面的設計和數(shù)據(jù)輸出界面的設計。
第7章介紹程序設計語言的基本概念、基本成分、特性、發(fā)展和分類、選擇,并說明什么是高質(zhì)量代碼,接著給出達到高質(zhì)量的建議,包括代碼復審和結對編程,另外還介紹了軟件配置管理的概念、方法、技術和工具Git。
第8章介紹了軟件測試的起源、概念和特點、流程和類別等基礎知識,并給出了一些軟件測試工具,解釋了針對軟件測試的一些誤解,另外還介紹了軟件測試設計的一些方法。
第9章著重介紹白盒和黑盒這兩類基礎的測試用例設計方法,比較了各種方法的特點和適用場景,另外還以ATM取款測試為例,說明如何應用這些用例設計方法。
第10章首先介紹程序錯誤類型,然后介紹軟件測試的級別和類型,接著介紹軟件的糾錯(調(diào)試),最后介紹面向對象測試與敏捷測試;重點介紹了多模塊程序的測試策略和軟件調(diào)試技術。
第11章以Web應用為例,具體介紹軟件測試的角度、內(nèi)容和過程,以及Web應用自動化測試。
第12章的內(nèi)容對形成可實際應用的軟件非常重要。該章介紹軟件穩(wěn)定,以及和發(fā)布相關的詞、發(fā)布流程、發(fā)布方案、發(fā)布前后的注意事項,并介紹軟件維護和重構的相關技術。這是軟件生命周期中耗時最長的階段。
第13章從介紹金融科技四大新興技術入手,詳細說明了云計算、大數(shù)據(jù)、人工智能、區(qū)塊鏈的概念、發(fā)展、技術要點和在金融領域的應用場景,結合金融科技產(chǎn)業(yè)生態(tài)以及發(fā)展面臨的挑戰(zhàn)和趨勢,以量化投資、智能信貸、智能投顧為例,說明如何按照軟件工程的原理和方法進行金融軟件項目的實踐,最后給出了AiQuant人工智能量化平臺的案例分析。
致謝
筆者在編寫本書的過程中得到了南京大學計算機科學與技術系各位老師的幫助,這里特別感謝仲盛教授、陶先平教授、聶長海教授等給予的鼓勵和支持。
感謝20172022年這6年來選修本課程的同學以及完成本科畢業(yè)論文的同學,他們在金融軟件工程的教學研討與實踐過程中提供了開闊的思路和豐富的素材,對最終形成本書起到了非常重要的作用。
本書在編寫過程中得到了國家自然科學基金面上項目基于程序分析的IDE編程輔助智能增強關鍵技術研究(No.62272214)、國家自然科學基金重點項目面向安全攸關深度學習系統(tǒng)的軟件測試技術(No.61832009)、南京大學軟件新技術、南京大學計算機科學與技術系、華為南京大學下一代程序設計創(chuàng)新、南京大學校級教改項目計算機與金融工程交叉復合人才培養(yǎng)改革子課題計算機與金融工程復合人才培養(yǎng)計算機課程群建設研究等單位和項目的支持。
編者
2023年2月10日
于南京大學仙林校區(qū)計算機樓
目 錄
前言
第1章 軟件工程概述 1
1.1 引言 1
1.2 軟件工程的基本概念 2
1.2.1 工程 2
1.2.2 軟件 3
1.2.3 軟件的特點 5
1.2.4 軟件的類型 5
1.2.5 軟件危機 6
1.3 軟件工程的發(fā)展歷史 8
1.3.1 軟件開發(fā)歷程 8
1.3.2 軟件工程定義 9
1.3.3 軟件工程生命周期模型 11
1.3.4 軟件工程的經(jīng)濟觀點 12
1.4 金融軟件工程 13
作業(yè) 14
第2章 計算機軟件的發(fā)展與
開發(fā)計劃 16
2.1 計算機軟件的發(fā)展歷程 16
2.2 問題定義和可行性分析 18
2.2.1 現(xiàn)狀調(diào)查和問題定義 18
2.2.2 可行性研究與論證 18
2.2.3 可行性分析所需工具 20
2.3 個人軟件流程與團隊軟件流程 21
2.4 敏捷過程 24
2.4.1 敏捷過程的流行 24
2.4.2 Scrum框架 25
2.4.3 用戶故事 27
2.4.4 敏捷估算 28
2.5 軟件生命周期 29
2.6 軟件體系結構 29
作業(yè) 31
第3章 軟件需求分析 33
3.1 軟件需求 33
3.2 需求工程 35
3.3 需求獲取 36
3.3.1 需求獲取的流程和方法 37
3.3.2 需求獲取的注意事項 38
3.3.3 NABCD模型 40
3.4 需求分析與建!41
3.4.1 需求分析 42
3.4.2 結構化需求分析 43
3.4.3 面向對象需求分析 44
3.5 軟件需求規(guī)格說明書 46
3.6 需求驗證 47
作業(yè) 48
第4章 軟件設計基礎 50
4.1 軟件設計過程 50
4.2 軟件設計的任務和步驟 52
4.3 軟件設計的方法 54
4.3.1 模塊化設計 55
4.3.2 結構化設計 58
4.3.3 面向對象設計 61
4.4 UML的發(fā)展歷程 63
4.5 其他設計方法 65
作業(yè) 66
第5章 軟件詳細設計 67
5.1 詳細設計階段的目的與任務 67
5.2 結構化詳細設計的描述工具 68
5.2.1 程序流程圖 68
5.2.2 N-S圖 69
5.2.3 PAD 70
5.2.4 偽代碼 71
5.3 基于UML的分析與設計過程 72
5.4 數(shù)據(jù)庫選擇策略 80
作業(yè) 82
第6章 用戶界面設計 83
6.1 界面設計的概念 83
6.1.1 界面與界面設計 83
6.1.2 用戶界面設計的要點和
原則 85
6.1.3 用戶界面設計相關人員和
工具 88
6.2 用戶界面設計分析 88
6.3 界面設計的基本類型 89
6.3.1 菜單 90
6.3.2 圖像 90
6.3.3 對話 91
6.3.4 窗口 91
6.4 用戶界面設計風格 92
6.5 數(shù)據(jù)輸入界面的設計 92
6.6 數(shù)據(jù)輸出界面的設計 94
作業(yè) 95
第7章 程序編碼 96
7.1 程序設計語言概述 96
7.1.1 程序設計語言的三要素 96
7.1.2 程序設計語言的基本成分 97
7.1.3 程序設計語言的特性 98
7.1.4 程序設計語言的發(fā)展和
分類 99
7.1.5 程序設計語言的選擇 101
7.2 程序設計風格和代碼規(guī)范 101
7.2.1 源程序的內(nèi)部文檔 101
7.2.2 數(shù)據(jù)說明 102
7.2.3 語句構造 103
7.2.4 輸入和輸出 104
7.3 結構化編程 104
7.3.1 結構化編程的起源 104
7.3.2 結構化編程的原則和
方法 105
7.3.3 程序復雜性度量 106
7.3.4 程序效率 107
7.3.5 結構化編程風格 108
7.4 面向對象編程 108
7.4.1 面向對象編程的特點 109
7.4.2 面向對象編程的概念和
術語 110
7.5 代碼復審和結對編程 111
7.5.1 代碼復審 111
7.5.2 結對編程 112
7.6 軟件配置管理 113
7.7 配置管理工具Git 116
7.7.1 Git的誕生 116
7.7.2 Git的工作機制 117
7.7.3 Git的安裝和使用 117
7.7.4 Git的工作原理 118
7.7.5 Git的遠程倉庫 119
7.7.6 Git的分支 120
作業(yè) 122
第8章 軟件測試基礎 123
8.1 軟件測試的起源 123
8.2 軟件測試的相關概念和特點 125
8.2.1 軟件缺陷 125
8.2.2 軟件質(zhì)量 127
8.2.3 軟件測試 127
8.3 軟件測試的流程和類別 129
8.3.1 軟件測試的流程 130
8.3.2 軟件測試的類別 131
8.4 軟件測試工具 136
8.5 有關軟件測試的誤解 137
8.6 對測試人員的要求 138
作業(yè) 139
第9章 軟件測試用例設計方法 140
9.1 白盒測試用例的設計 140
9.1.1 邏輯覆蓋方法 141
9.1.2 基本路徑測試方法 143
9.2 黑盒測試用例的設計 145
9.2.1 等價類劃分 146
9.2.2 邊界值分析 148
9.2.3 組合測試 149
9.2.4 因果圖法 152
9.2.5 決策表法 153
9.2.6 相關技術的比較和應用 154
9.3 ATM取款測試示例 155
作業(yè) 156
第10章 軟