高级软件工程课程总结

1.初识软件工程

1.1软件无处不在

“软件定义世界”成为社会发展的潮流,软件在人类生活中扮演者越来越重要的角色,软件已经成为一个极其重要的产业形态。

软件是软件工程的研究对象,也是软件工程的产品形态与客观存在。

工程是将理论和知识应用于实践的科学,其目的是经济有效地解决实际问题。

1.2软件的本质与特性

软件=程序+数据+文档

软件具有复杂性、一致性、可变性和不可见性等固有的内在特性,这是造成软件开发困难的根本原因。

1.3软件工程的产生与发展

根据美国standish集团的调查报告,软件项目的成功率大概在30%左右。

软件开发面临的挑战:交付的许多功能不是客户需要的,交付的日期没有保障,客户使用时发现许多bug,客户需求变化频繁,无力应对,无法预见软件的交付质量,对流程盲目遵从,忽视客户业务价值,开发团队专注于技术,忽视风险,无能力预测成本,导致预算超支,无法评估开发人员能力及工作进度,困扰于如何提升团队的能力与效率。

发展历史:

(1)史前阶段(1956-1967):软件开发没有方法可循;软件设计是开发人员头脑中的隐藏过程;60世纪中期的软件危机。

(2)   瀑布过程模型(1968-1982):1968年提出“软件工程”结构化开发方法,瀑布式软件生命周期模型成为典型。

(3)质量标准体系(1983-1995):面向对象开发方法,软件过程改进运动,CMM/ISO9000/SPICE等质量标准体系。

(4)20世纪90年代至今:敏捷开发方法流行,更紧密的团队协作,有效应对需求变化,快速交付高质量软件,迭代和增量开发过程。

1.4软件工程的基本概念

软件工程是:(1)将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即工程化应用到软件上;(2)对(1)中所述方法的研究。

软件工程的目标是创造出足够好的软件。

软件工程的基本要素:(1)过程(支持软件开发各个环节的控制和管理);(2)方法(完成软件开发任务的技术手段);(3)工具(为软件开发方法提供自动或半自动的软件支撑环境)。

软件开发活动:问题定义(构想文档,用户故事)》》需求开发(分析模型,软件需求规格说明)》》软件设计(设计模型,软件体系结构文档,软件详细设计文档)》》软件构造(源程序,目标代码,可执行构件)》》软件测试(测试规程,测试用例,测试报告)。

软件工程方法:面向过程(以算法为基本构造单元,强调自顶向下的功能分解,将功能和数据进行一定程度的分离)》》面向对象(以类为基本程序单元,对象是类的实例化,对象之间以消息传递为基本手段)》》面向构件(寻求比类的粒度更大的且易于复用的构件,期望实现软件的再工程)》》面向服务(在应用表现层次上将软件构件话,即应用业务过程由服务组成,而服务由构件组装而成)

软件工程工具:需求开发+软件设计(软件建模工具,数据库设计工具)》》软件构造(程序编辑器、编译器、解释器、调试器、集成开发环境)》》软件测试(单元测试工具,静态分析工具,自动化测试工具,性能测试工具,缺陷跟踪工具)》》软件维护(代码重构工具,逆向工程工具)》》开发管理(需求管理工具,项目管理工具,配置管理工具,测试管理工具)


软件开发的基本策略:软件复用(不仅仅是代码的复用,包括【库函数、类库,模板(文档、网页等),设计模式,组件,框架】),分而治之,逐步演进,优化折中。

例子:使用内存缓冲区方法,读取1468802字节文件时,2048和4096的缓冲大小对性能的提升不大,故选择2048的缓冲大小。

软件过程的Wasserman规范:抽象、软件建模方法、用户界面原型化、软件体系结构、软件过程、软件复用、度量、工具与集成环境。

1.5软件质量实现

软件质量:用户(功能质量)》》开发人员》》(结构质量)》》投资者(过程质量)。

软件过程(过程质量)》》软件产品(内部质量+外部质量)》》产品效用(使用质量)。

好的软件:正确的软件+软件运行正确;

ISO9126质量模型:外部和内部质量(功能性【适合性、准确性、互操作性、安全性】、可靠性【成熟性、容错性、可恢复性】、易用性【易理解性、易学习性、易操作性、吸引性】、效率/性能【时间特性、资源利用】、可维护性【易分析性、易改变性、稳定性、易测试性】、可移植性【适应性、易安装性、共存性、替换性】)

实现软件质量:高质量的设计+规范的编码+有效地测试。


2.编写高质量的软件代码

2.1编程过程与规范

软件编程是一个复杂而迭代的过程,它不仅仅是编写代码,还应该包括代码审查、单元测试、代码优化、集成测试等一系列工作。

软件编程规范是用特定语言相关的描写如何编写代码的规则集合。

Python 的import语句:先import内置模块,再import第三方模块,最后import自己开发项目中的其他模块;这几种模块中用空行分隔开来。

Python的列表推导:

[s['name'] for s in students if s['age']>18]

Python的条件表达式:

return s['name'] if s['age']>18 else s['nickname']

2.2良好的编程实践

模块化程序设计:将一个大的程序按功能分解成一系列小模块。

web应用系统:水平划分(用户管理、权限管理、...、业务功能),垂直划分(应用服务层、业务逻辑层、数据存储层);

基于易变和稳定:认识和识别变与不变的部分,并将之科学地分离开;

基于单一职责:类或者函数应该只做一件事,并且做好这件事;

模块设计》》开发模块之间的接口》》

2.3Python集成开发环境

PyCharm:涉及较多web开发时使用。

2.4代码静态检查




Pykint安装与使用:

pip install -U pylint  #安装最新版的Pylint
pylint [options] module_or_package_or_file  #对模块/包/文件运行pykint
            --rcfile=<file>  指定检查的配置文件
	    --ignore=<file>  不进行检查的文件列表
            --disable=<msg ids>   关闭某种类型的检查
	    --f <format> 报告类型,如html
pylint --help-msg <msg-id>   #查看某种类型问题的帮助
pylint --generate-rcfile   #根据当前配置生成配置文件

类型:

C(Convertion,约定)

R(Refactor,重构)

W(Warning,警告)

E(Error,错误)

2.5代码性能分析

优化是对代码等价变换,使得变换后的代码运行结果与变换前的代码运行结果相同,但执行速度加快或存储开销减少。

改进算法,选择合适的数据结构:

良好的算法对性能起到关键作用,因此性能改进的首要点事对算法改进;

算法时间复杂性的排序依次是 O(1)<O(lgn)<O(nlgn)<O(n^2)<O(n^3)<O(n^k)<O(k^n)<O(n!);

对成员的查找访问等操作,字典(dictionary)要比列表(list)要快;

集合(set)的并、交、差的操作比列表(list)的迭代要快;

循环优化的基本原则:尽量减少循环过程中的计算量,在多重循环的时候,尽量将内层的计算提到上一层;

字符串的优化:Python的字符串对象是不可改变的。字符串连接的使用尽量使用join()而不是+。当对字符串可以使用正则表达式或内置函数处理时,选择内置函数;

使用列表解析和生成器表达式:列表解析要比在循环中重新构建一个新的list更为高效,因此可以利用这一特性来提高运行效率。

2.6结对编程实践

结对编程是由两名程序员在同一台电脑上结对编写解决同一问题的代码。


3.单元测试

3.1单元测试概述

单元测试是对软件中的最小可测试单元进行检查和验证。

程序=UT+CODE,测试人员有权利对没有做过UT的代码说No。

单元测试:模块接口(对通过所有被测模块的数据流进行测试),局部数据结构(检查模块中的数据结构是否正确的定义和使用),边界条件(检查数据流或控制流中条件或数据处于边界),独立路径(检查由于计算错误、判定错误、控制流错误导致的程序错误),出错处理(检查可能引发错误处理的路径以及进行错误处理的路径)。

单元测试原则:快速的,独立的,可重复的,自我验证的,及时的。

指标:测试通过率,测试覆盖率。

代码覆盖率:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

单元测试方法:静态测试,动态测试。

Mock测试:在测试过程中对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象(即Mock对象)来创建以便测试的方法。例如,真实对象具有不可确定的行为(产生不可预测的结果),真实对象很难被创建(如具体的web容器),真实对象的某些行为很难触发(如网络错误),真实情况令程序额运行速度缓慢,真实对象有用户界面,测试需要询问真实对象它是如何被调用的,真实对象实际上并不存在。

3.2黑盒测试方法

黑盒测试(black box testing):又称功能测试,它将测试对象看作一个黑盒子,完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。

测试用例(测试集:测试用例值的集合):测试用例值,期望结果,前缀值,后缀值。

测试用例设计:具有代表性和典型性;寻求系统设计和功能设计的弱点;既有正确输入也有错误或异常输入;考虑用户实际的诸多使用场景。

黑盒测试技术:等价类划分,边界值分析,因果图决策表,场景法,组合设计法,状态转换测试。

等价类划分是将输入域划分成尽可能少的若干子域,在划分中要求每个子域两两互不相交,每个子域称为一个等价类。

变量的等价类==》字符串:在规定了输入数据必须遵守的规则情况下,可确定一个有效等价类(符合规则)和若干无效等价类(从不同角度违反规则)。枚举:若规定输入数据是=一组值(假定N个),并且程序要对每一个输入值分别处理,可确定N个有效等价类和一个无效等价类。数组:数组是一组有相同类型的元素的集合,数组长度及其类型都可以作为等价类划分的依据。

测试用例生成:测试对象通常有多个输入参数,如何对这些参数等价类进行组合测试,来保证等价类的覆盖率,是测试用例设计首先需要考虑得问题。

边界值分析:基本思想【故障往往出现在程序输入变量的边界值附近】。

健壮性测试:是作为边界值分析的一个简单的扩充,它除了对变量的5个边界值分析取值外,还要增加一个略大于最大值(max+)以及略小于最小值(min-)的取值,检查超过极限时系统的情况。


3.3白盒测试方法

白盒测试(White Box Testing):又称结构测试,它把测试对象看做一个透明的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有的逻辑路径进行测试。

测试覆盖标准:测试需求,覆盖标准,测试覆盖,覆盖程度。

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值