软件开发流程是从需求分析、设计、编码、测试到上线等一系列环节的步骤和活动。通常来说,软件开发流程可以分为以下几个阶段:
需求分析:明确客户需求,收集、分析、整理、确认需求,以确保开发出的软件符合客户需求。
设计阶段:在明确的需求基础上,进行软件架构设计和详细设计,确定软件的功能模块和模块之间的关系。
编码阶段:根据设计文档进行程序编写,实现系统功能模块,通常会使用特定的编程语言和开发工具。
测试阶段:进行各种测试,包括单元测试、集成测试、系统测试等,以确保软件质量。
发布阶段:将软件发布到生产环境中,进行部署、配置、发布等操作,确保软件正常运行。
运维阶段:对软件进行监控、维护、升级和优化,以保证软件稳定运行。
不同的软件开发团队和项目可能会有不同的开发流程,例如采用敏捷开发、瀑布模型等不同的开发方法。但是,以上阶段基本上都是必不可少的(阿里研发流程知多少),软件开发流程的目标是确保开发出的软件质量、满足客户需求、按时交付并能够可靠地运行。
我的第一份工作,所在的团队当时的研发模式属于瀑布模式。它将软件开发流程分为一系列相互依赖的阶段,每个阶段必须在上一个阶段完成之后才能开始。瀑布模式存在风险管理能力不足、测试不充分等问题:
需求变更困难:瀑布模型是一个严格的阶段性过程,每个阶段必须完成后才能进入下一个阶段,这使得在项目开发过程中,客户的需求变更非常困难。
风险管理不足:由于在瀑布模型中,风险评估和管理通常在项目开始阶段进行,因此在后期发现的风险可能导致整个项目失败。
测试不充分:瀑布模型的测试阶段通常在开发完成后进行,这可能导致在测试阶段发现的问题难以解决,同时也会增加修复问题所需的时间和成本。
缺乏灵活性:瀑布模型中每个阶段的输入和输出必须按照一定的顺序执行,这意味着在需求或设计阶段出现问题时,整个项目可能需要重新开始。
周期较长:由于瀑布模型的每个阶段必须按顺序执行,因此整个项目的周期通常较长,这使得瀑布模型对于那些需要快速交付的项目不太适用。
传统的瀑布模式不适应如今的互联网大环境,而敏捷开发模型是一种迭代的、增量式的软件开发方法。它强调快速响应变化和客户需求的能力,并且通过与客户的持续协作来确保软件开发过程中的透明度和质量,目前被互联网公司广泛采用。
敏捷开发强调尽早、频繁地交付可用的工作软件,并通过快速反馈和验证来确保软件的质量和正确性。
站在测试的角度,瀑布模式下,开发完成 coding 提测后,测试向开发反馈 BUG(沟通成本高) 是一个反复且非常耗时 (机械) 的过程,很显然不适合敏捷开发的要求。可以参考我这篇文章《阿里微服务质量保障系列:研发环境知多少》
如果让开发和测试 (运维) 团队整合到一个团队,是不是可以最大限度地降低了反馈成本,DevOps 也就应运而生。
DevOps 由 Development 和 Operations 两个词组成。其中 Development 代表着软件开发,包括设计、编码、测试等过程;Operations 则代表着软件运维,包括部署、监控、维护等过程。因此,DevOps 的字面意思可以理解为将软件开发和运维整合在一起的一种方法或理念,旨在加快软件交付速度、提高软件质量和可靠性。
说的大白话些,就是 “简化” 开发和测试 (运维) 之间流程,通过工具使提升整体软件开发速度。
再说直白点,DevOps 解决的根本问题就是软件开发和测试 (运维) 之间的分离和沟通不畅的问题。
注:为什么说 DevOps 既可以说开发和测试、又可以说开发和运维呢?这里说一下个人对 DevOps 的理解。
这主要是因为不同公司对运维这个岗位的职责和归属不同。
我的第一家公司,运维是独立的岗位,有一个人专门负责,工作内容就是服务器监控、到甲方部署软件等,即开发->测试->运维。
阿里这边运维的责任貌似更多在开发同学肩上,当然测试也会负责,但大多数时间由开发负责,因此开发即运维,这里 DevOps 叫做 DevTest 其实更合适。
回答这个问题之前,我们再回首一下文章开头介绍的软件开发流程:
PLAN:开发团队根据客户目标制定开发计划
CODE:根据 PLAN 开始编码,由于产品要满足不同用户要求,则需要将不同版本的代码存储在一个代码仓库。
BUILD:开发完成后,将代码构建并部署运行。
TEST:包括开发侧的单测以及测试同学的黑盒、回归、自动化等测试
DEPLOY:代码经过测试后,如果达到准出要求,则将代码合并到主干分支,交由运维(开发)部署生产环境。
OPERATE:开发(运维)将代码部署到生产环境。
MONITOR:项目部署上线后,需要持续监控产品。
INTEGRATE:将监控阶段收到的有效反馈发送回 PLAN 阶段,往复循环,形成闭环。
上文说了,DevOps 旨在降低项目过程的沟通成本,那么如何降低呢?自然是通过工具实现自动化。
OK,到这里相信大家已经悟了吧,通过这张图大家应该知道 DevOps 就是强调团队之间应该使用自动化工具来协作和沟通来完成软件生命周期管理,从而实现更快、更高质量地交付更稳定的软件。
那么我们学习 DevOps 到底学什么?
我认为是学 DevOps 理念以及软件生命周期涉及到的管理工具。
代码管理工具:如 Git 等,用于管理代码的版本和变更。
自动化构建工具:如 Jenkins,用于将源代码转换为可执行的软件。
自动化部署工具:如 Kubernetes 等,用于将软件部署到生产环境。
自动化测试工具:如 JUnit、Selenium 等,用于自动化执行各种类型的测试。
持续集成和持续交付:如 CI/CD 等,用于自动化构建、测试和部署软件。
日志管理和监控工具:如 ELK、Prometheus 等,用于监视软件的运行状况和性能。
容器化技术:如 Docker 等,用于将应用程序打包成容器并管理其生命周期。