软件开发各阶段 (教学大纲 3.3.4)
未来的软件工程师们,大家好!本章我们将告别编写单行代码的模式,开始像项目经理一样思考。软件开发不仅仅是写代码;它是一个包含规划、构建和检查的严谨过程。理解这一过程(通常称为软件开发生命周期,即 SDLC)对于创建可靠、高效且实用的计算机系统至关重要。
如果这些步骤看起来很多,也不用担心——我们在现实生活中处理复杂任务时,其实都在运用类似的过程,比如组织一场校园活动或装修一个房间!
软件开发的阶段
软件开发通常被划分为几个关键阶段。虽然有时它们被呈现为一个僵化的顺序(如瀑布模型),但现代开发通常采用迭代式或敏捷开发(Agile)方法,这意味着你会多次循环经历这些阶段,并在每次循环中不断完善产品。
第 1 阶段:分析 (Analysis)
这是“搞清楚用户到底想要什么”的阶段。如果你完美地构建了一个错误的东西,那依然是失败的!
在开始任何构建工作之前,必须清晰地定义问题。
分析阶段的关键步骤:
1. 确定需求 (Establish Requirements):
- 这涉及与预期用户(即真正使用系统的人)进行深入沟通。
- 我们需要明确系统必须做什么(功能需求),以及它必须做得多好(非功能需求,如速度或安全性)。
2. 创建数据模型 (Create a Data Model):
- 这涉及确定系统需要存储哪些数据,以及这些数据之间如何关联。
- 示例:如果你要构建一个学校注册系统,你需要对学生、班级和教师等实体进行建模,并定义每个实体的属性。
你知道吗? 明确需求的过程通常涉及原型制作 (Prototyping) 或敏捷方法。这意味着先制作一个快速、基础的工作版本(原型)展示给用户,这样他们就能在你投入数月时间编写最终版本之前说:“等一下,那个按钮应该是蓝色的,而不是红色的!”
核心任务是定义问题,从用户处收集需求,并规划所需数据模型。
第 2 阶段:设计 (Design)
一旦我们知道要构建什么(分析阶段),设计阶段就决定了我们如何构建它。该阶段在编写任何最终代码之前,会先对解决方案进行详细说明。
关键设计组成部分:
- 规划数据结构: 决定如何在代码中实现数据模型(例如,使用数组、列表或记录)。
- 设计算法: 创建解决问题特定部分的逐步过程(算法,通常以伪代码编写)。
- 模块化结构: 将程序拆分为更小、可管理、已命名的代码块(子程序或函数)。这对结构化编程(在 3.3.1 中涵盖)至关重要,并使代码更易于测试和维护。
- 设计人机界面 (HUI): 规划屏幕外观以及用户如何与系统进行交互(例如,按钮布局、导航流程)。
与分析阶段一样,设计阶段也可以是迭代的,特别是在使用原型制作或敏捷开发方法时。
核心任务是规划结构(模块)、数据组织以及逐步逻辑(算法)。
第 3 阶段:实现 (Implementation)
这是真正的写代码阶段!你要把规划(算法和设计)转化为可执行的代码。
在之前阶段设计的模型和算法会被翻译成计算机可以处理的数据结构和代码(指令)。
当使用迭代/敏捷方法时,开发人员通常会优先关注关键路径 (Critical Path)。
什么是关键路径?
关键路径是解决方案中其他一切都依赖于它的那一部分。如果关键路径无法运作,整个系统就会失败或无法继续。
类比: 如果你正在构建一个在线商店,处理付款的能力就是关键路径。没有付款处理功能,无论产品展示页面做得多好,整个商店都是没用的。
编写代码,将算法转换为指令,并在迭代开发中优先处理关键路径。
第 4 阶段:测试 (Testing)
实现工作永远不会在程序经过严格测试之前结束!测试的目标是发现错误(Bug)并确保系统表现完全符合需求说明。
学生必须具备设计和应用各类测试数据的实践经验:
1. 正常 (典型) 数据 (Normal Data)
目的: 检查实现是否在预期的、有效的条件下正常工作。
示例: 一个程序要求输入 18 到 60 岁之间的年龄。正常数据可以是 35 或 42。
2. 边界数据 (Boundary Data)
目的: 检查可接受输入的极限值。程序往往恰好在边界限制处出错。
示例: 对于 18 到 60 岁范围,边界数据包括 18、17(刚超出)、60 和 61(刚超出)。
3. 错误数据 (无效数据) (Erroneous Data)
目的: 检查程序在面对完全错误或意外数据类型时的稳健性。
示例: 在需要年龄时输入 "Tuesday" 或 "-5"。程序应该能优雅地处理这种情况(例如,显示错误消息)而不是崩溃。
测试通过规划好的测试数据集来确认正确性:正常(预期)、边界(极限)和错误(无效)。
第 5 阶段:评估 (Evaluation)
系统构建并测试完成后,我们必须回顾并评价其质量。这涉及将最终系统与初始需求进行比较,并使用关键指标进行评判。
你需要掌握评估计算机系统的标准:
1. 正确性 (Correctness)
- 程序是否满足了分析阶段指定的所有原始用户需求?
- 它是否能对正确的输入产生正确的输出?(即:是否没有 Bug?)
2. 效率 (Efficiency)
- 系统是否有效地使用了计算资源?
- 我们从时间效率(算法运行速度,通常与算法选择有关)和空间效率(程序占用多少内存,与数据结构选择有关)来衡量。
3. 可维护性 (Maintainability)
- 系统在未来是否易于理解、调试和更新?
- 高可维护性意味着代码结构良好(模块化)、使用了有意义的标识符名称,并包含说明性注释。
- 鼓励: 编写好的注释和清晰的变量名对于可维护性至关重要——这能节省以后的时间和麻烦!
软件开发周期总结
一个健壮的系统会经历这些阶段,当原型测试失败或用户反馈改变需求时,通常会循环回到较早的阶段(特别是分析或设计阶段)。