理论应用
请简述…理论,结合自己的项目实践,写出应用实例。
常见的软件工程中的理论内涵及含义,在实际应用中的举例
应用和案例:与作业做过的密切相关
理论内涵以及含义
IBM公司提出的能力成熟度模型CMM
Wasserman规范
理论内涵:提出了八个基本概念来应对软件开发过程中面临的问题
- 抽象:使我们将关注点集中于问题的关键方面而不会陷入细节中
- 分析和设计方法以及表示法:软件工程中没有类似于建筑中的绘图规范一类的内容。通过该概念的提出,提供交流媒介,能够建立模型并并检查模型的完整性和一致性。
- 用户界面原形化:构建一个系统的小版本,通常只有有限的功能。原型化过程通常是迭代的,先构建原型并评估,再据此构建另外一个原型。
- 软件体系结构:根据一组体系结构单元与单元之间的相互关系描述,描述系统。单元独立,体系结构越模块化。系统划分为单元的方法:模块化分解,面向数据/事件分解,由外到内的设计,面向对象的设计。
- 软件过程:不同的软件类型需要不同的过程,企业范围需大量控制,单个/部门级应用程序可利用快速应用程序开发。
- 复用:复用以前开发项目中的项来利用应用程序之间的共性。制定长期复用计划困难:构建小构件比搜索更快,足够通用很难,复用失效无人负责,质量难以保证,理解复用的构件耗时。
- 测度:量化我们做了什么以及目标是什么,就能用数学语言描述行动和结果,评估进展。
- 工具和集成环境:CASE工具,增强软件开发。CASE(计算机辅助软件工程)
瀑布模型
过程,优缺点;
==缺点==
敏捷方法
他的四个原则
个体和交互 胜过过程和工具: 激发团队潜能
可以工作的软件 胜过面面俱到的文件
客户合作 胜过合同谈判
响应变化 胜过遵循计划
==举例==
极限编程XP,水晶法Crystal,并列争球法SCRUM,自适应软件开发ASD,特征驱动软件开发FDD,实用编程
极限编程的==十二个实践操作==
==静态模型和动态模型的区别==:
静态模型描述过程,表明从输入到输出的转换过程.
动态模型能够动态展现过程,这样用户能够看到中间产品和最终产品时如何随着时间的推移进行转换的。
Scrum的专业==名词记忆==
四种人员工作风格
- 感性外向型的人:告诉别人自己的看法和想法,根据对问题的感觉和感情做决定。适合于快速做出合理的决策。
- 理性内向型的人:收集充足资料,根据资料进行逻辑推理,做出决定。
- 感性内向型的人:收集充足资料后,凭借自己的感觉和情感做出决定。
为什么直接使用单位时间内的代码规模来描述生产率是不合适的?
原因有以下几点:
- 程序员的输出差异很大
- 每次的规模大小根据程序应用语言\应用程序领域、难度和问题的新颖性而不同。
- 代码复用的数量也会影响生产率。
- 管理风格和结构。
- 程序员的风格可能会根据给他们的目标而有所不同。
- 直到需要估计很长时间之后,才能获得大小的值,而大小估计可能非常不准确。
因此,有一种衡量生产率的方法来克服所有这些缺点将是非常有帮助的。此外,我们需要了解一些周围的问题,例如生产率目标、管理风格和程序员专业知识对生产率的影响,无论它是如何衡量的。
如果一个判定表有两个相同的列,说明需求规格说明是冗余的.
如果有两列指定相同的条件(相同的真值集)但不同的操作,则该规范是矛盾的。
如果存在一些没有列的条件(即没有指定的操作),则该规范是模棱两可的或不完整的。
七种常见的体系结构风格
管道-过滤器风格
- 过滤器的相对独立性,即过滤器独立完成自身功能,相互之间无需进行状态交互。
- 设计者可以将整个系统的输入、输出特性简单的理解为各个过滤器功能的合成。
- 基于管道-过滤器风格的系统具有较强的可维护性和可扩展性
- 支持一些特定的分析,如吞吐量计算和死锁检测等
- 管道-过滤器风格具有并发性
缺点
- 交互式处理能力弱
- 具体实现比较复杂
层次设计风格为代表的调用返回风格
优点:
- 层次结构风格支持系统设计过程中的逐级抽象
- 基于层次结构风格的系统具有较好的可扩展性
- 层次结构风格支持软件复用
缺点:
- 并不是每个系统都可以很容易地划分为分层的模式
- 很难找到一个合适的、正确的层次抽象方法。
C/S风格架构
优点:
- 界面和操作可以很丰富
- 安全性高
- 响应速度快
缺点:
- 适用面窄
- 用户群固定
- 维护成本高
B/S架构风格
优点:
- 维护和升级方式简单
- 交互性较强
缺点:
- 在速度和安全性上需要花费巨大的设计成本
- 通常需要刷新页面(Ajax等可以一定程度缓解该问题)
- 通信开销大
分析
下图是…,请分析…,
UML图以及提纲中列出来的图表(可供分析的,主要分析这个东西是什么设计模式/其他所属的类别,有什么优点或者缺点?
有哪些设计模式/体系结构风格,都要尽量了解他们以及各自的特性.
给你一个实例,分析他背后反映出来的东西.
第一章系统举例
呼吸系统的例子:身体吸进氧气排出二氧化碳.
系统边界用于区分给定的一个身体器官是否是呼吸系统的一部分.而氧气和二氧化碳分子等实体或对象.根据实体之间的交互聊描述系统中的活动: 吸入气体,过滤气体,传输分子进入/离开血液,呼出气体.
工资单产品的系统定义:
系统边界:
- 系统边界内部包含:日期确认,计算,打印;
- 系统边界外部包含:输入和输出(来自于公司的计算机提供的支付信息\发送到邮箱的工资单的集合)
实体:
- 工资单
- 支付信息
- 日期等等
第一章增量开发举例
包含一系列阶段,每一个阶段都使前面的系统不受后面系统的约束的限制。例如阶段1可以增加一个新硬件,然后每个阶段做一点微小的变动,直到整个系统逐渐从旧的软件和硬件中脱离开来,体现出新系统的设计。
关于实时系统的例子 阿丽亚娜5型发射火箭:
产生灾难性后果的原因是客户错误地说明了需求。程序是高质量的,但是厂商再检测到异常情况时的措施,是终止处理器,而不是对异常进行适当处理。
开发初期,低质量的系统工程会导致一系列的决策失误,导致灾难。将整个系统看作子系统的集合,但是综合的解决方案必须包含所有构建的总体视图,将各个部件合在一起考虑。
==第4.16==
第一章的错误、故障、失效的举例
错误:开发人员开发过程中在思想上存在的一些误解或误区。
故障:由这些误解导致编码开发过程中编写了错误的内容,例如代码,测试数据等,这些错误信息称为故障。
失效:当这些故障使得程序产生了错误的行为,或生成错误的结果,称为失效。
举例:误以为开发时直径是半径的三倍,导致需求文档写错(描述输入1输出3),从而导致程序员编写代码产生问题。输入直径后返回三倍,导致失效。如果与该公式相关的部分在设计/需求确认时没有得到发现,那么这个故障会导致失效。如果给定的测试数据没有让这一部分代码得到执行,这也是故障导致系统交付后产生失效。
给定一个产品质量不等于技术质量的例子。
一个复用库,做得很好,技术力MAX。但是不给文档,对于不熟悉的人来说根本没法用,产品质量不太好。
对于敏捷开发之用户故事的举例
初始需求:1.作为网络规划人员,我想要配置一个媒体网关,因为想要增加网络容量和服务
初次分解:1.1作为网络规划人员,我想把媒体网关参数上传到管理系统1.2作为网络规划人员,我想从管理系统下载媒体网关参数
再次分解:1.2.1作为网络规划人员,我想用文件方式从管理系统下载媒体网关参数
用例:用户在管理系统上选择以文件方式下载媒体网关参数,执行成功后,检查文件是否正确下载到本地且内容正确
1.2.2作为网络规划人员,我想用MML结构方式从管理系统下载媒体网关的参数
用例:…………
分析在需求后期发生更改的时候,使用的几个不同的过程模型的处理措施?
- 对于瀑布模型:重新分析需求,重新设计,重新编码,重新测试
- V模型,与瀑布模型相同的处理措施
- 原型模型:对设计和代码中的原型进行更改,与客户沟通,进行迭代
- 可操作规格说明:重新转换规格
- 可转换模型:重新做相关的转换
- 增量模型/迭代模型:在另一个增量或者迭代中实现更改
- 螺旋模型:实现另外的一圈螺旋
我们认为软件开发是一个创造性的过程,而不是一个制造过程。讨论适用于软件开发的制造特性,解释软件开发中哪些特性更类似于创造性行动?
与制造业一样,软件开发中也存在着确保产品质量的问题,许多资源都被用于评估和改进质量。同样,制造和软件开发都需要仔细规划和监控过程。
然而,软件开发是创造性的,因为几乎每个问题都是新的,并且需要一个至少部分是以前从未做过的解决方案。因此,必须利用想象力来设想解决方案如何以及是否可行。
哪些软件过程在需求变化时具有更大的灵活性?
增量模型和迭代模型都具有很大的灵活性,但是,它们在处理哪种类型的需求更改方面存在差异。
增量模型适用于添加或删除整个功能区的更改,因为每个增量都会在功能方面添加到系统中,因此,如果在需求中添加了新功能,可以视为未来增量的一部分进行规划。
迭代模型适用于处理修改功能的需求更改,每个函数都是在开始时实现的,但是通过连续的迭代细化,大部分函数都会在迭代中被更改,因此不难合并由于需求更改而引起的更改。
学生项目设计时,在按时完成项目方面存在着极大的风险.分析一个学生项目中可能存在的风向.
风险暴露是什么,可以使用什么方法减轻各种风险?
Risk | Exposure | 减轻方式 |
---|---|---|
对于设计无法达成一致意见 | 0.3*10=3天 | 选择一位首席设计师来决定 |
有成员不参与工作 | 0.1*30=3天 | 选择合适的团队成员;向上级求助 |
测试中出现很多bug | 0.5*5=2天 | 合理检查,经常检查 |
给定两种文档和需求规格说明
两者实际上是不同的,考虑一个安放在动物园入口的软件控制的十字转门.
当向该十字转门投以一枚硬币,锁打开,游客可以推动十字转门,进入动物园.
当已经开锁的十字转门旋转到能够使一个人进去的程度之后,就重新锁住,防止另外一个没有付费的人进入.
那么在实际应用中,
需求定义:
是客户想要的每一件事情的完整列表。
本例中:
- 未付费的人不能进入动物园
- 对于每一次付费,系统都不应该阻止其相应的进入。
需求规格说明
将需求重新陈述为关于要构建的系统将如何运转的规格说明。着重于描写系统与环境的交集–共享的接口中的的部分说明,而不应该设计系统边界之外的环境的内容。
在本例中,对于门禁系统来说,十字转门是属于系统的,并且还是系统与外界环境的交集部分(共享的接口)。在描述需求“未付费者不能进入动物园”时,不应该使用到“进入”的概念,而是应该聚焦于共享的接口,也就是十字转门,因此应该描述为:
当系统检测到硬币投入,并且一个游客使用一定的力来推动开锁的十字转门时,十字转门应该能够旋转半周,然后锁上。(没有提及游客进入这个行为)
针对给定的KWIC例子和四种设计风格(信息库,数据抽象,隐含调用以及管道和过滤器风格),这些风格的高层构件的内聚性和耦合性如何?
信息库设计由于共享数据而具有高耦合性.
并且由于每个模块负责系统的一个功能而具有高内聚性。
数据抽象由于使用接口来检索必要的数据,所以在组件之间的耦合比存储库低。
由于主要功能分布在模块之间,因此它的内聚性低于存储库设计。
隐含调用由于使用了 ADT,所以比以前的设计具有更低的耦合性.
并且由于将主要功能分离到单独的模块中,因此具有高内聚性。
管道和过滤器设计因为过滤器之间的依赖是它们之间的管道而具有低耦合
因为每个独立的过滤器都与系统的主要功能相关,具有高内聚性。
设计
有问题…,请设计…
给定一个问题,设计模式/程序来求解.
给定一个图,设计一个程序来解决.
使用增量模型开发文字处理软件,如何设计每个增量?
第一个增量发布基本的文件管理、编辑和文档生成功能
第二个增量发布更加完善的编辑和文档生成功能
第三个增量实现拼写和语法检查功能
第四个增量实现高级的页面布局功能。
对于驾驶汽车使用Lai表示方法进行静态建模(感觉应该不会考吧
用图书、作者两个实体及其属性和练习构建E-R图
设计数据流图来表示。。。
计算
已知…,请估算…
割集树,活动图
故障播种的计算
软件可信度的计算之类的P138例题和公式(第八章第十一题
作业题出现的计算题
关键路径法(CPM)
时差=最晚开始时间(13)-最早开始时间(1)
关键路径:这条路径上的每个节点的时差都为0
使用的是AOE边活动网络,使用定点代表时间,使用有向边表示活动。
最早开始时间
earliest(i)=从源点v0到vi的最长路径长度
最晚开始时间
latest(i)=earliest(i)-从vi到汇点的最长路径长度
也就是说,求最早开始时间,使得汇聚到某个点上的值尽可能地大;求最晚开始时间,使汇聚到某个点上的值尽可能的小。
求出每个节点的值之后,可以进一步求解每条边代表的活动的最早开始时间和最晚开始时间:
- 最早开始时间,等于这条边的前驱的最早开始时间
- 最晚开始时间,等于这条边的后继节点的最晚开始时间 - 边的长度
综合
结合自己的软工项目实践,举例从X、Y、…等方面提高软件质量所做的重构工作。
对比前后…种设计方案的特点不同。