本书聚焦于金融软件的开发理论、技术和方法,并注重实践,强调使用正确的工程方法开发出成本低、可靠性好并能高效运行的金融软件,为金融软件的开发维护培养复合人才。本书以软件生命周期为顺序,分别介绍问题的定义和可行性分析、软件需求分析、软件设计、程序编码、软件测试、软件的发布维护和重构。并在现有软件工程的技术基础上,介绍金融科技项目实践。结合新兴的大数据、云计算、人工智能、区块链等技术,构建金融科技产业生态,并通过分析发展面临的挑战,对未来趋势进行展望。
前 言
背景和动机
目前我国金融行业正处于经济增长的前沿,证券、银行等金融产业占据着越来越重要的地位,各种金融产品影响着每个人的生活。金融行业需要大量既懂软件技术又掌握金融知识的专业软件开发人员。因而,学科的交叉融合是当前环境下的必然趋势,其基本指导思想是宽基础、重实践、求复合、创模式,即融合两个专业的学科基础,在有限的学习时间内奠定复合型人才的学科基础,并将复合人才的实践实训落到实处,强调内容重构和教学手段创新,力争形成既符合学科内涵又体现学科交叉的融合培养新模式。
自2016年以来,针对学科交叉融合建设中软件工程课程教学的需求,南京大学计算机科学与技术系进行了系统、深入的教学改革,落实金融计算机人才培养方案,加强学生软件工程能力培养,以适应专业和产业交叉融合发展,从而满足金融科技岗位需求。这次教学改革涉及面广、幅度大、要求高,包括计算机学科和金融工程学科的交叉融合、知识结构的重组优化、教学方式方法的改进、在线教学平台的开发应用、考核评价方法的适应调整等。本书在此背景下应运而生。
软件工程课程的目标是培养学生借助工程化的手段综合运用多方面知识来解决复杂问题和开展创新实践的能力。目前软件工程在一些行业、领域已普遍应用(如MIS、GIS、ERP等),但软件工程与金融领域交叉,其关键是数据处理和金融模型算法。开发维护这类软件系统时,需要在内容、流程和工具支撑上更有针对性,以融合软件工程和金融工程之间的认知差异。同时,通过针对性的软件系统工程化开发实践,学生可深入理解和掌握抽象的软件工程知识,并学以致用,在开发、维护软件系统的过程中克服困难、解决问题,进而积累经验、提升能力。
另外,跨学科的计算机金融实验班面向全校不同专业招生,学生编程基础相对薄弱,缺乏软件项目经验,需要开发维护的又是专门领域的软件,对金融和计算机两个专业的知识要求都很高。例如,金融软件需要在大量数据的基础上结合科学计算、机器学习等技术,对数据进行清洗、去重、规格化和针对性的分析,这涉及多个学科的多项专业技能。目前,互联网技术蓬勃发展并有效助力软件开发大环境的改善,各种开源软件、社区日新月异。总体来看,挑战与机遇并存。
本书以软件生命周期为序,分别介绍问题定义和可行性分析、软件需求分析、软件设计、程序编码、软件测试、软件的发布/维护/重构等内容,并在现有软件工程技术的基础上,结合新兴的大数据、云计算、人工智能、区块链等技术,介绍了金融科技项目实践,最后通过分析金融科技发展面临的挑战,对其未来趋势进行展望。本书可作为计算机类和金融类专业本科软件工程课程教学或实践课程教学的教材,也可作为金融领域金融科技工程师的参考用书。
继程序设计教材后,本书有助于提高学生的软件开发能力。要求学生在学习本书前应掌握信息管理系统、数据结构、结构化程序设计、面向对象程序设计以及程序设计方法论等知识。学生通过学习本书将在项目开发、毕业设计等方面奠定良好的基础。
教材组织思路
本书的组织思路是以项目驱动的方式让学生完整体验金融软件产品上线的全过程。例如:建设一个在线银行网站(存取款),从基本静态页面到动态交互页面、关联到数据库,再到考虑终端设备的多样性等;结合专业特点,完成一个融合信息获取、处理和表达等多方面设计的投顾系统;根据校园生活的衣、食、住、行各方面,实现App的开发和运维。但更重要的是做真实的项目,即有真正用户的软件,这样才能有真实的需求、场景和测试用例。
在需求分析阶段,要明确所需开发软件的需求(可采用思维导图,事先确定好what、why、how、who、when等要素),采用一系列技术和措施来保障实施推进工作的顺利开展,并高度重视所实现软件的质量检验。
在实施推进阶段,要求目标明确、方法得当、稳步推进。可以通过草图来细化软件设计,并充分了解现有的技术,包括基础的编程语言、算法、数据结构以及各种流行的框架、包、API等。在项目管理方面,关注各种文档的版本控制、需求变动,强调流程的规范性目前流行的GitHub可以有效处理项目的托管。
在质量检验阶段,可以设计功能、性能、可用性、安全性等方面的检查列表(Checklist),并学习分析(静态 动态)及测试(黑盒 白盒)技术,在度量时考虑内聚度 耦合度,维护时考虑需求变动 重构。
章节构成
第1章从软件工程的基本概念出发,介绍工程、软件的概念,以及软件的特点、软件的类型和软件危机;进而介绍软件工程的发展历史,包括软件开发历程、软件工程定义、软件工程生命周期模型以及软件工程的经济观点;最后介绍金融软件工程的产生背景及特点、内容等。
第2章从计算机及软件的发展历程出发,介绍软件开发计划的制订过程,包括问题定义、可行性分析、可行性分析报告和系统的开发计划,另外还介绍了个人软件流程与团队软件流程,以及敏捷过程、软件生命周期、软件体系结构。
第3章从软件需求入手,介绍了需求工程,重点是需求获取以及需求分析与建模。需求分析是软件定义时期的最后一个阶段,基本任务是准确回答系统必须做什么。另外还介绍了需求规格说明书的撰写以及需求验证。
第4章介绍有关软件设计的基本概念、设计技术和设计方法,包括图形建模、控制流、UML等,并介绍软件设计的过程、任务和步骤。
第5章着重考虑怎样实现软件系统,即对系统的各个模块进一步细化,分析各个模块的子模块,给出各子模块的算法和数据库设计等。该章介绍了各种过程设计工具以及数据库选择策略,并以ATM系统设计为例,展示了基于UML的分析设计过程。
第6章首先明确界面设计的概念,然后分析用户界面设计,接着说明界面设计的基本类型以及界面设计风格,最后分别介绍数据输入界面的设计和数据输出界面的设计。
第7章介绍程序设计语言的基本概念、基本成分、特性、发展和分类、选择,并说明什么是高质量代码,接着给出达到高质量的建议,包括代码复审和结对编程,另外还介绍了软件配置管理的概念、方法、技术和工具Git。
第8章介绍了软件测试的起源、概念和特点、流程和类别等基础知识,并给出了一些软件测试工具,解释了针对软件测试的一些误解,另外还介绍了软件测试设计的一些方法。
第9章着重介绍白盒和黑盒这两类基础的测试用例设计方法,比较了各种方法的特点和适用场景,另外还以ATM取款测试为例,说明如何应用这些用例设计方法。
第10章首先介绍程序错误类型,然后介绍软件测试的级别和类型,接着介绍软件的纠错(调试),最后介绍面向对象测试与敏捷测试;重点介绍了多模块程序的测试策略和软件调试技术。
第11章以Web应用为例,具体介绍软件测试的角度、内容和过程,以及Web应用自动化测试。
第12章的内容对形成可实际应用的软件非常重要。该章介绍软件稳定,以及和发布相关的词、发布流程、发布方案、发布前后的注意事项,并介绍软件维护和重构的相关技术。这是软件生命周期中耗时最长的阶段。
第13章从介绍金融科技四大新兴技术入手,详细说明了云计算、大数据、人工智能、区块链的概念、发展、技术要点和在金融领域的应用场景,结合金融科技产业生态以及发展面临的挑战和趋势,以量化投资、智能信贷、智能投顾为例,说明如何按照软件工程的原理和方法进行金融软件项目的实践,最后给出了AiQuant人工智能量化平台的案例分析。
致谢
笔者在编写本书的过程中得到了南京大学计算机科学与技术系各位老师的帮助,这里特别感谢仲盛教授、陶先平教授、聂长海教授等给予的鼓励和支持。
感谢20172022年这6年来选修本课程的同学以及完成本科毕业论文的同学,他们在金融软件工程的教学研讨与实践过程中提供了开阔的思路和丰富的素材,对最终形成本书起到了非常重要的作用。
本书在编写过程中得到了国家自然科学基金面上项目基于程序分析的IDE编程辅助智能增强关键技术研究(No.62272214)、国家自然科学基金重点项目面向安全攸关深度学习系统的软件测试技术(No.61832009)、南京大学软件新技术、南京大学计算机科学与技术系、华为南京大学下一代程序设计创新、南京大学校级教改项目计算机与金融工程交叉复合人才培养改革子课题计算机与金融工程复合人才培养计算机课程群建设研究等单位和项目的支持。
编者
2023年2月10日
于南京大学仙林校区计算机楼
目 录
前言
第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 软件工程的发展历史 8
1.3.1 软件开发历程 8
1.3.2 软件工程定义 9
1.3.3 软件工程生命周期模型 11
1.3.4 软件工程的经济观点 12
1.4 金融软件工程 13
作业 14
第2章 计算机软件的发展与
开发计划 16
2.1 计算机软件的发展历程 16
2.2 问题定义和可行性分析 18
2.2.1 现状调查和问题定义 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
作业 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 软件需求规格说明书 46
3.6 需求验证 47
作业 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的发展历程 63
4.5 其他设计方法 65
作业 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 数据库选择策略 80
作业 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 数据输入界面的设计 92
6.6 数据输出界面的设计 94
作业 95
第7章 程序编码 96
7.1 程序设计语言概述 96
7.1.1 程序设计语言的三要素 96
7.1.2 程序设计语言的基本成分 97
7.1.3 程序设计语言的特性 98
7.1.4 程序设计语言的发展和
分类 99
7.1.5 程序设计语言的选择 101
7.2 程序设计风格和代码规范 101
7.2.1 源程序的内部文档 101
7.2.2 数据说明 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
作业 122
第8章 软件测试基础 123
8.1 软件测试的起源 123
8.2 软件测试的相关概念和特点 125
8.2.1 软件缺陷 125
8.2.2 软件质量 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
作业 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
作业 156
第10章 软