1. 软件维护的定位 (Where Are We Now?)
1.1 核心概念
- 软件维护 (Software Maintenance):
- 定义:软件投入运行后,为了纠正错误、增强功能或适应新环境而进行的活动。
- 生命周期定位:它是软件生命周期的最后一个阶段,也是时间最长的阶段。它不属于开发过程,而是发生在系统投入生产性运行之后。
- 助教补充:不要把“运维”简单理解为“修电脑”或“修Bug”。在现代软件工程中,它包含了售后服务、功能迭代和产品运营。
1.2 软件开发的三阶段七环节
- 计划阶段:问题定义、可行性分析。
- 开发阶段:需求分析、系统设计、开发、测试。
- 运行阶段:运维(我们目前关注的重点)。
1.3 成本与缺陷修复(考试重点)
- 缺陷修复成本曲线:发现错误越晚,修复代价越高。
- 数据对比:如果以编码阶段修复Bug的成本为
1,那么在**产品发布后(运维阶段)**修复同一个Bug的成本可能高达20甚至更多。 - 核心结论:前期质量控制(测试、设计审查)对于降低后期运维成本至关重要。
- 数据对比:如果以编码阶段修复Bug的成本为
2. 软件运维实战 (Software Maintaining Battle)
2.1 现实中的运维挑战
- 部署即开始:系统上线(Deploy)不是结束,而是麻烦的开始。常见问题包括配置错误、数据抓取失败、环境不兼容等。
- 沟通成本:运维人员往往需要处理大量的客户投诉(邮件、电话)、现场支持(飞往客户现场),面临巨大的心理压力。
2.2 运维的商业价值
- 合同构成:软件合同通常包含“技术服务费”或“售后服务费”。
- 模式:通常第一年免费质保,之后按人/天或按年收取维护费。
- 二次开发契机:
- 维护过程中,客户会提出新需求(如:增加国外网站监控、改进算法)。
- 这些新需求会转化为二期项目或新的开发合同,是软件公司持续盈利的来源。
- 用户留存:没有维护 = 用户流失。软件如果没人维护,或者由于Bug多没人用,生命周期就会终结。
3. 运维的分类 (Classification) —— ★核心考点
根据维护的目的不同,IEEE将软件维护分为四类。请务必背熟这四类的定义及其占比。
3.1 四种维护类型
- 改正性维护 (Corrective Maintenance)
- 含义:为了识别和纠正软件错误、改正软件性能上的缺陷。即“修Bug”。
- 占比:约 17%-21%。
- 适应性维护 (Adaptive Maintenance)
- 含义:为了使软件适应变化了的环境(如:操作系统升级、数据库变更、硬件更换)而进行的修改。
- 占比:约 18%-25%。
- 完善性维护 (Perfective Maintenance) —— 占比最高
- 含义:为了满足用户新的需求、扩充原有功能、提高性能而进行的修改。
- 占比:约 50%-66%。
- 助教解读:这是运维的大头,因为用户永远不满足现状,需求是无底洞。
- 预防性/其他维护 (Preventive Maintenance)
- 含义:为了提高软件的可维护性、可靠性等,为将来做准备(如重构代码)。
- 占比:约 4%。
3.2 运维的难点(典型问题)
- 文档缺失:理解别人的代码非常困难,尤其是只有代码没有文档(或文档与代码不一致)时。
- 开发者缺位:原开发人员往往已离职或转岗。
- 耦合风险:缺乏模块化设计,导致“牵一发而动全身”,修改一个小地方引发大Bug(波及效应)。
3.3 运维管理流程
- 组织架构:需要专门的维护机构(L1/L2/L3支持),涵盖用户、维护管理员、系统管理员。
- 核心工具:
- 维护记录/日志:记录谁提出的、什么问题、谁修的、何时修好。
- 维护计划:对于大型修改(如完善性维护),需要像开发新项目一样制定甘特图(Gantt Chart)和关键路径。
4. 可维护性 (Maintainability) —— ★核心原理
4.1 定义
- 软件可维护性:维护人员理解、改正、改动和改进这个软件的难易程度。
4.2 决定可维护性的五大因素(考试重点)
- 可理解性 (Understandability):外来读者(非原作者)看懂代码结构、接口和功能的难易程度。
- 可测试性 (Testability):诊断和测试错误的难易程度。
- 可修改性 (Modifiability):
- 关键原理:高内聚、低耦合。如果模块间耦合度太高,修改难度就会指数级上升。
- 可移植性 (Portability):软件从一个环境迁移到另一个环境的难易程度。
- 可重用性 (Reusability):同一构件在不同环境中重复使用的程度。
4.3 提升可维护性的手段
- 文档 (Documentation):
- 地位:文档是影响可维护性的决定因素。
- 分类:
- 用户文档:操作手册、安装指南(Deploy Guide,PPT中提到的救命稻草)。
- 系统文档:需求分析、设计文档、测试报告。
- 原则:文档必须与代码同步更新。
- 日志 (Logging):
- 系统开发日志、错误记载、系统维护日志。
- Log4j 等工具生成的程序日志是排查问题的核心依据。
- 代码重构 (Refactoring):在不改变外部行为的前提下,优化内部结构。
5. 互联网运营 (Internet Operation)
5.1 概念演变
- 传统软件 vs 互联网产品:
- 传统:研发负责生孩子(开发),运维负责把孩子带大(维护)。
- 互联网:概念延伸到了运营,不仅是技术维护,更包括内容、活动、用户增长。
5.2 运营职能分类
- 内容运营:生产和分发内容。
- 用户运营:用户分析、调研、留存。
- 活动运营:策划活动、执行、复盘。
- 数据运营:数据模型分析、指标监控。
- 渠道推广:市场投放。