1. 软件维护的定位 (Where Are We Now?)

1.1 核心概念

  • 软件维护 (Software Maintenance)
    • 定义:软件投入运行后,为了纠正错误、增强功能或适应新环境而进行的活动。
    • 生命周期定位:它是软件生命周期的最后一个阶段,也是时间最长的阶段。它不属于开发过程,而是发生在系统投入生产性运行之后。
    • 助教补充:不要把“运维”简单理解为“修电脑”或“修Bug”。在现代软件工程中,它包含了售后服务、功能迭代和产品运营。

1.2 软件开发的三阶段七环节

  1. 计划阶段:问题定义、可行性分析。
  2. 开发阶段:需求分析、系统设计、开发、测试。
  3. 运行阶段运维(我们目前关注的重点)。

1.3 成本与缺陷修复(考试重点)

  • 缺陷修复成本曲线发现错误越晚,修复代价越高
    • 数据对比:如果以编码阶段修复Bug的成本为 1,那么在**产品发布后(运维阶段)**修复同一个Bug的成本可能高达 20 甚至更多。
    • 核心结论:前期质量控制(测试、设计审查)对于降低后期运维成本至关重要。

2. 软件运维实战 (Software Maintaining Battle)

2.1 现实中的运维挑战

  • 部署即开始:系统上线(Deploy)不是结束,而是麻烦的开始。常见问题包括配置错误、数据抓取失败、环境不兼容等。
  • 沟通成本:运维人员往往需要处理大量的客户投诉(邮件、电话)、现场支持(飞往客户现场),面临巨大的心理压力。

2.2 运维的商业价值

  • 合同构成:软件合同通常包含“技术服务费”或“售后服务费”。
    • 模式:通常第一年免费质保,之后按人/天或按年收取维护费。
  • 二次开发契机
    • 维护过程中,客户会提出新需求(如:增加国外网站监控、改进算法)。
    • 这些新需求会转化为二期项目或新的开发合同,是软件公司持续盈利的来源。
  • 用户留存没有维护 = 用户流失。软件如果没人维护,或者由于Bug多没人用,生命周期就会终结。

3. 运维的分类 (Classification) —— ★核心考点

根据维护的目的不同,IEEE将软件维护分为四类。请务必背熟这四类的定义及其占比。

3.1 四种维护类型

  1. 改正性维护 (Corrective Maintenance)
    • 含义:为了识别和纠正软件错误、改正软件性能上的缺陷。即“修Bug”。
    • 占比:约 17%-21%
  2. 适应性维护 (Adaptive Maintenance)
    • 含义:为了使软件适应变化了的环境(如:操作系统升级、数据库变更、硬件更换)而进行的修改。
    • 占比:约 18%-25%
  3. 完善性维护 (Perfective Maintenance) —— 占比最高
    • 含义:为了满足用户新的需求、扩充原有功能、提高性能而进行的修改。
    • 占比:约 50%-66%
    • 助教解读:这是运维的大头,因为用户永远不满足现状,需求是无底洞。
  4. 预防性/其他维护 (Preventive Maintenance)
    • 含义:为了提高软件的可维护性、可靠性等,为将来做准备(如重构代码)。
    • 占比:约 4%

3.2 运维的难点(典型问题)

  • 文档缺失:理解别人的代码非常困难,尤其是只有代码没有文档(或文档与代码不一致)时。
  • 开发者缺位:原开发人员往往已离职或转岗。
  • 耦合风险:缺乏模块化设计,导致“牵一发而动全身”,修改一个小地方引发大Bug(波及效应)。

3.3 运维管理流程

  • 组织架构:需要专门的维护机构(L1/L2/L3支持),涵盖用户、维护管理员、系统管理员。
  • 核心工具
    • 维护记录/日志:记录谁提出的、什么问题、谁修的、何时修好。
    • 维护计划:对于大型修改(如完善性维护),需要像开发新项目一样制定甘特图(Gantt Chart)和关键路径。

4. 可维护性 (Maintainability) —— ★核心原理

4.1 定义

  • 软件可维护性:维护人员理解、改正、改动和改进这个软件的难易程度。

4.2 决定可维护性的五大因素(考试重点)

  1. 可理解性 (Understandability):外来读者(非原作者)看懂代码结构、接口和功能的难易程度。
  2. 可测试性 (Testability):诊断和测试错误的难易程度。
  3. 可修改性 (Modifiability)
    • 关键原理高内聚、低耦合。如果模块间耦合度太高,修改难度就会指数级上升。
  4. 可移植性 (Portability):软件从一个环境迁移到另一个环境的难易程度。
  5. 可重用性 (Reusability):同一构件在不同环境中重复使用的程度。

4.3 提升可维护性的手段

  • 文档 (Documentation)
    • 地位:文档是影响可维护性的决定因素
    • 分类
      • 用户文档:操作手册、安装指南(Deploy Guide,PPT中提到的救命稻草)。
      • 系统文档:需求分析、设计文档、测试报告。
    • 原则:文档必须与代码同步更新
  • 日志 (Logging)
    • 系统开发日志、错误记载、系统维护日志。
    • Log4j 等工具生成的程序日志是排查问题的核心依据。
  • 代码重构 (Refactoring):在不改变外部行为的前提下,优化内部结构。

5. 互联网运营 (Internet Operation)

5.1 概念演变

  • 传统软件 vs 互联网产品
    • 传统:研发负责生孩子(开发),运维负责把孩子带大(维护)。
    • 互联网:概念延伸到了运营,不仅是技术维护,更包括内容、活动、用户增长。

5.2 运营职能分类

  • 内容运营:生产和分发内容。
  • 用户运营:用户分析、调研、留存。
  • 活动运营:策划活动、执行、复盘。
  • 数据运营:数据模型分析、指标监控。
  • 渠道推广:市场投放。