学习时间
2021-03-15
学习内容
软件工程概述
概述
软件是一个抽象化,且不可触摸的。它不受物质材料的限制,也不受物理定律或者加工过程的制约。但是软件也正因为它不受自然条件的约束,使得软件系统变得极为复杂,理解这个过程会很困难,也使得造价和维护的成本高昂。
专业化软件开发
首先我们先对有关软件工程的一些问题做一个汇总。
软件工程的目的是支持专业化的软件开发。其软件产品有以下两类
- 通用软件产品
由软件开发机构制作,在市场上公开销售,可以独立使用。比如微信、QQ、应用市场上的付费软件等。 - 定制软件产品
受特定客户委托,由软件承包商专门为这类客户开发。比如电子设备控制系统等。
软件的质量属性
-
正确性(Correctness)
系统满足规格说明和用户目标的程度,即在预定环境下能正确地完成预期功能的程度。
如软件有没有按照需求规格来完成,计算出的结果是否正确,计算结果是否精确。 -
健壮性/鲁棒性(Robustness)
健壮性是指在异常情况下(如硬件发生故障、输入的数据无效或操作错误等),软件能够正常运行的能力。
健壮性有两层含义:一是容错能力,二是恢复能力。
容错是指发生异常情况时系统不出错误的能力,对于应用于航空航天、武器、金融等领域的这类高风险系统,容错设计非常重要。
而恢复则是指软件发生错误后(不论死活)重新运行时,能否恢复到没有发生错误前的状态的能力。
例如:因输入数据不正确,引起系统异常,这是容错能力不高引起的健壮性问题;操作系统死机了,重启后能够正常使用,说明具有一定恢复能力,具有一定的健壮性;数据库发生故障后,再次启动时一般能够恢复到正常的状态,恢复能力比较好。 -
可靠性(Reliability)
软件系统在一定的时间内无故障运行的能力。
可靠性是一个与时间相关的属性,指的是在一定环境下,在一定的时间段内,程序不出现故障的概率,因此是一个统计量,通常用平均无故障时间(MTTF, mean-time to fault)来衡量。
可靠性不同于正确性和健壮性,软件可靠性问题通常是由于设计中没有料到的异常和测试中没有暴露的代码缺陷引起的。
例:由于某个地方数据库连接没有释放,在长时间运行的时候,出现活动的数据库连接数过多,造成系统越来越慢,甚至系统停止服务。 -
性能(Performance)
性能是指软件及时提供相应服务的能力。具体而言,性能包括速度、吞吐量和持续高速性三方面的要求:
速度往往通过平均响应时间来度量;
吞吐量通过单位时间处理的交易数来度量;
持续高速性是指保持高度处理速度的能力。
效率(Efficiency)指软件对CPU处理能力和存储能力这两大类计算机资源的使用效率。效率和性能反映了同一问题的“表”、“里”,性能为“表”,效率为“里”。
如系统运算一个报表,需要很长时间,这就是性能问题。 -
安全性(Security)
指软件同时兼顾向合法用户提供服务,以及阻止非授权使用软件及资源的能力。
安全性既属于技术问题又属于管理问题。一般地,如果黑客为非法入侵花费的代价(考虑时间、费用、风险等多种因素)高于得到的好处,那么这样的系统就可以认为是安全的。
例:有人可以访问非授权的资源,这就是安全性问题。 -
易用性(Usability)
易用性是指用户使用软件的容易程度。
软件的易用性要让用户来评价。
例:对于一般用户而言,Windows的易用性比Linux的高。 -
可用性(Availability)
指的是产品对用户来说有效、易学、高效、好记、少错和令人满意的程度,即用户能否用软件完成他的任务,效率如何,主观感受怎样。
ISO 9241-11国际标准对可用性作了如下定义:产品在特定使用环境下为特定用户用于特定用途时所具有的有效性(effectiveness)、效率(efficiency)和用户主观满意度(satisfaction)。其中:
有效性:用户完成特定任务和达到特定目标时所具有的正确和完整程度;
效率:用户完成任务的正确和完整程度与所使用资源(如时间)之间的比率;
满意度:用户在使用产品过程中所感受到的主观满意和接受程度。 -
互操作性(Interoperability)
指本软件与其他系统交换数据和相互调用服务用以协同运作的难易程度。
例:利用Web Service增加软件的互操作性。 -
易理解性(Understandability)
理解和使用系统的难易程度。 -
可扩展性(Extensibility)/灵活性(Flexibility)/适应性(Adaptability)/可伸缩性(Scalability)
反映软件适应“变化”的能力。调整、修改或改进正在运行的软件系统以适应新需求、变化了的需求的难易程度。
例:如报销系统原来不需要总经理审批,现在要改为总经理审批,可扩展性强的系统不需要作太多调整;如用户和数据量增加时,通过增加服务器来提高系统性能,这样可伸缩性比较强。 -
可重用性(Resuability)
重用软件或其中一部分的难易程度。 -
可测试性(Testability)
对软件测试以证明其满足需求规约的难易程度。 -
可维护性(Maintainability)
为修改Bug、增加功能、提高质量而诊断并修改软件的难易程度。 -
可移植性(Portability)
软件不经修改或稍加修改就可以运行于不同软硬件环境的难易程度,主要体现为代码的可移植性。
软件工程
软件工程中系统化的方法也叫做软件过程,所有的软件过程都包含4项基本活动:
- 软件描述
客户和工程师定义所要成产的软件以及对其操作的一些约束。 - 软件开发
软件得以设计和编程实现。 - 软件有效性验证
软件经过检查,以保证他就是客户所需要的 - 软件进化
软件随不同的客户和变化的市场需求而进行修改。
软件工程与计算机科学和系统工程的关系
计算机科学研究的是支撑计算机和软件系统的理论和方法,而软件工程则研究软件制作中的实际问题。计算机科学理论通常更适用于相对较小的程序。对于大型的或是复杂的需要用软件解决的问题,计算机科学的经典理论不可能总是适用的。
系统工程是研究有关复杂系统的开发和进化的方方面面,此类系统中软件起着重要的作用。系统工程涉及系统部署、策略和过程设计、系统实施,也包括软件工程。系统工程人员的工作包括系统定义,定义他的总体体系结构,集成各个组件以完成整个系统,较少关注系统各组件(硬件、软件等)的工程问题。
影响软件的三个方面
- 异质性:市场要求软件像基于网络的分布式系统一样运行,开发新技术,只做可靠的软件,灵活应对多样性。
- 业务和社会的变革:随着新经济成长和新技术涌现,业务和社会快速变革,对现存软件的变更和开发新软件提出需求。技术必须在不损及系统质量前提下进化,缩短大型、复杂系统的交付时间。
- 安全和可信。
软件工程的多样性
软件工程是生产软件的系统化的方法,它考虑了实际成本、进度、可靠性等问题,以及软件生产者和消费者的需要。
不同类型的应用系统
- 独立的应用:独立运行在端系统上的应用。
- 以交易为基础的交互式应用:应用运行在远程端系统上,用户通过端系统访问端系统。
- 嵌入式控制系统:在嵌入系统中软件控制系统控制和和管理硬件设备。
- 批处理系统:处理大批量数据的系统。
- 娱乐系统:主要用于个人用户娱乐的系统。
- 建模和仿真系统:科学家和工程师用以模拟物理过程或环境的计算密集型的高性能并行系统。
- 数据采集系统:利用传感器从环境中采集数据并发送数据的系统。
- 集成系统:由多种软件系统构成的系统。
系统类型边界是模糊的,同时也可能是交叉的,每种类型软件有不同的特征,需要不同的软件工程技术。
软件工程基本通用方法
使用有管理的和理解了的开发过程进行开发。
可依赖性和性能对所有类型的系统来说都很重要。
理解和管理系统描述和需求是很重要的。
尽可能高效地使用当前存在的资源。
软件工程和Web
软件组织的显著变化导致了以网络为基础的系统设计的变化
软件复用已成为构建基于Web的系统的主要技术。
指定系统的所有需求不切实际。
用户界面受到Web浏览器能力的约束。
软件工程人员的职业道德
软件工程人员需要的职业道德
- 保密:保守雇主或客服的机密。
- 工作能力:实事求是地表述自己的工作能力。
- 知识产权:确保雇主和客户的知识产权受到保护。
- 计算机滥用:不运用自己的技能滥用他人计算机。
ACM、IEEE(电气和电子工程师协会)、和英国计算机协会等组织颁布了职业行为准则或职业道德准则:
总结:
软件工程是一门涉及软件生产的各个方面的一门工程学科
软件产品不仅是程序,还包括相关文档。软件产品的基本属性是可维护性、可靠性、信息安全性、效率及可接受性。
软件过程包括开发软件产品过程中的所有活动。软件过程中的活动主要有:软件描述、开发、有效验证和进化。
软件工程的基本概念普遍适用于所有类型的系统开发。这些基本概念包括软件过程、可靠性、信息安全性、需求以及复用。
世界上是存在着许多类型的系统。每一种类型的系统的开发都需要一种与之相适应的软件工程工具和技术。几乎不存在普适的神奇的软件设计和实现技术。
软件工程的基本思想适用于所有的软件系统。这些基本思想包括有管理的软件过程、软件的可依赖性和信息安全性、需求工程和软件复用。
软件工程人员对软件工程行业和整个社会负有责任,不应该只关心技术问题。
职业协会颁布的行为准则规定了一系列协会成员应该遵守的行为标准。
声明:
本文参考:
- 《软件工程》(原书第9版)机械工业出版社
- CSDN原创文章:软件工程笔记 第一章 概述