全公司层级化、分层扁平化_扁平化软件发布过程
在向用户交付软件方面,敏捷开发尚未在许多组织中兑现其诺言。 造成这种情况的原因有很多,但是核心问题是组织结构的错位。 通常,公司的开发和运营团队位于单独的公司部门中,只有一位高管(CEO)是共同的,首席执行官通常信任下级高管做出适当的决定。 两支球队的目标存在内在冲突。 开发是通过其可用于业务的功能的数量来衡量的,而运营是通过系统的正常运行时间(即其稳定性)来衡量的。 由于此类公司缺乏软件系统的统一视图,因此没有一个团队会受到适当激励,无法实现定期提供在稳定环境中运行的高质量功能的目标。
关于本系列
开发人员可以从操作中学到很多,操作可以从开发人员中学到很多。 本系列文章致力于探索将操作思维方式应用于开发(反之亦然)的实际用途,以及将软件产品视为可以以比以往任何时候都更高的敏捷性和频率交付的整体实体。
托马斯·弗里德曼(Thomas Friedman)在2005年出版的《世界是平坦的》一书中提出,全球化,软件,互联网以及某些发展中国家边界的开放等因素正在汇聚在一起,以“消除”参与世界经济的传统障碍。 现在,在寻求竞争优势的公司内部,软件行业正在看到自己的“扁平化”趋势:软件版本和组织结构的扁平化。 自动化,工具,协作以及行业最佳实践和模式的融合使这种转变成为可能,从而使这些公司的软件交付变得更快,更好,更便宜。
在本系列文章中,我将展示如何从整体上看待软件系统,以及如何必须扁平化软件组织才能实现定期交付稳定功能的目标。 本文介绍了整个系列中我将介绍的许多主题,包括敏捷,DevOps,新兴行业模式,工具和协作。 所有这些都为实现这一目标做出了贡献。
参与其中
developerWorks 敏捷转换提供新闻,讨论和培训,以帮助您和您的组织在敏捷开发原则上建立基础。
敏捷+ DevOps
敏捷宣言中的12项原则中的三项(请参阅参考资料 )强调了软件交付实践:
- “我们的首要任务是通过尽早并持续交付有价值的软件来满足客户。”
- “经常交付工作软件,从几周到几个月不等,而更倾向于缩短时间。”
- “工作软件是进度的主要衡量标准。”
该宣言的编写已有十多年的历史了,许多组织仍在寻求遵守这些原则。 但是,令人兴奋的是其他组织正在超越这些宗旨。 在某些公司中,软件总是随时可以发布 ,团队周围没有围墙或孤岛:他们有一个交付团队,该团队由开发,质量保证,数据库,运营等方面的专家组成,不断向以下部门交付有价值的软件:他们的用户。 这就是敏捷性的全部意义。
从本质上讲,导致DevOps运动的动机是跨团队发布和维护软件系统时所遇到的挫败感。 对于典型的软件项目,从广义上讲,有两个团队负责开发和交付软件:开发和运营。 这两个团队必须合作,但是他们经常有相互竞争的动机。 为了开发,它提供了新功能 。 对于运营而言,这可确保系统的稳定性 。 通常,团队之间沟通不畅,这会导致软件交付过程后期出现故障。
DevOps运动的目标之一是使开发人员和操作人员以更加协作的方式一起工作。 结果,出现了新一代的DevOps工程师,他们充分利用了这两门学科,并将它们结合起来,为用户创造价值。 在开发,配置管理,数据库,测试和基础架构方面经验丰富的跨职能团队的兴起也体现了这一点。
模式
软件模式是在特定上下文中解决问题的方法( 上下文是区分模式与“最佳实践”的关键)。 与敏捷DevOps相关的一些模式是脚本化环境 , 测试驱动的基础架构 , Chaos Monkey ,对所有内容进行版本控制 , 交付管道以及DevOps仪表板 。 我将在本文中介绍这些模式,随着系列的进行,您将看到有关它们的更多详细信息。
脚本环境
通过使环境供应完全自动化,可以降低在一种环境中发生的部署错误而在其他环境中不会发生的部署错误的风险。 通过编写脚本环境,您可以在目标环境中验证软件特定版本的完整性(即,未进行任何修改)。 通过遵循不会对环境进行任何修改的策略,除非它处于版本化脚本中,是自动化的并且是生产的单个路径的一部分,您可以更好地确定部署错误的根本原因。 脚本化环境的好处包括:
- 环境始终处于已知状态。
- 它们支持自助服务环境和部署。
- 它们减少了部署因独特的环境类型而有所不同的机会。
- 环境是生产的单一路径(和版本)的一部分。
- 他们减少了将知识锁定在团队成员头脑中的机会。
- 部署更具可预测性和可重复性。
您将在本系列中详细了解的基础架构自动化工具支持此模式。 木偶就是这样一种工具。 清单1中的代码片段示例了一个基本的Puppet程序-被称为manifest :
清单1.脚本化环境:人偶清单httpd片段
class httpd {package { 'httpd-devel':ensure => installed,}service { 'httpd':ensure => running,enable => true,subscribe => Package['httpd-devel'],}
}
通常,大量清单会脚本化基础结构。 这些脚本与应用程序代码一样,被提交到版本控制存储库。
测试驱动的基础架构
DevOps的一个简单前提就是从开发到运营以及从运营到开发的最佳实践和模式的应用。 由测试驱动的将测试与代码一起编写的方法起源于软件开发。 随着基础架构自动化工具在组织中变得越来越主流,工程师正在将测试驱动的实践应用于其基础架构。 基础结构在一个脚本中进行了描述(如清单1所示 ),并且这些脚本具有测试。 测试驱动的基础架构的许多好处包括:
- 之所以会出现问题,是因为基础架构的更改是通过持续集成系统与软件系统的其余部分集成在一起的。
- 测试以及脚本化的基础结构成为文档。
- 您可以更好地隔离破坏性更改,因为所有内容都是脚本,并在测试中进行了描述。
清单2展示了一个简单的验证Web服务器已启动并正在运行的场景。 它使用称为Cucumber的行为驱动开发(也称为验收测试驱动开发)工具,其中将测试描述为场景 。
清单2. Cucumber中的基础结构测试
Scenario: Is the proper version of Apache installed?
When I run "/usr/sbin/httpd -v"
Then I should see "2.2"
在本系列的后续文章中,您将看到更多测试驱动的基础结构示例。
混沌猴
几年前,Netflix技术团队开发了一种称为“ 混沌猴子”的连续测试工具。 该工具有意且随机但有规律地终止了Netflix生产基础架构中的实例,以确保系统在发生故障时继续运行。 该工具最近以开源形式发布(请参阅参考资料 )。
Netflix遵循的原则是“任何时候都失败”(这一口号由Amazon.com首席技术官Werner Vogels提出)。 就像Netflix所说的那样,“混沌猴子的工作是随机杀死我们架构中的实例和服务。如果尽管失败,我们就不会不断地测试我们的成功能力,那么在最重要的情况下,它就不太可能奏效。意外中断”(请参阅参考资料 )。 在本系列的后面部分,我将探讨混沌猴子及其在功能完善的DevOps环境中的作用。
瞬态环境
过渡环境的一般经验法则是,交付给DevOps团队成员的自助服务环境的寿命尽可能短,从几小时到几天不等,基本上只有足够的时间来进行测试。 软件开发项目中最重要的问题之一是团队拥有固定实例,其他人无法触摸,因为他们花了几天,几周甚至几个月的时间来配置各个团队成员。 这通常是由于未编写脚本的环境导致的结果,导致环境稀缺资源。 当某些东西稀缺时,您要坚持并保护它。
使用完全脚本化的环境后,环境不再稀缺。 一切都在模板中定义,并检入版本控制系统。 您可以根据需要终止基于脚本的环境。 这种模式具有两个优点:它使资源可供其他人使用,并且强化了必须使所有内容自动化的概念,而不是在数周和数月的时间内人工培育。 您将在本系列中了解有关瞬态环境的更多信息。
版本一切
这种模式很简单,看似不言而喻:版本化所有内容。 是的,所有内容:基础架构,配置,应用程序代码和数据库脚本。 尽管这可能很容易理解,但是以我的经验,很少有人会找到创建该软件系统所需的所有工件版本的团队。
版本化所有内容的目的是为软件系统建立单一的事实来源(也称为规范版本或记录系统)。 您将软件视为一个整体。 在对所有内容进行版本控制时,团队成员并不会一直不清楚或正在浏览软件系统的众多版本。 在本系列中,我还将介绍对软件交付系统配置本身的各个部分进行版本控制的一种新兴实践。
有一种简单的方法可以知道是否对所有内容进行了版本控制:团队中的新人使用新计算机并从版本控制中执行单命令检出,应该能够从该检出中获得完整的工作软件系统。
输送管道
使用诸如Jenkins之类的Continuous Integration服务器,您还可以配置传送管道 。 从本质上讲,交付管道是一个过程,在该过程中,将根据先前作业的成功来运行不同类型的作业。 在此管道中,您可以配置各个阶段,包括提交阶段,接受阶段等等。 每个阶段都基于上一个阶段的成功; 这种方法可确保您在每个连续阶段都降低候选发布版本的风险,直到将软件系统发布到生产中为止。 如图1所示,Jenkins表示了一个传递管道的示例:
图1. Jenkins持续集成服务器中表示的交付管道
![](/assets/blank.gif)
DevOps仪表板
一旦您有一个跨职能的交付团队专注于交付功能和稳定性,将每个人都放在同一个页面上(无论是图形上还是字面意义上)都变得非常有用。 DevOps仪表板显示了从更改到部署到生产的每个阶段,每个更改如何影响整个系统。 在本系列的后面部分,我将详细介绍一个开源仪表板,该仪表板提供有关正在开发的软件系统的实时信息。
合作
协作是DevOps的Struts之一。 传统的开发和运营团队倾向于孤岛工作,并限制团队之间的通信量,直到软件发布为止。 确保集体所有权,建立跨职能团队并扩大工程师的技能是增加协作并打破阻止定期交付软件的传统障碍的三种方法。
集体所有权
集体所有权是一种可以追溯到极限编程(XP)以及通常说来的敏捷方法论建立的实践。 但是,在连续交付的情况下,重点在于确保构成软件系统的所有类型的源文件都可供任何授权的团队成员进行修改。 这些包括应用程序代码,配置,数据,甚至基础结构。 一切都已编写脚本,并且可以修改。
跨职能团队
拥有跨职能团队意味着每个团队成员都要负责交付过程。 团队中的任何人都可以修改软件系统的任何部分。 相应的反模式是孤立的团队:开发,测试和操作具有其自己的脚本和流程,并且不属于同一团队。
跨职能团队由来自所有必要学科的代表组成。 交付团队不是将每个学科视为单独的集中式服务组织,而是成为关键的组织结构。 团队以专用的方式协同工作,以一致地交付软件,而团队之间在整个组织中进行交流时没有固有的时间障碍。 考虑组成(至少)业务分析,客户代表,DBA,开发人员,项目经理以及质量保证和发布工程师的每个团队。 通过跨职能团队,您可以减少阻碍沟通的“不是我的工作”综合症,并且可以减少在物理位置内和跨物理位置的团队之间建立有效沟通的众多“障碍”。
多技能的工程师
多技能的工程师是在软件交付过程的每个领域都熟练的团队成员。 开发人员应了解如何进行数据库更改。 数据库管理员应了解如何编写功能测试。 项目经理应了解如何将方案添加到自动化测试中。 通常,团队成员继续执行与其角色一致的功能。 (例如,DBA通常仍然专注于数据库。)但是,共享的知识大大减少了在地理位置分散的大型组织中引入的通信障碍。 这也限制了需要依靠一些关键人物来向用户发布软件的需求。
工具类
工具是敏捷DevOps的重要组成部分。 您为项目选择的工具取决于您的特定要求,但是一项基本规范是该工具必须从命令行运行。 这是因为您希望管道以无头模式或一键式运行。 (如果您有一个不提供命令行选项的旧版工具,则可以尝试以无头模式运行屏幕抓取,但这并不理想,并且经常需要定期维护。)在表1中,您看到了以下内容的列表:典型的DevOps工具集中的一些工具类型; 更多地关注工具的类型 ,而不是工具名称:
表1.支持DevOps的工具
工具种类 | 工具类 |
---|---|
基础设施自动化 | Bcfg2,CFEngine,Chef,CloudFormation,IBM Tivoli,Puppet |
部署自动化 | Capistrano,ControlTier,Func,Glu,RunDeck |
基础架构即服务 | 亚马逊网络服务,CloudStack,IBM SmartCloud,OpenStack,Rackspace |
构建自动化 | 蚂蚁,Maven,耙,Gradle |
测试自动化 | JUnit,Selenium,Cucumber,easyb |
版本控制 | Subversion,Git,IBM Rational ClearCase |
持续集成 | Jenkins,CruiseControl,IBM Rational BuildForge |
请记住, 表1中的列表仅是说明性的,而不是穷举性的( 有关更多工具列表,请参阅参考资料 )。
交付软件的道路更加平坦
通过Agile DevOps实现了软件版本和组织的扁平化。 在本文中,我评论了敏捷的现状,DevOps是什么,以及开发人员和运营部门如何能够更紧密地协作以在稳定的环境中更频繁地交付功能。 我介绍了一些新兴的DevOps模式,我将在本系列的后续文章中对其进行更详细的介绍。 最后,我提供了一些支持敏捷DevOps软件交付的工具的列表。
在下一篇文章中,您将了解支持脚本化环境模式的基础结构自动化工具。 我将介绍领先的开源基础结构自动化工具:Chef和Puppet。
翻译自: https://www.ibm.com/developerworks/java/library/a-devops1/index.html
全公司层级化、分层扁平化_扁平化软件发布过程相关推荐
- 举例说明儿化音的作用_儿化音的作用是什么
展开全部 普通话里儿化音变的作用有三个方面: (1)语法上起到区分词性的作用,如:"盖"是动词,而"盖儿"则是名词:e68a84e8a2ad6261696475 ...
- 分式化简结果要求_分式化简的结果有什么要求?
分式的化简与求值 分式的有关概念和性质与分数相类似,例如,分式的分母的值不能是零,即分式只有在分母不等于零时才有意义;也像分数一样,分式的分子与分母都乘以(或除以)同一个不等于零的整式,分式的值不变, ...
- 举例说明儿化音的作用_儿化韵有何作用举例说明
儿化韵有何作用举例说明 [篇一:儿化韵有何作用举例说明] 儿化 " 的作用 " 儿 " 连在别的音节后面作词尾时,就失去独立性,和前面的音节融 合成一个音节,使前一个音节 ...
- 分式化简结果要求_分式化简的结果为( ) A. B. C. D.——青夏教育精英家教网——...
我国农业因遭受酸雨而造成每年损失高达15多亿元.为了有效控制酸雨,目前国务院已批准了<酸雨控制区和二氧化硫污染控制区划分方案>等法规. (1)现有1份雨水样品,每隔一段时间测定该雨水样品的 ...
- 马化腾说视频号是全公司希望
我是卢松松,点点上面的头像,欢迎关注我哦! 这应该是,腾讯这家公司创办以来,马化腾最焦虑也最外露的一次讲话了,对于腾讯内部的大会,马化腾先生作了重要发言,因其在内部员工大会的讲话,而开始被网络热议.这 ...
- 马化腾:视频号基本是全公司的希望;雷军宣布小米人事调整:总裁王翔月底退休,卢伟冰晋升接任;QT 6.5 Beta发布|极客头条
「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...
- 钢化膜全覆盖非全覆盖的区别_钢化膜和水凝膜的区别
一.钢化膜 1.钢化膜就是使用钢化玻璃制作的手机膜,主要分为全覆盖和非全覆盖两类.顾名思义,全覆盖是指能覆盖包括屏幕显示部分和边框的钢化膜,而非全覆盖钢化膜通常只能覆盖屏幕显示部分和上下部分边框. 2 ...
- 机器学习结构化学习模型_生产化机器学习模型
机器学习结构化学习模型 The biggest issue in the life-cycle of ML project isn't to create a good algorithm or to ...
- 用户运营4大策略体系搭建:增长框架+用户建模+场景化分层+数据运营
用户运营体系是什么样的? 相信每个企业都有一套相对完善的用户运营体系,之前接触一些介绍用户体系的文章,基本将用户运营体系等同于用户分群策略和AARRR运营模型,实则这只是整个运营体系中的一角. 结合运 ...
最新文章
- EndDialog和CDialog::OnOK()
- python多进程队列中的队列_python 多进程队列数据处理详解
- SQLite中利用事务处理优化DB操作
- C语言程序设计基础之联合
- 在实际项目中,如何选择合适的机器学习模型?
- 全国专业技术人员计算机应用能力考试word2003题库版,全国专业技术人员计算机应用能力考试word2003...
- pip 升级 pip
- lamda表达式修改数据_关系数据库SQL语言简介
- java编程思想(注释文档)
- smarty编译,缓存原理
- 廖雪峰的Python总结
- jQuery实现选择“学科门类”、“学科大类(一级学科)”、“专业”(二级学科)实现三级联动
- 微软面试案例分析,绝!
- DS线性表—多项式相加
- WinINet 与 WinHTTP简介
- 市场分析-全球与中国木槿果实提取物市场现状及未来发展趋势
- fa-cog css,完整的Font Awesome 3.2.1 图标参考
- 12.10中兴通讯科技园研发大楼发生42岁工程师跳楼事件
- 【ESP32_8266_WiFi (九)】JSON基础
- A Man Called Ove
热门文章
- 面对诱惑,我才知道自己有多脆弱
- 短视频获客系统哪家好
- 【CAD二次开发】实现双击实体的响应
- iOS 《Quartz 2D编程指南》之【图片裁剪】(包含完整demo源码) :
- Android 给App加上屏保功能 类似广告功能的实现。
- 小米平板4可刷的linux,重磅!小米平板4更新MIUI,首次支持小爱同学
- 【英语语法入门】 第34讲 [被动语态 (4)]被动语态的疑问句
- 由于Skyline RabbitMQ导致NI Package Manager安装失败
- Scala:Scaladoc的生成方法
- Qt4.8类继承关系图(全网最全)