7月28日,我们的Instagram帐户和YouTube与Badoo伦敦办公室的领先PHP开发人员Alexander Vysotsky进行了现场直播,后者在反垃圾邮件团队中工作。Sasha谈到了如何用PHP创建Highload项目,他在伦敦的生活,当然还有Badoo。
我叫Alexander Vysotsky,我是Badoo的领先PHP开发人员。我们正在开发约会应用程序Badoo和Bumble,它们在全球拥有超过5亿用户。
我们在不同的国家/地区设有多个办事处,但大多数开发商位于莫斯科和伦敦。Badoo开发团队共有大约300名员工。我们有20个开源项目和许多内部工具,我们经常在我们的Habré博客上谈论它们。
今天,我想告诉您在一天两次发布,一个真正的高负载和一百万行代码的条件下,在Badoo担任后端开发人员的感觉如何,如何适应国外的生活和工作,以及如何使家人团聚。
我如何去Badoo
我的家乡是萨拉托夫,在那里我也接受了专门的教育:我毕业于SSU计算机科学和信息技术学院的专业和研究生课程。从研究生院毕业时,他设法在各个领域担任后端开发人员:从旅游业到游戏业。
2017年中,主要项目的工作结束了,而我面前又浮现了一个问题,下一步该怎么做:在萨拉托夫寻找新事物,搬到莫斯科或圣彼得堡或去外国公司?至此,我已经了解Badoo,并申请了伦敦办事处的空缺职位。是的,我没有足够的经验和知识来获得报价。但同时我收到了德国和荷兰的两个工作机会。我们决定与我的妻子一起搬到一家德国公司工作。一年半的时间,我们住在莱比锡(Leipzig)-德国最大的城市之一,在那里我致力于旅游业的解决方案。
但是,在Badoo工作的愿望并没有消失,一年后,我再次申请了一个空缺职位。经过几次电话采访和一次面对面采访后,我得到了报价。所以在2019年初我搬到了伦敦。
莱比锡和伦敦这两个举动都是一个严峻的考验。我发现自己不在平常的环境中:没有朋友,亲戚,父母每天都习惯与我交流。对于我和我的妻子,对我们整个家庭来说,这都不容易。我们正在寻找摆脱这种状况的出路,并试图尽快融入新社会。
在德国,明显的障碍是语言:我们一直学习英语,但是在这里我们不得不面对德语。这花了很多功夫,但是在莱比锡生活了1.5年之后,我们每天都很好地学习了这种语言。在伦敦,这个问题没有出现,此外,我们已经有在国外生活的经验。在寻找住所,与税务机关进行沟通的过程中,Badoo提供了最大的支持。这有助于融入当地生活。
俄罗斯人搬家时最困难的时刻之一就是税收。在英格兰,使用的是累进税率:税率根据收入水平而提高。另一个有问题的问题是医学。有人说一切都与她相处,有人不同意。我有一个积极的经验。
寻找住房的另一个故事。好的选择很快就会消失。另外,在您获得要出租的公寓之前,您需要检查一下。以我为例,甚至有电话打给我们以前的房东:他们被问到我的房客有多好。
对我来说,我的妻子喜欢在新地方生活也很重要。她一直想获得一名设计师的职业,现在正在为入学做准备。找到了她喜欢的课程;同时,她加强了语言能力,并通过了雅思考试,以进入室内设计学士学位。伦敦的教育机构种类繁多,但您需要记住,外国人的教育费用是当地人的教育费用的几倍。
接下来,我将在聊天中回答一些问题。
是什么帮助每次都适应了一个新的地方?
主要支持始终在家庭内部。就我们而言,我和妻子互相支持,这有助于克服所有最初的困难。另外,每次我与团队合作时都很幸运:我有非常酷的同事,他们总是在言传身教上相互支持,分享经验,起初他们可以与您一起解决问题。总的来说,一个好家庭和一个好同事值得拥有金子。
如果您以前从未有过这样的工作经验,那么让自由职业者在低薪的大公司工作是否值得?
问题不在于薪水,而在于与向大公司过渡相关的过程。自由职业者可以为自己设定一个工作日,并建立可帮助您完成工作的工作流程。在大型公司中,一切都是不同的:苛刻的期限,更多的沟通-团队中的同事之间以及团队之间。您需要考虑这种工作节奏和格式是否适合您,并根据此做出决定。
至于薪水,你必须看看未来。如果您现在放弃了自由职业者的高薪,而转到了较小的自由职业者,而转到了一家公司,那么后来由于该行业的经验,其薪水会增长。
小免责声明:您可以访问我们的网站tech.badoo.com我们发布当前职位空缺的位置。也许您会遇到喜欢的事情,然后您提出了要求。
与小型公司相比,Badoo有哪些好处?
最好在我们的网站上阅读此内容:列出的内容比我记得的要多。不能不高兴的要点是自愿医疗保险,体能补偿,公司早餐,午餐,晚餐,高品质的工作设备。
Badoo确实不雇用在英国工作吗?我找不到明确的答案。
大流行之前,我们在莫斯科和伦敦都有空缺。当然,在当前环境下,尽管招聘仍在继续,但搬迁和办公室之间的任何商务旅行都被暂时冻结。请参阅网站上的更新:它始终指示空缺职位。该公司在此问题上坚持最大的透明度。
您需要远程工作吗?它变得更加困难了吗?您是如何互动的?
是的,我们仍然在远程工作。起初,由于我和我的同事并不总是在时间上相吻合,这很困难:其他人“没有来”上班,有人已经“离开”了。需要不同团队之间的同步。沟通问题变得更加难以解决。不必亲自问问题,我不得不写或打电话,这需要更长的时间。
为了进行交互,我们使用了大量的聊天,视频会议。现在变得更容易了-我们已经习惯了。
如何控制努力,毅力,自我激励,拖延?
众所周知,由于大流行,大多数IT公司都转而在家工作。我很难在其他轨道上重建,但我为自己挑出了几点。
首先,需要严格控制工作时间。您可以通知所有同事,您从9到18工作,并且在所有Messenger中都可用,并且在此时间以外不会响应请求。每个人都应以理解来对待。当您在家工作时,很难将工作与家庭分开,但是保持心理状态和人际关系非常重要。
其次,自我激励和拖延很重要。关于哈布雷的许多文章都说拖延是正常的,但是拖延很多时却很糟糕。我使用以下技术:如果遇到大问题,则将其分为许多小问题。然后,新的令人恐惧的功能不再显得令人恐惧,并且可以毫无问题地发布它。
Badoo的PHP和高负载
我将继续讨论有关工作的问题。我在反垃圾邮件小组工作。顾名思义,似乎我们只在处理反垃圾邮件,但事实并非如此。我们的目标是为使用我们的应用程序提供最佳的体验。保护用户的任务对我们非常重要,为此分配了大量资源和精力。
总而言之,我们致力于打击恶意用户:发送垃圾邮件,欺诈和破坏用户体验的用户。我们正在积极使用ML。当然,为了防止垃圾邮件发送者的生活变得更轻松,我无法详细介绍,但是这里有一些示例。
我们有一个垃圾邮件/欺诈检测模型。我们制作了一个用于分析并行团队的移动流量的工具。此外,我们公司使用神经网络:用于手势照片验证以及在Messenger中发送淫秽照片时。最近,我们的同事推出了一种所谓的“迪克图片检测器”,以防止私人消息中的不当内容:用户可以选择是否要查看此类内容。
Badoo如何处理垃圾邮件?如果已经或ML很简单?
我曾经在某个地方开玩笑说ML只是if / else的一大堆。但是,当然,事实并非如此。
Badoo对于ML具有多种用途,因为它可以大大改善项目。例如,正如我已经说过的,我们使用用户照片验证,而ML可以帮助您:它确定一个人现在实际上拍了张照片,并且按照他的要求做了。神经元很酷。
您如何实施ML?PHP,另一种语言,某种框架,完全自己开发吗?
数据团队中有很多很酷的人。该博客有Alexander Krasheninnikov的精彩报告-不幸的是,他已经是我的前同事-该博客讲述了该团队是什么样的团队,解决了哪些问题,如何改善Badoo的工作并为我们所有人提供帮助。数据团队创建了他们自己的ML框架,该框架非常易于使用,并且可供公司中的所有其他团队使用:我们可以说他们已经为我们完成了所有工作。他们有一个非常酷的实现,出色的文档,一种非常简单的使用框架的方法。
您在Badoo面临的最大挑战是什么?
我无法挑出最困难的特定任务或项目。有有趣的项目,也有非常有趣的项目。在我的实践中,这些都是与机器学习相关的项目。在读研究生时,我谈到了这个话题,这个领域给我留下了深刻的印象。我们为绩效营销团队做了一个与流量分析相关的项目-非常酷,我们发现了许多有用的见解。
为什么使用PHP?
PHP是解决Web开发问题并快速开发可伸缩项目的绝佳工具。但是在社区中对这种语言的态度是模棱两可的,这是由于其声誉。自PHP诞生以来,一直有人认为在其中编写错误代码非常容易。我认为,较低的准入门槛不是不利条件。相反,它使您可以在开发中涉及广泛的人员。此外,它确实很好地开发了Web应用程序,并且随着每个新版本语言的不断完善。
PHP 7在生产力和开发方面已迈出了一大步。我们在Habré的博客上有一篇很棒的文章,内容涉及到向该版本过渡的方式如何使我们释放了大量资源。
PHP的受欢迎程度最近有所下降,这很自然-与PHP竞争的其他工具和语言出现了,许多开发人员都在转向它们。但是习惯上我们选择用于特定任务的工具,而PHP可以处理该任务。
您如何看待PHP 8,您打算迁移吗?
我们正在积极监视每个新的PHP版本。当然,我们将使用新版本的所有功能-当然,在确保代码兼容并且向PHP 8过渡之后,我们将比在过渡本身上花费的时间更多。我们将决定何时PHP 8推出。
就像我说的那样,当我们切换到PHP 7时,我们释放了很多服务器,这些服务器用于其他任务。也就是说,过渡到新版本可以带来很多好处。
Badoo是否使用PHP编译?
没有。
告诉我们更多关于Badoo的自写框架的信息。它是在什么基础上实施的,它又是什么样的?
这是由平台团队完成的,他们是“后端后端”并支持大量后端开发人员的人。他们给了我们很多很酷的东西。我已经部分讨论了这一点:例如,它们实现了与公司广泛使用的相同的排队功能;他们还根据我们的需求提供云服务。
我不会说该框架类似于特定的东西。我已经与Laravel和Symfony一起工作-当然,其中有一些部分,我们可以在项目中使用开源的模块。但是我认为我们的git仓库与其他现代框架在方法上并没有很大不同。我们使用包管理器引入第三方依赖关系,使用自动加载,使用模块封装代码。
Badoo为什么使用整体而不是微服务?
这是一个非常神圣的问题,社区对此分为两个阵营。我们使用整体式体系结构对任何人来说都不是秘密,并且在项目存在期间,我们已经学会了应对这种方法的缺点并利用其所有优点。此外,我们还有一组服务(在Go,PHP,C ++中),可在日常工作中积极使用。
如果我们将问题理解为“我们应该放弃一切并使用所有可用资源来重写微服务体系结构的现有整体”,我将回答是否定的。现有解决方案成功应对的业务挑战。如有必要,我们已准备好进行更改,但正如我所说,我们根据手头的任务选择工具。
负载下整块的不同部分如何缩放?
跟进整体和微服务的好问题。我们在博客中进行了精彩的演讲,介绍了性能以及从体系结构的角度构建后端的方式-我将简单介绍一下。我们大约有600台服务器,处理来自客户端的所有请求,它们负责我们的单一存储库。通过这种方法,我们在扩展,添加新车,添加代码方面具有一定的灵活性,并且可以随时使用。
整体环境中的部署有多无缝?
这个问题的答案可以分为两个部分。第一个是CICD管道的技术实现,我的前同事Yuri Nasretdinov在HighLoad的演讲中对此进行了很好的描述(“在高负载条件下部署PHP代码的5种方式”)。我建议看。简而言之,我们有数百台服务器可满足用户请求。在部署期间,我们仅将更改推送到存储库,并自动切换符号链接。
第二部分是确保部署不会影响我们的生产。使用单元测试,集成测试和UI测试以及静态分析器检查发行前的所有代码是否存在明显问题。我们拥有庞大且专业的质量检查部门,这使我们每天可以成功发布两次。
在如此短的发布周期内,对我们而言,保持高水平的产品质量非常重要:我们不想在生产中发布错误/致命信息。因此,首先要测试即将投入生产的功能。每个后端开发人员都对以下事实感兴趣:后端上的功能启动后,其部门,前端和移动团队无需采取任何其他措施。当您拥有开发后端功能的票证并在生产中发布时,可能会出现这种情况,但实际上,他们只是在一段时间后才开始使用它。然后质量检查工程师来找您,问为什么它不起作用。因此,在后端,在发布功能时,我们会以最大数量的测试,模拟和QAP覆盖此功能,以确保所有内容我们的工作是100%有效的。
一萝卜,每个人都推到一个地方?
是的,只有一个萝卜,所有后端工程师都在努力。我们有一个内部规则来命名与手头任务相关的分支。当然,您不能直接将master推入,在成功检查代码,所有检查和单元测试之后,以及与您一起完成任务的QA工程师说一切正常之后,分支就被推到那里。
您在使用DDD还是其他架构模式?
DDD是域驱动设计。它不是体系结构模式,而是一种方法论。我不会说我们有一个特定的方法,我们结合了几种方法。
关于模式:在后端,使用了几种设计模式来解决问题,我想对此进行详细介绍。我们使用事件总线实现,我们有很多队列,我们发送了数百万个由相应使用者处理的事件。活跃使用的模式还包括模块模式:我们的大多数代码都分成单独的,相互连接的实例,这些实例通过有限的开放API进行交互。
您是在使用异常还是试图避免?
我们用。而且我们尽量避免。
您的API是一个整体吗?
是。
您如何测试API?
我们有单元测试和一个完整的框架,可在最短的时间内并行运行大量测试。您可以在Vladimir Yants在我们的博客中的文章中了解到更多有关该主题的内容,他很好地详细介绍了该主题。在UI测试方面,我们使用Calabash和Selenium来测试UI是否正常工作。
测试驱动的开发,先是测试,然后是代码-您不练习吗?
在我们的团队中,每个团队在开发时都可以使用自己的方法,而且我知道有些同事在实践。我知道它有效,但是我自己不练习。
您对DDD的感觉如何?
正如我所说,我们正在从多种方法中进行汇编。如果我们在谈论我的个人态度,我支持任何可以让您有效解决问题的方法。DDD值得投资:它将使您能够以新的质量级别进行应用。
告诉我们,生产无法承受高负荷吗?您是如何处理的?
它不在我的记忆中。我们拥有经验丰富的工程师,我们的产品开发已经超过15年,并且公司在高负荷开发方面拥有丰富的经验。我们旨在最大程度地提高应用程序的性能。
PHP和MySQL-如何优化后端性能?
它涉及公司使用的堆栈和性能,因此我还将答案分为两部分。
关于堆栈:由于Badoo拥有大量部门和团队,因此我们使用了最广泛的技术集-从PHP,MySQL,Nginx,Go,C ++到Tarantool,LUA和Scala。每个团队都选择一种工具来有效解决任务。由于我们在高负载条件下工作,并且每秒处理数万个请求,因此后端性能的问题变得至关重要。
现在值得一提的是内部创建并以开源形式发布的工具。第一个工具是Pinba(PHP不再是瓶颈)。它是一种用于收集统计信息和监视应用程序性能而不影响其性能的工具,并且可以以一种人性化的方式显示所收集的数据。
下一个是Codeisok:一种用于管理git存储库和进行代码审查的工具。我们会积极利用内部工作,在掌握功能之前,我们会应用最佳的代码审查实践(您也可以在我们的博客中了解它们),以便最有效的代码投入生产。
LifeProf是另一个使我们能够跟踪每段代码的性能的工具:它使我们能够自动分析所有请求。所有这些工具(以及更多工具)都可以在我们的Github存储库中找到。
您正在使用ORM还是直接存储交互?为什么?
我已经提到我们拥有自己的框架。我们使用自己的ORM实现。
项目模块的交互如何组织?上课还是上课更棘手?
好问题。每个模块都有一个入口点(前端控制器),该入口点为其他模块或其他功能提供向外的统一且可理解的API。我们不会透露项目其余部分的整个内部实现,而只留下我们想给外部的东西。
使用ORM使用的特定于数据库的包子是什么?
我不完全理解这个问题,但我会尽力回答。
我已经说过,我们的主数据库是MySQL,大多数数据都存储在其中。我们还将Exasol,Presto,Tarantool和Aerospike用于特定任务。也就是说,每个任务都有大量的存储空间。我们在选择工具时并不局限于自己:如果技术的使用有利可图,我们就会使用它。MySQL是我们应用程序的核心,我们使用各种复制和分片来有效地保持负载。
开发人员测试如何进行?要在docker上本地化所有东西,或更难的是在虚拟服务器上?
我无法确切回答的另一种情况。
在PHP中进行开发时,我们不使用Docker(但管理员可以使用它),我们有一个通用的开发环境。我们的平台团队除其他外,一直致力于保持开发环境的正常运行以进行开发,然后在此运行所有测试,列出将投入生产的功能。也就是说,我们有一个预先配置的环境。
我仍然不了解ML是什么:PHP,Python等?
我们曾经将Python用于ML框架,但现在他们切换到了Spark:这大大提高了性能。
您如何平衡600台服务器上的负载?我是否正确理解这是Docker中每台服务器上的monorepa?
在每台服务器上的Monorepa,我们使用Nginx以相当标准的方式进行平衡。
您是否使用代码生成器?做什么任务?
我们经常使用它。在开发时,当您需要根据配置中的某些描述生成模型时,或者是否存在必须根据特定模板实现功能的类时。
数据库复制如何用于MySQL?
我只能从表面上回答。
我们在欧洲和美国拥有数据中心已经不是什么秘密了,有必要保持它们之间的数据一致性。我们使用核心存储库之间的复制来使每个位置的信息保持最新。由于数据中心之间可能存在很大的复制滞后,因此对于那些与数据无关紧要的任务,我们使用各种类型的缓存。
Badoo工程师如何支持俄语的PHP社区?会议,聚会,博客,非正式聚会?
Badoo积极主持并参加大量的专业活动。这植根于公司文化和工程师文化中。开发人员在内部和外部聚会,会议和会议上不断分享最佳实践和知识。
Badoo PHP聚会:每年两次,在我们的莫斯科办公室。最近的会议有大约250人参加。我已经提到过的同事弗拉基米尔·扬特(Vladimir Yants)正在莫斯科举办非正式会议-BeerPHP Moscow。他已经在圣彼得堡,萨拉托夫和其他城市拥有追随者。当然,这种格式是从类似的BeerJS聚会中借用的,但是它仍然非常酷:在非正式的环境中,与志趣相投的人,同事以及行业内的帅哥进行交流。
Badoo工程师经常在俄罗斯唯一的PHP会议PHP Russia的编程委员会中任职。今年,由于我们的公司,其在线部分已变得国际化,所有参与者免费。
我们还在Habré和Medium上拥有博客,我们在其中共享所有开发内容(不仅限于PHP)。
您选择Juns还是最低中级?
正如我所说,您需要提出要求。在面试过程中,您现在是否会拥有足够的知识和经验来开始在公司工作,或者是否应该像我一样在其他地方获得相关的经验和知识然后再返回,这将变得很清楚。
您正在计划在美国设立办事处吗?
我们在Bumble所在的美国设有办事处-德克萨斯州的奥斯汀。但是那里没有工程团队,我们是否会扩展尚不得而知。
, soft/hard- ?
我已经说过,所有空缺职位都在我们的网站tech.badoo.com上。我建议任何人都不要羞愧,不要害怕,注意要求并离开申请表。
很难说公司对候选人的期望是什么。我会说:如果阅读说明,您觉得自己不适合这个空缺,则需要100%申请。可以通过几轮访谈从该人那里学习相关的经验或知识。我认为,无论如何您都需要提出请求。
当然,从硬技能上来说,您需要对PHP和MySQL的工作方式有经验和了解:这些是我们使用的主要技术,涉及后端开发时使用的技术。其他部门有自己的堆栈。
软技能是一个广泛的话题。在我看来,很多开发不是关于编写代码,而是关于与人沟通。提出正确的问题非常重要。如果您知道如何执行此操作,则可以解决50%的问题。总是存在误解的问题,但是数量越少,对您,公司和产品都越好。也就是说,良好的沟通能力,您绝对需要团队合作。人们知道如何担负起使项目(功能,功能的一部分)完成的责任,这一点也很重要。
之前发生了什么
- Facebook高级软件工程师Ilona Papava-如何获得实习机会,如何获得报价以及有关在公司工作的所有信息
- Bodex Yangel,Yandex ML工程师-如果您是数据科学家,如何不加入愚蠢的专家队伍
- EOLastBackend的Alexander Kaloshin-如何启动一家初创公司,进入中国市场并获得1500万美元的投资。
- , Vue.js core team member, GoogleDevExpret — GitLab, Vue Staff-engineer.
- , DeviceLock — .
- , RUVDS — . 1. 2.
- , - . — .
- , Senior Digital Analyst McKinsey Digital Labs — Google, .
- «» , Duke Nukem 3D, SiN, Blood — , .
- , - 12- — ,
- , GameAcademy — .