软件工程学习笔记(一):软件工程

1 计算机软件

1.1 软件

计算机软件是指计算机系统中的程序以及文档,程序是计算任务处理对象和处理规则的描述.

1.2 软件特点

  • 一种逻辑实体.
  • 维护工作量大.
  • 维护软件过程中会引入副作用.

1.3 软件分类

1.3.1 系统软件

最靠近硬件的一层,比如操作系统.

1.3.2 支撑软件

软件开发,维护与运行的软件,比如各种IDE等.

1.3.3 应用软件

应用于特定领域的软件.

2 软件语言

软件语言主要包括需求定义语言,功能性语言,设计性语言,程序设计语言与文档语言.

2.1 需求定义语言

用于书写软件需求定义的语言,包括功能需求与非功能需求.典型的语言有PSL.

2.2 功能性语言

书写软件功能规约的语言,描述软件做什么以及只做什么.典型语言有广谱语言,Z语言.

2.3 设计性语言

书写软件设计规约的语言,是软件设计的严格而完整的描述.典型语言有PDL.

2.4 程序设计语言

即编程语言,可以分为低级语言与高级语言,过程式语言与非过程式语言,通用语言与专用语言,交互式语言与非交互式语言,顺序语言与并发语言与分布语言.

2.5 文档语言

书写软件文档使用的语言,比如Z语言.

3 软件工程

软件工程是建立和使用一套合理的工程原则,以便获得经济的软件,这种软件是可靠的,可以在实际机器上高效地运行.软件工程是应用计算机科学理论以及工程管理原则的方法,按预算与进度实现满足用户要求的软件产品的工程,或以此为研究对象的学科.

4 软件工程的基本原则

4.1 适宜的开发规范

选用适宜的开发规范,以保证软件开发的可持续性,并使最终的软件产品满足客户的需求.

4.2 合适的设计方法

要考虑软件的模块化,信息隐藏,局部化,一致性以及适应性等问题,采用合适的设计方法有助于支持问题的解决与实现.

4.3 高质量的工程支持

需要提供高质量的工程支持,例如配置管理,质量保证等.

4.4 有效的软件工程管理

软件工程的管理直接影响可用资源的有效利用,以提高软件组织的生产能力.

5 软件生存周期

软件生存周期分为6个阶段:

5.1 计算机系统工程

计算机系统工程的任务是确定待开发软件的总体要求与范围,以及该软件与其他计算机系统元素之间的关系,进行成本估算,作出进度安排,并进行可行性分析.

5.2 需求分析

需求分析主要解决待开发软件要做什么的问题,确定软件的功能,性能,数据,界面等要求,生成软件需求规约.

5.3 设计

软件设计主要解决待开发软件怎么做的问题,通常可以分为系统设计与详细设计,系统设计的任务是设计软件系统的体系结构,详细设计的任务是设计各个组成成分的实现细节.

5.4 编码

利用程序设计语言进行编码.

5.5 测试

发现并纠正软件中的错误与缺陷,包括单元测试,集成测试,确认测试与系统测试.

5.6 运行与维护

软件运行期间需要进行维护,对软件进行修改.

6 CMM

CMM是能力成熟度模型,定义了5个软件过程成熟度等级,包括初始级,可重复级,已定义级,已管理级,优化级.

6.1 初始级

软件过程的特点是无秩序的,甚至是混乱的,几乎没有什么过程是经过妥善定义的.

6.2 可重复级

建立了基本的项目管理过程来跟踪成本,进度与功能特性.制定了必要的过程纪律,能重复早先类似应用项目取得的成功.

6.3 已定义级

已将管理和工程活动两方面的软件过程文档化,标准化,并综合成该组织的标准软件过程.所有项目均使用经批准,剪裁的标准软件过程来开发与维护软件.

6.4 已管理级

收集对软件过程和产品质量的详细度量值,对软件过程和产品都有定量的理解与控制.

6.5 优化级

过程的量化反馈和先进的新思想,新技术促使过程不断改进.

7 CMMI

CMMI是若干过程模型的综合与改进,是支撑多个工程学科和领域的系统的,一致的过程改进框架,能适应现代工程的特点与需要,能提高过程的质量与工作效率.CMMI有两种表示法:阶段式模型与连续式模型.

7.1 阶段式模型

阶段式模型的结构类似于CMM,分为5个成熟度等级:

7.1.1 初始的

过程不可预测且缺乏控制.

7.1.2 已管理的

过程为项目服务.

7.1.3 已定义的

过程为组织服务.

7.1.4 定量管理的

过程已度量和控制.

7.1.5 优化的

集中与过程改进.

7.2 连续式模型

连续式模型关注每个过程域的能力,一个组织对不同的过程域可以达到不同的过程域能力等级.
CMMI包含了6个过程域能力等级,等级号为0-5,能力等级表明了单个过程域中组织执行的好坏程度.能力等级包括共性目标及相关的共性实践,可以独立地应用于任何单独的过程域,各能力等级的含义:

7.2.1 CL0

未完成的,过程域未执行或未达到CL1中定义的所有目标.

7.2.2 CL1

已执行的,其共性目标是过程可以将标识的输入工作产品转换成可标识的输出工作产品,以实现支持过程域的特定目标.

7.2.3 CL2

已管理的,共性目标是集中于已管理的过程的制度化.根据组织政策规定过程的运作将使用哪个过程,项目遵循已文档化的计划和过程描述,所有正在工作的人都有权使用足够的资源,所有工作任务和工作产品都被监督,控制和评审.

7.2.4 CL3

已定义的,共性目标是集中于已定义的过程的制度化.过程是按照组织的剪裁指南从组织的标准过程集中剪裁得到的,还必须收集过程资产和过程的度量,并用于将来对该过程的改进上.

7.2.5 CL4

定量管理的,共性目标是集中于可定量管理的过程的制度化.使用测量与质量保证来控制和改进过程域,建立和使用关于质量和过程执行的定量目标作为管理准则.

7.2.6 CL5

优化的,使用量化手段改变和优化过程域,以应对客户的要求的改变与持续改进计划的过程域的功效.

8 软件过程模型

软件过程模型习惯上也叫软件开发模型,是软件开发全部过程,活动和任务的结构框架.

8.1 瀑布模型

1970年由W.Royce提出,给出了软件生存周期活动的固定顺序,上一阶段的活动完成后向下一阶段活动过渡,最终得到开发的软件产品.瀑布模型中上一阶段的活动完成并经过评审后才能开始下一阶段的活动,特征是:

  • 接受上一阶段活动的结果作为本阶段活动的输入.
  • 依据上一阶段活动的结果实施本阶段应完成的活动.
  • 对本阶段的活动进行评审.
  • 将本阶段活动的结果作为输出,传递给下一阶段.

8.1.1 优点

最早出现应用最广泛的模型,确保软件开发的顺利进行,对提高软件项目的质量和开发效率起到重要作用.

8.1.2 缺点

  • 用户难以清晰描述所有需求,开发过程中需求也有可能发生改变.
  • 发现错误时,为了改正错误要回到前一阶段,造成瀑布倒流.
  • 在测试完成后才可以看到可运行的软件,发现问题的修改代价极大.

8.2 增量模型

增量模型将软件的开发过程分成若干个日程时间交错的线性序列,每个线性序列产生一个可发布的增量版本,后一个版本是对前一个版本的修改和补充,重复增量发布的过程,直至产生最终的完善产品.

8.2.1 优点

适用于需求经常发生变化的软件开发,以后的增量中可以逐渐加入需求,另外可以有计划地管理技术风险.

8.2.2 缺点

需要良好的架构设计,避免加入的构件破坏已构造好的系统部分,需要对系统有好的全盘分析,否则容易退化成边做边改模型.

8.3 原型模型

原型是预期系统的一个可执行版本,反映了系统性质的一个选定的子集.一个原型不必满足目标软件的所有约束,目的是可以快速,低成本地构建原型.步骤是:

定义总体目标 --> 标识需求 --> 指定原型开发计划--> 确定原型目标和范围--> 快速设计建模-->
构建原型 --> 交付使用--> 收集反馈意见 -- > 下一轮原型迭代开发--> 定义总体目标

8.3.1 优点

用户与开发者在原型上达成一致,减少错误,缩短开发周期,加快进度,降低成本.

8.3.2 缺点

不利于原型系统作为最终产品,原型被建造仅仅是用户用来定义需求,之后便会被部分或全部抛弃,准确的原型设计比较困难,不利于开发人员创新.

8.4 螺旋模型

螺旋模型将原型实现的迭代特征与瀑布模型中的控制的和系统化的方面结合起来,增加了风险分析.螺旋模型沿着螺线自内向外旋转,4个任务区域(4个象限)内分别完成以下任务:

  • 第一象限:风险分析,评价所选方案,识别风险,清楚风险.
  • 第二象限:制订计划,确定软件目标,选定实施方案,弄清项目开发的限制条件.
  • 第三象限:客户评估,评价开发工作,提出修正建议.
  • 第四象限:工程实施,实施软件开发,验证工作产品.

在这里插入图片描述
(图片来源:https://www.itread01.com/cont...

8.4.1 优点

设计灵活,成本计算容易,客户始终参加每个阶段的开发,可以进行有效的互动.

8.4.2 缺点

周期长,需要丰富的风险评估经验以及专门知识,如果未能及时标识风险,势必造成重大损失.

8.5 喷泉模型

喷泉模型是一种支持面向对象开发的过程模型.喷泉体现了面向对象的迭代与无间隙特性.
在这里插入图片描述

8.5.1 优点

各个阶段没有明显的边界,开发人员可以进行同步开发,提高软件项目的开发效率,节省开发时间.

8.5.2 缺点

不利于项目管理,要求严格编写文档,审核难度大.

8.6 基于构件的开发模型

利用预先包装的构件来构造应用系统.构件可以是内部开发的构件,也可以是商业化的构件.

8.6.1 优点

构件可重用,易于维护,对提高软件生产率,提高软件质量,降低成本有很大的帮助.

8.6.2 缺点

很难找到100%合适的构件,就是现有的构件不一定很适合使用,但基于已有构件构造出的构件未必经过100%的测试,难以保证质量.

8.7 形式化方法模型

形式化方法是建立在严格的数学基础上的一种软件开发方法,用严格的数学语言和语义描述功能规约与设计规约,通过数学的分析与推导,易于发现需求的歧义性,不完整性与不一致性,易于对分析模型,设计模型和程序进行验证.通过数学的演算,使得从形式化功能规约到形式化设计规约,以及从形式化设计规约到程序代码的转换成为可能.

8.7.1 优点

用数学语言解决了规格说明的二义性问题,提高了精确性用数学提供了确认手段,使得证明与验证软件按程序满足用户和系统的需求成为可能,可以可视化地模拟/执行模型.

8.7.2 缺点

形式化的方法比其他技术的抽象级别要低,容易陷入细节,需要提早确定系统边界,通常限于正确一致的模型,但大多数情况下模型并非正确与一致.

Image placeholder
blue
未设置
  36人点赞

没有讨论,发表一下自己的看法吧

推荐文章
职业规划指南:怎样才能成为软件工程师?

如果你想从事软件工程师方面的工作,但又不确定从何开始,这里有一些关于薪资、就业市场、技能和该领域常见面试问题的信息。美国“千禧一代”刚刚进入职场,他们中年龄最大的人进入职场时,美国的就业市场正好,雇主

jQuery 学习笔记

jQuery中的dom追加操作方法(主动/被动、前面/后面、里面/外面): append:主动/后面/里面 appendTo:被动/后面/里面 prepend:主动/前面/里面 prependTo:被

流畅的python学习笔记-第4章

第4章文本和字节序列[toc]编码和解码markdom可以插入emoji表情包其中作为前缀,x1f54为对应表情的unicode编码🥺emoji 把码位转换成字节序列的过程是编码;把字节序列转换成码位

流畅的python学习笔记-第5章

第5章函数[toc]函数在python中一切都可以视作为对象,包括函数deffunction_try(): '''itisfuncitontrydoc''' print('function_tryd

go学习笔记-goroutine竞争状态

如果两个或者多个goroutine在没有相互同步状态的情况下同时访问某个资源,并且同时对这个资源进行读写的时候,对于这个资源就处于相互竞争状态(racecandition)。下面来看一个相互竞争的例子

Redis学习笔记2—缓存、集群、一致性等

缓存淘汰策略为了保证高性能,缓存都保存在内存中,当内存满了之后,需要通过适当的策略淘汰老数据,以便腾出空间存储新数据。数据的淘汰策略,典型的包括FIFO(先进先出,淘汰最老数据),LRU(淘汰最近最少

《CSS网站布局实录》学习笔记(四)

课程推荐:JAVA开发工程师--学习猿地精品课程 第四章CSS网站元素设计 4.1网站导航   网站导航是网站中最重要的元素。从形式上看,网站导航主要分横向导航、纵向导航、下拉及多级菜单导航灯3种常见

十年软件通胀率:从 2009 到 2019 年,软件越来越昂贵

过去十年,软件定价逐渐上升。在我们调查的一百个商业应用程序中,价格平均上涨了62%,其中包括一些比较便宜的应用程序。如果用户现在花钱购买一款应用程序,那么它很可能比十多年前的价格贵98%以上。

Adobe又逆天!不用机器学习,用13.5M软件把《长安十二时辰》变成水墨动画

大数据文摘出品作者:曹培信用过修图软件的同学们应该都知道,利用强大的GAN,已经可以实现一键转换照片风格的功能,比如将你拍的风景照转换成一副印象派的画作。现在,轻松转换视频风格的软件也诞生了!Secr

学习猿地PHP第一关课堂笔记

什么是PHP? 绰号:拍黄片 服务器端的脚本语言 超文本预处理器 注意:所有的PHP文件不能直接双击打开,必须经过服务器打开,不经过服务器访问不到。 创建PHP文件 php文件后缀名是.php

【PHP学习】PHP入门学习 之 常量

PHP常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变(除了所谓的魔术常量,它们其实不是常量)。PHP常量默认为大小写敏感。传统上常量标识符总是大写的。 PHP常量名

react学习路线图,学习react就是有捷径

课程推荐:web全栈开发就业班--拿到offer再缴学费--融职教育 文章摘自:https://sunmenglei.blog.csdn.net/article/details/108554788

工程师笔记:我对数据库系统云原生化的一些思考

作者|张敏(于期)阿里云智能高级技术专家划重点我眼中的云原生我认为的云原生关键能力我眼中的云原生化技术手段我对数据库云原生化的思考伴随着云原生技术越来越热门,阿里内部关于CloudNative、Ser

软件架构被高估,清晰简单的设计被低估

软件架构最佳实践、企业架构模式以及系统描述的正式方法都是非常重要且实用的工具,总会有合适的场景让它们发挥作用。但在设计系统时,请从简单始、以简单终,尽可能避免一切会无谓提高复杂度的架构与正式工具。

MacOS 下的 Laravel 调试软件 - Tinkerwell

Tinkerwell是Macos下的一款用于调试的应用,支持本地调试和远程调试。 目前功能比较简单,包括: 基本界面设置-主题、字体、大小、侧边栏等 是否实时运行(仅本地可用) 是否启用Vim映射 设

实践和思考的重要意义(论软件代码设计)

感触 最近这段时间,包括以前,经常听到,程序员们大谈设计模式,这个话题并不陌生,面试必问的问题,活了这么多年,我就一直没搞清楚,为啥面试官喜欢问这个问题。如果一个面试官喜欢问这种问题,我觉得也没啥意思

实践和思考的重要意义(论软件代码设计)

感触最近这段时间,包括以前,经常听到,程序员们大谈设计模式,这个话题并不陌生,面试必问的问题,活了这么多年,我就一直没搞清楚,为啥面试官喜欢问这个问题。如果一个面试官喜欢问这种问题,我觉得也没啥意思。

当年“你说什么,我都能实现”的软件公司,后来都是怎么死的?

在 #“我,80后,曾经靠副业的收入买车买房”# 的评论区里,有读者问,十几年前,圈内有不少软件公司,规模大小不一,遍布各个行业,但这几年似乎都没动静了,他们还活着吗?我说,撇开纯做“劳工”输出的外包

物联网软件开发面临的7种挑战

如今,物联网软件开发实际上是一个雷区。市场需要高质量、可扩展、强大、安全且用户友好的解决方案。物联网开发团队必须重新评估其标准流程,以便将所有因素都考虑进去。在物联网项目的背景下,重新评估“一切”意味

阿里系统软件迎战“双11”超高流量峰值全纪录

刚刚过去的2018年天猫“双11”,创下了全天2135亿GMV的数字奇迹,零点交易峰值比往年提升50%,各项指标均创下历史新高。2018年是“双11”的第十年,也是阿里系统软件事业部参与的第二个“双1

企业备份软件选型指南:这三点是必关注项

企业备份软件,简单来说可以将数据和应用程序从主存储平台转移到二级存储。过去,磁带和磁盘常被用作二级存储媒介。如今,越来越多的供应商也把支持公有云存储作为一项长期战略。在现代IT实践中,备份工具已经从仅

软件定义IT基础架构,如何看待深信服的产品战略布局?

在很多人的潜意识里,深信服是一家令人尊敬的企业,技术支撑能力强,产品种类多,功能全面,后劲足,是少数能和华为、新华三同台竞技的企业之一。但有时候,深信服也会被这些优势所累,比如经常会被问道:你们和华为

如何看待2019年多家开源公司修改软件许可?

从Web服务器到信息站,再到挖掘Facebook信息的大数据算法,几乎所有与您交互的计算机系统都至少有一部分在开源软件上运行。在科技行业,开源软件催生了一大批初创公司,促成了世界历史上最大的软件收购。

容器十年 ——一部软件交付编年史

张磊阿里云容器平台高级技术专家、CNCF官方大使Kubernetes项目资深成员与维护者,曾就职于Hyper、微软研究院(MSR),现在负责Kubernetes技术及上下游相关工作。2019年,全世界

解读2019华为第001号文件:AI时代软件开发的第一要义是可信

晓查发自凹非寺量子位出品|公众号QbitAIAI加持,万物互联、万物智能。我们在享受科技进步的同时,软件开发行业却面临着更大的挑战。过去,软件出现安全问题或许仅仅意味着经济损失,但当走向产业互联网时代