当前位置: 首页 > news >正文

重点解析(软件工程)

一. 概述

什么是软件、软件危机、软件工程

软件是可执行的指令(程序)、操作信息的数据以及描述程序操作和使用的文档的集合。

软件危机指软件开发速度跟不上需求增长,导致设计拙劣、维护困难,可能造成经济损失或灾难。

软件工程是1968年NATO会议提出的概念,旨在解决软件危机。

软工的目标

软件工程通过系统化、规范、可量化的方法指导软件开发、运行和维护,以解决软件危机,确保软件质量。

软工的三层结构:过程、工具和方法

层次

定义

主要内容

作用

过程(Process)

支持软件生命周期(SLC)的所有活动,为开发、运行、维护提供框架。

- 阶段:问题定义、可行性分析、需求分析、设计、编码、测试、验收、维护、废弃

- 主要活动:沟通、策划、建模、构建、部署

- 保护伞活动:项目跟踪、测量、技术评审、质量保证、风险管理、配置管理、可复用管理

定义活动顺序、任务分配和里程碑,确保项目有序推进。

方法(Methods)

提供“如何做”的技术指导,具体解决每个阶段的技术问题。

- 经典方法:结构化分析、设计、实现

- 面向对象方法:基于对象建模,映射问题域

- 面向方面方法:处理系统性关注点

- 基于构件方法:组装已有构件

- 基于知识的软件工程:运用AI和知识工程

提供技术路线和最佳实践,确保实现符合需求和质量标准。

工具(Tools)

提供自动化或半自动化支持,提升开发效率和质量。

- CASE工具:支持开发、维护、管理

- 重点工具:UML(统一建模语言)

- 其他工具:IDE、测试工具、配置管理工具等

简化重复性工作,规范开发流程,减少人为错误。

常用的过程模型:瀑布、增量、螺旋、快速原型等

模型

定义

特点

优点

缺点

适用场景

瀑布模型

按阶段顺序开发,线性推进。

阶段明确,需文档和评审。

管理简单,适合需求稳定。

需求不清晰易出错,成果交付晚。

需求明确的小型项目。

增量模型

分步交付功能,逐步完善。

每次增量加功能,可并行开发。

早期交付,灵活,客户可反馈。

集成复杂,需求变更成本高。

需快速交付的中大型项目。

螺旋模型

迭代开发,结合风险评估。

每轮迭代有原型,强调风险管理。

适合高风险,减少失败概率。

成本高,管理复杂。

高风险的大型项目。

快速原型

快速建原型验证需求后开发。

抛弃型或演化型原型,与客户交互。

验证需求,减少误解。

原型成本高,可能设计不佳。

需求模糊的项目。

统一过程(RUP)

用例驱动,迭代增量开发。

架构为中心,强调质量和最佳实践。

灵活,适合复杂项目。

实施复杂,需经验团队。

需高质量架构的大型项目。

二. 项目计划 & 七. 项目管理

度量和估算

概述

  • 度量:用数字量化软件开发过程、产品或资源的特性,为管理和改进提供基础(Lord Kelvin:用数字表达了解程度)。

  • 估算:预测开发所需资源(如时间、人力、成本),基于经验、历史数据和模型,需接受不确定性。

度量与估算核心内容(表格)

类别

定义与内容

方法与公式

作用与特点

面向规模的度量

基于代码行(Loc/Kloc)衡量软件规模及相关指标。

- 指标:每千行代码错误数、成本、文档页数;每人月错误数、代码行、文档成本。

- 简单直观,易于统计。

- 受语言差异影响,难以比较不同项目。

面向功能的度量

基于功能点(FP)衡量软件功能复杂度。

- 公式:FP = CT × (0.65 + 0.01 × ΣFi)

- CT:用户输入、输出、查询、文件、外部接口数

- Fi:14项调整因子(如备份、数据通信)

- 聚焦功能,独立于语言。

- 需经验判断调整因子,计算复杂。

软件质量度量

评估软件质量属性(如功能性、可靠性)。

- 模型:McCall(层级质量属性)、Boehm(高层/中层/原始属性)、ISO/IEC 9126(已由ISO/IEC 25010:2011取代)。

- 提供质量评估标准。

- 需结合具体项目需求选择模型。

估算方法

预测资源需求的多种技术,结合经验和数据。

-

基于类似项目

:参考历史项目。

-

分解技术

:按活动/功能/模块划分,定义最好/最坏情况。

-

经验模型

:如CoCoMO、Putnam。

-

其他

:德尔菲法、敏捷估算。

- 提高资源分配准确性。

- 需经验、历史数据和勇气,接受不确定性。

分解技术

将项目分解为小单元估算(如过程活动、功能模块)。

- 定义最好/最坏情况。

- 三点估算:EV = (Sopt + 4Sm + Spess) / 6(乐观值、可能值、悲观值)。

- 细化估算,降低误差。

- 需清晰分解结构。

经验模型

使用数学模型估算工作量和时间。

-

形式

:E = A + B × (ev)^C(E:工作量,ev:估算变量)。

-

Putnam方程

:E = (Loc^3 × B) / (P^3 × t^4)(B:技术因子,P:生产率,t:持续时间)。

-

CoCoMO

:E = aKLOC^b,D = cE^d(基本/中级/高级模型)。

- 提供定量预测。

- 依赖参数准确性,需校准。

资源金字塔

估算开发所需资源,层次分明。

- 底层:硬件/软件工具(基础支持)。

- 中层:可复用软件资源(降低成本、提早交付)。

- 顶层:人员(主要资源)。

- 明确资源优先级。

- 强调人员关键性,复用资源可显著优化。

配置管理

📌 一、定义与作用
  1. 配置管理:对软件开发过程中的所有可交付成果进行标识、控制、审计和记录的活动。

  2. 作用:确保变更可控、版本可追溯、文档一致性,提高质量与效率。

📌 二、四大活动(考试高频)
  1. 配置项标识:确定需要管理的对象并赋予唯一编号。

  2. 变更控制:所有变更必须经过审批(如CR审批)。

  3. 配置状态记录:记录每个配置项的状态和版本演变。

  4. 配置审计:验证配置项的完整性和一致性。

📌 三、重要术语
  1. 配置项(SCI):需要管理的项目,如源代码、设计文档、测试用例等。

  2. 基线(Baseline):经批准冻结的配置项快照,只能通过变更控制修改。

  3. 版本(Version):某一配置项的一个具体实例。

  4. 修订(Revision):对同一项的局部小修改。

  5. 变更请求(CR):正式申请变更的文档或记录。

📌 四、配置管理工具
  1. Git:分布式管理,主流代码版本控制工具。

  2. SVN:集中式管理,适合文档或传统项目。

  3. GitHub/GitLab:托管平台,支持协作和持续集成。

📌 五、基线类型
  1. 需求基线:冻结需求版本。

  2. 设计基线:冻结设计方案。

  3. 代码基线:冻结开发阶段的代码版本。

  4. 测试基线:冻结测试方案和测试结果。

📌 六、配置管理的价值
  1. 避免版本混乱,支持并行开发。

  2. 保证交付内容的一致性、完整性、可追踪性

  3. 是质量保证、项目管理不可或缺的一部分。

软件质量保证

软件质量是软件满足明确和隐含需求的程度。

软件质量保证是保证软件过程和产品质量的系统活动。

SQA贯穿软件生命周期的所有阶段。

SQA的目标是预防缺陷,而不是仅仅发现缺陷。

SQA确保开发过程遵循标准和规范

质量计划包含质量目标、标准和审核流程。

过程审计监督软件开发是否按计划执行。

技术审查评审需求、设计、代码等成果。

测试管理组织各类测试并跟踪缺陷。

缺陷管理确保缺陷被及时记录、修复和验证。

质量度量用数据支持质量管理和决策。

McCall质量模型包含功能性、可靠性、效率、可维护性等。

Boehm模型分高层、中层和底层质量属性。

ISO/IEC 9126定义功能性、可靠性、易用性等六大质量特性。

ISO/IEC 25010是9126的更新版本。

FURPS+模型包括功能、易用性、可靠性、性能和支持性。

质量保证活动贯穿需求、设计、编码、测试和交付阶段。

需求阶段重点评审需求完整性和一致性。

设计阶段重点评审设计和接口合理性。

编码阶段进行代码检查和规范审查。

测试阶段进行测试计划制定和执行。

交付阶段审查文档和用户手册。

质量保证关注过程,质量控制关注产品结果

审核检查是否遵守流程,评审评价项目成果。

验证确认产品是否符合设计要求。

确认验证产品是否满足用户需求。

认证

认证是第三方确认产品或服务符合规定标准和规范的过程。

软件认证分为产品质量认证质量体系认证两大类。

产品质量认证:确认软件产品符合特定技术和质量标准。

质量体系认证:确认软件开发企业的质量管理体系符合标准要求。

常见的国际标准认证有ISO 9001(质量管理体系认证)。

软件能力成熟度模型(CMM/CMMI)常用于评估软件过程能力和成熟度。

认证能够提高软件的市场竞争力和用户信任度。

认证过程通常包括审核、评审、测试和现场检查

获得认证的产品或组织会得到证书或标志作为合格证明。

认证是软件质量保证的重要组成部分,促进标准化和规范化。

认证可以帮助发现和改进软件开发过程中的缺陷和不足。

认证过程应保持客观、公正和透明

敏捷

敏捷开发强调快速响应变化,而非严格遵循计划。

敏捷开发的核心是人和交互高于流程和工具

敏捷开发重视工作的软件高于详尽文档

强调客户合作胜过合同谈判

敏捷宣言提出响应变化胜过遵循计划

敏捷方法不是固定流程,而是一种灵活的开发态度和原则

敏捷适合需求不稳定、快速变化的项目环境。

常见敏捷方法有**极限编程(XP)、Scrum、看板(Kanban)、透明水晶(Crystal)**等。

敏捷团队强调自组织和跨职能协作

敏捷开发通过迭代和增量交付软件产品。

每次迭代结束要交付可工作的软件

持续集成和持续测试是敏捷的重要实践。

敏捷团队通过每日站会快速沟通和调整。

敏捷鼓励持续反馈和持续改进

敏捷开发强调团队成员间的开放沟通和信任

三. 需求分析

什么是需求

需求是用户对软件系统功能、性能和约束的描述。

需求体现了用户期望系统实现的目标和行为

需求是软件开发的基础,决定系统的设计和实现。

需求分为功能需求非功能需求

功能需求描述系统应具备的具体功能和服务。

非功能需求包括性能、安全性、可靠性、可维护性等质量属性。

需求应是完整、准确、一致、可验证和可追踪的。

需求来源包括用户、市场调研、法律法规、业务流程等。

需求分析的目标是明确、细化和规范需求。

不良需求会导致项目失败或返工,需求管理非常重要。

需求工程分了哪几个阶段

  1. 需求获取(Elicitation)

    • 收集用户、客户和相关方的需求信息。

    • 通过访谈、问卷、观察、头脑风暴等方法。

  2. 需求分析(Analysis)

    • 对获取的需求进行分类、整理、澄清和矛盾分析。

    • 明确需求的优先级和范围。

  3. 需求规格说明(Specification)

    • 将需求以书面形式规范化描述,形成需求规格说明书(SRS)。

    • 要求需求清晰、完整、一致且可验证。

  4. 需求验证(Validation)

    • 确认需求文档满足用户真实需求。

    • 通过评审、走查、原型演示等方式。

  5. 需求管理(Management)

    • 控制需求变更,维护需求的版本和追踪。

    • 保障需求的可追踪性和一致性。

如何获取需求

  1. 访谈(Interview)

    • 与用户、客户或利益相关者面对面交流,了解需求。

    • 结构化、半结构化或非结构化访谈。

  2. 问卷调查(Questionnaire/Survey)

    • 设计有针对性的问题,收集大量用户反馈。

    • 适合用户分布广泛或人数多的场景。

  3. 观察(Observation)

    • 直接观察用户的工作流程和操作行为,发现隐含需求。

    • 可以是现场观察或录像分析。

  4. 头脑风暴(Brainstorming)

    • 团队成员集体讨论,激发创意,收集多种需求想法。

  5. 文档分析(Document Analysis)

    • 审查现有系统文档、业务流程、法规标准等资料。

  6. 原型法(Prototyping)

    • 制作简单模型或样品,帮助用户更直观表达需求。

  7. 用例法(Use Case)

    • 通过描述系统如何与用户交互,明确功能需求。

  8. 需求研讨会(Workshops)

    • 组织多方代表集中讨论、协商,达成共识。

  9. 竞争对手分析

    • 研究类似产品,发现潜在需求和改进点。

结构化需求分析常用的模型:数据流图、实体关系图

  1. 数据流图(DFD, Data Flow Diagram)

    • 描述系统的数据流动、处理过程和数据存储。

    • 用来分析系统功能和信息流。

    • 包含外部实体、过程、数据流和数据存储四要素。

  2. 实体关系图(ERD, Entity-Relationship Diagram)

    • 描述系统中的实体、属性和实体间的关系。

    • 用于数据建模和数据库设计。

  3. 状态转换图(State Transition Diagram)

    • 描述系统或对象状态的变化及触发事件。

    • 用于分析系统动态行为。

  4. 过程说明书(Process Specification)

    • 对数据流图中的处理过程进行详细说明。

  5. 结构化英语(Structured English)

    • 用类似程序语言的形式描述处理逻辑。

  6. 决策表(Decision Table)

    • 用表格形式表示复杂的逻辑判断和对应操作。

  7. 决策树(Decision Tree)

    • 用树状图形表示决策路径和结果。

需求分析文档的编制

  1. 定义:需求分析文档(SRS,Software Requirement Specification)是对系统需求的详细书面描述。

  2. 目的:明确系统功能和性能需求,为后续设计和开发提供依据。

  3. 结构一般包括

    • 引言(目的、范围、定义、参考资料)

    • 总体描述(产品视角、功能概述、用户特征、约束条件)

    • 具体需求(功能需求、性能需求、安全需求等)

    • 其他需求(接口需求、硬件需求、软件质量属性)

  4. 编写步骤

    • 收集和整理需求信息

    • 需求分类和分析

    • 规范化需求描述,避免歧义

    • 审核和确认需求

  5. 编写原则

    • 语言简洁明了,避免模糊表达

    • 需求应完整、一致、可验证

    • 使用图表(如用例图、数据流图)辅助说明

  6. 常用工具:Word、Excel、UML建模工具等。

  7. 审核与版本控制:确保文档准确无误,并做好版本管理,方便追踪修改。

  8. 文档维护:需求变更时及时更新文档,保持与实际开发同步。

四. 设计

一些设计概念:抽象、求精、模块化、信息隐藏、内聚和耦合等

  1. 抽象(Abstraction)

    • 抓住事物的本质特征,忽略非本质细节。

    • 通过抽象,简化复杂系统,便于理解和设计。

  2. 求精(Refinement)

    • 逐步细化设计,层层展开细节。

    • 从高层抽象逐步向具体实现过渡。

  3. 模块化(Modularity)

    • 将系统划分为独立且功能明确的模块。

    • 便于开发、测试和维护。

  4. 信息隐藏(Information Hiding)

    • 隐藏模块内部实现细节,仅通过接口与外界交互。

    • 降低模块间依赖,提升系统稳定性。

  5. 内聚(Cohesion)

    • 模块内部元素之间的关联程度。

    • 高内聚表示模块职责单一且紧密,设计优良。

  6. 耦合(Coupling)

    • 模块之间的依赖关系。

    • 低耦合意味着模块间依赖少,系统更灵活易维护。

架构设计风格

  1. 分层架构(Layered Architecture)

    • 系统划分为多个层,每层只与相邻层交互。

    • 常见层有表示层、业务逻辑层和数据访问层。

    • 优点:高内聚、低耦合,便于维护和扩展。

  2. 客户端-服务器架构(Client-Server)

    • 客户端请求服务,服务器响应请求。

    • 支持多客户端共享服务器资源。

  3. 事件驱动架构(Event-Driven Architecture)

    • 通过事件触发和响应,解耦组件之间的关系。

    • 适合异步通信和实时系统。

  4. 微内核架构(Microkernel Architecture)

    • 核心系统功能最小化,通过插件扩展额外功能。

    • 常用于操作系统和可扩展产品。

  5. 微服务架构(Microservices Architecture)

    • 将系统拆分为多个小型、独立的服务,每个服务完成特定功能。

    • 支持独立部署和扩展。

  6. 管道-过滤器架构(Pipe and Filter)

    • 系统由一系列处理过滤器组成,数据通过管道流动。

    • 适合数据流处理系统。

  7. 共享数据架构(Shared Data Architecture)

    • 组件通过共享数据库或数据存储进行交互。

  8. 服务导向架构(SOA,Service-Oriented Architecture)

    • 系统由多个服务组成,服务通过标准协议通信。

    • 强调服务的松耦合和重用。

详细设计的内容:用户界面设计、接口设计、数据设计、过程与算法设计等

  1. 用户界面设计(User Interface Design)

    • 设计软件系统的人机交互界面。

    • 包括界面布局、导航方式、交互元素(按钮、菜单等)、视觉风格和用户体验。

    • 目标是提升用户的操作效率和满意度。

  2. 接口设计(Interface Design)

    • 设计模块之间、系统与外部系统之间的交互方式。

    • 包括接口的调用规范、数据格式、传输协议等。

    • 确保模块间通信准确、高效、可靠。

  3. 数据设计(Data Design)

    • 设计系统的数据结构和数据库方案。

    • 包括数据模型、数据存储方式、数据访问接口。

    • 重点保证数据的一致性、完整性和安全性。

  4. 过程与算法设计(Process and Algorithm Design)

    • 设计实现功能的具体过程和算法逻辑。

    • 关注算法的正确性、效率和可维护性。

    • 通过流程图、伪代码等形式描述。

设计原则

  1. 单一职责原则(SRP)

    • 一个类只负责一项职责。

    • 有助于降低复杂度和提高可维护性。

  2. 开闭原则(OCP)

    • 软件实体应对扩展开放,对修改关闭。

    • 通过抽象和继承实现扩展而不修改原代码。

  3. 里氏替换原则(LSP)

    • 子类对象必须能替换父类对象,且功能正确。

    • 保证继承体系的正确性。

  4. 依赖倒置原则(DIP)

    • 高层模块不依赖低层模块,两者都依赖抽象。

    • 抽象不依赖细节,细节依赖抽象。

  5. 接口隔离原则(ISP)

    • 客户端不应依赖它不需要的接口。

    • 拆分大接口为多个专门接口。

  6. 迪米特法则(LoD,最少知识原则)

    • 一个对象应尽量少了解其他对象的内部细节。

设计模式

  1. 创建型模式(Creational Patterns)

    • 关注对象创建的机制,常见有:

    • 单例模式(Singleton):保证一个类只有一个实例。

    • 工厂模式(Factory):通过工厂类创建对象,解耦实例化过程。

    • 抽象工厂(Abstract Factory):创建相关或依赖对象的家族。

    • 建造者模式(Builder):分步骤创建复杂对象。

    • 原型模式(Prototype):通过复制已有对象创建新对象。

  2. 结构型模式(Structural Patterns)

    • 关注类和对象的组合,常见有:

    • 适配器模式(Adapter):转换接口,使不兼容接口协同工作。

    • 装饰器模式(Decorator):动态增加对象功能。

    • 代理模式(Proxy):为对象提供代理控制访问。

    • 外观模式(Facade):为子系统提供统一接口。

    • 组合模式(Composite):将对象组合成树形结构。

    • 桥接模式(Bridge):分离抽象和实现。

  3. 行为型模式(Behavioral Patterns)

    • 关注对象间的通信,常见有:

    • 观察者模式(Observer):对象间一对多依赖。

    • 策略模式(Strategy):定义一系列算法,互换使用。

    • 责任链模式(Chain of Responsibility):请求沿链传递。

    • 命令模式(Command):将请求封装成对象。

    • 状态模式(State):对象行为随状态变化而改变。

    • 迭代器模式(Iterator):顺序访问集合元素。

五. OOAD & UML

用例图

类图

交互图(顺序图和通信图

状态机图(也包括活动图

六. 实现

编码风格

  1. 命名规范

    • 变量、函数、类名应具有描述性,易于理解。

    • 遵循驼峰命名法(camelCase)或下划线命名法(snake_case),保持一致。

  2. 缩进和排版

    • 统一使用空格或制表符缩进,一般推荐4个空格。

    • 合理分段,代码块清晰,增强可读性。

  3. 注释规范

    • 重要逻辑、复杂算法、接口说明必须注释。

    • 注释应简洁明了,避免多余和重复。

  4. 代码简洁

    • 避免冗余代码,保持代码简洁、清晰。

    • 避免深层嵌套,提升代码可维护性。

  5. 一致性

    • 代码风格在整个项目中保持一致。

    • 团队应制定并遵守统一的编码规范。

  6. 错误处理

    • 合理处理异常和错误,避免程序崩溃。

    • 使用统一的错误处理机制。

  7. 避免魔法数字和硬编码

    • 使用常量定义代替魔法数字,增强代码可读性。

  8. 代码复用

    • 避免重复代码,提取公共函数或模块。

测试的目标

  1. 发现缺陷

    • 通过测试找出软件中的错误和缺陷。

  2. 验证和确认需求

    • 确保软件满足用户需求和规格说明。

  3. 提高软件质量

    • 发现问题及时修正,提升软件的稳定性和可靠性。

  4. 评估软件性能

    • 评估系统的响应时间、吞吐量和资源利用等性能指标。

  5. 保证软件符合设计

    • 确保实现与设计一致。

  6. 减少维护成本

    • 通过及早发现缺陷,降低后期维护难度和成本。

测试的原则

  1. 测试表明存在缺陷

    • 测试只能发现缺陷,不能证明软件无缺陷。

  2. 穷尽所有测试是不可能的

    • 不能测试所有输入组合,只能有针对性地选择测试用例。

  3. 早期测试

    • 尽早开始测试活动,尽早发现缺陷。

  4. 缺陷聚集原则

    • 少数模块含有多数缺陷,测试应重点关注高风险区域。

  5. 杀虫剂悖论

    • 重复相同的测试会失去效果,测试用例需要不断更新。

  6. 测试应独立于开发

    • 测试人员应保持一定独立性,确保测试客观性。

  7. 缺陷的严重性不同

    • 测试应优先发现和解决严重缺陷。

  8. 测试环境应尽量接近真实环境

    • 模拟真实运行环境以提高测试效果。

测试的过程

  1. 测试计划(Test Planning)

    • 明确测试目标、范围、资源、时间安排和测试方法。

    • 制定测试策略和风险评估。

  2. 测试设计(Test Design)

    • 分析需求规格,设计测试用例和测试数据。

    • 确定测试环境和测试工具。

  3. 测试准备(Test Preparation)

    • 搭建测试环境,准备测试数据和测试脚本。

    • 确认测试资源到位。

  4. 测试执行(Test Execution)

    • 按测试用例执行测试,记录测试结果。

    • 发现缺陷及时反馈给开发人员。

  5. 缺陷跟踪(Defect Tracking)

    • 记录缺陷信息,跟踪缺陷的修复状态。

    • 验证缺陷修复情况。

  6. 测试评估与报告(Test Evaluation and Reporting)

    • 分析测试结果,评估软件质量和测试覆盖率。

    • 编写测试报告,向相关人员汇报。

  7. 测试总结与改进(Test Summary and Improvement)

    • 总结测试经验和教训,提出改进建议。

    • 更新测试文档和测试用例库。

常用的测试方法:等价类划分、边界值分析、独立路径等

  1. 等价类划分(Equivalence Partitioning)

    • 把所有可能的输入划分成若干等价类。

    • 认为每个等价类中的输入测试效果相同,选择其中一个代表进行测试。

    • 目的是减少测试用例数量,提高测试效率。

  2. 边界值分析(Boundary Value Analysis)

    • 重点测试输入域的边界值及其邻近值。

    • 因为错误多出现在边界处。

    • 包括上边界、下边界及其内外侧的测试值。

  3. 独立路径测试(Independent Path Testing)

    • 基于程序控制流图,设计测试用例覆盖所有独立路径。

    • 独立路径是指包含至少一条未被其他路径覆盖的边。

    • 确保代码中所有可能的执行路径都被测试。

维护的分类

  1. 纠正性维护(Corrective Maintenance)

    • 修复软件缺陷和错误,保证软件正常运行。

  2. 适应性维护(Adaptive Maintenance)

    • 使软件适应环境变化,如操作系统升级、硬件更换等。

  3. 完善性维护(Perfective Maintenance)

    • 根据用户需求改进软件性能或功能,提高软件质量。

  4. 预防性维护(Preventive Maintenance)

    • 通过改进软件结构和代码,减少未来潜在缺陷的发生。

再工程和逆向工程

逆向工程(Reverse Engineering)

  1. 定义

    • 从现有软件系统中提取设计和规格信息的过程。

    • 目的是理解系统结构和功能,便于维护和改进。

  2. 特点

    • 不改变现有系统,只进行分析和理解。

    • 用于文档缺失或旧系统维护。

  3. 应用

    • 系统理解、缺陷修复、迁移和重构。


再工程(Re-engineering)

  1. 定义

    • 在逆向工程基础上,进行改进和重构,使系统更易维护和扩展。

    • 包括代码重构、文档重建、系统重组等活动。

  2. 过程

    • 逆向工程 → 重新设计 → 正向工程(重新实现)。

  3. 目标

    • 提高系统质量、降低维护成本、延长系统寿命。

http://www.lryc.cn/news/574628.html

相关文章:

  • 云电脑,“死”于AI时代前夕 | 数智化观察
  • 基于DE1-SoC的My_First_oneAPI(二)
  • 黑马Day01-03集开始
  • 第24篇:Linux内核深度解析与OpenEuler 24.03实践指南
  • TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制
  • 交易期权先从买方开始
  • C8BJWD8BJV美光固态闪存HSA22HSA29
  • android脱糖
  • Kubernetes生命周期管理:深入理解 Pod 生命周期
  • python有哪些常用的GUI(图形用户界面)库及选择指南
  • Unity Text-Mesh Pro无法显示中文的问题
  • Android检测当前进程或者应用是否被调试
  • 安卓android com.google.android.material.tabs.TabLayout 设置下拉图标无法正常显示
  • 国产化条码类库Spire.Barcode教程:如何使用 C# 读取 PDF 中的条码(两种方法轻松实现)
  • 【数字后端】- 什么是NDR规则?
  • vscode打开.c文件后中文乱码
  • ros(一)使用消息传递图像+launch启动文件
  • 通过Prompt提示构建思维链
  • git操作练习(3)
  • WHAT - React Native 的 Expo Router
  • 华为云Flexus+DeepSeek征文|华为云ModelArts Studio:利用New API实现大模型网关与AI资产管理的无缝对接
  • 梳理React中的fiber架构
  • 学历信息查询API (IVYZ9A2B) 的对接实战 | 天远API
  • WPF/Net Core 简单显示PDF
  • WEB安全--Java安全--jsp webshell免杀1
  • 原子操作(CAS)
  • 【AI大模型】Spring AI 基于Redis实现对话持久存储详解
  • 打包上传到Linux部署并启动
  • 鸿蒙 FolderStack 组件全解析:折叠屏悬停布局开发指南
  • kvm console 的使用