清华软件工程(一):软件无处不在、软件的本质特性、软件工程的产生于发展、软件工程的基本概念、软件质量实现

一、软件无处不在:

1. 软件工程(SE):

软件: 是软件工程的研究对象, 也是软件工程的产品形态与客观存在;
工程: 是将理论和知识应用于实践的科学, 其目的是经济有效地解决实际问题;

2. 软件工程需要解决的问题:

  • 软件具有哪些本质的特性?
  • 软件开发面临哪些主要的问题?
  • 如何理解软件工程的基本概念和内涵?
  • 软件开发应该遵循哪些工程化原则?
  • 页面认识如何看待软件工程?

二、软件的本质特性:

1. 软件的定义:

软件 = 程序 + 数据 + 文档

  • 软件: 计算机可以接受的一系列指令, 运行时可以提供所要求的功能和性能;
  • 数据: 是的程序能够适当的操作信息的数据结构;
  • 文档: 描述程序的研制过程, 方法和使用的图文资料;

2. 软件的本质特性:

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

2.1 复杂性:

2.2 一致性:

  • 软件不能独立存在, 需要依附于一定的环境(如硬件, 网络以及其他软件);
  • 如那件必须遵从认为的管理并适应已有的技术和系统;
  • 软件需要岁接口不同而变化, 随时间推移而变化, 而这些变化是不同人设计的结果;
    在这里插入图片描述

2.3 可变性:

  • 人们总是认为软件是容易修改的, 但是忽视了修改所带来的的副作用;
  • 不断的修改最终导致软件的退化, 从而结束其生命周期;
    在这里插入图片描述

2.4 不可见性:

  • 软件是一种"看不见, 摸不着"的逻辑实体, 不具有空间的形体特性;
  • 开发人员可以直接看到程序代码, 但是源代码并不是软件本身;
  • 软件是以机器代码的形式运行, 但是开发人员无法看到源代码是如何运行的;

三、软件工程的产生与发展:

1. 软件开发面临的挑战:

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

2. 探讨软件之道:

软件工程一直致力于探索软件开发问题的解决之道;

2.1 软件工程诞生:

  • 史前时代: (1956-1967)
    • 软件开发没有方法可循;
    • 软件设计是在开发人员头脑中完成的隐藏过程;
    • 60年代中期的软件危机;
  • 1968年, 北大西洋公约组织提出"软件工程"概念和术语;
  • 瀑布过程模型:(1968-1982):
    • 结构化开发方法;
    • 瀑布式软件生命周期模型称为典型;
  • 质量标准体系:(1983-1995)
    • 面向对象开发方法;
    • 软件过程改进运动;
    • CMM/ISO9000/SPICE等质量标准体系;
  • 互联网敏捷开发:(20世纪90现代至今):
    • 敏捷开发方法流行;
    • 更紧密的团队协作;
    • 有效应付需求变化;
    • 快速交付高质量软件;
    • 迭代和增量开发过程;

四、软件工程的基本概念:

1. 工程的含义:

工程是将理论和经济应用于实践的科学, 以便经济有效地解决问题;
工程活动的特征:

  • 大规模的设计与建造;
  • 复杂问题与目标分解;
  • 团队协作与过程控制;

2. 什么是软件工程:

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

  • 较低的开发成本;
  • 按时完成开发任务并及时交付;
  • 实现客户要求的功能;
  • 具有良好的性能, 可靠性,可扩展性,可移植性等;
  • 软件维护费用低;

3. 软件工程的基本要素:

开发高质量软件的三个基本要素:

  • 过程: 支持软件开发各个环节的控制和管理;
  • 方法: 完成软件开发任务的技术手段;
  • 工具: 为软件开发方法提供自动或半自动的软件支撑环境;

3.1 过程:

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

3.2 方法:

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

3.3 工具:

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

4. 软件开发的基本策略:

  • 软件复用
    • 构建一个新的系统不必从零做起, 直接复用已有的构建进行组装;
    • 构件是经过反复使用验证的, 由其组成的新系统具有较高的质量;
  • 分而治之:
    • 将一个复杂的问题分解成若干个简单的问题, 然后逐个解决;
    • 来源于人们生活与工作经验, 完全适合于技术领域;
  • 逐步演进:
    • 软件开发是自底向上逐步有序的生长过程;
    • 小步快跑: 每走完一步再调整并为下一步确定方向, 直到终点;
  • 优化折中:
    • 优化: 优化软件的各个质量特性, 如: 运行速度, 资源利用, 用户体验;
    • 折中: 通过协调各个质量特性, 实现整体质量的最优;

4.1 软件复用:

软件复用是利用已有的软件制品, 直接组装成或者合理修改形成新的软件系统, 从而提高开发效率和产品质量, 降低维护成本;
软件复用不仅仅是代码复用, 还包括:

  • 库函数、类库;
  • 模板(文档、网页等);
  • 设计模式;
  • 组件;
  • 框架;

4.2 分而治之:

软件工程是一项解决问题的工程活动, 通过对问题进行研究分析, 将一个复杂问题分解成可以理解并能够处理的若干小问题, 然后再逐个解决;

4.3 逐步演进:

软件的生长是一歌逐步有序的过程. 软件开发应该遵循软件的客观规律, 不断进行迭代式增量开发, 最终交付符合客户价值的产品;

4.4 优化折中:

软件工程师应该把优化当成一种责任, 不断改进和提升软件质量; 但是优化是一个多目标的最优决策, 在不可能使所有目标都得到优化时, 需要进行这种实现整体的最优.

5. 软件工程的Wasserman规范:

  • 抽象, 软件建模方法, 用户界面原型化, 软件体系结构, 软件过程, 软件复用, 度量, 工具与集成环境;

五、软件质量实现:

1. 软件质量:

  • 用户: (功能质量)
    • 软件符合指定需求;
    • 软件几乎没有缺陷;
    • 软件性能正常;
    • 软件容易上手, 操作方便;
  • 开发人员: (结构质量)
    • 代码可测试性;
    • 代码可维护性;
    • 代码可读性;
    • 代码效率: 高效管理资源;
    • 代码安全: 可预防常见威胁;
  • 投资者: (质量过程)
    • 软件按时交付;
    • 软件满足预算;
    • 可复用开发过程, 确保交付质量;

2. 什么是好的软件:

2.1 什么是好的软件:

在这里插入图片描述
质量就是软件产品对于某个(某些)人的价值.

  • 正确的软件:
    • 一个软件要能够满足用户的需求, 为用户创造价值. 这里的价值可以体现为为用户创造利润 和 减少成本;
  • 软件运行正确:
    • 软件没有或有很少缺陷, 具有很强的扩展性, 良好的性能以及较高的易用性等;

2.2 高质量的软件产品:

  • 做了用户想要它做的事情;
  • 正确有效地使用计算机资源;
  • 抑郁用户学习和使用;
  • 设计良好, 代码良好且抑郁测试和维护;

3. 产品质量维度:

3.1 产品质量维度模型(通用性):

性能、特色、可靠性、符合性、耐久性、客服务性、审美、感知;

3.2 ISO9126质量模型: 外部和内部质量

  • 功能性:
    • 适合性: 当软件在指定条件下使用, 其满足明确和隐含要求功能的能力;
    • 准确性: 软件提供给用户功能的精确度是否符合目标;
    • 互操作性: 软件与其他系统进行交互的能力;
    • 安全性: 软件保护信息和数据额安全能力;
  • 可靠性:
    • 成熟性: 软件产品避免因软件中错误发生而导致失效的能力;
    • 容错性: 软件防止外部接口错误扩散而导致系统失效的能力;
    • 可恢复性: 系统失效后, 重新恢复原有功能和性能的能力;
  • 易用性:
    • 易理解性: 软禁显示的信息要清晰, 准确且易懂, 使用户能够快速理解软件;
    • 易学性: 软件使用户能学习其应用的能力;
    • 易操作性: 软件产品使用户能抑郁操作和控制它的能力;
    • 吸引性: 软件具有的某些独特的、能让用户眼前一亮的属性;
  • 效率/性能:
    • 时间特性: 在规定的条件下, 软件产品执行其功能时能够提供适当的响应时间和处理时间以及吞吐率的能力;
    • 资源利用: 软件系统在完成用户指定的业务请求所消耗的系统资源, 诸如: CPU占有率、内存占有率、网络带宽占有率等;
  • 可维护性:
    • 易分析性: 软件提供辅助手段帮助开发人员定位缺陷原因并判断出修改之处;
    • 易改变性: 软件产品使得指定的修改容易实现的能力;
    • 稳定性: 软件产品避免由于软件修改而造成意外结果的能力;
    • 易测试性: 如那件提供辅助性手段帮助测试人员实现其测试意图;
  • 可移植性:
    • 适应性: 软件产品无需做任何相应变动就能适应不同运行环境的能力;
    • 易安装性: 在平台变化后, 成功安装软件的难易程度;
    • 共存性: 软件产品在公共环境与其他共享资源的其他系统共享的能力;
    • 替换性: 软件系统的升级能力, 包括在线上级, 打补丁升级等;

4. 实现软件质量:

4.1 软件质量:

质量不是被测出来的, 而是在开发过程中逐渐构建起来的;
虽然质量不是测出来的, 但是未经测试也不可能开发出高质量的软件;
质量是开发过程的问题, 测试是开发过程中不可缺少的重要环节;

4.2 高质量软件开发之道:

高质量的设计; 规范的编码; 有效的测试;

4.3 商业目标决定质量目标:

  • 商业目标决定质量目标, 不应该把质量目标凌驾于商业目标之上;
  • 质量是有成本的, 不可能为了追求完美的质量而不惜一切代价;
  • 理想的质量目标不是"零缺陷", 而是恰好让广大用户满意;
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅弋、璃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值