一日在伦敦提供:搬家后如何获得和做什么

哈Ha!

我们有2020年的宏伟计划。我们打算积极发展Badoo和Bumble,因此我们正在认真扩大技术团队。今天,我们宣布在伦敦办公室大量招聘PHP开发人员。 

在2017年,我们尝试了一种新的搜索格式-招聘活动:我们将出色的开发人员带到莫斯科,在一天之内进行面试,并立即向合适的候选人提供报价。当然,要花去首都的所有费用。

格式运作良好,我们又有很多空缺职位,因此我们宣布一个新的PHP Hiring Event。 

规则是相同的:在3月1日之前显示高测试结果,并在3月21日或22日在莫斯科成功通过了面试-并在同一天收到Badoo伦敦办事处的录取通知。 

UPD:感谢所有参与者,测试已经完成!我们已经通知决赛入围者,并警告说,为候选人的舒适和安全起见,面谈日期将无限期推迟。



在削减之下,我会告诉你:

  • 有关测试的更多信息;
  • 我们从事的项目:照片优化,视频流,字母的机器学习,过渡到新版本的PHP等。

如果您是PHP shnik并想搬到伦敦,欢迎来到Kat!


如何通过考试


该测试包含五个任务。恰好有90分钟分配给该决定:延迟或暂停该过程将无效。开始之前,请确保您有足够的时间。 

在三项任务中,您需要编写代码/ SQL查询,在其余两项中,我们希望看到问题的详细答案。测试发布在HackerRank上。我们建议您练习平台的测试任务,以使自己熟悉该界面。 

直到UTC 2020-03-01 23:59:59才会做出决定。根据测试结果,我们将选择大约60名应聘者,我们将邀请他们前往莫斯科进行面试。 

该公司承担了前往莫斯科的所有费用,以及与前往伦敦相关的费用。我们帮助获得新同事的家人的工作签证,支付机票费用,在搜索过程中租房,为搬家支付现金红利并帮助提高英语水平。您可以在面试阶段就熟悉团队:开发人员自己在招聘活动中进行面试。

服务器开发团队的工作 


我们负责约会服务Badoo和Bumble的后端。除了左右滑动以查找合作伙伴外,这些应用程序还具有视频流,与语音消息聊天,搜索附近的人,与支付服务集成等功能。一个相对简单的界面在PHP和Go中隐藏了很多逻辑(并且越来越多)。 

我们的团队有40多人。作品可分为两大部分:

  • 应用程序中的新功能,
  • 技术项目-工具的改进,优化,承担技术债务。

我将谈论我们在过去两年中实施的最有趣的项目。

产品中的酷芯片


约会应用程序市场是充满活力和竞争的,因此我们的主要目标是开发产品:对用户而言,它必须保持有趣和安全。 

学会隐藏太“个人”照片


即使对话者未要求提供此类礼物,某些用户也会发送带有色情内容的聊天照片。 

我们必须解决的任务是教应用程序将“私人”(18张以上)照片与普通照片区分开,并在聊天中显示它们聊天,从而使接收者可以自己决定是否要全部查看它们。 

我们与研发团队一起在Go语言上创建了一个服务,该服务具有可以识别“私人”照片的神经网络。如果照片出现色情的可能性高于设置的阈值,则会在邮件中放置一个特殊标志,并且客户端会相应地处理这种情况:显示模糊的存根,询问收件人是否要查看里面的东西。 

我们通过A / B测试运行所有任务,并通过统计信息仔细涵盖新功能的关键点。因此,我们发现每天大约发送200,000张“私人”照片,而且-通常这些照片仍被查看并且不会抱怨发件人。  

添加了音频和视频聊天消息


. API CDN.

- , - API HTTP-, CDN. , . :

  • API ( ) 100 000 ;
  • CDN经过优化可与多媒体配合使用,并且每秒可发送200,000张照片(我们在Uptime日会议上详细讨论了CDN优化)。

从CDN的角度来看,下载文件的类型无关紧要,并且我们已经进行了视频转换。我们只能在移动API协议中正确处理新类型(音频和视频)。

学习了如何在不进行研发的情况下构建ML模型


在2018年,我们创建了自己的框架来自动化对数据模型的训练。现在,任何后端开发人员都可以独立构建针对其应用程序量身定制的模型,而不会吸引R&D的同事。 

该框架能够收集数百个指标,这些指标对于每个特定模型而言都是通用的(性别,年龄,应用程序中的活动)以及特定的,有意义的。可以灵活配置用于构造ML模型的算法,并且可以“开箱即用”地使用结果图进行分析。在输出中,该框架提供了一个工作模型,该模型响应速度足够快(在10到100毫秒内),因此可以在用户请求中直接从PHP调用它而无需牺牲UX。

去年,我们将该框架集成到了应用程序的各个部分:反垃圾邮件系统,对应用程序进行评级等。Mail ML是最成功的应用程序之一:该模型可以预测特定用户在电子邮件中单击链接的可能性。该模型从其他用户的数据中学习,类似于具有“重要”属性的电子邮件收件人,并且“重要性”由框架自动计算。

在评估结果之后,我们停止发送电子邮件,而单击链接的机会最少。因此,我们: 

  • 用户忠诚度的提高,从而改善了服务的活动指标:人们不喜欢“无希望”字母;
  • 关键邮件的收件箱率提高:电子邮件服务(如发件人)的点击率较高。

启动视频流


我们一直在寻找新的发展机会。当视频流开始蓬勃发展时,我们决定将其集成到我们的应用程序中。预测项目的成功并不容易,因此为了降低成本,我们没有全力投入解决方案的开发,而是找到了一家为平台和SDK提供所需功能的公司。

我们需要构建功能逻辑,客户端与服务器的交互,实现发送和支付礼物的选项,提供内容(视频流和评论)的快速审核并以指标覆盖所有内容。我们组建了一个由不同部门和部门组成的跨职能团队:客户开发,服务器开发,计费,平台,后台,BI分析,设计和产品管理。所有人都安顿在一个办公室里,工作开始沸腾了。

我们确定了第一个版本(MVP)的功能-一个月后,我们在另一个国家/地区推出了一项功能。我们已经在不同的国家/地区推出了数周的视频,如今,视频流媒体无处不在。 

在Arbat上广播用户消息


这是一次非常不寻常的促销活动:整个十月,Badoo用户都将消息发送到位于莫斯科Novy Arbat的巨大视频广告牌上。一个月内,有23,000封邮件发送给我们,其中12,000封邮件已成功审核并显示在屏幕上。

广告牌就是这样一种智能电视,里面装有浏览器和我们的JavaScript客户端。屏幕上显示了五分钟的广告,每分钟三分钟。 



当然,所有用户都希望用自己的眼睛在屏幕上查看发送的消息。为了使之成为可能,我们需要在每条消息出现在此处时回答问题。

审核后,我们应该通知用户显示时间。从技术上讲,此刻,该消息已进入我们的内部时间表,其中明确显示了该节目的开始时间,并且动态地计算了持续时间:从30秒到5分钟(取决于发件人的数量)。 

困难在于提供商本身就没有提供控制和跟踪广告时间的能力,因此有必要巧妙地将我们的时间表与提供商的时间表同步,并在必要时不断进行监视和调整。我们注意到,这对我们有所帮助(记录就是我们的一切!),在下一个视频显示几十秒之前,智能电视重新加载了页面。不可能专注于这个时间,但是可以注意到时间表的变化,有时会达到15-30秒。我们对我们的班次进行了监控,在运营的那一刻,我们开始向供应商要求最近的演出时间。 

在设置该系统的过程中,我们的工程师在广告牌对面的一家咖啡馆工作,吃了可口的羊角面包,喝了好几杯咖啡,但是由于他,用户信息的播送很顺利,没有发生严重的事件。 

技术项目


尽管杂货工作量很大,但我们仍将大量时间用于技术项目。它们大多数与我们的应用程序的性能以及内部工具的开发和改进有关。

Liveprof开源项目


我们长期以来有机会针对特定请求在生产中启用XHProf,但这并不总是足够的。请求是不同的,但是对于性能方面的系统工作,我希望查看所有请求的概况。因此,产生了这样的想法:在一小部分查询中自动启动XHProf,并汇总结果。这就是Liveprof项目的出现方式,我们将其置于开放访问中。

在处理请求的过程中,存在根据概率和API方法决定是否启动XHProf的逻辑。分析结果被写入磁盘,然后传递到单独的服务器,然后将它们以原始格式放在MySQL中。 

每天运行一次脚本,该脚本汇总每个品牌,平台和API方法的结果。因此,我们可以看到针对Badoo iOS的特定请求进行概要分析的结果(以树的形式和火焰图的形式),可以看到调用单个函数所占簇的百分比(例如,为照片收集URL花费了多少),并且最近将此信息的输出直接添加到了PhpStorm。

迁移到PHP 7.4


新版本的PHP对性能改进感到满意。在过去的两个过渡中(从7.0到7.2,从7.2到7.4),我们的部门负责。

过渡在正式发布之前就已经开始了。首先,我们使用新版本手动运行测试,并且……我们面临大量问题。其中一些很容易解决,而另一些则需要一些时间。 

解决了大多数问题后,我们将在开发人员环境中切换到新版本,一段时间后,我们将监视错误日志并收集来自开发人员和质量检查工程师的反馈。到稳定版本正式发布时,我们已经准备好进行生产测试:首先,我们在一台机器上运行它,然后逐步在另一台机器上进行布局。

但是,在所有服务器上分发了新版本之后,过渡不会结束:我们继续检查两个版本的PHP(新版本和旧版本)的语法。这样,我们确保开发人员不会开始使用新语法,并且如果新语法中出现意外问题,我们可以随时切换到旧版本。例如,在新年假期之前,我们在PHP 7.4中发现了一个内存泄漏小问题,决定不冒险,并在假期之前返回到以前的版本。假期过后,在解决了该问题之后,我们再次推出了7.4版,并仍然使用它。 

去汇总请求


随着PHP更新,我们为性能而奋斗并没有就此结束。我们有一个功能强大的框架,从一开始就要做很多工作:从初始化到每个请求所需的各种检查。 

我们决定进行一个简单的实验。我们选择了对服务器的响应不是很关键的部分命令(例如,从客户端发送统计信息或在滑动游戏中选择“否”选项),然后在Go上编写了一项服务,接受此类请求,将其保存,然后将它们以数据包的形式发送到服务器(每个用户)。因此,我们无需重写主代码就可以非常轻松地节省初始化应用程序的时间。

实验证明是成功的:根据我们的估计,我们可以节省几%的CPU(在我们的例子中是十个以上的服务器)而无需重写主代码,但以操作和工作逻辑复杂为代价。为了使图片更完整,我们决定等待PHP 7.4预加载和RoadRunner的实验结果,以便根据获胜比例和实现复杂性选择最佳解决方案。 

照片优化


. , , , , . 

2018 , Bumble, . , .

A/B . , . . 

除了存储服务器之外,我们还为基础架构分配了照片缓存集群-这些是存储最常用图片的服务器。由于世界上有大量具有不同屏幕的智能手机,因此我们以几种基本尺寸存储照片,并即时将其转换为客户要求的尺寸和格式。 

我们要解决的任务是选择最佳格式(JPEG,WebP,PJPEG),大小和图像质量。从理论上讲,WebP格式应该是最好的,但是就即时转换而言,它是最昂贵的:除了节省流量之外,您需要购买更多的照片缓存服务器。同时,我们决定测试该区域的CDN如何帮助改善用户体验。

我们的几位工程师被派往印度发起一个项目。因此,我们不仅拥有无数个数字,还拥有可以在不同运营商处现场测试该应用程序,将其工作与其他应用程序的工作进行比较的人员,等等。

实验的结果使我们能够选择最佳的照片质量和尺寸选项。例如,我们看到在客户端上预加载照片的逻辑在用户活动中起着重要作用。尽管WebP中的照片下载速度更快,但仅在移动浏览器中才看到积极的效果。CDN的情况与此相同:我们测试了三种外部CDN服务,尽管加快了内容交付的速度,但活动没有任何积极的变化。结果,我们为移动浏览器打开了WebP并节省了电能,所有其他客户端都保持JPEG格式。

自己的视频流


如上所述,视频流的第一个版本是使用外部服务启动的。实验被认为是成功的-我们开始准备软件和基础架构以在我们的数据中心中启动。 

在现成的代码转换器(用于压缩来自用户的视频流)和边缘服务器(用于将流分发给用户)的帮助下,我们必须构建类似于外部盒装解决方案的系统。而且,当然,很多事情都必须随身携带一个“文件”来完成。

例如,最初,每个边缘服务器都连接到每个转码器服务器,这使扩展变得复杂,内部流量也随之增加。考虑到每个特定流的流行程度,我们以一种方式编写客户端平衡,以使一个流的客户端转到最少数量的Edge服务器。 

另一个例子,当我们不得不变得机灵时,是改变WebRTC中的流质量的逻辑:由于我们使用了两个质量选项,因此标准算法被拆除,并且仅在降低比特率方面起作用。我必须更深入地编辑WebRTC库中使用的算法。

另外,默认情况下,WebRTC信令将太多有关网络主机的信息传递给客户端。解决方案是Go上的代理服务器,该服务器仅向客户端提供他需要了解的内容,此外还收集了许多有关已连接客户端的有用信息。 

从研究开始到全面实施,该项目花费了六个多月的时间,但结果,我们能够通过放弃外部服务来显着降低成本。 

性能优化


对于我们的团队来说,这不是一个一次性的项目-这是我们也非常关注的重要领域。我们来自应用程序的主要群集服务请求由数百台服务器组成,因此,对我们来说,将时间投入到优化应用程序上是有利可图的:每个百分比的获胜使我们花费了几台物理服务器。 

我们会持续监控集群的总负载以及每个特定API调用的负载。如果超过某个阈值,我们将开始搜索并优化瓶颈。盈余越大,参与的人越多。这种方法是完全有道理的:在过去两年中,集群增长率一直是我们服务的受众增长率的一半。 

我们在会议上积极分享在优化工作中获得的知识。有关我们的项目和研究的更多详细信息,请参见Pasha Murzakov的文章和报告: 


控制旧的和未使用的代码


我们的开发工作非常密集,随着公司的发展,启动产品任务和实验的步伐也在加快。在这种情况下,代码库变得更加复杂且控制更少。具有较旧版本的应用程序和操作系统的多个平台和用户使情况更加恶化。 

我们试图使代码库保持“干净”,以保持较高的工作速度:

  • 产品实验完成后,自动创建任务以删除代码;
  • 自动跟踪应用程序和操作系统的旧版本以及其中使用的代码分支;
  • 引入了自动搜索未使用代码的工具。

您可以在2月15日星期六举行Badoo PHP Meetup上了解有关我们结果的更多信息。 

当然,这些并不是我要谈论的所有项目。在过去的两年中,我们一直在与垃圾邮件发送者和快照程序做斗争,为PhpStorm看到了我们的插件,测试了各种KV存储库(并选择了Aerospike),进行了很多实验,在会议上以及文章中分享了很多知识。

但是,如果您确定我们仅在工作,那么事实并非如此。每个团队都有自己的团队建设预算。我们的同事参观了阿姆斯特丹,爱丁堡,布拉格和其他城市。去年,我们组织部门在克罗地亚股东大会:


我们也知道如何Photoshop中。

转移到伦敦和苏荷办公室 我们已经说过了,因此我们将不赘述本文中的详细信息-仅显示几张照片。



大照片










招聘活动是加入我们团队的最简单,最快的方式。我们接受测试的答案,直到3月1日(含)为止。然后,我们将花费一个星期的时间来分析结果并致电那些完成任务的人员。 
 
如果您想在伦敦为我们工作,但又不想参加考试,还有另一种选择:只需在我们的网站上申请职位,这个机会就一直存在。

如果您有任何问题,请随时在评论中提问或给我发送私人消息。 

祝好运

Source: https://habr.com/ru/post/undefined/


All Articles