软件的本质 (The Nature of Software)¶
1.1 软件的本质¶
软件的演进 (The Evolution)¶
-
早期 (Early days):
- 用户 ↔ 计算机 (User ↔ Computer)
- 软件 = "将一系列指令放在一起,让计算机做一些有用的事情" (Software = "Place a sequence of instructions together to get the computer to do something useful")。
- 这个时期的计算机非常昂贵,只有少数专家才能操作。编程语言也处于非常原始的阶段,通常是机器语言或汇编语言。
- 示例: 早期的计算机用于计算弹道轨迹、破解密码等。
-
20 世纪 50 年代后期 (Late 1950's):
- 用户 ↔ 程序员 ↔ 计算机 (User ↔ Programmer ↔ Computer)
- 计算机变得更便宜、更常见 (Computer became cheaper and more common)。
- 发明了高级语言 (High level languages were invented)。
- 程序员作为用户和计算机之间的桥梁出现,降低了使用计算机的门槛。高级语言(如 FORTRAN、COBOL)的出现使得编程更加容易。
- 示例: FORTRAN 用于科学计算,COBOL 用于商业数据处理。
-
20 世纪 60 年代早期 (Early 1960's):
- 黑客 ≠ 破坏者 (Hacker ≠ Cracker)
- 极少数大型软件项目由一些专家完成 (Very few large software projects were done by some experts)。
- 这个时期的“黑客”是指那些对计算机技术有深入了解并热衷于探索和创新的程序员,而不是现在常指的恶意入侵者。
- 拓展: 区分 Hacker 和 Cracker:
- Hacker: 热衷于探索计算机系统和编程,追求技术卓越,通常具有建设性。
- Cracker: 恶意入侵计算机系统,破坏数据或窃取信息,具有破坏性。
案例研究:IBM System/360¶
- 背景: 美国 IBM 公司在 1963 年至 1966 年开发了 IBM 360 机的操作系统。
- 规模: 耗费了 5000 人年的工作量,最多时有 1000 人参与开发,编写了近 100 万行源程序。
- 问题: 每次发布的新版本都是从前一版本中找出 1000 个程序错误并修正的结果。
- 负责人 F. P. Brooks 的总结: "...正像一只逃亡的野兽落到泥沼中做垂死的挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难。..."
- 经典著作: Brooks 博士随后写出了软件工程领域的经典著作《人月神话》(The Mythical Man-Month)。
- 启示:
- 软件开发并非简单的“人多力量大”,盲目增加人手反而可能导致项目更加混乱。
- 软件开发过程需要良好的管理、规划和沟通。
- 《人月神话》中提出的许多观点至今仍然适用。
软件是什么? (What is Software?)¶
- 定义: 软件是一组项目或对象的集合,形成一个配置,其中包括:
- 指令 (Instructions): 即计算机程序,执行时提供所需的功能和性能。
- 数据结构 (Data structures): 使程序能够充分操作信息。
- 文档 (Documents): 描述程序的操作和使用。
- 以及更多... (AND MORE...)
- 特点:
- 软件是被开发或设计的,而不是传统意义上的制造。
- 软件不会“磨损”,但会“退化”。
- 没有软件备件。
软件的退化 (Software Deterioration)¶
- 硬件故障曲线 (Failure curve for hardware): 呈现“浴缸曲线”形状。早期故障率高(早期失效),中期故障率低(稳定期),后期故障率再次升高(老化)。
- 理想化的软件故障曲线 (Idealized curve): 随着时间推移,故障率应该逐渐降低。
- 实际的软件故障曲线 (Actual curve): 由于不断修改和引入新的错误,故障率会周期性上升。
- 原因:
- 软件的每次更改都可能引入新的错误(副作用)。
- 软件的复杂性随着时间的推移而增加,维护变得更加困难。
软件应用类型 (Software Application Types)¶
- 系统软件 (System software): 为其他软件提供平台的软件,如操作系统、数据库管理系统、网络软件等。
- 应用软件 (Application software): 为用户执行特定任务的软件,如文字处理软件、电子表格软件、游戏等。
- 工程/科学软件 (Engineering/Scientific software): 用于工程和科学领域的软件,如 CAD 软件、仿真软件等。
- 嵌入式软件 (Embedded software): 嵌入到硬件设备中的软件,如汽车控制系统、家用电器中的软件等。
- 产品线软件 (Product-line software): 一组共享通用功能并满足特定市场需求的软件密集型系统。
- Web 应用程序 (Web-applications): 基于 Web 的应用程序,如电子商务网站、社交媒体平台等。
- 人工智能软件 (Artificial intelligence software): 模拟人类智能的软件,如机器学习、自然语言处理等。
遗留软件 (Legacy Software)¶
- 定义: 已经存在很长时间,但仍然需要维护和更新的软件。
- 为什么必须更改?
- 适应 (Adapted): 适应新的计算环境或技术。
- 增强 (Enhanced): 实现新的业务需求。
- 扩展 (Extended): 与其他更现代的系统或数据库互操作。
- 重构 (Re-architected): 使其在网络环境中可行。
1.2 软件的不断变化的本质 (The Changing Nature of Software)¶
Web 应用程序 (WebApps)¶
- 特点:
- 不仅仅是带有少量图片的超文本文件。
- 使用 XML 和 Java 等工具进行增强,以实现交互式计算能力。
- 可以独立运行,也可以与企业数据库和业务应用程序集成。
- 语义 Web 技术(Web 3.0)已经发展成为复杂的企业和消费者应用程序。
- 内容的审美性质仍然是 WebApp 质量的重要决定因素。
移动应用程序 (Mobile Applications)¶
- 特点:
- 驻留在移动平台(如手机或平板电脑)上。
- 包含考虑设备特性和位置属性的用户界面。
- 通常提供对基于 Web 的资源以及本地设备处理和存储功能的组合的访问。
- 在平台内提供持久存储功能。
- 移动 Web 应用程序允许移动设备使用浏览器访问 Web 内容。
- 移动应用程序可以直接访问设备上的硬件。
- 随着时间的推移,这些差异将变得模糊。
云计算 (Cloud Computing)¶
- 定义: 云计算为联网计算设备提供分布式数据存储和处理资源。
- 架构:
- 计算资源驻留在云外部,并可以访问云内部的各种资源。
- 云计算需要开发包含前端和后端服务的架构。
- 前端服务包括客户端设备和应用程序软件。
- 后端服务包括服务器、数据存储和服务器驻留应用程序。
- 云架构可以进行分段以限制对私有数据的访问。
- 图示: (幻灯片 11 中的图)
产品线软件 (Product Line Software)¶
- 定义: 一组软件密集型系统,它们共享一组通用的功能,并满足特定市场的需求。
- 特点:
- 使用相同的应用程序和数据架构以及可重用软件组件的通用核心进行开发。
- 共享一组资产,包括需求、架构、设计模式、可重用组件、测试用例和其他工作产品。
- 通过利用产品线中所有产品的共性来实现多个产品的开发。
总结¶
软件的本质是不断变化的。从早期的简单指令到现代复杂的分布式系统,软件已经渗透到我们生活的方方面面。理解软件的本质、演进和不同类型,对于软件工程师来说至关重要。同时,我们也需要关注软件开发过程中遇到的挑战,并不断学习和适应新的技术和趋势。