标签:无法获得 职责 基础问题 质量 常用 tail 运动 体系 监控
在前一篇博客中谈到了是上课学的是"上世纪"的软件工程思想,先买呢谈谈我推崇的软件工程思想----敏捷开发
“没有人喜欢敏捷,但我们不得不敏捷。就像没有人喜欢工作,但你必须工作。”这是我经常用来调侃敏捷的一句话。
试想一下,拿到一份完整详尽的需求文档,逐个功能Coding,测试部署上线。不需要再次确认需求,不会有人打断思路。没有需求更改,只要自己不犯错,不存在推倒重来这才是大部分开发人员最舒服的工作方式吧,简直太完美了。但它很像瀑布,一点都不敏捷。
既然我们喜欢的工作方式是传统的、瀑布的,为什么要敏捷?这还不都是市场环境逼的。今天的市场向我们提出了三个问题:
1.如何做出真正满足用户需求的产品?
我不确定这世上是否有人可以做到,他所做出的全部决定都是对的。但绝大多数人是无法一次性做出真正满足用户需求的产品的。我们无法预测未来,我们必须通过一次次的测试,去寻找用户需要的产品是什么?想要更快地获得好的产品,必须迅速将产品推向市场,快速试验,避免走弯路。
2.如何满足不断变化的用户需求?
今天所有的事情的都在快速变化,用户的需求也在变化。毫不夸张地说,我们正在全力开发的一些功能,当它们上线的时候,我们的用户已经不再需要了。我们没有办法让一切不变,我们只能选择去拥抱变化。
3.如何同时满足不同层次用户的需求?
过去我们的产品会遵循产品生命周期,早期追求新奇的尝鲜者,中期普通大众,后期落后者。今天,产品的生命周期变化非常地快,我们可能会同时面对尝鲜者、普通大众、落后者,不同的用户类型的需求是不一样的,你如何满足他们?我们必须快速响应,没法快速响应,就没法留住用户,没有用户就没有一切。
迅速将产品推向市场,拥抱变化、快速响应。今天的市场向所有的从业者提出了一个要求:拥有应对快速变化的需求的软件开发能力。而敏捷就是赋予团队应对快速变化的需求的软件开发能力的方法,而这就是敏捷流行的原因。
敏捷绝非某一种特定的开发方法,它只是一种应对快速变化的需求的一种软件开发能力。敏捷本身只包含了《敏捷软件开发宣言》和《敏捷软件的十二条原则》两份文档。敏捷相信,只要符合这两份文档的开发方法,就能让开发团队拥有应对快速变化需求的能力,这样的开发方法都叫做敏捷开发方法。
敏捷开发的方法有很多:ASD、AUP、DSDM、XP、FDD、Kanban、RAD、Scrum。目前国内最流行的应属Scrum。
Scrum本意是指橄榄球运动中的“带球过人”,它可以解决非常复杂的项目,并且能高效并创造性地交付高价值的产品。Scrum包含3个角色、3个工件、5个价值观、5个事件(详情https://www.scrum.org/)。
相比其他敏捷方法,Scrum既不简单又不复杂。它有完善的指南,你可以按照指南,轻易在团队内推广尝试。但想要实践好Scrum,又需要很好的技巧。这种易上手难精通的方法,特别适合培训机构。所以近几年,关于Scrum的培训机构遍地都是。可以说,在Scrum流行这件事上,这些培训机构做了很大的贡献。
下面来谈谈Devops:
DevOps对不同的人来说有不同的意义。在深入思考这个主题之前,我认为明确DevOps对我的意义非常重要。
维基百科将DevOps定义为:
DevOps(区分开的“开发”与“运维”的复合体)是一种软件工程文化和实践,旨在统一软件开发(Dev)和软件运维(Ops)。DevOps运动的主要特点是在软件构建的所有步骤(从集成,测试,发布到部署和基础架构管理)中大力提倡自动化和监控。DevOps旨在缩短开发周期,增加部署频率和更可靠的版本,与业务目标紧密结合。
DevOps的定义对于我来说更狭义且稍有不同:
DevOps是开发人员负责在生产中全天候运维服务的实践。这包括使用共享基础架构原语进行开发,测试,待命,可靠性工程,灾难恢复,定义SLO,监控设置和告警,调试和性能分析,事件根本原因分析,准备和部署等。
维基百科与我对DevOps的定义(开发理念与运维策略)之间的区别很重要,这是我在个人的行业经验中得出的。DevOps“运动”的一部分是将前进缓慢的“遗留”企业引入现代高度自动化基础设施和开发实践,其中包括:松散耦合的服务,API和团队;持续集成;小型迭代部署;敏捷的沟通和规划;云原生弹性基础设施等等。
在我职业生涯的最后10年里,我曾在超快速发展的互联网公司工作过,包括AWS EC2,上市前的推特和Lyft。此外,由于创建和探讨Envoy的缘故,我花了两年时间与无数超速发展的互联网公司的技术架构和组织进行会面和交流。对于所有这些公司而言,拥抱自动化,敏捷开发/规划以及其他DevOps“最佳实践”是一个既定的因素,能很好地解释生产力的提高。相反,这些工程组织面临的挑战是如何平衡系统可靠性与业务增长,人员增长和竞争(业务和招聘)的极端压力。本文的其余部分均基于我的个人经验,可能并不适用于所有情况,尤其是那些习惯了每季度仅全量发布一次和正在被引入更快速和敏捷的开发实践的缓慢前进的企业。
在我称之为现代互联网时代的过去大约三十年中,互联网应用程序的开发和运维已经经历了(在我看来)三个不同的阶段。
在第三阶段此类型公司不雇用专职运维人员的变化至关重要。虽然,很显然这样的公司不需要全职系统管理员来管理托管设施中的机器,但是之前从事这类工作的人通常也具备其他20%的技能,例如系统调试,性能分析,运维的直觉力等。新公司成立需要那些缺乏关键性、不易替换的技能的“劳动力”。
DevOps,正如我所定义的那样(开发和运维各自服务的工程师),对于现代互联网初创公司来说效果非常好,原因有以下:
事实是大多数创业公司都失败了。因此,任何花费大量时间在Google中创建基础架构的早期创业公司都是在浪费时间。我总是告诉人们坚持他们的单体架构,除了人力可扩展性问题(通信,规划,紧耦合等)需要向更加分离的架构迈进之外,不要担心任何其他问题。
那么当现代(第三阶段)互联网初创公司获得成功并进入高速增长时会发生什么?一些有趣的事情将同时开始发生:
普遍大部分遵循早期创业特征,现代互联网超高速发展公司最终都以类似的方式构建其工程组织。这种通用组织结构由一个集中的基础架构团队组成,该团队支持一组实施DevOps的垂直产品团队。
核心基础架构团队如此普遍的原因在于,正如我上面所讨论的那样,超高速增长带来了一系列相关的变化,包括人员和底层技术,现实情况是,如果每个产品工程团队都必须单独解决有关网络,可观察性,部署,配置,缓存,数据存储等方面的常见问题的话,那先进的云原生技术就太难应用了。作为一个行业,我们与“Serverless”技术差距已有数十年,它足以完全支持高可靠,大规模和实时的互联网应用,且可以让整个工程组织可以在很大程度上关注业务逻辑。
因此,核心基础架构团队的诞生是为了解决大型工程组织的问题,而不仅仅是基于云原生基础架构原语存在的问题。显然,谷歌的基础设施团队比Lyft这样的公司的规模要大几个数量级,因为谷歌正在从数据中心层面开始解决基础问题,而Lyft依赖于大量公开可用的原语。但是,创建核心基础架构组织的根本原因在两种情况下都是相同的:抽象尽可能多的基础架构,以便应用程序/产品开发人员可以专注于业务逻辑。
最后,我们得出了“可替代性”的概念,这是纯粹的DevOps模型失败的关键,当组织超出一定数量的工程师时。可替代性表示所有工程师都是平等的,他们都可以做所有事情。无论是作为一个明确的招聘目标(至少是亚马逊或许还有其他的公司),或者通过“训练营”的方式(明确表示在没有团队或角色的情况下)招聘工程师,可替代性已成为许多公司在过去10到15年间的现代工程的一个流行组成部分理念。什么原因导致这样?
然而,正如许多新的互联网初创公司所做的那样,这种想法已经发挥到极致,导致只聘请全能型(全栈)工程师,期望这些(DevOps)工程师能够处理开发,QA和运维。
对于早期初创公司而言,可替代以及通用型人才招聘通常都很好。然而当超出一定的规模,所有工程师都可替代的想法就变得几近荒谬,原因如下:
具有讽刺意味的是像亚马逊和Facebook这样的组织也优先考虑软件工程角色的可替代性,但他们同样重视开发和运维之间的技能区分,继续为每个人提供不同的职业道路。
纯DevOps如何以及在何种组织规模下失败?出了什么问题呢?
在什么规模下工程技术组织里的某些环节会开始掉链子,因基础设施团队为支持纯粹的DevOps模型让组织开始出现人为扩展问题。我认为这个大小取决于当前公有云原生技术的成熟度,这篇文章说的是总共有几百名工程师这样子的规模。
对于成立已超过10年的公司,网站可靠性或生产工程模型已经很普遍。虽然各公司的实施情况各不相同,但我们的想法是聘请能够完全专注于可靠性工程而不受产品经理影响的工程师。但是有些实施细节非常相关,其中包括:
该实施计划的成功及其对整个工程组织的影响往往取决于上述问题的答案。但是,我坚信在一定规模的情况下,SRE模型是将工程组织扩展到许多工程师的唯一有效方式,超出了纯粹DevOps模型发生故障的程度。事实上,我认为在本文概述的人员扩展限制之前成功引导SRE计划是现代超高速发展型互联网公司的工程领导的关键责任。
鉴于目前业内实施的案例过多,这个问题没有正确的答案,所有模型都存在问题。我将根据我过去十年的观察概述我认为的最佳点:
如上所述,在成长阶段早期实施的成功的SRE计划,以及对新员工和继续教育和文档的实际投资,可以提高整个工程组织的门槛,同时减轻之前描述的许多人员扩展问题。
很少有公司能达到超快速发展阶段,那么这篇文章表达的能直接适用。对于许多公司而言,因为涉及的工程师数量,所需的系统可靠性以及业务所需的产品迭代率,基于现代云原生基元的纯DevOps模型可能完全足够。
适用于这篇文章的相对较少的那些公司,关键的要点是:
现代超高速发展的互联网公司(在我看来)存在极大的倦怠,这主要是由于严苛的产品需求以及对运维基础设施的投资不足。我认为领导层可以在组织的稳定性成为主要障碍之前先采取行动以逆转这一趋势。
虽然较新的公司可能会认为云原生自动化的进步正在使传统的运维工程师过时,但事实并非如此。在可预见的未来,即使在利用最新技术的同时,也应该认识和重视专门从事运维和可靠性的工程师,以提供任何其他方式无法获得的关键技能组合,并且他们这一重要角色应正式编入到早期发展阶段的工程组织中。
参考:
https://www.zhihu.com/question/19645396/answer/410025559
http://dockone.io/article/8189
标签:无法获得 职责 基础问题 质量 常用 tail 运动 体系 监控
原文地址:https://www.cnblogs.com/dingzihu/p/10181614.html