-
2018-12-30 21:47:02
一、需求的作用
需求是解决问题的前提。
其中标注为软件系统工程的一些活动,是作为系统工程工作的一部分被实施的。
Q:什么样的陈述可以被称为需求?
1.这个需求是否有必要?–>必要的(Necessary)
2.会不会产生歧义?–>无歧义(Unambiguous)
3.能不能测试?–>可测试(Testable)
4.能不能跟踪?–>可跟踪(Trackable)
5.能不能测量?–>可测量(Measurable)二、需求分类
需求分为功能性需求;性能需求;外部接口需求;设计约束需求;质量属性需求。
功能需求是整个需求的主体,即没有功能需求,就没有非功能需求,即性能需求、外部接口需求、设计约束和质量属性。
非功能需求对功能需求而言,可以是一对多的,例如:
三、需求发现——怎么提需求?
常用的发现初始需求的技术,包括:
3.1自悟(Introspection)
需求人员把自己作为系统的最终用户,审视该系统并提出问题:“如果是我使用这一系统,则我需要……”
3.2 交谈
为了确定系统应该提供的功能,需求人员通过提出问题,用户回答,直接询问用户想要的是一个什么样的系统。
成功条件:交谈通常是一种比自悟更好的技术。
这种途径成功与否依赖于:
需求人员是否具有“正确提出问题”的能力,回答人员是否具有“揭示需求本意”的能力。存在的风险:在交谈期间需求可能不断增长,或是以前没有认识到的合理需求的一种表现,说是“完美蠕行”(Creeping elegance)病症的体现,以至于很难予以控制,可能导致超出项目成本和进度的限制。
应对措施:项目管理人员和客户管理人员应该定期地对交谈过程的结果进行复审。3.3 观察
通过观察用户执行其现行的任务和过程,或通过观察他们如何操作与所期望的新系统有关的现有系统,了解系统运行的环境,特别是了解要建的新系统与现存系统、过程以及工作方法之间必须进行的交互。尽管了解的这些信息可以通过交谈获取,但“第一手材料”一般总是能够比较好的“符合现实”的。
存在的风险:
一一客户可能抵触这一观察。其原因是他们认为开发者打扰了他们的正常业务。
一一客户还可能认为开发者在签约之前,就已经熟悉了他们的业务。3.4 小组会(Group session)
举行客户和开发人员的联席会议,与客户组织的一些代表共同开发需求。其中:
通常是由开发组织的一个代表作为首席需求工程师或软件工程项目经理,主持这一会议。但还可以采用其它形式,这依赖于其应用领域和主持人的能力。主持人的作用主要是掌握会议的进程。
必须仔细地选择该小组的成员,不仅要考虑他们对现存的和未来运行环境的理解程度,还要考虑他们的人品。
3.5提炼(Extraction)
复审技术文档(例如,有关需要的陈述,功能和性能目标的陈述,系统规约接口标准,硬件设计文档以及ConOps文档),并提出相关的信息。
适用条件:提炼方法是针对已经有了部分需求文档的情况。依据产品的本来情况,可能有很多文档需要复审,以确定其中是否包含相关联的信息。在有的情况,也可能只有少数文档需更钉审
以上方法需要综合运用到一个项目中。
四、需求规约
一个需求规约是一个软件项/产品/系统所有需求陈述的正式文档,是一个软件产品/系统的概念模型。
一般来说,SRS应必须具有以下4个性质:
①重要性和稳定性程度(Ranked for importance and stability).例如:基本需求、可选的需求和期望的需求。
②可修改的(Modifiable):在不过多地影响其它需求的前提下,可以容易地修改一个单一需求.
③完整的(Complete):没有被遗漏的需求.
④一致的(Consistent):不存在互斥的需求.其中,就功能的需求规约来说,还应考虑以下问题:
(1)功能源。
(2)功能共享的数据。
(3)功能与外部界面的交互。
(4)功能所使用的计算资源。在获取以上初始需求的基础上,可采用ICEE标准830-1998所给出的格式,完成一个完整的需求文档草案的编制工作。
学习笔记来源于中国大学Mooc上北京大学的《软件工程》选修课。
更多相关内容 -
慕课软件工程(第六章.接口设计)
2020-03-09 11:15:16软件工程.第六章.结构化分析方法2.接口设计0 目录6 结构化分析方法26.1 接口设计6.1.1课堂重点6.1.2测试与作业7 下一章 0 目录 6 结构化分析方法2 6.1 接口设计 6.1.1课堂重点 6.1.2测试与作业 1单选(2分)接口...慕课北京大学.软件工程.第六章.结构化分析方法2.接口设计
0 目录
6 结构化分析方法2
6.2 接口设计
6.2.1课堂重点
6.2.2测试与作业
1单选(2分)接口设计的主要内容是_______
A.模块或软件构件间的接口设计
B.软件与其他软硬件系统之间的接口设计
C.软件与用户之间的交互设计
D.以上都是
正确答案:D2.00/2.002单选(2分)用户界面应具备的特性中,最重要的是______
A.可使用性2.00/2.00B.灵活性C.可靠性D.可扩展性
正确答案:A3单选(2分)设计人机交互的界面时,应当遵循一定的设计原则,不包括______
A.操作步骤少B.提供undo功能C.减少人脑的记忆负担D.增加复杂的功能
正确答案:D7 下一章
-
硬件工程师如何零基础入门?
2022-03-13 23:08:03文章目录1、书籍阅读2、网站推荐3、免费的教学课程推荐4、知识体系的搭建4.1 电子元器件知识学习4.2 硬件开发工具的使用4.3 PCB设计和电路设计4.3 总线接口协议学习4.4 进阶内容学习 这个问题关注有一段时间了,想找...这个问题关注有一段时间了,想找一个比较长的空闲的时间好好的回答一下。
首先我是一名硬件工程师,工作6年,从事过物联网、车载、智能硬件、手机平板等产品的硬件研发工作,我觉得我还是有一些发言权的。
不同行业的硬件工程师差别也是蛮大的,但也不是无迹可寻,很多东西也是相通的。
核心思想都是一样的,硬件工程师都是围绕电路设计和PCB设计展开的工作。
在整个产品的研发过程中,可以说电路设计和PCB设计只能占到很小的一部分,更多的是,前期的准备工作,以及后期的调试及维护。
作为一个过来人,下面这些内容,建议好好看看,相信你会有很大的收获。
1、书籍阅读
硬件的入门需要先看基本的书籍,和工程实践结合紧密的课程有:电路分析、数字电路、模拟电路、高频电子等。
对于基础较差的,先看电路分析,再看模电和数电。之前也单独写过一篇文章,推荐了一些很好的书籍。
如开关电源设计,推荐下面这本书。
如高速电路设计,推荐下面这本书。完整地文章链接如下:学硬件设计,需要看哪些书籍?
2、网站推荐
除了日常的书籍,我们还会上网查一些资料,因为网络资源很复杂,筛选优质的信息很费时间,可能找了半天,找到的还是很劣质误导人的信息。
网站推荐站,也单独写过一篇文章:学习电子,有什么网站可以推荐?
3、免费的教学课程推荐
对于一些学生,购买高昂的教学视频,会有很大的经济压力,而且还不一定适合小白观看。
下面的视频都是大厂出品的,课程质量非常高,更重要的是免费!免费!免费!重要的事情说三遍。
点击阅读:这些视频课程,直接吹爆
4、知识体系的搭建
知道要看什么书,上什么网站学习,并配有不错的教学视频,接下来就是搭建自己的知识体系,并不断完善它。
因为硬件工程师要学的内容很多,我整理了一份思维导图。
4.1 电子元器件知识学习
电子产品是由一个个电子元器件组成的,了解其特性、原理、学会选型,是基本功。
无源器件,像电阻、电容、电感,用的是最多的器件,一个高端的手机中需要用到上千个电容,电阻稍少一些。
晶体管,如二极管、三极管、MOS 管,应用也很多,仅次于电阻电容。
电源芯片,如 DC-DC、LDO、充电芯片。其他的,如晶振、磁珠、存储器、继电器、传感器、RTC、ESD 保护器件等等,都是需要掌握的。
如果你不知道要学哪些电子元器件,没关系,我已经整理好了:硬件设计-知识体系思维导图
4.2 硬件开发工具的使用
电脑端软件,如原理图&PCB绘制工具,常用的有三个:Altium Designer、PADS、Cadence,对于入门的同学,推荐使用Altium Designer,上手会比较快一些。
如果你不知道如何使用,没关系,我整理了一下教学视频:AD软件视频教程
PADS一些芯片原厂用的很多,通信厂、手机厂,用PADS的也多。Cadence功能非常强大,入门难一点,上手之后,用起来很丝滑,很多大公司都在用。
然后就是原理图仿真工具,在研发前期,对于一些新的电路方案,我们可以选择仿真,来确定电路参数和电路的正确性。
在这里推荐TI的Tina,工具非常小巧,功能也非常强大。
之前也写过一篇文章,感兴趣的可以看看:Tina-TI——小巧好用又高效的原理图仿真软件
测量工具,如万用表、示波器、电源、电子负载等,都是硬件工程师必须会的仪器,会帮助我们更多的分析问题解决问题。
可以参考下面这张图。
4.3 PCB设计和电路设计
在学习了工具及电子元器件知识后,接下来就是进行电路设计和PCB设计。
小白会说了,那么多电路,怎么学的过来了。当然了,这里说的是一些常见的并且常用的电路,通过学习这些电路,来提高自己分析电路、读懂电路的能力,会看了,会模仿了,然后才能设计电路。
写了一个硬件设计的专栏,登上了热销专栏榜第89名,感兴趣的可以看看。4.3 总线接口协议学习
接下来就是接口协议的学习。
为啥要学这些东西,接口就像两个汽车之间的桥梁,如果你连桥梁都没建好,那汽车肯定无法行驶,协议则像交通规则,双方都遵守了规则,才不会出问题,这里的汽车就是电子里面的芯片。
4.4 进阶内容学习
硬件工程师是一个理论与实践结合非常紧密的工作,两则缺一不可。
所有的技能都是为产品而服务的,下面这些进阶内容,也非常重要。
像英语能力,因为大部分电子元器件的规格书都是全英文的,如果英语不过关,连基本的电子元器件选型都很困难。
像EMC电磁兼容,现在电子产品的要求越来越高,对环境的影响,对人的影响,包括出口的产品,很多是需要过各种各样的认证,这个时候产品的EMC设计就显得异常的重要。
海阔凭鱼跃,天高任鸟飞。
-
软件工程导论—软件与软件工程
2020-05-02 12:47:35文章目录1. 软件与软件危机1.1.... 软件工程学2.1. 软件工程学的概念2.2. 软件工程项目的基本目标2.3. 软件工程的八项原则2.4. 软件工程的本质特征2.5. 软件工程的七条基本原理3. 软件工程方法学3.1. 软件工程方法...1. 软件与软件危机
1.1. 软件的概念和特点
软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。
其中,程序是按事先设计的功能和性能要求执行的指令序列;数据是使程序能正常操纵信息的数据结构;文档是与程序开发,维护和使用有关的图文材料。
与之相似的是,在1983年IEEE组织对软件下的定义是:计算机程序、方法、规则、相关的文档资料以及在计算机上运行程序时所必需的数据。
比软件定义更重要的是,必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
软件有以下七个特点:
- 软件是一种逻辑实体,而不是具体的物理实体,因而它具有抽象性;
- 软件的生产与硬件不同,它没有明显的制造过程;
- 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。但就目前的软件工程环境应用而言,在不更新升级的情况下软件的平均寿命大约为5年,如果一个软件5年内没有任何更新,那么它将面临淘汰;
- 软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖性;
- 软件的开发至今尚未完全摆脱手工艺的开发方式;
- 软件本身是复杂的,这种复杂性可能来自它所反映的实际问题的复杂性,例如相当多的软件工作涉及到社会因素,复杂性也可能来自程序逻辑结构的复杂性;
- 软件成本相当昂贵
1.2. 软件规模的分类与发展阶段
软件的分类并没有一个绝对的标准,但一般情况下都会用软件规模来对软件进行分类,如下表:
类别 参加人员数 研制期限 产品规模(源程序行数) 微型 1 1~4周 0.5K 小型 1 1~6月 1K~2K 中型 2~5 1~ 2年 5K~50K 大型 5~20 2~3年 50K~ 100K 甚大型 100~1000 4~5年 1M 极大型 2000~5000 5~10年 1M~10M 软件发展的四个时期及其特点
- 程序设计的原始时期(1950~1950年代末),这时既没有汇编语言也没有高级语言,程序员只能用机器指令编写程序;
- 基本软件期(1950年代末~1960年代末),出现了汇编语言,并逐渐普及。随着高级语言的发展,编译技术也有较大的发展;
- 程序设计方法时代(1960 年代末~1970年代中期) 。 这一时期,与硬件费用下降相反,软件开发费急剧上升。于是人们提出了结构式程序设计和模块化程序设计等程序设计方法,设法降低软件的开发费用;
- 软件工程时期(1970年代中期~现在)。软件开发技术不再仅仅是程序设计技术,而是包括了与软件开发的各个阶段,如需求分析、设计、编码、单元测试、综合测试、使用和维护及其整体有关的各种管理技术。
特点\时期 基本软件期 程序设计方法时代 软件工程时期 软件所指 程序 程序及说明书 程序、文档、数据 主要程序设计语言 汇编及机器语言 高级语言 软件语言 软件工作范围 程序编写 设计、编码和测试 软件周期 软件使用者 程序设计者本人 少数用户 市场用户 软件开发组织 个人 开发小组 开发小组及大中型软件开发机构 软件规模 小型 中小型 大中小型 决定质量的因素 个人编程技术 小组技术水平 技术水平及管理水平 开发技术和手段 子程序和程序库 结构化程序设计 数据库,开发工具,开发环境,
工程化开发方法,标准和规范,
网络及分布式开发面向对象技术及软件复用维护责任者 程序设计者 开发小组 专职维护人员 硬件特征 价格高、存储容量小、工作可靠性差 速度、容量及工作可靠性有明显提高 向超高速,大容量,微型化及网络化方向发展 软件特征 完全不受重视 软件技术的发展不能清足需要,出现软件危机 开发技术有进步,但未获突破性进展,价格高未完全摆脱软件危机 1.3. 软件危机
1968年在西德Garmish召开的国际软件工程会议上正式提出软件危机的概念:计算机软件的开发和维护过程所遇到的一系列严重问题。
1.3.1. 软件危机的表现
软件危机一般表现在以下五个大方面:
- 对软件开发成本和进度的估算很不准确。 实际成本比估计成本有可能高出一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。软件开发人员常常在对用户要求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下,就匆忙着手编写程序;另外软件成本在计算机系统总成本中所占的比例逐年上升。由于微电子学技术的进步和生产自动化程度不断提高,硬件成本逐年下降,然而软件开发需要大量人力,软件成本随着通货膨胀以及软件规模和数量的不断扩大而持续土升。美国在1985年软件成本大约已占计算机系统总成本的90%。
- 软件产品不符合用户的实际需要。 通常情况下用户也不知道自己想要什么,导致开发时常常出现产品与预期不匹配的现象,实际上当前的软件技术已经十分发达,搞明白了需求基本上都能通过技术实现,如下图是软件技术与需求之前的增长关系:
- 软件产品质量不可靠。 软件可靠性和质量保证的确切的定量概念刚刚出现不久,软件质量保证技术(审查、复审和测试)还没有坚持不懈地应用到软件开发的全过程中,这些都导致软件产品发生质量问题;计算机软件不仅仅是程序,还应该有三整套文档资料。这些文档资料应该是在软件开发过程中产生出来的,而且应该是"最新式的"(即和程序代码完全一致的)。软件开发组织的管理人员可以使用这些文档资料作为“里程碑”,来管理和评价软件开发工程的进展状况:软件开发人员可以利用它们作为通信工具,在软件开发过程中准确地交流信息;对于软件维护人员而言,这些文档:资料更是必不可少的。
- 缺少软件文档,大型软件系统经常失败。 缺乏方法指导和工具支持导致很多程序中的错误是非常难改正的,甚至一旦换了一个新的硬件环境就不能正常运行,也不能根据用户的需要在原有程序中增加一些新的功能。"可重用的软件"还是一个没有完全做到的、正在努力追求的目标,人们仍然在重复开发类似的或基本类似的软件
- 软件开发效率不高,与计算机应用的迅速发展不匹配。 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。软件产品"供不应求"的现象使人类不能充分利用现代计算机硬件提供的巨大潜力。
1.3.2. 软件危机产生的原因
客观原因:软件本身特点,例如逻辑部件复杂、规模庞大等等。
在软件开发和维护的过程中存在这么多严重问题,一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件,在运行过程中不会因为使用时间过长而被"用坏",如果运行中发现了错误很可能是遇到了一个在开发时期引入的,在测试阶段没能检测出来的错误。
软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。
主观原因:程序员不正确的开发方法,忽视需求分析,并且错误地认为软件开发等于程序编写,轻视软件维护。
主观上的错误认识和作法主要表现为忽视软件需求分析的重要性,认为软件开发就是写程序并设法使之运行,轻视软件维护等。目前相当多的软件专业人员对软件开发和维护还有不少其他的糊涂观念,在实践过程中或多或少地采用了错误的方法和技术,这可能是使软件问题发展成软件危机的主要原因。
对用户要求没有完整准确的认识就匆忙着手编写程序是许多软件开发工程失败的主要原因之一。另一方面还必须认识到程序只是完整的软件产品的一个组成部分,一个软件产品必须由一个完整的配置组成,主要包括程序、文档和数据等成分,他们缺一不可。
软件问题要尽早解决
作好软件定义时期的工作,是降低软件,成本提高软件质量的关键。在实际的软件开发中,在软件开发的不同阶段进行修改需要付出的代价是很不相同的,大约如下图所示,它表示了错误发现的越晚,付出的代价越高。
因此可以说,轻视维护是一个巨大的错误。统计数据表明,实际上用于软件维护的费用占软件总费用的55%~70%。软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。软件危机案例:
IBMOS/360操作系统被认为是一个典型的案例,到现在为止,它仍然被使用在360系列主机中。这个经历了数十年,极度复杂的软件项目甚至产生了一套不包括在原始设计方案之中的工作系统。IBM公司开发OS/360系统,共有4000多个模块,约100万条指令,投入5000人年,耗资数亿美元,结果还是延期交付,在交付使用后的系统中仍发现大量(2000个以上)的错误,造成无法估计的安全隐患。
1.3.3. 软件危机如何解决
实际上就目前的手段而言,软件工程只能解决主观上造成软件危机的原因,对于软件本身特点,例如逻辑部件复杂、规模庞大等客观原因,软件工程是无能为力的。
主观危机的解决途径主要有两条:1、组织管理。2、技术措施
在组织管理可以采用工程项目管理方法;
在技术措施上提升软件开发技术与方法,灵活运用软件工具。应该推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和做法。并且应该开发和使用更好的软件工具,在软件开发的每个阶段都有许多繁琐重复的工作需要做,在适当的软件工具辅助下,开发人员可以把这类工作做得既快又好。
为了消除软件危机,首先应该对计算机软件有一个正确的认识,首当其冲的就是彻底消除"软件就是程序"的错误 观念,要明确一个软件必须由一个完整的配置组成,是程序、数据及相关文档的完整集合。
2. 软件工程学
2.1. 软件工程学的概念
软件工程学是在1968年,北约计算机科学会议上由Fritz Bauer提出的,他给出的软件工程学的定义为:用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术及管理方法。其中包含了三个要素:方法、工具、过程。
软件工程学的中心思想是把软件当作一种工业产品,要求采用工程化的原理与方法对软件进行计划、开发和维护。因此可以说,软件工程学是一门指导计算机软件开发和维护的工程学科,它包含了开发技术和工程管理两方面。
2.2. 软件工程项目的基本目标
软件工程的目的是为了实现按预期的进度和经费完成软件生产计划,提高软件的生产率和可靠性。
具体来说就是要达到以下几个主要的目标:
- 付出较低的开发成本;
- 达到要求的软件功能;
- 取得较好的软件性能;
- 开发的软件易于移植;
- 需要较低的维护费用;
- 能按时完成开发工作,及时交付使用。
但是软件工程的各个目标是不可能全部满足的,下图表示了软件工程目标之间的关系,可见,软件工程的最终目标只能是实现一个均衡的系统。
2.3. 软件工程的八项原则
- 抽象
抽取事物最基本的特性和行为,忽略非基本的细节。采用分层次抽象,自顶向下、逐层分解的办法控制软件开发过程的复杂性。例如,软件瀑布模型、结构化分析方法、结构化设计方法,以及面向对象建模技术等都体现了抽象的原则。 - 封装(信息隐蔽)
将模块设计成“黑箱”,实现的细节隐藏在模块内部,不让模块的使用者直接访问。这就是信息封装,使用与实现分离的原则。使用者只能通过模块接口访问模块中封装的数据。 - 模块化
模块是程序中逻辑上相对独立的成分,是独立的编程单位,应有良好的接口定义。如C语言程序中的函数过程,C++语言程序中的类。模块化有助于信息隐蔽和抽象,有助于表示复杂的系统。 - 局部化
要求在一个物理模块内集中逻辑上相互关联的计算机资源,保证模块之间具有松散的耦合,模块内部具有较强的内聚。这有助于加强模块的独立性,控制解的复杂性。 - 确定性
软件开发过程中所有概念的表达应是确定的、无歧义性的、规范的。这有助于人们之间在交流时不会产生误解、
遗漏,保证整个开发工作协调致。 - 一致性
整个软件系统(包括程序、文档和数据)的各个模块应使用一致的概念、符号和术语。程序内部接口应保持一致。软件和硬件、操作系统的接口应保持一致。系统规格说明与系统行为应保持一致。用于形式化规格说明的公理系统应保持一致。 - 完备性
软件系统不丢失任何重要成分,可以完全实现系统所要求功能的程度。为了保证系统的完备性,在软件开发和运行过程中需要严格的技术评审。 - 可验证性
开发大型的软件系统需要对系统自顶向下逐层分解。系统分解应遵循系统易于检查、测试、评审的原则,以确保系统的正确性。
2.4. 软件工程的本质特征
软件工程关注于大型程序的构造
"大"与"小"的分界线并不十分清晰。通常把一个人在较短时间内写出的程序称为小型程序,而把多人合作用时半年以上才写出的程序称为大型程序。软件工程的中心课题是控制复杂性
软件所解决的问题十分复杂,通常不得不把问题分解,使得分解出的每个部分是可理解的,而且各部分之间保持简单的通信关系。用这种方法并不能降低问题的整体复杂性,但是却可使它变成可以管理的。软件经常变化
绝大多数软件都模拟了现实世界的某一部分。现实世界在不断变化,软件为了不被很快淘汰,必须随着所模拟的现实世界一起变化。因此,在软件系统交付使用后仍然需要耗费成本,而且在开发过程中必须考虑软件将来可能的变化。开发软件的效率非常重要
目前,社会对新应用系统的需求超过了人力资源所能提供的限度,软件供不应求的现象日益严重。因此,软件工程的一个重要课题就是,寻求开发与维护软件的更好更有效的方法和工具。和谐地合作是开发软件的关键
软件处理的问题十分庞大,必须多人协同工作才能解决这类问题。为了有效地合作,必须明确地规定每个人的责任和相互通信的方法。纪律是成功地完成软件开发项目的一个关键。软件必须有效地支持它的用户
开发软件的目的是支持用户的工作。软件提供的功能应该能有效地协助用户完成他们的工作。有效地支持用户意味着必须仔细地研究用户,以确定适当的功能需求、可用性要求及其他质量要求(例如,可靠
性、响应时间等)。有效地支持用户还意味着,软件开发不仅应该提交软件产品,而且应该写出用户手册和培训材料。在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人
软件工程师是诸如Java程序设计、软件体系结构、测试或统一建模语言(UML)等方面的专家,他们通常并不是图书馆管理、航空控制或银行事务等领域的专家,但是他们却不得不为这些领域开发应用系统。缺乏应用领域的相关知识,是软件开发项目出现问题的常见原因。有时候,软件开发者通过访谈、阅读书面文件等方法了解到用户组织的“正式”工作流程,然后用软件实现这个工作流程。但是,决定软件系统成功与否的关键问题是,用户组织是否真正遵守这个工作流程
2.5. 软件工程的七条基本原理
著名的软件工程专家B.W.Boehm综合学者们的意见,于1983年在一篇论文中提出了软件工程的七条基本原理。这七条原理是确保软件产品质量和开发效率的原理的最小集合。
这七条原理是互相独立的,其中任意6条原理的组合都不能代替另一条原理。同时这七条原理又是相当完备的,虽然不能用数学方法严格证明它们是一个完备的集合,但是可以证明在此之前已经提出的一百多条软件工程原理都可以由这七条原理的任意组合蕴含或派生。
七条基本原理:
- 用分阶段的生命周期计划严格管理
经统计发现,在不成功的软件项目中有一半左右是由于计划不周造成的。因此应该把软件生命周期划分成若千个阶段,并相应地制定出切实可行的计划,然后严格按照计划对软件的开发与维护工作进行管理。不同层次的管理人员都必须严格按照计划各尽其职地管理软件开发与维护工作,绝不能受客户或上级人员的影响而擅自背离预定计划;一般来说软件的生命周期分为定义阶段、可行性研究阶段、需求分析阶段、程序设计阶段、编码阶段、测试阶段、运行维护阶段。 - 坚持进行阶段评审
软件的质量保证工作不能等到编码阶段结束之后再进行,这样说至少有两个理由:
第一,大部分错误是在编码之前造成的,根据统计,设计错误占软件错误的63%,编码错误仅占37%;
第二,错误发现与改正得越晚,所需付出的代价也越高;
因此,在每个阶段都进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,是一条必须遵循的重要原则。 - 实行严格的产品控制
在软件开发过程中改变需求是难免的,只能依靠科学的产品控制技术来顺应这种要求。也就是说,当改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的产品控制,其中主要是实行基准配置管理。
所谓基准配置又称为基线配置,它们是经过阶段评审后的软件配置成分。基准配置管理也称为变动控制,指的是一切有关修改软件的建议,特别是涉及到对基准配置的修改建议,都必须按照严格的规程进行评审,获得批准以后才能实施修改。绝对不能谁想修改软件,就随意进行修改。 - 采用现代程序设计技术
从提出软件工程的概念开始,人们一直把主要精力用于研究各种新的程序设计技术,并进一步研究各种先进的软件开发与维护技术。实践表明,采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量。 - 结果应能清楚地审查
软件产品不同于一般的物理产品,它是看不见摸不着的逻辑产品。软件开发人员的工作进展情况可见性差,难以准确度量,从而使得软件产品的开发过程比一般产品的开发过程更难于评价和管理。为了提高软件开发过程的可见性,更好地进行管理,应该根据软件开发项目的总目标及完成期限来规定开发组织的责任和产品标准,从而使得所得到的结果能够清楚地审查。 - 开发小组的人员应该少而精
软件开发小组的组成人员的素质应该好,而人数则不宜过多。素质高的人员的开发效率比素质低的人员的开发效率可能高几倍至几十倍,而且素质高的人员所开发的软件中的错误明显少于素质低的人员所开发的软件中的错误。
此外,随着开发小组人员数目的增加,因为交流情况讨论问题而造成的通信开销也急剧增加。当开发小组人员数为N时,可能的通信路径有N(N-1)/2条,可见随着大数N的增大,通信开销将急剧增加。 - 承认不断改进软件工程实践的必要性
遵循上述六条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产,但是,仅有上述6条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐。因此,Boehm提出应把承认不断改进软件工程实践的必要性作为软件工程的第7条基本原理。按照这条原理,不仅要积极主动地采纳新的软件技术,而且要注意不断总结经验。
3. 软件工程方法学
3.1. 软件工程方法学的概念
软件工程包括技术和管理两方面的内容,是技术与管理紧密结合所形成的工程学科。通常把在软件生命周期全过程中使用的整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。
软件工程方法学包含3个要素:
- 方法,是完成软件开发的各项任务的技术方法,回答"怎样做"的问题;
- 工具,是为运用方法而提供的自动的或半自动的软件工程支撑环境;
- 过程,是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
3.2. 传统软件工程与面向对象软件工程
3.2.1. 传统软件工程与面向对象软件工程的对比
目前使用得最广泛的软件工程方法学有传统方法学(面向数据流/结构化方法学) 和 面向对象方法学。他们分别代表了两种程序设计方法:即结构化程序设计(程序=数据结构+算法) 和 面向对象程序设计(程序=对象+请求消息)
两种方法学的软件开发流程如下所示:
传统软件工程:软件分析→总体设计→详细设计→面向过程的编码→测试。会有一个清楚的流程体系。
面向对象软件工程:软件分析与对象抽取→对象详细设计→面向对象的编码→测试。3.2.2. 传统软件工程的生命周期
所谓软件生命周期,软件从产生、发展到成熟,直至衰亡为止的整个过程。
它由八个小阶段组成:
国标《计算机软件开发规范》将软件生存周期分为可行性研究与计划、需求分析、总体设计、详细设计、实现(编码和单元测试)、集成测试、确认测试、使用和维护共八个小阶段
这八个小阶段又可以分为三个时期:
- 计划时期。问题定义、可行性分析
问题定义阶段必须回答的关键问题是"要解决的问题是什么?"如果不知道问题是什么就试图解决这个问题,显然是盲目的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能是最容易被忽视的一个步骤。通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模的书面报告,经过讨论和必要的修改之后这份报告应该得到客户的确认。
可行性研究阶段的关键是明确要解决问题,找出行得通解决方法,并且给出粗略的计划。系统分析员需要从经济、技术、社会(操作)等方面对软件项目进行可行性分析。可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。可行性研究的结果是使用部门负责人作出是否继续进行这项工程的决定的重要依据。可行性研究以后的那些阶段将需要投入更多的人力物力。及时终止不值得投资的工程项目,可以避免更大的浪费。 - 开发时期。需求分析、软件设计(总体设计、详细设计)、编码、测试(单元测试和集成测试)
需求分析阶段需要确定目标系统的任务目标以及必须具备哪些功能。系统分析员必须和用户密切配合,充分交流信息以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法表示在需求分析阶段确定的系统逻辑模型是以后设计和实现系统的基础。这个阶段的一项重要任务,是用正式文档准确地记录对目标系统的需求,这份文档通常称为需求《规格说明书》。
总体设计阶段应该明确用什么方法去实现目标系统。首先,应该根据需求分析阶段的结果设计出实现目标系统的多种可选的方案。通常至少应该设计出低成本、中等成本和高成本等3种方案。软件工程师在充分权衡各种方案的利弊的基础上,推荐一个最佳方案。制定出实现最佳方案的详细计划。一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系,最终完成总体设计后需要记录在文档中,这份文档称为《总体设计说明书》。
详细设计阶段的任务就是把实现目标系统的方法具体化。详细设计也称为模块设计,在这个阶段将详细地设计每个模块,确定实现模块功能所需要的算法和数据结构,最终形成一份《详细规格说明》,这种规格说明应该包含必要的细节,程序员可以根据这些细节写出实际的程序代码。
编码和单元测试阶段的关键任务是写出正确的、容易理解、容易维护的程序模块。程序员应该根据目标系统的性质和实际环境,选取适当的程序设计语言,把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试(调试)编写出的每一个模块。
集成测试阶段的关键任务是通过各种类型的测试(及相立的调试)使软件达到预定的要求。最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试;所谓验收测试则是按照规格说明书的规定,由用户对目标系统进行验收。必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验,集成测试和验收测试结束后应该形成文档《测试报告》,里面应当写明测试计划、测试方案和结果。 - 运行时期。软件维护
软件维护阶段是要通过各种必要的维护活动使系统持久地满足用户的需要"。通常有四类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错误;适应性维护,即修改软件以适应环境的变化,例如Windows迁移到Linux;完善性维护,即根据用户的要求改进或扩充软件使它更完善;预防性维护,即修改软件为将来的维护活动预先做准备。每一项维护活动都实质上是经历了一次压缩和简化了的软件定义和开发的全过程。
实际从事软件开发工作时,软件规模、类型、开发环境及技术方法等因素会影响到阶段划分,及各阶段的执行顺序,形成不同生存周期模型,又称过程模型。也就是说以上的三个时期所包含的阶段不一定非要按照国标来进行,应当按照实际情况灵活安排软件周期。
4. 软件开发模型
软件开发模型实际上是软件工程三要素中"过程"要素的展开,下面介绍几种经典的软件开发模型
4.1. 传统开发模型
4.1.1. 瀑布模型(waterfall model)
瀑布模型一直是唯一被广泛采用的生命周期模型,现在它仍然是软件工程中应用得最广泛的文档驱动的过程模型。如下图所示为传统的瀑布模型
瀑布模型区别与其他模型最大的特点有三个:- 阶段间具有顺序性和依赖性
(1)必须等前一阶段的工作完成之后,才能开始后一阶段的工作;
(2)前一阶段的输出文档就是后一阶段的输入文档。因此,只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果。 - 推迟实现
对于规模较大的软件项目来说,往往实现(编码和测试)开始得越早最终完成开发工作所需要的时间反而越长。这是因为,前面阶段的工作没做或做得不扎实,过早地考虑进行程序实现,往往带来灾难性后果瀑布模型在编码之前设置了系统分析与系统设计的各个阶段,清楚地区分逻辑设计与物!理设计,尽可能推迟程序的物理实现,是按照瀑布模型开发软件的一条重要的指导思想 - 质量保证
软件工程的基本目标是优质、高产。为了保证所开发的软件的质量,在瀑布模型的每个阶段都应坚持两个重要做法:
(1)每个阶段都必须完成规定的文档,没有交出合格的文档就是没有完成该阶段的任务;
(2)每个阶段结束前都要对所完成的文档进行评审,以便尽早发现问题,改正错误。
传统的瀑布模型过于理想化了,事实.上,人在工作过程中不可能不犯错误。实际的瀑布模型是带"反馈环"的,如下图所示。
实际的瀑布模型当在后面阶段发现前面阶段的错误时,需要沿图中左侧的反馈线返回前面的阶段,修正前面阶段的产品之后再回来继续完成后面阶段的任务。4.1.2. 快速原型模型(rapid prototype model)
快速原型模型是低成本的,进行循环需求分析的一个快速开发模型。它的基本结构如图所示。
原型是值快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集,然后在用户的不断使用中探明用户需求,不断对原型进行改进,最终完成需求分析。因此它的两个最大的优点就是:
- 原型系统已经通过与用户交互而得到验证,据此产生的规格说明文档正确地描述了用户需求,因此,在开发过程的后续阶段不会因为发现了规格说明文档的错误而进行较大的返工。
- 开发人员通过建立原型系统已经学到了许多东西,因此,在设计和编码阶段发生错误的可能性也比较小,这自然减少了在后续阶段需要改正前面阶段所犯错误的可能性。
4.2. 演化开发模型
4.2.1. 增量模型(incremental model)
增量模型也称为渐增模型。使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和
测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。开发流程如下图所示
下图是每一个增量构建的实现过程图:
增量模型能在较短时间内向用户提交可完成部分工作的产品。逐步增加产品功能可以使用户有较充裕的时间学
习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击。但是它也是有缺陷的,增量模型面临的最大困难就是必须保证在把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品。必须把软件的体系结构设计得便于按这种方式进行扩充,向现有产品中加入新构件的过程必须简单、方便,也就是说,软件体系结构必须是开放的。
4.2.2. 螺旋模型(spiral model)
螺旋模型的基本思想是,使用原型及其他方法来尽量隆低风险。理解这种模型的一个简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。从本质上来讲,螺旋模型就是一个加入了风险分析的快速原型模型。
螺旋模型的主要优势在于,它是风险驱动的。它的开发过程如图所示:
一个螺旋式周期包括下面4个完整步骤:
- 确定目标,选择方案,选定完成目标的策略
- 从风险角度分析该策略
- 启动一个开发阶段
- 评价前一步的结果,并计划下一轮的工作
4.3. 面向对象开发模型
4.3.1. 构件集成模型(component integration model)
构建集成模型是一个典型的面向对象开发模型,它的一个典例就是各种开发IDE,例如Visual Studio,可以查找加载各种构建。
构建集成模型有着以下五个特点:面向对象、基于构件库、融合螺旋模型特征、支持软件开发的迭代方法、软件重用
-
软件工程期末考试题库(超全)
2020-12-18 18:25:49软件工程期末考试题库 选择题 具有风险分析的软件生命周期模型是( C )。 A.瀑布模型 B.喷泉模型 C.螺旋模型 D.增量模型 软件工程的基本要素包括方法、工具和( A )。 ... -
软件工程导论—需求分析
2020-05-05 12:09:46软件需求的概念1.2. 需求分析的准则1.3. 需求分析的任务和步骤2. 需求获取的常用方法和步骤3. 分析建模3.1. 结构化分析模型3.1.1. 结构化分析模型概述3.1.2.实体联系图 E-R图3.1.3.数据流图 DFD3.2. 面向对象分析... -
软件工程导论—软件测试
2020-05-13 21:26:491. 软件测试基础 2. 单元测试 3. 集成测试 4. 确认测试 5. 白盒测试技术 6. 黑盒测试技术 7. 调试 8. 软件可靠性 -
STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
2018-08-28 21:26:25Ⅰ、写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。...本文将提供STM32硬件SPI、软件模拟SPI两实例工程代码供大家参考、掌握两种方式的区别。... -
今年高考生,想学电子信息工程和软件工程,它们有什么区别?
2021-07-21 07:11:02最近,有家长通过留言问了这样一个问题,他的孩子对电子信息工程和软件工程专业非常感兴趣,但不知道它们之间有什么区别。能够在高考之前,想到这样的问题,其实是挺好的。因为在我们的高考中,有不少考生和家长到了... -
软件工程期末试题及答案(史上最全)
2021-07-15 15:39:15软件工程期末试题及答案 1.开发瀑布模型中的软件定义时期各个阶段依次是:( B) A) 可行性研究,问题定义,需求分析。 B) 问题定义,可行性研究,需求分析。 C) 可行性研究,需求分析,问题定义。 D) 以上顺序都... -
软件工程:需求分析
2020-10-20 21:28:52需求分析阶段结束之前,系统分析员应该写出软件需求规格说明书,以书面的形式准确地描述软件需求。 基本准则: 必须理解并描述问题的信息域,根据这条准则应该建立数据模型。 必须定义软件应完成的功能,. -
高级软件工程习题
2020-12-10 14:23:50(8) 软件工程过程 软件工程过程关注软件过程的定义、实现、评估、测量、管理、变更、改进,以及过程和产品的度量。 (9) 软件工程工具和方法 软件工具分为:需求工具、设计工具、构造工具、测试工具、维护工具、... -
软件工程大题题库
2021-01-05 11:29:36文章目录第一章 软件工程概述1 软件的特点2 计算机软件与硬件相比有什么特点3 为什么说软件工程的发展在一定程度上解决了软件危机的各种弊端?4 简述软件工程的基本原则5. 软件工程的研究内容6. 软件工程的三要素7. ... -
一个神奇的大学科目《软件工程》,知识点总结+测试题,包你不挂科
2021-04-13 12:37:49软作详细设计是软件工程的重要阶段,在详细设计过程中,细化了高层的体系结构设计,将软件结构中的主要部件划分为能独立编码、编译和测试的软件单元,并进行软件单元的设计,同时确定了软件单元和单元之间的外部接口。... -
【软件工程】简答题汇总
2021-12-14 17:19:51软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。 -
《软件工程导论》期末复习知识点总结(全)
2020-10-26 15:27:06目录写在最前软件需求综述软件项目成功的三个主要因素软件人成功的三个主要因素软件工程和需求工程区别与联系软件需求的内容和层次业务需求用户需求功能性与非功能性需求软件需求获取需求工程的内容需求开发需求管理... -
【SDN】软件定义硬件
2022-01-23 22:55:28软件定义网络SDN小知识 -
软件工程期末考试超全试题库(含答案 和解析)
2021-11-29 19:57:561.下面哪项不属于软件工程方法学的要素(B) A、方法 B、模型 C、工具 D、过程 (知识点)软件工程三要素:方法、工具、过程 2.面向对象方法学具有(D)个要点。 A、1 B、2 C、3 D、4 (知识点)面向对象要点:对象... -
【软件工程】需求分析文档——需求规格说明书
2021-03-18 10:13:37文章目录1 引言1.1 编写目的1.2 背景1.3 术语和缩略词1.4 参考资料2 任务概述2.1 项目概述2.1.1 项目来源及背景2.1.2 项目目标2.1.3 系统功能...特性5.3 灵活性6 运行需求6.1 用户界面6.2 软件接口6.3 硬件接口7 其他 -
《软件工程》课程:期末复习提纲(超详细课本内容)
2021-01-18 10:36:22软件工程是建立和使用一套合理的工程原则,以便获得经济的软件,这种软件是可靠的,可以在实际的机器上高效的运行。 2.IEEE在软件工程术语汇编中的定义 软件工程是: 将系统化的、严格约束的、了量化的方法应用于... -
软件工程
2021-01-24 17:13:02软件工程——原理、方法与应用(学习笔记) -
软件工程试题大全
2019-07-02 15:19:11软件工程基础 一. 选择题 1。软件需求分析阶段的工作,可以分为4个方面:需求获取,需求分析,编写需求规格说明书以及(B) A).用户 B).需求审评 C).总结 D).都不正确 2。在原型法中称(A)为用户/设计者,开发人员根据用户... -
软件工程复习知识点
2020-07-19 21:52:44软件工程第一章 软件工程概述1、四种图2、计算机系统计算机系统组成:计算机分为四个发展阶段:3、软件危机:产生原因:4、软件工程:软件工程的基本原理 :软件工程包括两方面的内容:软件工程方法学3要素:5、软件... -
软件工程-UML画图
2021-12-19 11:27:104. 其他软件工程图 4.1 流程图 4.2数据流图 4.3数据字典 4.4 实体关系图 4.5 层次方框图 4.6 其他 1. UML简介 UML(Unified Modeling Language,统一建模语言)是一种基于面向对象的可视... -
软件工程的起源与发展
2019-10-19 22:15:56软件工程专业的起源与发展 作为一个软件工程的学生,我们必须了解也应当了解软件工程这一专业的起源和发展 起源 软件工程这一专业起源于软件危机年代,经过这么多年的发展,软件工程也形成了自己一套独有的知识体系... -
软件概要设计如何写(文档恐惧症的程序猿必读)
2021-10-21 20:18:04按照传统软件工程的软件过程,区别如下: 1.需求分析--产生 软件功能规格说明书,需要确定用户对软件的需求,要作到明确、无歧义。不涉及具体实现方法。用户能看得明白,开发人员也可据此进行下面的工作(概要设计) 2.... -
软件工程名词解释
2020-08-06 11:26:231、软件生存周期 内容:软件产品从形成概念开始,经过开发、运行(使用)和维护直到退役的全过程 称为软件生存周期,包括软件定义、开发、使用和维护三部分 软件生存周期模型: 内容:软件生存周期模型是描述软件... -
嵌入式软件工程师就只需会写C代码吗
2019-04-17 11:40:55步入嵌入式行业三年了,刚开始就自认为学好c代码就万事大吉了。后来随着项目经验的累积发现,只懂c是解决不了啥问题的,顶多算入门。要想获得更多技能,需要不断拓展自己的领域。... 需要较深层次理解硬件设计,嵌入... -
【软件工程】概要设计文档——概要设计说明书
2021-03-28 17:22:05文章目录1 引言1.1 编写目的1.2 范围1.2.1 系统目标1.2.2 主要软件需求1.2.3 软件设计约束、限制1.3 术语和缩略词1.4 参考资料2 体系结构设计2.1 需求复审2.2 软件体系结构2.3 模块设计3 接口设计3.1 用户接口3.2 ...