1. 软件模型
在计算机刚刚诞生的年代,计算机是一种只有天才才能掌握的工具。人们对计算机的认知仅仅停留在程序的层面上,所谓的软件开发就是这些能够掌握计算机的天才们写的一些只能计算的二进制序列而已。但是随着技术的发展,软件的复杂度不断地提高,人们进入了大规模软件开发时代。[这时,人们发现,软件系统已经变得非常复杂,需要遵循一定的开发方法才能成功,称这些模式化的开发方法为开发模型]
当谈论软件开发模型时,我们指的是一种组织和管理软件开发过程的框架或方法。不同的软件开发模型提供了不同的方法来规划、设计、实施和测试软件项目。
软件模型存在以下几种:
- 瀑布模型
- 演化模型
- 螺旋模型
- 增量模型
- 敏捷模型
- 融合模型(DevOps)
2. 各类软件模型展开
[不知三军之权而图三军之任] [具体问题具体分析] [结合自身实际情况,实事求是]
2.1. 瀑布模型
顾名思义,瀑布模型就如同瀑布一样,从一个特定的阶段流向下一个阶段。
瀑布模型分为:瀑布模型和瀑布V模型
2.1.1. 瀑布模型
瀑布模型认为,软件开发是[一个阶段化的精确的过程],就像要造一艘航空母舰,首先需要知道航空母舰的具体参数(长、宽、高、排水量、航速等)。在这些参数的技术上需要对航空母舰进行设计,设计包括总体设计和详细设计。只有[设计的一清二楚的图纸,才能交付施工,制造出航空母舰的各个部分],否则制造出来的零件肯定拼装不到一起去。[制造完毕之后,要把这些零件一个一个的拼装起来,拼装成发动机、船舱等部分],并检查这些部分是否符合设计标准,[这就是集成测试]。最后将各个部分组合在一起,造出来一艘巨大的航母,[最后对这艘航空母舰进行检查、下水以及编队航行],这就是[系统测试和验收测试]。
而这个过程到软件开发的过程中便是:需求分析、总体设计、详细设计、编码、调试、集成测试和系统测试。如图:
在上图中,每一个阶段都有回到上一阶段的反馈线,这指的是,在软件开发中当在后续阶段发生缺陷的时候,可以把这个缺陷反馈到上一阶段进行修正。
从上图,我们可以看出瀑布模型的一个重要特点:
- [软件开发的阶段划分是明确的,一个阶段到下一个阶段有明显的界限]。[当每个阶段结束后,都会有固定的文档或源程序流入下一阶段]。
- 在需求分析阶段结束后,需要明确的描述软件需求的文档。
- 总体设计结束后,需要有描述软件的总体结构的文档。
- 详细设计结束后,需要有可以用来编码的详细设计文档
- 而编码阶段结束后,代码本身被作为文档流入到下一阶段。
因此[也称瀑布模型是面向文档的软件开发模型]
当软件需求明确、稳定时,可以采用瀑布模型按部就班的开发软件,当软件需求不明确或者变动剧烈时,瀑布模型中往往要到测试阶段才能暴露出需求的缺陷,造成后期修改困难,代价高昂,难以控制开发的窘境。
2.1.2. 瀑布V模型
瀑布V模型是瀑布模型的一种变体。随着对瀑布模型的应用,人们发现,缺陷是无法避免的,任何一个阶段都会在软件中引入隐患,而最后的测试也不能证明软件没有缺陷,只能是争取在交付之前发现更多的缺陷。测试成为软件开发中非常重要的环节,测试的质量直接影响到软件的质量。
整个瀑布模型在[编码与测试]打了一个对折,形成了一个对称的V字。瀑布V模型同标准瀑布模型一样,在进行完[需求分析]就将进入[总体设计]阶段,但是除总体设计外,需求分析还有一条虚线指向的系统测试。这指的是,需求分析的结果将作为系统测试的标准,即需求分析阶段也将产生同软件需求一致的系统测试用力;同时软件产品是否符合最初的需求将在系统测试阶段得到验证。依此类推,[总体设计对应了集成测试],[详细设计对应了单元测试]
瀑布V模型除了保持了瀑布模型的[阶段式文档驱动的特点],而且更强调了[软件产品的验证工作]。
2.1.3. 瀑布模型的缺点
虽然是经典的开发模型,但瀑布模型中存在一些难以克服的缺陷,即使在改进的瀑布V模型中还是存在。
首先,在瀑布模型中,需求分析阶段是一切活动的基础,设计、实现和验证活动都是从需求分析阶段的结果导出的。[一旦]需求分析的结果不完全正确,存在偏差,那么后续的活动只能放大这个偏差,在错误的道路上越走越远。[事实上],由于用户和开发者的立场、经验、知识域都不相同,不同的人对同一件事务的表述也不同,这就导致了需求分析的结果几乎不可能精确、完整的描述整个软件系统。[所以]瀑布模型的后期的维护工作相当繁重,而这些维护工作大多都是修正正在需求分析阶段引入的缺陷
其次,[瀑布模型难以适应变化]。在瀑布模型中精确的定义每一个阶段的活动和活动结果,而每一阶段都紧密依赖于上一阶段的结果。如果在软件后期出现了需求的变化,整个系统又需要从头开始的流程走一遍。
第三,使用瀑布模型意味着当所有阶段都结束才能最终的交付软件产品,所以提出需求后只能开始很长一段时间之后才能看到成果,才能发现软件产品究竟能不能满足客户的需求。
第四,文档驱动型的瀑布模型除了制造软件之外还将产生一大堆的文档,大部分的文档对客户没有任何意义,但完成这些对客户没有意义的文档却需要花费大量的人力。所以也称瀑布模型是一个重载模型
2.1.4. 瀑布模型适合知道什么样的项目,这样的项目有什么特点?
瀑布模型适用于具有相对稳定、明确、预定义需求的项目,尤其是小规模项目和对变更要求不频繁的项目。以下是适合使用瀑布模型的项目类型:
-
小规模项目:瀑布模型适用于小规模项目,因为项目的规模相对较小,开发流程可以按照线性的阶段顺序进行。
-
清晰的需求:如果项目的需求在项目开始时已经相对明确、详细定义,那么瀑布模型可以更好地控制开发过程,因为不会频繁改变需求。
-
低变更率:瀑布模型适合对变更要求不敏感的项目。一旦开发进入某个阶段,就不会频繁地改变已经确定的需求和设计。
-
稳定的技术环境:如果项目所涉及的技术和工具在整个开发过程中保持相对稳定,瀑布模型可以更好地应用。
-
有限的人力资源:在瀑布模型下,每个阶段都在前一个阶段完成后开始,这意味着团队在一个阶段完成后可以重新部署到下一个阶段。
-
较低的风险容忍度:对于那些风险较高或者风险管理不是主要焦点的项目,瀑布模型可能更合适,因为它强调阶段之间的严格控制和计划。
-
传统和正式项目:在一些传统、正式的项目环境中,瀑布模型可能更符合规定的流程和标准。
总之,瀑布模型适用于那些需要在项目开始时就明确定义需求、有稳定的开发环境、不频繁变更需求并且风险容忍度较低的项目。然而,[随着软件开发趋向更灵活的方法,瀑布模型在某些情况下可能不太适用,因为它缺乏适应性和对变更的容忍度。]
2.1.5. 举例说明一些项目
- 像一开始举例说明的航空母舰系统,该类系统从立项之初,明确了航母所拥有的特性,一般不会在定性之后,对航母的特征有非常剧烈的变化(特殊情况除外:[政治、经济等等])
- 部分项目形成产品线,需要从产品线中拿出版本实现特定区域、特定环节的项目。
- 人员较少、开发内容较少的项目
2.2. 演化模型
演化模型其主要思想为:[人们很难一次性的完全地理解用户的需求,设计出完美的架构,开发出可用的系统],这是由于[人的认知本身就是一个过程,这个过程是渐进的、不断深化的],对于复杂问题,“做两次”肯定能够做的更好。[那么],对于软件开发这个复杂而且与人的认知过程紧密相关的事情也应该是一个渐进的过程。
[一般的],一个演化模型可以看作若干次瀑布模型的迭代,当完成瀑布模型之后,重新进入下一次迭代周期,软件在这样的迭代过程中得以演化、完善。
[演化模型可以演变为螺旋模型、增量模型和原型法开发]
2.3. 螺旋模型
螺旋模型是将瀑布模型和演化模型结合起来,不仅体现了两个模型的优点,而且还强调了其他模型均忽略了的风险分析。螺旋模型的每一周期都包括[需求定义]、[风险分析]、[工程实现]和[评审]4个阶段,由这4个阶段进行迭代,软件开发每迭代一次,软件开发就前进一个层次。
螺旋模型基本做法是在“瀑布模型”的每一个开发阶段前,引入一个[非常严格的风险识别、分线分析和风险控制]。它将软件项目分解成一个个小项目,每个小项目都标识一个或多个主要风险,直到所有的风险因素都被确定。
螺旋模型强调[风险分析],使得开发人员和用户对每个演化层出现的每个风险均有所了解,继而做出应有的反应。因此,[螺旋模型特别适用于庞大而复杂、具有高风险的系统,对于这些系统,风险是开发不可忽视的、潜在的不利因素,它可能在不同程度上损害软件开发过程,影响软件产品的质量]。减小软件风险的目标是在造成危害之前,及时对风险进行识别、分析,决定采取何种对策,进而消除或减少风险的损害。
与瀑布模型相比,螺旋模型[支持用户需求的动态变化],[为用户参与软件开发的所有关键决策提供了方便],[有助于提高目标软件的适应能力],[为项目管理人员及时调整管理决策提供了便利,从而降低了软件开发风险]。
2.3.1. 螺旋模型的缺点
- 采用螺旋模型,需要具有相当丰富的风险评估经验和专业知识。在风险较大的项目中,如果没有及时的标识风险,势必造成重大损失。
- 过多的迭代次数会增加开发成本,延迟提交时间。
2.4. 增量模型
演化模型的另一种形式是增量模型。在系统的技术架构成熟、风险较低的时候,可以采用增量的方式进行系统开发,这样可以提前进行集成测试和系统测试,缩短初始版本的发布周期,提高系统对用户的可见度。
对于增量模型,通常有两种策略。一种增量发布的方法,即首先做好系统的分析和设计工作,然后将系统划分为若干不同的版本,每一个版本都是一个完整的版本,后一个版本以前一个版本为基础进行开发,扩充前一个版本的功能。在这种策略中,第一个版本往往是系统的核心功能,可以满足用户基本的需求,随着增量发布,系统的功能逐步的丰富起来、完善起来。用户在很短的时间内就可以得到系统的初始版本并试用。试用的问题可以很快的反馈到后续开发中,从而降低了系统的风险。
- 每一个版本都是一个[完整的版本]。虽然最初的几个增量不能完全的实现用户需求,但这些版本都是完整的,可用的。
- 版本间的增量要均匀,这一点很重要。如果第一个版本要一个月,下一个版本要六个月,这种不均匀的分配会降低增量发布的意义,需要重新调整。
另一种策略是原型法。同增量发布不同,原型法的每一次迭代都经过一个完整的生命周期。当用户需求很不明确或技术架构中存在很多不可知因素的时候,可以采用原型法。在初始的原型中,针对一般性的用户需求进行快速的实现,并不考虑算法的合理性或系统的稳定性。这个原型的主要目的是为了获得精确的用户需求,或验证架构的可用性。一般情况下,会在后面的开发中抛弃这个原型,重新实现完整的系统。
2.5. 敏捷模型/敏捷方法
2001年2月,在美国的犹他州,17位“无政府主义”共同发布了《敏捷软件开发宣言》,在宣言中指出。
- [尽早地、持续的]向客户交付有价值的软件对开发人员来说是重要的。
- [拥抱变化],即使在开发的后期。敏捷过程能够驾驭变化,保持客户的竞争力。
- 经常交付可工作的软件,从几周到几个月,范围越小越好。
- 在整个项目中,业务人员和开发者紧密合作。
- 围绕士气高昂的团队进行开发,为团队成员提供适宜的环节,满足他们的需要,并给予足够的信任。
- 在团队中,最有效率的也是效果最好的沟通方式是[面对面交流]。
- 可以工作的软件是进度首要的度量方式。
- 可持续的开发。投资人、开发团队和用户应该保持固定的节奏。
- 不断追求[优秀的技术和良好的设计]有助于提高minjiex。
- 要简单,尽可能减少工作量。[减少工作量的艺术]是非常重要的。
- 最好的架构、需求和设计都来自于一个[自我组织]的团队。
- 团队要[定期的总结]如何能够更有效率,然后相应的[自我调整]。
敏捷方法族中目前包含11中开发方法
- AD(Agile Database Techniques,敏捷数据技术)
- AM(Agile Modeling,敏捷建模)
- ASD(Adaptive Software Development,自适应软件开发)
- Crystal(水晶方法)
- FDD(Feature Driven Development,特征驱动开发)
- DSDM(Dynamic Systems Development Method,动态系统开发方法)
- LSD(Lean Software Development,精益软件开发)
- Scrum。
- TDD(Test-Driven Design,测试驱动设计)
- XBreed。
- XP(eXtreme Programming,极限编程)
2.6. 融合模型(DevOps)
它是将开发(Development)和运维(Operations)融合在一起的一种方法。
DevOps 是一种强调开发团队和运维团队之间协作、沟通和自动化的方法。它的目标是通过将开发和运维过程结合起来,实现更快的交付、更高的质量和更好的协作。DevOps 关注于消除开发和运维之间的壁垒,使软件交付变得更加持续和可预测。
DevOps 是一种文化理念、工具与实践的结合,目的是更快更可靠地向用户持续交付价值。其中最重要的是文化,文化要求 Dev 和 Ops 团队责任共担,目标一致,也要求整个团队持续学习,抱着成长的心态,Continuously Everything。其次 DevOps 离不开高效的工具集,工具是自动化的基础。最后我们要在各个环节追求最佳实践,不管是工具的使用,还是团队的协作模式,沟通方法上面。