Oferta em Londres em um dia: como obtê-lo e o que fazer depois de se mudar

Olá Habr!

Temos grandes planos para 2020. Pretendemos desenvolver ativamente o Badoo e o Bumble, por isso estamos expandindo seriamente a equipe técnica. E hoje anunciamos a contratação massiva de desenvolvedores de PHP em nosso escritório em Londres. 

Em 2017, tentamos um novo formato de pesquisa - evento de contratação: trazemos desenvolvedores legais para Moscou, conduzimos entrevistas em um dia e fazemos imediatamente uma oferta a candidatos adequados. Todas as despesas de uma viagem à capital são incorridas.

O formato funcionou bem, e temos muitas posições em aberto novamente, por isso estamos anunciando um novo evento de contratação de PHP. 

As regras são as mesmas: mostram um alto teste resultado antes de 1 de março de passar com êxito a entrevista em 21 de Março ou 22 em Moscou - e no mesmo dia receber uma oferta para o escritório Badoo Londres. 

UPD: o teste está concluído, obrigado a todos os participantes! Já notificamos os finalistas e advertimos que as datas da entrevista foram adiadas indefinidamente para o conforto e a segurança dos candidatos.



Abaixo do corte, eu vou lhe dizer:

  • mais sobre o teste;
  • em quais projetos estamos envolvidos: otimização de fotos, streaming de vídeo, aprendizado de máquina para cartas, transição para novas versões do PHP e muito mais.

Se você é um shnik PHP e quer se mudar para Londres, bem-vindo ao kat!


Como passar no teste


O teste consiste em cinco tarefas. São precisos exatamente 90 minutos para a decisão: não funcionará para atrasar ou pausar o processo. Antes de começar, verifique se você tem tempo suficiente. 

Em três tarefas, você precisa escrever consultas de código / SQL e, nas duas restantes, esperamos ver respostas detalhadas para as perguntas. Teste publicado no HackerRank. Recomendamos praticar nas tarefas de teste da plataforma para se familiarizar com a interface. 

As decisões são tomadas até 2020-03-01 23:59:59 UTC. Com base nos resultados dos testes, selecionaremos aproximadamente 60 candidatos que convidaremos para Moscou para uma entrevista. 

A empresa cobre todas as despesas de uma viagem a Moscou, bem como as despesas associadas à mudança para Londres. Ajudamos a obter vistos de trabalho para os membros da família de nosso novo colega, pagamos pelo voo, alugamos uma casa durante a pesquisa, pagamos um bônus em dinheiro pela mudança e ajudamos a melhorar o inglês. Você já pode se familiarizar com a equipe na fase da entrevista: os próprios desenvolvedores conduzem entrevistas no evento de contratação.

O que a equipe de desenvolvimento de servidores faz 


Somos responsáveis ​​pelo back-end dos serviços de namoro Badoo e Bumble. Além de deslizar para a esquerda e direita para encontrar um parceiro, os aplicativos têm transmissão de vídeo, bate-papo com mensagens de áudio, pesquisa de pessoas próximas, integração com serviços de pagamento e muito mais. Uma interface relativamente simples esconde muita lógica no PHP e no Go (e fica cada vez mais). 

Nossa equipe tem mais de 40 pessoas. O trabalho pode ser dividido em duas grandes partes:

  • nova funcionalidade em aplicativos,
  • projetos técnicos - aprimoramento de ferramentas, otimização, trabalho com dívida técnica.

Vou falar sobre os projetos mais interessantes que implementamos nos últimos dois anos.

Fichas frias no produto


O mercado de aplicativos de namoro é dinâmico e competitivo, portanto, nosso principal objetivo é o desenvolvimento do produto: ele deve permanecer interessante e seguro para os usuários. 

Aprendeu a ocultar fotos muito "pessoais"


Alguns usuários enviam fotos de bate-papo de natureza erótica, mesmo que o interlocutor não tenha solicitado esses presentes. 

A tarefa que tivemos que resolver foi ensinar o aplicativo a distinguir fotos “privadas” (maiores de 18 anos) das fotos comuns e mostrá-las conversando no bate-papo, permitindo ao destinatário decidir por si mesmo se ele quer vê-las na íntegra. 

Juntamente com a equipe de P&D, criamos um serviço on Go com uma rede neural capaz de reconhecer fotos "privadas". Se a probabilidade de a foto ficar erótica for maior que o limite definido, uma sinalização especial é colocada na mensagem e o cliente lida com essa situação: mostra um esboço borrado perguntando se o destinatário deseja ver o que está dentro. 

Executamos todas as tarefas por meio de testes A / B e também cobrimos cuidadosamente os pontos principais da nova funcionalidade com estatísticas. Então descobrimos que cerca de 200.000 são enviadas por dia com fotos "particulares" e também - que muitas vezes essas fotos ainda são visualizadas e não reclamam do remetente.  

Adicionadas mensagens de bate-papo por áudio e vídeo


Nos últimos dois anos, fomos atraídos por recursos para mensageiros avançados e demos aos usuários a oportunidade de trocar mensagens multimídia. A implementação desta opção no lado do servidor foi bastante simples devido à arquitetura flexível da API móvel e sua própria CDN.

Ao projetar mensagens multimídia no bate-papo, transferimos o upload do arquivo da API principal do cliente-servidor para os serviços HTTP separados localizados na CDN. Utilizamos um único repositório, portanto, do ponto de vista do suporte ao código, essa solução não causou problemas. Mas tornou possível o uso de ferramentas otimizadas para a natureza da carga:

  • a API móvel (protocolo binário) é aprimorada pela troca de comandos curtos e, no pico, passa por si mesma mais de 100.000 solicitações por segundo;
  • A CDN está ajustada para trabalhar com multimídia e é capaz de fornecer 200.000 fotos por segundo ( falamos sobre otimizações da CDN em detalhes na conferência do dia da atividade).

Do ponto de vista da CDN, o tipo de arquivo baixado não importa muito e já tivemos conversão de vídeo. Só conseguimos processar corretamente os novos tipos (áudio e vídeo) no protocolo da API para dispositivos móveis.

Aprendeu a criar modelos ML sem pesquisa e desenvolvimento


Em 2018, criamos nossa própria estrutura para automatizar o treinamento de modelos em nossos dados. Agora, qualquer desenvolvedor de back-end pode criar independentemente um modelo personalizado para seu aplicativo, sem envolver colegas de P&D. 

Essa estrutura é capaz de coletar centenas de métricas, universais (sexo, idade, atividade no aplicativo) e específicas, significativas para cada modelo específico. Os algoritmos para a construção de modelos de ML são configurados com flexibilidade e gráficos dos resultados estão disponíveis para análises "prontas para uso". Na saída, a estrutura fornece um modelo de trabalho que responde com rapidez suficiente (de 10 a 100 ms) para que possa ser chamado diretamente do PHP nas solicitações do usuário sem afetar o UX.

No ano passado, integramos a estrutura em várias partes de nosso aplicativo: sistemas anti-spam, classificação do aplicativo e outros. O Mail ML é um dos aplicativos mais bem-sucedidos: o modelo prevê a probabilidade de um clique no link no email para um usuário específico. O modelo aprende com os dados de outros usuários, semelhante ao destinatário do email com atributos "importantes", e a "importância" é calculada automaticamente pela estrutura.

Após avaliar os resultados, paramos de enviar e-mails com a menor chance de clicar em links. Devido a isso, nós: 

  • maior lealdade do usuário, o que resultou em métricas de atividade aprimoradas no serviço: as pessoas não gostam de cartas "sem esperança";
  • aumento da taxa de caixa de entrada nos principais remetentes: serviços de email como remetentes com alta CTR.

Streaming de vídeo lançado


Estamos sempre buscando novas oportunidades de desenvolvimento. Quando o streaming de vídeo começou a ganhar impulso, decidimos integrá-lo ao nosso aplicativo. Prever o sucesso do projeto não foi fácil; portanto, para reduzir custos, não nos precipitamos no desenvolvimento de nossa solução, mas encontramos uma empresa que forneceu à plataforma e ao SDK a funcionalidade necessária.

Fomos obrigados a criar lógica de recursos, interação cliente-servidor, implementar opções para enviar e pagar presentes, fornecer moderação rápida de conteúdo (fluxo de vídeo e comentários) e cobrir tudo com métricas. Reunimos uma equipe multifuncional de diferentes departamentos e divisões: desenvolvimento de clientes, desenvolvimento de servidores, cobrança, plataforma, back office, análise de BI, design e gerenciamento de produtos. Tudo se estabeleceu em um espaço de escritório - e o trabalho começou a ferver.

Determinamos a funcionalidade da primeira versão (MVP) - e um mês depois lançamos um recurso em um país após o outro. Por várias semanas, lançamos em diferentes países e hoje a transmissão de vídeo está disponível em todos os lugares. 

Transmitir mensagens de usuário no Arbat


Foi uma promoção muito incomum: em outubro, os usuários do Badoo enviaram mensagens para um enorme outdoor de vídeo localizado no Novy Arbat, em Moscou. Em um mês, 23.000 mensagens foram enviadas para nós, das quais 12.000 foram moderadas com sucesso e apareceram na tela.

Um outdoor é uma TV tão inteligente com um navegador e nosso cliente JavaScript dentro. Os comerciais de cinco minutos foram mostrados na tela, em cada um dos quais três minutos foram dados a nós. 



Obviamente, todos os usuários queriam ver a mensagem enviada na tela com seus próprios olhos. Para tornar isso possível, tivemos que responder à pergunta quando cada uma das mensagens aparecer lá.

Devemos informar o usuário sobre o horário da exibição após a moderação. Tecnicamente, a essa altura, a mensagem entrava em nossa programação interna com um horário de início claro para o programa e uma duração calculada dinamicamente: de 30 segundos a cinco minutos (dependendo do número de remetentes). 

A dificuldade era que o provedor, por sua vez, não fornecia a capacidade de controlar e acompanhar o horário do comercial, por isso era necessário sincronizar astuciosamente nossa programação com a programação do provedor, monitorar e ajustar constantemente, se necessário. Nos ajudou a perceber (o registro é o nosso tudo!). Algumas dezenas de segundos antes do próximo vídeo ser exibido, a TV inteligente recarrega a página. Era impossível concentrar-se neste momento, mas era possível notar mudanças no cronograma, que às vezes chegava a 15 a 30 segundos. Montamos o monitoramento de turnos do nosso lado e, nos momentos de operação, começamos a solicitar a hora do show mais próximo ao fornecedor. 

No processo de configuração desse sistema, nosso engenheiro, que trabalhava em um café em frente ao quadro de avisos, comeu uma quantidade impressionante de croissants e bebeu muitas xícaras de café, mas graças a ele, a transmissão de mensagens do usuário ocorreu sem problemas e não houve incidentes graves. 

Projetos técnicos


Apesar do grande volume de trabalho de mercearia, dedicamos muito tempo a projetos técnicos. A maioria deles está relacionada ao desempenho de nossos aplicativos, bem como ao desenvolvimento e aprimoramento de ferramentas internas.

Projeto Open Source de Liveprof


Há muito tempo tivemos a oportunidade de ativar o XHProf na produção para uma solicitação específica, mas isso nem sempre é suficiente. As solicitações são diferentes, mas, para o trabalho sistemático sobre desempenho, quero ver o panorama geral de todas as solicitações. Portanto, nasceu uma ideia: inicie o XHProf automaticamente em uma pequena parte das consultas e agregue os resultados. Foi assim que o projeto Liveprof apareceu , que colocamos em acesso aberto.

No processo de processamento da solicitação, existe uma lógica que, com base nas probabilidades e no método API, decide se deve iniciar o XHProf. Os resultados da criação de perfil são gravados no disco e entregues em um servidor separado, onde são colocados no formato bruto no MySQL. 

Uma vez por dia, é executado um script que agrega os resultados para cada marca, plataforma e método de API. Assim, podemos ver os resultados da criação de perfil para solicitações específicas do Badoo iOS (na forma de uma árvore e na forma de um gráfico de chama), podemos ver qual a porcentagem do cluster necessária para chamar uma função individual (por exemplo, quanto custa para coletar um URL para uma foto), e recentemente adicionou a saída dessas informações diretamente ao PhpStorm.

Migrando para o PHP 7.4


Novas versões do PHP estão satisfeitas com a melhoria de desempenho. Nas duas últimas transições (de 7.0 para 7.2 e de 7.2 para 7.4), nosso departamento foi responsável.

A transição começa muito antes do lançamento oficial. Primeiro, executamos os testes manualmente com a nova versão e ... enfrentamos um grande número de problemas. Alguns deles são facilmente resolvidos, enquanto outros requerem algum tempo. 

Quando a maioria dos problemas foi resolvida, passamos para a nova versão no ambiente do desenvolvedor, por algum tempo monitoramos os logs de erros e coletamos feedback dos desenvolvedores e engenheiros de controle de qualidade. No momento do lançamento oficial da versão estável, já estávamos prontos para testar a produção: primeiro, rodamos em uma máquina e gradualmente as colocamos nas outras.

Mas depois que a nova versão é distribuída em todos os servidores, a transição não termina: continuamos a verificar a sintaxe das duas versões do PHP (nova e anterior). Portanto, estamos convencidos de que os desenvolvedores não começaram a usar a nova sintaxe e que podemos mudar para a versão antiga a qualquer momento, se surgirem problemas inesperados na nova. Por exemplo, antes dos feriados de Ano Novo, encontramos um pequeno problema com um vazamento de memória no PHP 7.4, decidimos não arriscar e voltamos à versão anterior antes dos feriados. Após as férias, tendo resolvido o problema, lançamos novamente a versão 7.4 e ainda a usamos. 

Ir agregação de solicitações


Com a atualização do PHP, nossa luta pelo desempenho não termina aí. Temos uma estrutura poderosa que faz muito trabalho no início: da inicialização às várias verificações necessárias para cada solicitação. 

Decidimos realizar um experimento simples. Selecionamos uma parte dos comandos para os quais a resposta do servidor não é crítica (por exemplo, enviando estatísticas do cliente ou escolhendo a opção "Não" no jogo de furto) e escrevemos um serviço no Go que aceita tais solicitações, as salva e as envia ao servidor em um pacote ( para cada usuário). Assim, podemos economizar muito facilmente ao inicializar o aplicativo sem reescrever o código principal.

O experimento acabou sendo bem-sucedido: de acordo com nossas estimativas, podemos economizar alguns por cento da CPU (que no nosso caso é mais de dez servidores) sem reescrever o código principal, mas com o custo de complicar a operação e a lógica do trabalho. Para completar, decidimos aguardar os resultados das experiências com o PHP 7.4 preload e o RoadRunner para escolher a solução ideal de acordo com a proporção de ganhos e a complexidade da implementação. 

Otimização de fotos


A atividade do usuário depende diretamente de alguns projetos técnicos. Por exemplo, quanto mais rápido mostramos as fotos, mais ativamente as pessoas passam, mais correspondências acontecem, mais novos pares se formam e assim por diante. 

Em outubro de 2018, uma de nossas marcas, a Bumble, decidiu entrar no mercado indiano. Como não sabíamos nada sobre a velocidade da Internet local, decidimos realizar uma série de experimentos com a qualidade e o tamanho das fotografias.

Iniciamos todas as experiências técnicas sob testes A / B. Isso permite ver não apenas a diferença no comportamento e na atividade de diferentes grupos, mas também estatísticas sobre a operação do aplicativo no cliente, divididas por opções. Estávamos interessados ​​na hora de baixar fotos e na hora de decodificar e exibir. 

Infraestrutura, além dos servidores de armazenamento, alocamos um cluster de caches de fotos - esses são os servidores que armazenam as fotos mais usadas. Como existe um grande número de smartphones com telas diferentes no mundo, armazenamos fotos em vários tamanhos básicos e as convertemos rapidamente para o tamanho e formato solicitados pelo cliente. 

A tarefa que queríamos resolver era escolher o formato ideal (JPEG, WebP, PJPEG), tamanho e qualidade de imagem. Em teoria, o formato WebP deve ser o melhor, mas é o mais caro em termos de conversão instantânea: em vez de economizar tráfego, você precisa comprar mais servidores de cache de fotos. Junto com isso, decidimos testar como as CDNs da região ajudarão a melhorar o UX.

Vários de nossos engenheiros foram enviados para lá para lançar um projeto na Índia. Portanto, tínhamos não apenas números secos, mas também pessoas que podiam testar o aplicativo em diferentes operadores no local, comparar seu trabalho com o trabalho de outros aplicativos e assim por diante.

Os resultados dos experimentos nos permitiram escolher as melhores opções para a qualidade e o tamanho das fotografias. Por exemplo, vimos que a lógica de pré-carregar fotos no cliente desempenha um papel importante na atividade do usuário. E, apesar do fato de as fotos no WebP serem baixadas mais rapidamente, o efeito positivo foi perceptível apenas nos navegadores móveis. A mesma história da CDN: testamos três serviços externos da CDN e, apesar da aceleração da entrega de conteúdo, não houve mudanças positivas na atividade. Como resultado, ativamos o WebP para navegadores móveis e economizamos energia, deixando todos os outros clientes no formato JPEG.

Transmissão de vídeo própria


Como mencionei acima, a primeira versão do streaming de vídeo foi lançada usando um serviço externo. O experimento foi considerado bem-sucedido - e começamos a preparar software e infraestrutura para o lançamento em nossos data centers. 

Com a ajuda do transcodificador pronto (para extrair o fluxo de vídeo do usuário) e dos servidores de borda (para distribuir o fluxo para o usuário), tivemos que construir um sistema semelhante a uma solução in a box externa. E, é claro, muito precisava ser finalizado com um "arquivo" em movimento.

Por exemplo, inicialmente cada servidor de Borda se conectava a cada servidor de transcodificador, o que complicava a escala e aumentava o tráfego interno. Escrevemos o balanceamento de clientes de forma que os clientes de um fluxo acessem o menor número de servidores Edge, levando em consideração a popularidade de cada fluxo específico. 

Outro exemplo, quando precisávamos ser perspicazes, é a lógica de alterar a qualidade de um fluxo no WebRTC: devido ao fato de usarmos duas opções de qualidade, o algoritmo padrão foi demolido e funcionou apenas para diminuir a taxa de bits. Eu tive que ir mais fundo e editar o algoritmo usado dentro da biblioteca WebRTC.

Além disso, a sinalização WebRTC, por padrão, transmitiu muitas informações sobre hosts na rede para o cliente. A solução foi um servidor proxy on Go, que fornece ao cliente apenas o que ele precisa saber e, além disso, coleta muitas informações úteis sobre clientes conectados. 

Desde o início da pesquisa até a implementação completa, o projeto levou mais de seis meses, mas, como resultado, conseguimos reduzir significativamente os custos abandonando os serviços externos. 

Otimização de performance


Este não é um projeto único para nossa equipe - é uma área importante para a qual também prestamos muita atenção. Nosso cluster principal, que atende solicitações de aplicativos, consiste em centenas de servidores e, portanto, é rentável investir tempo na otimização do aplicativo: cada porcentagem conquistada nos custa vários servidores físicos. 

Monitoramos constantemente a carga total em nosso cluster e a carga para cada chamada de API específica. Se um determinado limite for excedido, começamos a pesquisar e otimizar gargalos. Quanto maior o excesso, mais pessoas se envolvem. Essa abordagem é totalmente justificada: nos últimos dois anos, a taxa de crescimento do cluster foi metade da taxa de crescimento do público de nossos serviços. 

Compartilhamos ativamente o conhecimento adquirido durante o trabalho de otimização em conferências e reuniões. Mais detalhes sobre nossos projetos e estudos podem ser encontrados em artigos e relatórios de Pasha Murzakov: 


Controle sobre código antigo e não utilizado


Temos um desenvolvimento bastante intenso, e o ritmo de lançamento de tarefas e experimentos de produtos também está crescendo à medida que a empresa cresce. Sob tais condições, a base de código se torna mais complexa e menos controlada. A situação é exacerbada por várias plataformas e usuários com versões mais antigas de aplicativos e sistemas operacionais. 

Tentamos manter nossa base de códigos "limpa" para manter um ritmo alto de trabalho:

  • crie automaticamente tarefas para remover o código após a conclusão da experiência do produto;
  • rastreamento automatizado de versões antigas de aplicativos e sistemas operacionais e as ramificações de código usadas neles;
  • Introduzimos ferramentas para procurar automaticamente código não utilizado.

Você pode aprender mais sobre nossos resultados no Badoo PHP Meetup , que será realizado neste sábado, 15 de fevereiro. 

Claro, esses não são todos os projetos que eu quero falar. Nos últimos dois anos, lutamos com spammers e snappers, instalamos nosso plugin para o PhpStorm, testamos vários repositórios KV (e escolhemos o Aerospike), experimentamos muito, compartilhamos conhecimento em artigos, em conferências e não apenas.

Mas se você decidir que estamos apenas trabalhando, não é assim. Cada equipe tem seu próprio orçamento para criação de equipes. Nossos colegas visitaram Amsterdã, Edimburgo, Praga e outras cidades. No ano passado, organizamos uma reunião geral do departamento na Croácia:


e também sabemos como fazer photoshop.

Ao mudar para Londres e para o escritório no Soho como já dissemos, portanto, não vamos nos aprofundar nos detalhes deste artigo - apenas mostre algumas fotos.



Foto grande










O evento de contratação é a maneira mais fácil e rápida de se juntar à nossa equipe. Aceitamos respostas para o teste até 1º de março, inclusive. Depois, levaremos uma semana para analisar os resultados e ligar para aqueles que lidaram com as tarefas. 
 
Se você deseja trabalhar para nós em Londres, mas não deseja fazer o teste, há outra opção: basta responder às vagas em nosso site , essa oportunidade está sempre disponível.

Se você tiver alguma dúvida, sinta-se à vontade para perguntar nos comentários ou me enviar mensagens privadas. 

Boa sorte

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


All Articles