软件开发模式
# 软件开发演变史
软件行业中,每一个概念的提出都是为了解决某个特定的问题。
多年来,DevOps从现有的软件开发策略/方法发展而来,以响应业务需求。让我们简要地看一下这些模型是如何演变的,以及它们最适合的场景。
- 缓慢而繁琐的瀑布模型演变成敏捷,开发团队在短时间内完成软件开发,持续时间甚至不超过两周。如此短的发布周期帮助开发团队处理客户反馈,并将其与bug修复一起合并到下一个版本中。
- 虽然这种敏捷的SCRUM方法为开发带来了敏捷性,但它在运维方面却失去了敏捷实践的速度。开发人员和运维工程师之间缺乏协作仍然会减慢开发过程和发布。
- DevOps方法就是基于对更好的协作和更快的交付的需求而产生的。DevOps允许用较少复杂问题的持续软件交付来修复和更快地解决问题。
# 传统瀑布模型
需求分析,软件设计,程序编写,软件测试,运行维护。
瀑布模型被淘汰的原因
- 各个阶段的划分完全是固定的,阶段之间产生大量的文档,极大地增加工作量。
- 由于开发是线性的,所以用户只有在开发的末期才可以到成果,所以增加了风险。
- 早起的错误等到最后测试再发现这样会带来严重的后果。
# 敏捷开发模型

缓慢而繁琐的瀑布模型演变成敏捷,开发团队在短时间内完成软件开发,持续时间甚至不超过两周。如此短的发布周期帮助开发团队处理客户反馈,并将其与 bug 修复一起合并到下一个版本中。
虽然这种敏捷的 SCRUM 方法为开发带来了敏捷性,但它在运维方面却失去了敏捷实践的速度。开发人员和运维工程师之间缺乏协作仍然会减慢开发过程和发布。
DevOps 就是为了更好地协作和更快地交付而产生的。下面让我们来详细看看 DevOps 是什么。
- 注:这里需要强调的是 DevOps 中的 Dev 不但包括 开发者(developers)而且包括测试人员(testers)
# 二、DevOps
DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
- 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
- 它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。
从概念中不难提炼出:
- DevOps 解决的是 Dev 和 Ops 的沟通问题
- DevOps 的目的是快速部署
- DevOps 有利于快捷、频繁和可靠地发布软件
- DevOps 强调自动化
# Dev 和 Ops 有什么沟通问题?
Ops 看重的是保障系统的稳定性、可靠性和安全性,而 Dev 则想着如何尽快发布新的版本,增加新的功能,这两者本身就是一种矛盾和冲突,尽管他们的共同目标都是为 用户提供软件产品或服务。
# 为什么 DevOps 强调自动化?
- 提高效率:Dev 和 Ops 的手动工作,如果可以实现自动化,将显著提升效率水平。
- 减少错误:即使再谨慎的人也难免会犯错误,尤其是面对重复性工作时。通过自动化工具来完成这样的工作,能将错误率大大降低。
- 最大化员工使用:通过自动化,Dev 和 Ops 可以将精力集中在更复杂、更有战略意义的事情上。同事也避免了雇佣许多员工来应对工作量增加的需求。
- 提高团队的信心:通过自动化,解放了手动的重复性工作。能让员工体现出更大的价值,也让产品更快捷、频繁和可靠地到达用户手上,提高了团队对产品的信心。
# DevOps 会替代敏捷吗?
个人认为 DevOps 只是对敏捷的补充,完善了敏捷在 Dev 和 Ops 之间的问题。两者之间,不存在包含或者替换关系。
# 三、DevOps 流程
一般来说,DevOps工具链包含下面这些:
更具体一些,DevOps 的流程就像它的图标一样,包含:计划,编码,构建,测试,发布,部署,运维,监控,反馈。
而 DevOps 之所以能快速部署的原因在于,DevOps 拥有一套自动化的持续集成、部署系统。
在 DevOps 中有许多“持续”,包括:持续开发、持续测试、持续集成、持续部署、持续监控、持续反馈。
# 持续开发
这是DevOps生命周期中软件不断开发的阶段。与瀑布模型不同,DevOps 软件交付成果被分解为短开发周期的多个任务节点。
这个阶段包括编码和构建阶段,并使用 Git 和 SVN 等工具来维护不同版本的代码,以及 Ant、Maven、Gradle 等工具来构建/打包代码到可执行文件中,这些文件可以转发给自动化测试系统进行测试。
# 持续测试
开发提交代码,构建完成后就被推到测试系统。对于测试人员,使用自动化测试工具,如 Selenium、TestNG、JUnit 等持续测试。这些工具允许质量管理系统完全并行地测试多个代码库,以确保功能中没有缺陷。
在这个阶段,使用Docker容器实时模拟“测试环境”也是首选。一旦代码测试通过,它就会不断地与现有代码集成。
# 持续集成
开发人员不断的开发,更新后的代码需要不断地集成,并顺利地与系统集成,以反映对最终用户的需求更改。更改后的代码,还应该确保运行时环境中没有错误。
Jenkins是一个非常流行的用于持续集成的工具。使用Jenkins,可以从git存储库提取最新的代码修订,并生成一个构建,最终可以部署到测试或生产服务器。可以将其设置为在git存储库中发生更改时自动触发新构建,也可以在单击按钮时手动触发。
# 持续部署
它将代码部署到生产环境。 在这里,我们确保在所有服务器上正确部署代码。 如果添加了任何功能或引入了新功能,那么应该准备好迎接更多的网站流量。 因此,系统运维人员还有责任扩展服务器以容纳更多用户。
由于新代码是连续部署的,因此配置管理工具可以快速,频繁地执行任务。 Puppet,Chef,SaltStack 和 Ansible 是这个阶段使用的一些流行工具。
容器化工具在部署阶段也发挥着重要作用。 Docker和Vagrant是流行的工具,Docker 这类容器工具在这一阶段,有助于保证开发,测试,生产环境一致性。
# 持续监控
这是DevOps生命周期中非常关键的阶段,旨在通过监控软件的性能来提高软件的质量。这种做法涉及运营团队的参与,他们将监视用户活动中的错误/系统的任何不正当行为。这也可以通过使用专用监控工具来实现,该工具将持续监控应用程序性能并突出问题。
这些工具包括 Splunk,ELK Stack,Nagios,NewRelic 和 Sensu 。这些工具可帮助密切监视应用程序和服务器,以主动检查系统的运行状况。发现的任何重大问题都可以向开发团队报告,以便可以在持续开发阶段进行修复。
# 持续反馈
持续反馈是 DevOps 中非常重要的环节,从 Dev、Ops、测试系统、监控系统等不断反馈回问题,并修复。 尽早发现问题是解决问题的关键。
这些DevOps阶段连续循环进行,直到达到所需的产品质量。下面的图表将显示可以在DevOps生命周期的哪个阶段使用哪些工具。
# 四、DevOps案例研究
既然我们已经确定了DevOps的重要性,并且了解了它的不同阶段以及所涉及的DevOps工具,现在让我们看看Facebook的一个案例研究,并理解为什么他们从敏捷转向DevOps。我们将采用Facebook曾推出的新特性的用例,这些新特性导致Facebook重新评估其产品交付并采用DevOps方法。
曾经,Facebook向遍布全球的若干亿用户推出了一系列新功能 - 时间轴,推荐和音乐功能。 发布后Facebook上产生的巨大流量导致服务器崩溃。 推出的功能获得了用户的大规模超常规响应,这导致了新功能产生了不可控的结果,使他们没有预料到。
这导致了Facebook重新评估和战略调整,从而使Facebook推出了暗启动技术。 使用DevOps原则,Facebook为其新版本的发布创建了以下方法。
# Facebook暗启动技术
暗启动是在新功能完全发布给所有用户之前,逐步将新功能,推广到选定的一组用户的过程。 这允许开发团队尽早获得用户反馈,测试错误,并且还可以测试基础架构性能。 这种发布方法是持续交付的直接结果,有助于实现更快,更迭代的版本,确保应用程序性能不会受到影响,并且用户可以很好地更新该版本。
在暗启动技术中,新功能通过专用的部署管道发布给小型用户群。 在上面给出的Facebook暗启动图表中,您可以看到只打开了一个部署管道,将新功能部署到一组选定用户。 此时剩余的数百条管道全部关闭。
持续监视部署功能的特定用户群,以收集反馈并识别错误。 这些错误和反馈将被纳入开发,测试和部署在同一用户群中,直到功能变得稳定。 一旦实现稳定性,通过启用其他部署管道,将逐步在其他用户群上部署这些功能。
通过这种方式,Facebook拥有一个受控或稳定的机制,可以为其庞大的用户群开发新功能。相反,如果功能没有得到很好的响应,他们可以选择完全回滚部署。这也帮助他们为部署准备服务器,因为他们可以预测网站上的用户活动,并相应地扩展服务器。上面给出的图表描述了Facebook的暗启动过程。
# 五、总结
微信,淘宝,以及许多领先的科技巨头,在向所有人发布之前,都使用暗发布逐渐向一小部分用户发布和测试新功能。
DevOps的目的是更快速,更可靠地创建质量更好的软件,同时开发,运维团队之间进行更多的沟通和协作。 它是一个自动化过程,允许快速,安全和高质量的软件开发和发布,同时保持所有利益相关者在一个循环中。 这就是DevOps获得越来越多的大型互联网公司青睐的真正原因。