课程连接 --> [进入]
1.1 软件的本质
- 软件具有产品和产品交付载体的双重作用。
- 作为一个产品,体现了由计算机硬件的计算能力。
- 作为产品交付载体,软件提供计算机控制、信息通信及应用程序开发和控制的基础平台。
- 软件提供了这个时代最重要的产品 - 信息。
- 目前,一个庞大的软件产品已经成为了工业经济中的主导因素。
软件生产过程中面临的问题
- 开发时间长
- 成本居高不下
- 交付前无法找到所有错误
- 维护的时间成本和人工成本高
- 开发和维护的过程难以度量
1.1.1定义软件
软件是:
- 指令的集合(计算机程序),通过执行这些指令可以满足预期的特征、功能和性能需求;
- 数据结构,使得程序可以合理利用信息;
- 软件描述信息,它以硬拷贝和虚拟形式存在,用来描述程序操作和使用。
软件的特性
- 软件是设计开发的,而不是传统意义上生产制造的。
- 软件不会“磨损”。
- 大多数软件仍是根据实际的顾客需求定制的。
软件的失效曲线
1.1.2 软件应用领域
- 系统软件
- 应用软件
- 工程/科学软件
- 嵌入式软件
- 产品线软件
- Web/移动APP
- 人工智能软件
1.1.3 遗留软件(旧系统)
特点
- 不断地被修改以满足商业需要和计算平台的变化。
- 遗留软件系统的维护代价高昂且系统演化风险较高。
- 具有生命周期长以及业务关键性特点,但是质量差。
发生演化的原因
- 软件需要进行适应性调整,从而可以满足新的计算环境或者技术的需求。
- 软件必须升级以实现新的商业需求。
- 软件必须扩展以使之具有与更多新的系统和数据库的互操作能力。
- 软件架构必须进行改建以使之能适应不断演化的计算环境。
1.2 软件的变更本质
- 软件是不断演化和发展
- 四大类软件不断演化,在行业中占有主导地位
- 四类软件在几十年前还处于初级阶段
- 它们是:WebApp,移动App,云计算,产品线软件
WebApp
- 现代WebApp远远不止于少量图片的好超文本文件
- 一些Web开发工具扩展了WebAPP的能力,使得Web工程师在向客户提供信息的同时也能提供计算能能力。
- WebApps不仅可以为最终用户提供独立的功能,而且已经同公司数据库和业务应用系统集成在一起了。
- 语义Web技术已经演化为成熟的企业和消费者应用系统,包括提供新功能的语义数据库,这些新功能需要Web链接、灵活的数据表示以及外部访问APIs。
- 应用内容的精美程度仍是决定WebAPP质量的重要因素。
移动App
- 术语app已经演化为在移动平台上专门设计的软件。
- 移动应用系统包括用户接口,用户接口利用移动平台所提供的独特的交互机制。
- 基于Web资源的互操作性提供与app相关的大量信息的访问,并具有本地处理能力。
- 提供了在平台中的持久存储能力。
- 移动Web应用系统允许移动设备通过针对移动平台的优点和弱点专门设计的浏览器获取基于Web内容的访问。
- 移动app可以直接访问设备的硬件特性(例如,加速器或者GPS的位置),然后提供前面所述的本地处理和存储能力。
- 随着时间的推移,移动Web应用系统与移动apps之间的区别会变得模糊。
云计算
- 提供分布式数据存储和处理功能,使任何用户在任何地点可以使用计算设备来共享广泛的计算资源。
- 计算设备位于云的外部,可以访问云内的各种资源。
- 云计算的实现需要开发包含前端和后端服务的体系结构。
- 前端包括客户设备和应用软件用于访问后端。
- 后端包括服务器和相关的计算资源、数据存储系统(如数据库)、服务器驻留应用程序和管理服务器。
- 可以对云体系结构进行分段,提供不同级别的访问。
软件产品线
- 一系列软件密集型系统,可以共享一组公共的可管理的特性,这些特性可以满足特定市场或任务的特定需求。
- 使用相同的底层应用软件和数据体系结构来开发,并使用可在整个产品线中进行服用的一组软件构件来实现。
- 软件产品线共享一组资源,包括需求、体系结构、设计模式、可重用构建、测试用例及其他软件工程工作产品。
- 软件产品线在对这些产品进行工程设计时,利用了产品线中所有产品的公共性。
软件危急:计算机软件的开发和维护过程所遇到的一系列严重问题。
软件危机的表现:
- 软件开发成本和进度估算不准确
- 无法满足用户需求
- 质量不可靠
- 难以更改、调试和增强
- 没有适当的文档
- 软件成本比重上升
- 软件开发生产率跟不上计算机应用迅速深入的趋势。
统计数字:混乱的软件开发
为何出现这种情况?
客观
- 软件产品开发的复杂度和难度随软件规模呈指数级别增长。
- 随着软件规模的激素增长,软件的开发方法已经不适用。
主观
- 软件开发人员缺乏工程性的、系统性的方法论。
- 程序员对软件开发这一过程性较强的任务缺乏足够的工程化思维
- 对软件开发的一些认识的误区
- 没有将“软件产品研发”与“程序编码”区分清楚
- 忽视需求分析、轻视软件维护