软件构造第二章总结

前言:经过一周的学习,第二章已经结束了,第一章介绍了软件构造过程中的目标有哪些,这章简单地介绍软件开发的基本过程,有哪些开发模型、开发技术、开发工具。这里记录一些重要的点以及思考来作为学习笔记。

一、软件开发生命周期

1.From 0 to 1

软件开发首先需要开发一个最初版本来,之后才能进行维护、更新等等,这个生命周期可以大致划分如下:
①进行规划:分析市场现状,市场需要的软件功能是什么,开发软件需要多少资源等等
②需求分析:要对软件各类受众的需求进行分析,此处的受众并不单指软件用户,而是包括所有软件利益相关方
③进行设计:解决如何做软件,如何实现的问题
④实现:写代码 ⑤测试与集成 ⑥运行与维护

2. From 1 to n

这主要是指软件发布以后对其不断维护与更新的过程,分析用户的功能需求是否产生了一些变化,软件体验如何等等,不断完善软件以延长生命周期,提高竞争力。

二、传统软件开发模型

这里简单介绍5种传统的开发模型,它们都基于以下两种逻辑的一种:
线性过程:开发过程中按部就班,前一步完成以后进行下一部分的设计,整个过程中不会进行回溯
迭代过程:总体上遵循线性过程,但是可以回溯到之前的设计部分进行迭代

1.瀑布过程

瀑布过程严格遵循线性过程,在构思,启动,分析,设计,构造,测试,实施和维护的各个阶段,稳步向下进行像是瀑布一样。
它有许多优点:是线性推进的,阶段划分清楚,管理起来简单方便;
但同时缺点也很明显,由于设计过程稳步推进,当需求发生变化时便无法适应

2.增量过程

将软件划分为多个增量,每一个增量按照瀑布过程进行设计,是多个瀑布的串行。
显然,增量过程也是符合线性过程的,具有它的一些优点,并作出了一些改进:由于划分增量的存在,当需求增加时可以很好地融入过程中,只需增加增量即可,但如果像是功能发生彻底改变的需求变化,仍然难以适应

3.V字模型

V模型大体可以划分为下面几个不同的阶段步骤,既需求分析、概要设计、祥细设计、编码、单元测试、集成测试、系统测试、验收测试。它通过开发和测试同时进行的方式来缩短开发周期,提高开发效率。可以将它作为瀑布模型的一种扩展来看待

4.原型开发

这一模型不再遵循线性过程而是遵循迭代过程。这一模型的思想是尽早开发出一个软件版本,然后拿给用户得到反馈,然后在原型上不断迭代,修改版本,再拿给用户进行试用,不断重复直到用户满意。这样便能及早发现用户的需求变化并作出应对。
显然,这一过程会有高昂的时间代价,但相应的,开发质量、适应能力也非常高

5.螺旋开发

这是一种风险驱动的过程模型,使用多轮迭代来设计,每一轮迭代都遵循原型过程,进行严格风险分析后才能进入下一轮迭代
每一轮迭代大致过程如下:制定目标→风险评估→开发与测试→计划下一轮迭代

三、敏捷开发

四、软件配置管理

核心:版本控制和基线的确立

1.软件配置项:是指软件中发生变化基本单元,如文件。每一个配置项修改后可形成不同版本,某一时刻所有配置项都处于某一特定版本,所有配置项组合成一个特定版本的软件
2.基线:软件持续变化过程中的 “稳定时刻”(例如:对外发布的版本)
3.对于配置项的管理可以采用配置管理数据库(CMDB),存储软件的各配置项随时间发生变化的信息+基线
4.版本控制:采用版本控制系统(VCS),可分为Local,Centralized,Distributed三种。
Local VCS中,仓库存储于开发者本地机器,无法共享和协作
Centralized VCS中,仓库存储于独立的服务器,支持多开发者之间的协作
Distributed VCS中,仓库存储于独立的服务器+每个开发者的本地机器
5.版本控制工具:Git

在git中,文件的状态一定处于上图中的一种。workspace是当前的工作目录,存储着该工程所有文件。Local repository是git在本地创建的仓库,Remote repository是远程服务器的仓库,staging是暂存区,用于隔离工作目录与,本地仓库。
可通过git add命令将工作目录中文件存入暂存区,然后可以通过git commit命令将暂存区的文件存入本地仓库,只有存入本地仓库的文件才能存入远程仓库。远程服务器上仓库的文件可以由多个开发者共享,可通过git clone命令进行复制

Git的所有操作都是在一个图数据结构(对象图)上进行,对象图是指版本之间的演化关系图,一条边A->B表征了“在版本B的基础上作出变化,形成了版本A”
从另一台机器/服务器复制git项目意味着复制整个对象图–gitclone URL local_repository

这里对基本的git命令进行列举:
–git remote:获取当前配置的所有远程仓库;
–git remote add [shortname] [url] :添加一个远程仓库;
–git fetch:从远程仓库抓取数据到本地;
–git pull:从一个仓库或者本地的分支拉取并且整合代码;
–git push [remote-name] [branch-name]:将本地仓库中的数据推送到远程仓库;
–git remote show [remote-name]:查看某个远程仓库的详细信息;
–git remote rm:从本地移除远程仓库;

五、广义的软件构造过程

构造过程如下:编程–重构–调试–测试–性能分析–代码评审–构建,下面具体分析每一个环节

1.编程

①编程语言+集成开发环境
②建模语言:以一套一致的规则定义来可视化、推理、验证和交流系统的设计,最常用的便是UML图
③配置语言: 配置文件配置程序的参数和初始设置。将程序中可变与不可变的因素,稳定与不稳定的因素隔离开来,可以把可变、不稳定的部分放在配置文件中,避免修改程序

2.代码评审(静态)

静态的代码评审不需要运行程序,而是对代码直接进行分析。经常采用的手段有正式的代码评审会议、结对编程、走查、自动化评审等等。
正式的代码评审会议在一个正式场合召集开发人员,集体对代码进行分析,是一种非常有效的手段。那种固存在自己编程经验中的Bug一般很难自己找出来,但对于他人来说却可能很明显。

3.动态代码分析

动态代码分析要执行程序并观察执行结果,根据结果来收集数据,从而分析代码中存在的不足。测试是否充分、测试达到的覆盖度有多少、能否测量程序的时空复杂度都是设计时需要关心的问题。

4.调试与测试

测试与调试是两个不同的概念,但都是重要的环节。
测试的目的是要发现程序中是否存在错误,因此一个好的测试用例要能够发现程序中潜在的bug而不是存在着bug却顺利地通过了样例。
在测试发现错误以后,需要通过调试进一步定位错误的位置,修改对应位置的代码,纠正错误,调试之后再来进行测试,通过测试说明纠正了错误,否则仍需要继续调试。这样不断往复来提高软件的正确性。
但要注意的是,调试与测试并不能够提高软件质量,它们只是来发现并纠正程序中不应存在的bug,软件质量是需要通过高质量的编码与良好的设计来完成的。

5.重构

代码重构并不是指将代码完全推到重写,它要求软件对外部的接口保持不变,即在不改变功能的前提下优化代码,对代码内部进行优化来提高质量。

六、狭义软件构造过程:Build

这里我们的目标是借助于工具,将软件构造各阶段的活动“自动化“(诸如编译、打包、静态分析、测试、生成文档、部署、…),尽可能脱离“手工作业”,提高构造效率

1.针对不同类型的语言或是文件,构建过程也是各不相同的。

①编译型语言,构建过程需要先将源代码编译为目标文件,再进行打包,从而到目标机器上执行
②解释型语言,构建过程可以省略目标文件,直接从源代码进行打包,但这不意味着没有编译就不能保证正确性,它采用额外的手段在书写代码时进行部分正确性检查
③Web-Based应用:这是编译代码、解释代码、配置或数据文件的混合,因此在打包的文件中,存在由源代码直接打包而来的,也存在经过目标文件进行中转的,是混合体

2.构建系统的组件

构建系统由很多部分组成,包括版本控制工具、代码树、对象树(目标文件)、编译工具(如编译器、链接器等)、构建工具(主要用来编排整个构建过程)、构件机器(由目标机器与构建机器是否相同可分为原生编译与跨平台编译)、生成可安装在用户机器上的软件等等

3.构建语言

类似编程语言,遵循一定的编写规范,告诉构建工具如何一步步地进行构建,描述整个构建过程的

4.构建工具

总结:这一章主要是大致对软件构造的基本过程进行介绍,对各种开发技术、开发工具都有所涉及,指导我们如何实现第一章的质量目标

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览93763 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年2月15日
下一篇 2020年2月15日

相关推荐