今天的文章来自我的同事平静静,SAP成都研究院一位程序媛。平静静2010年加入SAP,熟悉她的人一般都叫她平静。在她待过的每个小组,平静静都不是最引人瞩目的开发人员,然而她总是能一如既往,保质保量地完成开发任务,为团队默默地做出自己的贡献。

Jerry和平静静曾经在同一开发小组里共事过三年多的时间。2013年时,我们所在的CRM开发团队曾一起努力,将Twitter, Facebook和新浪微博等社交媒体的支持添加到CRM呼叫中心中去。令Jerry至今记忆犹新的是 ,早在2013年9月,平静静就开始使用Selenium进行SAP CRM WebUI的自动化测试用例开发,并且是当时SAP成都研究院最早使用Git进行源码管理的同事之一,比2014年成都团队大规模从ABAP技术栈切换到Java技术栈上整整早了一年。Jerry对于Selenimu的学习最早也是从阅读平静静的代码开始的。当时的CRM团队也是SAP成都研究院最早开始实践探索性测试(Exploratory Test)的团队,而平静静就是当时的主要组织者。

下面是平静静的正文。


大家好,我是平静静,SAP成都研究院Customer Engagement Center团队的DevOps Engineer。您一定听说过Development Engineer (开发工程师),也听说过Operation Engineer (运维工程师),那DevOps Engineer是个什么工种?想回答这个问题,在我担任DevOps Engineer这短短的一年看来,其实既有只缘身在此山中的困惑,也有不足为外人道的窘迫。

文章目录

  • DevOps in SAP
  • DevOps in SAP Customer Engagement Center
  • DevOps Engineer到底要干些什么?
  • DevOps Engineer的一天,大概是什么样的?

现在就让我梳理一下自己对DevOps的粗浅认识和感受。如果您对DevOps的话题感兴趣,恰好身边也有DevOps小伙伴,不妨也跟他们聊聊。

DevOps in SAP

早些年SAP的产品大多是开发周期较长的On-Premise产品,比如ERP,CRM。SAP除了开发团队,还有一个专门负责产品维护的部门,名叫IMS。那时候的模式是开发团队完成开发之后,就可以妥妥地移交给IMS团队。一年之后新的版本发布,再继续移交。任何客户的问题如果SAP Primary Support解决不了,那么都是交给IMS团队处理,开发团队可以很大程度上心无旁骛地继续做下一阶段的开发。

2015年左右,随着公司的战略转型,一系列基于云的新产品推出,SAP开发团队也在不断追求没有最短只有更短的交付时间。1年,3个月,1个月,2周。。。试想一下,原来那套基于On-Premise的开发和维护的模式是不是就搞不定了?也许IMS团队的同学会跳出来说,容我们缓缓,上周移交给我们的东东我们还没处理完bug呢,这周又来这么多新功能,实在是Hold不住了。。。另一方面,SAP开发团队也想了解,产品做得到底怎么样,应该怎样迭代得更好呢?但是隔着SAP Primary Support以及IMS团队,离客户这么远,信息从何而来呢?

不只是SAP一家公司在思考。战略转型,也就意味着组织结构需要做出必要的调整。国内外的很多软件公司都在寻求新的产品开发和维护模式,使得各个团队之间减少时间损耗,从而更加高效地协同工作。如果开发和维护不再是界线分明的两个团队,而是由一个团队同时Hold住开发和维护,是否可行呢?

借用维基百科中关于DevOps的定义:

DevOps(Development和Operations的组合词)是一种重视软件开发人员(Dev)和IT运维技术人员(Ops)之间沟通合作的文化、运动或惯例。透过自动化软件交付和架构变更的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。

https://zh.wikipedia.org/wiki/DevOps

DevOps in SAP Customer Engagement Center

关于DevOps理念在一个团队中如何落地,细分一下,大致有:

  1. 开发即维护:每个小伙伴都既是开发,也是维护,不分工;
  2. 开发和维护:团队中一部分小伙伴是开发,另一部分是维护,分工明确;
  3. 一半开发,一半维护:团队中的维护工作由开发小伙伴们来定期轮岗。

第一种策略最贴近DevOps的理念。第二种策略最接近传统,第三种策略折衷。没有孰优孰劣,合适的才是最好的。要考虑的因素既要保证产品的交付,同时兼顾团队小伙伴们自己的职业兴趣点和专长,以及沟通成本。

SAP成都Customer Engagement Center团队最初在转型DevOps时,采用第三种方式,由开发的同学每两周轮一次岗。每位同学在轮岗的两个星期中,50%的精力用来做开发,另外的50%精力用来处理DevOps相关的任务。在运行一段时间之后,收到的反馈认为,虽然仍有50%精力做开发,但会影响大家做事的专注力,整体效率不是太高。同时,有时轮岗的交接做得不到位会导致后续要花更多的成本在了解问题的上下文和跟踪问题上。

成都团队在之后的运行中调整为了第二种方式,虽然更接近传统方式,但弥补了方式三的短板。

DevOps Engineer到底要干些什么?

DevOps Engineer是指DevOps的模式下,身兼开发和维护的Engineer。当然在现实生活中,DevOps Engineer并不一定跟Developer承担同样的开发工作。那么DevOps Engineer在他/她们的小角落里都在做些什么呢?

DevOps,就像这个词的构成方式,是Development和Operation的组合,那么一千个组就可能有一千种组合方式。这取决于DevOps Engineer的资源,以及团队目前所处的阶段。

就SAP成都Customer Engagement Center团队而言,团队目前处于已发版,有客户的状态。这意味着可能会有客户报过来的ticket,以及来自售前团队以及内部产品经理团队的demo 需求,也可能会有更多的内部ticket以及tenant setup的要求。因此DevOps同学会投入更多精力在Operation方面,其实也就是下图中的客户生命周期(Customer Life cycle)方面。

再比如,如果团队处于开发阶段,未发版,那么来自于客户生命周期方面的任务不多,可以更多地关注CI/CD(持续集成 / 持续交付)以及监控等环节了。

在有更多的资源的情况下,DevOps同学就可以专注于偏dev方向的话题上,比如客户系统的自动化创建,cloud reporting等等。

从客户签单的那一刻起,就进入了客户生命周期管理:首先是客户系统的配置,测试,将系统交付给客户使用;其次是支持客户在使用系统过程中遇到的各种问题;再到客户系统的升级,以及可能的迁移等。这一系列活动都是直接跟客户生命周期管理相关的。

那么,怎样保障客户在使用云产品的过程中能够达到合同中所约定的服务品质(SLA:Service-Level Agreement)呢?是不是代码的质量足够好就可以了呢?当然,代码质量好肯定是产品的重要保证,但不同于On-Premise产品之处在于,云产品有更多的不确定性,也就更加需要监控工具的辅助。

首先,采用微服务架构的产品需要考虑部署在云上的服务是否可达。打个比方,如果部署在云上的服务处于stop的状态,那么客户的系统肯定是无法正常工作的。为了了解云上的服务是否还“活”着,可以使用availability check(SAP内部工具),每间隔一定的时间就对云上的服务发起请求。通过请求返回的响应值来判断云服务的状态,从而达到监控的目的。为了接近实时,间隔的时间可以尽可能的短,比如说每分钟发起一次请求。同时为了避免误判,也可以调整设置,当2或N次以上的请求都显示不可达时,才发出警告提示。这样,当有异常情况出现时,比如确实有服务“挂”了, availability check就可以第一时间通过邮件通知到相应的团队。或者如果还连接了SPC系统,还可以在SPC中创建ticket通知到一线的云支撑团队。

另一方面,云上的服务只要是live状态就可以了么?那么如果遇到服务响应时间下降或者错误率升高,会不会客户很生气,后果很严重呢?这个时候,就需要别的监控工具了。目前正在服役的工具是Dynatrace。每个团队可以根据自己的情况定制监控面板。此外在遇到具体问题时,可以跳转到具体的某个服务页面查看相应的指标,比如Response time, Failure rate, CPU consumption, Throughput,来分析问题可能的原因,以及相应的对策,比如是否需要增加服务的instance或者memory。如果调整之后的性能仍然不够满意,那么就需要深入看看代码层面是否有问题,检查是否存在可优化的地方。

除了以上提到的availability check以及Dynatrace,行业中还有很多其他的监控工具,具体使用哪种取决于公司或者每个团队的选择。

客户在使用系统的过程中,难免会出各种各样的问题,有的疑似bug,于是客户一封ticket就报了过来。DevOps或者开发团队想要重现一下问题,debug看看。额,debug对于云产品实在是种奢侈,只好求助于问题发生时留下来的蛛丝马迹。这个时候如果云平台自带的查看日志的命令不够用,比如说cf logs,那么就只好借助于Kibana这一类的可视化日志分析工具了。

如果说,监控是为了实现更好的服务质量,那么CI/CD就是为了在不影响产品质量的前提下更快地交付产品。将versioning,build,各种测试,代码扫描,以及deploy等步骤作为一个pipeline来整体考虑,这是现在更通用的做法。据了解,目前有的团队自己来负责从Jenkins服务器到pipeline的配置,有的团队则借助于SAP内部的CI/CD工具,比如目前在服役的codepipes,或者piper。使用工具的优势在于,节省了Jenkins或Bamboo服务器等维护成本,通过简单的少量配置代码就可以完成pipeline的构建。劣势在于,由于这类工具是多个开发团队使用,有资源上受限的可能性,以及当遇到服务器问题时使用上的不灵活性。

所以,在我看来,客户生命周期管理是核心,监控以及CI/CD其实也是为了更好的服务于客户生命周期。

DevOps Engineer的一天,大概是什么样的?

如同前面提到的,不同组的DevOps Engineer工作内容可能很不一样。举个例子,有时候会收到几个ticket,急着救火,有时候会耗在配demo上,捣鼓半天。有时候在发版的前期跟难用的pipeline工具死磕。DevOps Engineer不是最懂需求的,甚至也不精于测试和开发。但是会发现当有问题问了一圈无果时,也许问问DevOps Engineer,他/她或许是知道答案的那个人,或者能够帮您找到真正有能力解决问题的人。

感谢阅读,以及了解DevOps的那些事。


要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

SAP成都研究院DevOps那些事的更多相关文章

  1. SAP成都研究院2018年总共87篇技术文章合集

    2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...

  2. SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考

    今天的文章来自Jerry的同事,曾经的搭档郑晓霞(Zheng Kate).郑晓霞是在Jerry心中是一位很有实力的程序媛,2011年从西安某软件公司跳槽到SAP成都研究院.当时,成都研究院的CRM团队 ...

  3. SAP成都研究院姚瑶:软件质量保证工作的变迁

    大家好,我是来自SAP成都研究院Revenue Cloud 团队的质量工程师 , yoyo.很高兴可以和大家分享我个人的工作体会.每个团队都有QE(Quality Engineer), 相信大家对QE ...

  4. SAP成都研究院许聚龙:Hello, Coresystems!

    Jerry的前一篇文章<SAP成都研究院数字创新空间沟通S/4HANA和C/4HANA的智能服务演示视频和Coresystems分享预告>已经提到,接下来会由SAP成都研究院数字创新空间的 ...

  5. 我与SAP成都研究院吴院长的二三事

    这几天Jerry没怎么看手机,今天才注意到,昨天SAP中国研究院公众号上发布了一篇文章:SAP高管说: 体验经济时代下的SAP客户体验.仔细一看,这不是咱SAP成都研究院的吴院长么. 在今年没有发生部 ...

  6. SAP成都研究院李三郎:SCP Application Router简介

    今天的文章来自李贝宁(Ben),SAP成都研究院的资深程序猿和架构师. 作为成都研究院里同时精通Java, JavaScript和ABAP这三门编程语言的数位同事之一,Ben曾经先后担任了成都CRM ...

  7. SAP成都研究院35岁以上的开发人员都去哪儿了?

    2006年成立的SAP成都研究院,位于天府软件园B区.如今,因为研究院发展的不断壮大, 已经搬迁到天府软件园E区了,因此,发生在图片building各种充满悲欢离合的故事,已经成为一部分小伙伴脑海中难 ...

  8. SAP成都研究院廖婧:SAP C4C社交媒体集成概述

    曾经有朋友在知乎上向我提问,咨询在SAP成都研究院工作的体验. 当时,我的回答提到一点,SAP注重工作与生活的平衡,这也是SAP中国官网强调的一点. https://www.sap.com/china ...

  9. SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成

    今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...

随机推荐

  1. 模块 DLL C:\WINDOWS\system32\inetsrv\aspnetcore.dll 未能加载。返回的数据为错误信息。

    更新了win10的版本后,就启动原来的iis发布的程序 程序池就自动关闭.后来 启动网站 iis程序池自动关闭. 在为应用程序池“.NET v4.5”提供服务的工作进程“21908”中,协议“http ...

  2. Android开发中,那些让你觉得相见恨晚的方法、类或接口

    Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方 ...

  3. C#连接Oracle数据库解决报错(需要安装Oracle客户端软件8.1.7)的问题

    1.通过nuget安装  ManagedDataAccess 2.引用 using Oracle.ManagedDataAccess.Client; 注:最低framework4.0 测试连接: // ...

  4. MVC 中dapper的日志功能+程序报错修改

    由于之前的项目说最好要有日志功能,正好之前看过几篇这方面的文章就弄了点东西. 这是EF日志受启发很大的一个原文: http://www.cnblogs.com/GuZhenYin/p/5556732. ...

  5. SQL依据特殊符号分批截取字符串(案例)

    网上的问题: 下面是Insus.NET的解决办法,仅供参考. )) INSERT INTO #temp([Source]) VALUES ('2012-04-27 16:49:24$1$2'), (' ...

  6. Python基础(四)——迭代器/对象,生成器

    首先廖雪峰网站写的内容就我目前初步学习来说,已经相当详实,知识点平铺直叙让人易接受,所以以下内容均作为一种摘记记录以及补充. 1. 列表生成器 主要目的是创建 list .多看例子就能清楚: #列表生 ...

  7. 【读后感1】SQL2008技术内幕- SQL逻辑查询处理

    引言观点 1. 编程语言日新月异,但是从没有人否定sql 在现代编程中的巨大作用和 持续的可利用性.SQL以对人类友好的阅读体验提供数据查询能力( 相比其他编程语言 ), 同时在各种数据库平台中,基础 ...

  8. Unite 2017 干货整理 优化篇

    Unite 2017 干货整理 优化篇 2017年05月16日 将Unite 2017的一些演讲做了整理.  本篇有内存,CPU.GC.UI.渲染性能指标.Tips几个小节.  内容持续整理中. 内存 ...

  9. 图论2 最近公共祖先LCA

    模板 吸取洛谷P3379的教训,我决定换板子(其实本质都是倍增是一样的),把vector换成了边表 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下 ...

  10. python进阶12 Redis

    python进阶12 Redis 一.概念 #redis是一种nosql(not only sql)数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,还提 ...