我们如何在一天内将整个团队移植到另一种语言中(实际上不是)


开始在Go中快速“扎根” PHP开发人员的模板

15年来,我们一直在使用PHP做后端。 然后,有一天做出了一项战略决策:首先,重写Go上最重的位置,然后在其上开发新的服务。

想象一下:您想与一个由40名开发人员组成的团队讨论一种新语言,他们精心准备PHP,以至于他们将一个多线程实时和高可用性系统组合在一起。 在最坏的情况下,他们会烧死您,充其量他们会听,但是他们会像以前一样继续这样做。 这是强制输入语言的情况。

因此,我们决定先安排一次黑客马拉松,然后邀请所有人参加黑暗的一面。 如果至少有十个人招募了他们,那么随着时间的流逝,他们将向其他所有人展示这是多么酷的个人例子。

我将分步告诉您如何与您重复这种经历。 以及我们实施的结果。 以及关于一名PHP开发人员看到一种新语言时所发生的事情。

我们从模板和CI / CD的准备开始,这使您可以在15秒内关闭。 要自己编写,大约需要两个星期。 我们事先做了。

步骤1.介绍Golang


我们经常有很多内部研讨会。 有人想讲一些东西,写一个广告,聚集人们并讲述。 碰巧这些都是管制俄罗斯空中交通的特性,碰巧是关于旅行的故事,但更多的是我们谈论的是已实施的某种技术或功能。 这对其他人可能有用。 因此,我们在Go上组织了一次内部研讨会,在其中讨论了该语言的好处。 快速(无需手鼓即可编译:PHP也可以编译,但更困难),开箱即用的多线程,非常简单的支持,您可以在没有笔记本的情况下直接在笔记本中编写,即没有痔疮具有与开发框架一起拖动的三级依赖关系。 15秒内部署完毕。 看来,我们的情况甚至没有任何明显的缺陷。 我们建议尝试。 这就像是一个关于另一个世界的故事:这是语言,看它与众不同,下周末将举办有兴趣的黑客马拉松。

步骤2.文档


黑客马拉松比赛开始前三天,我们发送了一个链接,指向一个半小时的入门课程,内容涉及语法,基本数据类型和功能。 和基本文档。 这是开发人员得到的:

golang.org/doc
tour.golang.org

加上内部的高级联系人。

步骤3.组


此外,我们建议分成几组,并以新的语言提出我们现在和现在想要执行的任务。 他们立即警告说,黑客马拉松比赛将在下班后(星期六)在办公室进行,此事是自愿的,但有可能解决战斗任务并与认识该语言细微差别的人以几乎配对的方式在实践中学习。 这引起了40个人的兴趣,他们开始分组战斗并招募任务。 并非每个人都成功完成了小组:许多小组只完成了一项任务,小组只有两个人,而很少-三个人。 这些任务本身就是积压的工作,或者与复制某种抑制作用有关。

最终目标是在hackathon上完成一项任务,然后将其汇总并“出售”给产品负责人(方向经理)。 本着这样的精神:“看,它在40秒钟之前就起作用了,现在它可以将所有操作一分为二。” 对于在团队中成功引入该语言而言,这一部分最重要的是它在战略上的成功:一开始就需要取得小小的胜利。

步骤4.看不见的工作


我们为基础架构准备了一个模板(如上所述),该模板使我们可以立即运行,而无需跳舞即可构建和连接所需的一切。 该模板替代了框架。 传播它没有多大意义:我再说一遍,这对我们来说是非常监禁的。

我将仅列出模板中规定的功能:

  • 与k8s集成。
  • 将指标导出到Prometheus。
  • 通过环境变量进行配置。
  • Http服务器。
  • 开放式跟踪。
  • 记录仪

我们长期从事Kubernetes的研究,作为解决方案,我们选择了OpenShift,它为自定义和配置CI / CD提供了巨大的机会。 因此,我们立即在k8s下对模板进行了锐化。 在OpenShift中创建的应用程序将创建存储库,收集应用程序框架,k8s中的服务,应用安全策略,收集二进制文件,在k8s中进行部署,并且不到一分钟即可在网络上获得该服务。 因此,黑客马拉松也成为了将开发人员介绍给我们未来的PaaS的盛会。

我们还使用基本指标在Grafana中准备了一个仪表板,为Kibana和Jaeger设置了代理出口日志。 对于每个服务,都会生成服务链接,您可以在该链接上立即获取所有必要的信息。

接下来,有必要就黑客马拉松参与者解决问题所需的数据库访问达成一致。 这是错误的,但是在工作期间我们以只读方式连接到军事基地。 这是为什么星期六是这一天最小的负荷的另一个原因。

他们警告厨房(有关活动,我免费给我们免费提供小吃 -奶酪-水果,但不提供热食)。 食物被带到了办公室,这样我们就不会分心。

步骤5. Hackathon本身


由于明显的原因(家庭,放松),有些人在星期六失败了,所以我们将15个人分为几个电话。

他们讨论了我们的PaaS平台,如何从模板创建应用程序,如何使用模板。 这个框架(其中包含用于收集度量标准,运行状况检查和度量标准,连接到数据库等的包装程序)展示了如何连接各种不同的事物。 可以随时删除所有内容(模板也已分发给黑客马拉松)。 这是一个现成的应用程序,需要扩展。

他们讨论了Kubernetes的部署和开发功能(配置,日志记录,指标,使用现成样本,为处理器和内存分配资源等)。 他们试图部署“你好,世界!”。



伙计们自己创造了服务。 我对模板的简单性和易用性感到惊讶。 有人已经有时间练习Golang,有人刚刚翻阅了文档。



我们并没有一个目标来展示如何写得好,我们必须获得一个粗糙的功能代码,并展示一切如何快速进入预生产阶段,一切如何快速运行以及进行编辑的难易程度。

计划是这样的:团队写信,如果您有问题,我们会回答。 然后是一次回顾会议,并提供有关如何在Golang上做一些更正确的架构方面的帮助。

在PHP中间层的认知扭曲中,值得注意的是一个线程中的“旧”思维方式。 Go具有良好的内置竞争模型和开箱即用的多线程,而PHP中没有。 事实证明该代码可读性强,很少有人期望。

实际上,我们并不总是使用多线程。 取决于任务。 但是在引擎盖下,她也是如此,并且在必要时,由于她,速度也会增加。 例如,为任何传入的REST请求创建一个单独的goroutine。 Golang可以同时处理多个请求,而默认情况下,大多数其他语言(包括PHP)将它们排队并为每个工作程序在一个线程中处理它们。

第二个特点是错误返回带来的巨大痛苦。 如果多线程只是一种不同的体系结构,并且很容易在一两个小时内就习惯了,那么在从PHP切换到错误的情况下,这就是整个思维模式的改变。 从函数返回错误是Go中的主要范例。 在PHP中,try-catch通常将事物包装起来。 在这里,需要在函数主体中进行显式处理。 他们积极抵制,一些人被这种“减速”残酷地轰炸。 这是因为该方法非常接近TDD,并且TDD在编写代码时需要耐心,但调试起来很容易。 这会逐行增加代码“如果-错误”,但是一旦您写入就不返回。 这在微服务的体系结构中非常重要,因为微服务像蘑菇一样增长,并且一个开发人员可以编写数十个微服务。 不断切换上下文和调试错误非常昂贵且效率低下。 如果一切正确完成,那么该应用程序将在开发过程中有效运行多年。 在相同情况下的PHP中,如果代码编写不正确,很可能会不断弹出新的错误,然后有必要再次调试所有内容。

原来主要是鞋带。 当功能部分启动时,他们已经想出了如何最好地将其分解为软件包。 然后进行了审查。 当Go-senior帮助您时,它会非常有用。 他们向人们展示了如何用RAM中的缓存替换对基础的持续访问。 有人帮助并行执行重写了代码。 在某个地方有一些小插件,例如PHP中的HTTP服务器传统上会死掉,但在这里仍然挂起。

步骤6.仓库


在黑客马拉松结束时,代码被折叠到了存储库中,每个人都可以看到相邻团队的代码并发送拉取请求。 这也是培训的一部分,在一周中,这些要求非常活跃。

总结


在大约15个人的两个流中进行了八小时的黑客马拉松(我提醒您,在70位开发人员中,有40位想尝试Go并收到了文档和模板,但并不是每个人都可以参加一天或想亲自参加)。

四分之一的服务立即产生了预期的结果。 另一部分要么需要对PHP整体进行长时间的修改,要么就需要超过八个小时的宽度。 大约一半的服务在以后出售之前就已完成。

结果,每个人都熟悉该语言,OpenShift平台,如何将它们结合在一起等等。 我们看到了应用程序模板和新的CI / CD,并获得了整套工具来进一步解决Go上的问题。

然后将功能“出售”给产品所有者。 我们回答了团队负责人的架构问题。

在下个月,几乎所有人都为部门的需求添加了一个模板(这是一个微型框架)。 结果,他变得更大了。 是的,模板的另一个功能是:整个配置-通过环境变量,即通过本地开发,以及切换到preprod-prod时,所有功能均能完美地平等地工作。 Docker很好。

Go不仅从黑客马拉松走向了大众。 模板出现在用于PHP和Node.js的PaaS平台中,但是同样如此,开发人员经常选择Go作为微服务的语言。 结果,实际上,在黑客马拉松之后编写的所有新销售的微服务都是专门在Go上编写的。 也就是说,我们切割了整体,并立即在Kubernetes下编写了所有新内容。 到今年年底,我们将几乎完全搬到那里。

那些没有来的人问他们的同事。 然后他们接触并询问语言,在后台执行一些任务(针对主要工作),然后将代码放入存储库中,并从其他刚刚受过培训的开发人员和Go专家那里收到拉取请求。 对书籍感兴趣。 也就是说,我们仍在第二条线的技术支持上几周。

对于那些想继续学习的人,他们在Telegram中创建了一个包含书籍和更多内容的小组。 我们还组织了一个Golang开发者协会,每周在这里讨论工作中出现的问题,开发通用组件,分享良好做法。 任何开发人员都可以输入。

最大的后果是一个月后,我们重写了最繁忙的部分之一,并且开始在产品中运行约六千倍。 但我最好单独讨论一下:不仅有该语言的功能,而且还有多线程的实现,一些体系结构上的改进以及一些萨满主义。 最重要的是我们了解该语言的经验,如果您至少有一位围棋专家将花费几周的学习时间,通常很容易与您重复使用该语言。

关于我们开发的其他文章: 15年历史的巨石历史, 厨房杂货店的处理方法开发人员应了解的业务知识尤其是机票的返还

Source: https://habr.com/ru/post/zh-CN470461/


All Articles