· 操作系统
1. Linux环境变量的设置
export: 设置环境变量
echo:查看是否成功
env:显示所有的环境变量
set:显示所有本地定义的Shell变量
unset:清除环境变量
2. Shell语句
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
(1) touch
Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
(2) ‘>’ ‘>>’
在shell中 ‘>’ 为创建, ‘>>’ 为追加。当文件不存在时,’>'与‘>>’都会默认创建。
(3)echo
echo 是一个Shell内建命令,用来在终端输出字符串,并在最后默认加上换行符。单引号包围的字符串中不能解析变量。
(4)cat
cat 命令用于连接文件并打印到标准输出设备上。
(5)wc
wc -l : 统计行
wc -c: 统计字节数
wc -m:统计字符数,不能与-c同时使用
c -w:统计字数
wc -L:打印最长长度
(6)grep
Linux grep 命令用于查找文件里符合条件的字符串。
3. Linux逻辑判断
-a:与
-o:或
!:非
4. Linux比较
-lt :小于
-le :小于等于
-gt :大于
-ge: 大于等于
-eq :等于
-ne :不等于
例:
if [ ${var} -le 10 ]; then
echo "${var}小于等于10"
fi
注意:if [ ]里两边要有空格
5. 文件权限
Linux/Unix 的文件调用权限分为三级 : 文件拥有者(owner)、群组(group)、其他(others)。
使用chomd命令改变文件权限。
文件权限字符:“-rwxrwxrwx”
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
数字分别表示Owner、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
目录的x代表的是用户能否进入该目录成为工作目录,目录的r表示具有读取目录结构列表的权限。没有x权限则无法切换到该目录,也就无法执行该目录下的任何命令,即使拥有该目录的r/w权限。
· 计算机网络
1. TCP
TCP协议的特点:
1)TCP是面向连接的运输层协议。应用进程之间的通信像“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放链接。
2)每一条TCP连接只能有两个端点(endpoint),点对点。
3)TCP提供可靠交付的服务。无差错、不丢失、不重复,并且按序到达。
4)TCP提供全双工通信。双向通信.
5)面向字节流。“面向字节流“的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流 。TCP并不知道所传送的字节流的含义。
· 数据库
1. 数据库事务的四大特性(ACID)
1)原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
2)一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
3)隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
4)持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
2. 数据库索引
定义: 索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。
优点:
(1)通过创建索引,可以在查询的过程中,提高系统的性能
(2)通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
(3)在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间
(4)使用索引可以加快表的连接速度
缺点:
(1)创建索引和维护索引要耗费时间,而且时间随着数据量的增加而增大
(2)索引需要占用物理空间,如果要建立聚簇索引,所需要的空间会更大
(3)在对表中的数据进行增加删除和修改时需要耗费较多的时间,因为索引也要动态地维护
索引的最左前缀原则
mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:
- 如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;
- 如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col3)、(col1,col2,col3)上建立了索引;
3. 数据库系统(DBS)
DBS(数据库系统)包含DB(数据库)和 DBNS(数据库管理系统)
· 机器学习
1. 生成模型&判别模型
生成模型: 生成模型,就是生成(数据的分布)的模型;
朴素贝叶斯
混合高斯模型
隐马尔科夫模型(HMM)
贝叶斯网络
Sigmoid Belief Networks
马尔科夫随机场(Markov Random Fields)
深度信念网络(DBN)
判别模型: 判别模型,就是判别(数据输出量)的模型。
K近邻(KNN)
线性回归(Linear Regression)
逻辑斯蒂回归(Logistic Regression)
神经网络(NN)
支持向量机(SVM)
高斯过程(Gaussian Process)
条件随机场(CRF)
CART(Classification and Regression Tree)
2. 归一化处理
需要归一化处理的算法:
当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;在梯度下降进行求解时能较快的收敛。
使用梯度下降法求解最优解的模型,归一化就非常重要,如KNN,logistic回归,gbdt,xgboost,adaboost
基于距离的模型,量纲对模型影响较大,就需要归一化数据,处理特征之间的权重问题,这样可以提高计算精度。比如,KNN,SVM,k-means,主成分分析;
神经网络对数据分布本无要求,但归一化可以加快训练数据;
不需要归一化处理的算法:
树模型,对数据量纲不敏感,它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。如,决策树,随机森林。
- 强烈推荐:
《机器学习中数据预处理——标准化/归一化方法(scaler)》(https://blog.youkuaiyun.com/qq_33472765/article/details/85944256)
《今日面试题分享:树形结构为什么不需要归一化?》
(https://baijiahao.baidu.com/s?id=1625978541816519992&wfr=spider&for=pc)
3. 算法的分类
(1)基于距离的分类方法:KNN等
(2)决策树分类方法:ID3、C4.5、VFDT等
(3)贝叶斯分类方法:朴素贝叶斯方法和EM算法
(4)规则归纳方法:AQ算法、CN2算法和FOIL算法。
4. 异常检测
http://www.csuldw.com/2019/03/24/2019-03-24-anomaly-detection-introduction/?from=timeline&isappinstalled=0
(1)基于统计的异常值检测
MA滑动平均法: 假定异常数据点是偏离平均值的某个标准偏差,那么我们可以计算时间序列数据滑动窗口下的局部平均值,通过平均值来确定偏离程度。
3-Sigma: 3-Sigma原则又称为拉依达准则,使用3-Sigma的前提是数据服从正态分布。满足这个条件之后,在3-Sigma范围(μ−3σ,μ+3σ)内99.73%的为正常数据,其中σ代表标准差,μ代表均值,x=μ为图形的对称轴。
检测一元正态分布中的离群点,属于异常检测中的基于统计的离群点检测。
(2)基于密度的异常检测
基于密度的异常检测有一个先决条件,即正常的数据点呈现“物以类聚”的聚合形态,正常数据出现在密集的邻域周围,而异常点偏离较远。对于这种场景,我们可以计算得分来评估最近的数据点集,这种得分可以使用Eucledian距离或其它的距离计算方法,具体情况需要根据数据类型来定:类别型或是数字型。
局部异常因子算法Local Outlier Factor(简写LOF): LOF算法是一种无监督的异常检测方法,它计算给定数据点相对于其邻居的局部密度偏差。每个样本的异常分数称为局部异常因子。异常分数是局部的,取决于样本相对于周围邻域的隔离程度。确切地说,局部性由k近邻给出,并使用距离估计局部密度。通过将样本的局部密度与其邻居的局部密度进行比较,可以识别密度明显低于其邻居的样本,,这些样本就被当做是异常样本点。
基于密度的还有KNN算法(有监督)。
(3)基于聚类的异常检测
(4)OneClassSVM的异常检测
(5)iForest异常检测
(6)PCA+MD异常检测
(7)AutoEncoder异常检测
5. 统计学习方法的经典研究主题
线性回归模型
感知机
k 近邻法
朴素贝叶斯法
决策树
Logistic 回归于最大熵模型
支持向量机
提升方法
EM 算法
隐马尔可夫模型
条件随机场
6. 缺失值
缺失值敏感模型:
基于距离度量的模型对于缺失值敏感度高,如K近邻算法(KNN)和支持向量机(SVM);
线性模型的代价函数(loss function)往往涉及到距离的计算,计算预测值和真实值之间的差别,这容易导致对缺失值敏感。逻辑回归是线性模型,对缺失值敏感。
缺失值不敏感模型:
树模型对于缺失值敏感度低,其本身就可以把缺失值当成一类;
神经网络对缺失值不是非常敏感;
贝叶斯对缺失值也比较稳定,数据量小的时候推荐。
对于有缺失值的数据在经过缺失值处理后:
· 数据量很小,用朴素贝叶斯;
· 数据量适中或者较大,用树模型,优先 xgboost;
· 数据量较大,也可以用神经网络;
· 避免使用距离度量相关的模型,如KNN和SVM
7. 评价指标
召回率(recall):预测为正例且实际为正例的样本占所有正样本的比例。
精准率(precision):预测为正例且实际为正例的样本占所有预测为正例的样本的比例。
8. PCA
PCA把原先的n个特征用数目更少的k个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的k个特征互不相关。
· 算法
1. 二叉树
树: 除根节点之外每个节点都只有一个父节点,根节点没有父节点。除叶节点之外所有节点都有一个或多个子节点,叶节点没有子节点。父节点和子节点之间用指针链接。
二叉树定义: 每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
树的基本形态
a) 空二叉树
b) 只有一个根节点的二叉树
c) 只有左子树
d) 只有右子树
满二叉树
一棵二叉树的结点要么是叶子结点,要么它有两个子结点(如果一个二叉树的层数为K,且结点总数是(2^k) -1,则它就是满二叉树。)
完全二叉树
若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。
遍历
前序遍历: 先访问根节点,再访问左子结点,最后访问右子节点。(根——>左——>右)F-C-A-D-B-E-H-G-M
中序遍历: 先访问左子节点,再访问根结点,最后访问右子节点。(左——>根——>右)A-C-B-D-F-H-E-M-G
后序遍历: 先访问左子节点,再访问右子节点,最后访问根节点。(左——>右——>根)A-B-D-C-H-M-G-E-F
(1) 前序遍历的第一元素是整个二叉树的根节点;
(2) 中序遍历中根节点的左边的元素是左子树,根节点右边的元素是右子树
(3) 后序遍历的最后一个元素是整个二叉树的根节点
已知前序遍历和后序遍历,无法确定唯一的一棵二叉树。
已知前序遍历和中序遍历,可以确定一棵二叉树,
已知中序遍历和后序遍历,可以确定一棵二叉树
宽度优先遍历: 先访问树的第一层节点,再访问第二层节点…一直访问到最后一层节点。在同一层节点中,以左到右的顺序依次访问。F-C-E-A-D-H-G-B-M
二叉树的三叉链表存储
三叉链表是二叉树的另一种主要的链式存储结构。
三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本结点双亲的指针。三叉链表的结点形式如下:
改进于二叉链表,增加指向父节点的指针,能更好地实现结点间的访问。
2. 最短路径算法(The shortest-path problem, SPP)
最短路径问题是图论研究中的一个经典算法问题,旨在寻找图中两结点之间的最短路径。 算法具体的形式包括:
1)确定起点的最短路径问题:即已知起始结点,求最短路径的问题。
2)确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
3)确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。
4)全局最短路径问题:求图中所有的最短路径。
算法比较:
2.1 Floyd
是解决任意两点间的最短路径的一种算法,时间复杂度为O(N^3) ,空间复杂度为O(N^2)。
可以正确处理有向图或负权的最短路径问题。
floyd能有负权值的边,不能有负权值的回路。
从任意节点A到任意节点B的最短路径不外乎2种可能:是直接从A到B;或从A经过若干个节点X到B。
基本思想:
假设Dis(i,j)为节点i到节点j的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
动态规划法: Dis(i,j) =min(Dis(i,j), Dis(i,k) + Dis(k,j)).
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if ( e[i][j] > e[i][1]+e[1][j] )
e[i][j] = e[i][1]+e[1][j];
}
}
2.2 dijkstra
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。
Dijkstra算法不允许图中带有负权值的边,可适用于有向图。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
算法思想:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
3. 排序算法
选择排序: 每次从数组中选出一个最小数(最大数)放到数组最前面,存放在序列的起始位置,直到全部待排序的数据元素排完。
希尔排序: 设置增量分割数组,逐步进行直接插入排序,增量逐趟减少,并最后使得整个数组基本有序,再对整体进行直接插入排序。
插入排序: 构建有序序列,未排序数据依次从已排序数据按从后往前比较,插入到合适的位置。
归并排序: 把序列分成两个长度为n/2的子序列,对这两个子序列分别归并排序(循环将两个数组的第一个值比较,并弹出第一个值, 直到数组长度都不存在),将两个排序好的子序列合并成一个最终的排序序列。
4. 队列 先进先出
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。
随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。
当front=rear时,队列中没有任何元素,称为空队列。
5. 栈 先进后出
· Python
1. Python中的复数
1)表示复数的语法是real + image j
2)实部和虚部都是浮点数
3)虚部的后缀可以是 “j” 或者 “J”
4)复数的 conjugate 方法可以返回该复数的共轭复数。
· 计算机原理
1. 计算机存储容量单位
位(bit):音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。
字节(byte):音译为“拜特”,习惯上用大写的“B”表示。 字节是计算机中数据处理的基本单位。 计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111;通常1个字节可以存入一个ASCII码,2个字节可以存放一个汉字国标码。
· 统计学
1. 熵
2. 置信区间
置信概率(confidence probability)是用来衡量统计推断可靠程度的概率。
3. 普查
普查的优点:
由于是调查某一人群的所有成员,所以在确定调查对象上比较简单;
所获得的资料全面,可以知道全部调查对象的相关情况,准确性高;
普查所获得的数据为抽样调查或其他调查提供基本依据。
普查的缺点:
工作量大,花费大,组织工作复杂;
调查内容有限;
易产生重复和遗漏现象;
由于工作量大而可能导致调查的精确度下降,调查质量不易控制。
4. 检验方法
1)t检验,亦称student t检验(Student’s t test),主要用于样本含量较小(例如n < 30),总体标准差σ未知的正态分布。 t检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。它与f检验、卡方检验并列。
2)方差分析(ANOVA)又称“变异数分析”或“F检验”,是由罗纳德·费雪爵士发明的,用于两个及两个以上样本均数差别的显著性检验。
3)F检验(F-test),最常用的别名叫做联合假设检验(英语:joint hypotheses test),此外也称方差比率检验、方差齐性检验。它是一种在零假设(null hypothesis, H0)之下,统计值服从F-分布的检验。其通常是用来分析用了超过一个参数的统计模型,以判断该模型中的全部或一部分参数是否适合用来估计母体。
4)KS检验与t检验之类的其他方法不同是KS检验不需要知道数据的分布情况,可以算是一种非参数检验方法。
5. 相关系数
若相关系数r=0,仅表示无线性相关。
· SQL
1. 排序函数
(1)row_number():在排名时序号连续不重复。
select row_number() OVER(order by e.salary desc) as row_num , e.salary
from employee e
(2)rank():rank函数会把要求排序的值相同的归为一组且每组序号一样,排序不会连续。
select rank() OVER(order by e.salary desc) as row_num , e.salary
from employee e
(3)dense_rank():排序是连续的,也会把相同的值分为一组且每组排序号一样。
select dense_rank() OVER(order by e.salary desc) as row_num , e.salary
from employee e
2. 删除语句
delete使用别名的时候,要在delete和from间加上删除表的别名,这样才是正确的写法。
如:觉得正常的sql:
delete from ciri_tt_ttlistinfo t where t.task_sheet_no='C19014';
错误!!
正确:
delete from ciri_tt_ttlistinfo where task_sheet_no='C19014';
或者 delete t from ciri_tt_ttlistinfo t where t.task_sheet_no='C19014';
3. SQL性能优化
https://www.cnblogs.com/SimpleWu/p/9929043.html
- sql需要避免在索引字段上使用函数
- 避免在WHERE子句中使用in,not in , 可以使用exist和not exist代替
- 将对于同一个表格的多个字段的操作写到同一个sql中, 而不是分开成两个sql语句实现
- 避免建立索引的列中使用空值
· Others
1. 大数据的三大理念
https://blog.youkuaiyun.com/chengxvsyu/article/details/91630583
1)用全量代替样本
2)兼容不精确
3)更加关注相关规律:只关注关联关系,不关注因果关系
2. 数据挖掘相关
https://wenku.baidu.com/view/a5fa7ae7cd22bcd126fff705cc17552707225e29.html?from=search
为数据的总体分布建模;把多维空间划分成组等问题属于数据挖掘的建模描述任务。
3. 实时计算组件
实时计算:spark、storm、Flink
Hive不具有实时计算能力,不提供实时查询功能。hive 构建在基于静态批处理的Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,hive 并不能够在大规模数据集上实现低延迟快速的查询。
4. Hadoop
hadoop主要组成部分包括:HDFS、MapReduce和Yarn
5. 软件开发
软件开发包括需求、设计、编码和测试等阶段,有时也包括维护阶段。
常见的模型
软件开发模型(Software Development Model)是指软件开发全部过程、活动和任务的结构框架。
- 边做边改模型(Build-and-Fix Model)
模型描述: 开发人员拿到项目立即根据需求编写程序,调试通过后生成软件的第一个版本。在提供给用户使用后,如果程序出现错误,或者用户提出新的要求,开发人员重新修改代码,直到用户满意为止。
缺点: 这是一种类似作坊的开发方式,对编写几百行的小程序来说还不错,但这种方法对任何规模的开发来说都是不能令人满意的,其主要问题在于:
(1) 缺少规划和设计环节,软件的结构随着不断的修改越来越糟,导致无法继续修改;
(2) 忽略需求环节,给软件开发带来很大的风险;
(3) 没有考虑测试和程序的可维护性,也没有任何文档,软件的维护十分困难。 - 瀑布模型(Waterfall Model)
模型描述: 瀑布模型将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。
缺点: 瀑布模型强调文档的作用,并要求每个阶段都要仔细验证。但是,这种模型的线性过程太理想化,已不再适合现代的软件开发模式,几乎被业界抛弃,其主要问题在于:
(1) 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量;
(2) 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险;
(3) 早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。 - 快速原型模型(Rapid Prototype Model)
模型描述: 快速原型模型的第一步是建造一个快速原型,实现客户或未来的用户与系统的交互,用户或客户对原型进行评价,进一步细化待开发软件的需求。通过逐步调整原型使其满足客户的要求,开发人员可以确定客户的真正需求是什么;第二步则在第一步的基础上开发客户满意的软件产品。
特点: 快速原型方法可以克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险,具有显著的效果。快速原型的关键在于尽可能快速地建造出软件原型,一旦确定了客户的真正需求,所建造的原型将被丢弃。因此,原型系统的内部结构并不重要,重要的是必须迅速建立原型,随之迅速修改原型,以反映客户的需求。 - 增量模型&演化模型(Incremental Model)
模型描述: 与建造大厦相同,软件也是一步一步建造起来的。在增量模型中,软件被作为一系列的增量构件来设计、实现、集成和测试,每一个构件是由多种相互作用的模块所形成的提供特定功能的代码片段构成。
增量模型在各个阶段并不交付一个可运行的完整产品,而是交付满足客户需求的一个子集的可运行产品。整个产品被分解成若干个构件,开发人员逐个构件地交付产品,这样做的好处是软件开发可以较好地适应变化,客户可以不断地看到所开发的软件,从而降低开发风险。
在使用增量模型时,第一个增量往往是实现基本需求的核心产品。核心产品交付用户使用后,经过评价形成下一个增量的开发计划,它包括对核心产品的修改和一些新功能的发布。这个过程在每个增量发布后不断重复,直到产生最终的完善产品。
例如,使用增量模型开发字处理软件。可以考虑,第一个增量发布基本的文件管理、编辑和文档生成功能,第二个增量发布更加完善的编辑和文档生成功能,第三个增量实现拼写和文法检查功能,第四个增量完成高级的页面布局功能。
缺点:
(1) 由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构。
(2) 在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性。 - 螺旋模型(Spiral Model)
模型描述: 它将瀑布模型和快速原型模型结合起来,强调了其他模型所忽视的风险分析,特别适合于大型复杂的系统。螺旋模型刚开始规模很小,当项目被定义得更好、更稳定时,逐渐展开。
“螺旋模型”的核心就在于您不需要在刚开始的时候就把所有事情都定义的清清楚楚。您轻松上阵,定义最重要的功能,实现它,然后听取客户的意见,之后再进入到下一个阶段。如此不断轮回重复,直到得到您满意的最终产品。
(1)制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件;
(2)风险分析:分析评估所选方案,考虑如何识别和消除风险;
(3)实施工程:实施软件开发和验证;
(4)客户评估:评价开发工作,提出修正建议,制定下一步计划。
螺旋模型很大程度上是一种风险驱动的方法体系,因为在每个阶段之前及经常发生的循环之前,都必须首先进行风险评估。 - 喷泉模型(fountain model)
模型描述: 喷泉模型不像瀑布模型那样,需要分析活动结束后才开始设计活动,设计活动结束后才开始编码活动.该模型的各个阶段没有明显的界限,开发人员可以同步进行开发.其优点是可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程.喷泉模型与传统的结构化生存期比较,具有更多的增量和迭代性质,生存期的各个阶段可以相互重叠和多次反复,而且在项目的整个生存期中还可以嵌入子生存期。就像水喷上去又可以落下来,可以落在中间,也可以落在最底部。
缺点: 由于喷泉模型在各个开发阶段是重叠的,因此在开发过程中需要大量的开发人员,因此不利于项目的管理.此外这种模型要求严格管理文档,使得审核的难度加大,尤其是面对可能随时加入各种信息、需求与资料的情况.