软件工程入门笔记

本文详细介绍了软件开发的生命周期模型,包括瀑布模型、原型模型、增量模型和迭代模型,以及敏捷开发的思想。敏捷开发强调个体和互动、可工作的软件、客户合作和响应变化。在实践中,需求分析、架构设计、开发编码、测试和运行维护都是关键环节。文章还提到了持续集成、持续交付和持续部署的重要性,以及源码管理工具在开发流程中的作用。
摘要由CSDN通过智能技术生成


学习笔记摘录于:宝玉.《软件工程之美》

软件工程 = 过程 + 方法 + 工具
**
软件开发过程(软件项目周期)可以分为需求定义与分析、设计、实现、测试、交付和维护。
基于此衍生出最基础的过程模型——瀑布模型。但是由于周期较长等缺点,又在瀑布模型基础上提出了V模型原型设计增量模型螺旋模型等,已改善前者的一些缺陷。到90年代,各种轻量级开发方法不断被提出,又形成了敏捷开发
**
好的实践流程化,好的流程工具化。

0. 软件生命周期模型

瀑布模型

阶段内容产出
问题的定义和规划需求方和开发方明确开发目标。研究可行性。需求文档,可行性研究报告
需求分析对需求进行分析和反复沟通确认。需求分析文档
软件设计对软件系统进行抽象和设计,如系统框架、数据库等。架构设计文档
程序编码将架构设计和界面设计的结果转换成代码。代码文件
软件测试依据需求分析文档对程序进行严密测试。测试报告
运行维护修复错误,增加功能等。使用说明文档

优点:简单易行;分工协作;质量相对有保证。
缺点:难以响应需求变更;工作量分布不均。

(快速)原型模型

原型模型用于解决客户需求不明确和需求多变的问题。主要方法是快速造一个可以运行的软件原型*,再反复修改确认,直至符合用户需求。如果客户对质量要求较高,则原型只应用于需求分析阶段,后续重新开发(抛弃策略);或者将原型应用于整个开发过程,完善原型(附加策略)。
*:原型制作不一定需要设计编码,有时通过原型工具也可以完成。

原型模型能快速响应需求变更,但往往是以牺牲质量为代价。

增量模型

增量模型适用于能模块化、可以按批次交付的软件系统。主要方法是把待开发软件系统模块化,然后对每个模块应用瀑布模型。将软件产品分批次交付。

增量模型可以多模块并行开发。但是要求系统可模块化,以及人员有较高的系统架构水平。

迭代模型

迭代模型每次只设计和实现产品的一部分(一次迭代),然后逐步完成更多的功能。与增量模型的区别在于前者是按模块划分,而迭代模型则是按时间划分。

迭代模型同样依据分治原理缩短每次的交付周期。难点在于对每次迭代内容的把握。

敏捷开发思想

敏捷软件开发宣言(2001)

个体和互动 高于 流程和工具
工作的软件 高于 详尽的文档
客户合作 高于 合同谈判
响应变化 高于 遵循变化

敏捷 VS. 瀑布

阶段敏捷瀑布
需求分析用户故事严谨的需求分析和详尽的需求文档
架构设计渐进式一步到位
项目质量保证自动化测试为主有专门的阶段测试
发布部署持续集成测试环境->验收通过->生产环境

敏捷实践

  • Ticket

  • 基于Git 和 CI 的开发流程
    针对代码不稳定和部署繁琐问题,基于Git的开发流程结合CI的自动测试、部署提供了良好的解决方案。
    (1)从当前master克隆一个branch用于开发。开发完成后提交一个PR(Pull Request)。PR提交后,其他人就可以对代码进行评阅,确认没问题后通过代码审查。提交PR到源码服务器,CI会创建一个干净的运行环境,先把提交的代码下载下来,然后安装依赖项,接着运行自动化测试代码,并将测试结果反馈。当代码审查和自动化测试通过后,就可以合并到master了。
    (2)自动部署:当代码合并到master时,再次运行自动化测试代码,测试通过后直接运行自动部署脚本(构建镜像等),把master代码部署到开发或测试环境上。

  • 部署线上流程

  • 每日站会

  • 极限编程(eXtreme Programming, XP)
    目前敏捷开发主流的工程实践方法。极限的意思是如果某个实践好,就将其做到极致。基于极限理念,产生了很多优秀的实践方法,如持续集成、自动化测试、重构等。

1. 需求分析

需求分析:对用户需求进行提炼分析,形成产品需求的过程。

  • 挖掘真实需求
  • 提出解决方案
  • 筛选和验证方案

2. 架构设计

良好的架构设计可以降低因需求变动、人员组织、技术组织、软件稳定运行等带来的技术复杂度。

1)基本步骤

分析需求
选择相似且成熟的方案
层层细化
验证和优化

2)技术选型

问题定义
调研
验证
决策

3. 开发编码

1)持续集成、持续交付和持续部署

发展

  • 集成 -> 持续集成

集成:每个人把自己开发的分支代码合并到主干上。

  • 手动部署 -> 脚本自动化部署

部署:把代码发布到各种环境。
交付:测试验收通过后,具备发布到生产环境交付给客户使用的条件。

  • 脚本部署 -> 持续交付
  • 持续交付 -> 持续部署

如何搭建持续交付环境?

2)源码管理工具

简介

源码管理工具(版本控制系统)是保存文件多个版本的方法,可以用来稳定代码质量和高效协作。
版本控制系统包括本地版本管理(SCCS, RCS)、集中式版本管理(CVS, SVN)和分布式版本管理(Git)。其中Git是目前主流,基于Git的工具由可以分为自建(Git, Gitlab等)和托管平台(Github, Gitlab, Gitee, Coding等)。

基于源码管理的开发流程

  • Github flow
1.创建一个分支
2.提交更新
3.创建一个PR
4.代码审查
5.部署测试
6.合并

3)自动化测试

什么是自动化测试?

测试过程一般是:首先根据需求写出测试用例,设计好输入和期望输出,然后根据用例逐个操作,观察输出是否与期望一致。自动化测试就是将上述过程使用脚本自动完成。
自动化测试是敏捷开发能快速迭代很重要的质量保障,是持续交付的基本前提。
自动化测试分为三类。其中小型/单元测试是为了验证一个代码单元(如函数,类)的功能,不依赖网络、数据库、文件系统等外部服务。中型/集成测试验证多个模块之间的交互,几乎不依赖其它服务器资源。大型/系统/端到端测试验证系统功能,直接访问外部服务。

如何在项目中应用?

  • 1/3. 选择自动化测试框架
  • 2/3. 自动化测试代码:①基本结构可以是准备、执行、断言和清理(见下)。②一个完整的自动化测试要包括功能是否正确、边界条件、异常和错误处理三部分内容。
describe('User Service Unit Tests',() => {
  describe('Create new user', () => {
    it('should create the new use with valid username ans password', () => {
      //1.准备
      const fakeUserDA = new FakeUserDA();
      const userService = new UserService(fakeUserDA);
      //2.执行
      const newUser = userService.create({
        username: 'test',
        password: 'password',
      });
      //3.断言
      except(newUser.status).to.equal('approval');
      except(newUser.username).to.equal('test');
      //4.清理
      userService.remove(newUser);
    });
  });
});
  • 3/3. 在持续集成环境运行:提交代码前在本地跑一遍单元测试;成功后就可以提交到源码管理中心,提交后CI会自动运行完整的自动化测试(小、中型);通过所有测试后就可以合并到主分支。

4. 测试

软件测试的主要工作是发现、报告和跟踪bug。下部分介绍了相关工具。

软件测试工具

  • Bug跟踪:任务跟踪系统(TAPD、禅道等)、Bugzilla
  • 自动化测试:
  • 压力测试:
  • 安全性测试:

5. 运行维护

版本发布

版本命名方式一般为主版本号.子版本号.[修正版本号[构建版本号]]。其中主版本号和子版本号用于标识功能变化,修正版本号用于表示功能不变情况下bug修复。

线上监控和报警

故障处理

  • 评估影响范围
  • 试图重现问题
  • 临时方案和终极方案
  • 风险评估和持续优化

附录

项目决策金三角:质量,范围,时间,成本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值