No final de maio, nosso
campeonato de programação começará. Ele será realizado on-line e permitirá que você se teste em uma das quatro áreas: desenvolvimento de back-end ou front-end, aprendizado de máquina ou análise de dados. As tarefas para as seções foram desenvolvidas no gerenciamento de inteligência de máquina e pesquisa, pesquisa e geosserviços.

Todos os participantes primeiro terão que superar a rodada de qualificação. Após a inscrição, você escolherá quando tomá-lo. A qualificação é de 4 horas e inclui de 4 a 6 tarefas. Convidaremos os melhores para participar das finais, que serão realizadas no dia 1º de junho, também on-line. Os resultados serão anunciados em 5 de junho. Os vencedores em cada direção receberão 300 mil rublos, o segundo lugar - 150 mil rublos, o terceiro - 100 mil. As inscrições estão
abertas e durarão até o último dia da rodada de qualificação - 26 de maio, mas é melhor enviar a inscrição com antecedência.
Neste post, compartilharemos a experiência de realizar tais competições - em termos de público e na preparação de problemas algorítmicos complexos.
* * *
O campeonato é um desenvolvimento da ideia que implementamos em 2017–2018 na série Yandex.Blitz. A diferença é que Blitz era apenas uma série de concursos separados em diferentes direções. Eles foram unidos apenas pelo formato e ocorreram em momentos completamente diferentes. Certifique-se de ler habrastati com a análise de tarefas para cada competição: em
aprendizado de máquina ,
back-end ,
front -
end e
desenvolvimento móvel .
Ao preparar o campeonato e este post, conversamos muito com aqueles que se destacaram em Blitz e depois conseguiram um emprego na Yandex. Era importante levar em conta a experiência real dos caras, a visão do participante, para tornar a competição ainda mais transparente e interessante.
Por que vale a pena participar?
O campeonato, como o Blitz passado, é um caminho curto para a empresa: os participantes do topo poderão vir até nós para trabalhar de acordo com um esquema de entrevistas simplificado. Mas estamos esperando não apenas aqueles que procuram trabalho e consideram o Yandex. Esperamos que a competição seja acompanhada por representantes de mais duas categorias de desenvolvedores. A primeira categoria são aqueles que se interessam por algoritmos, participam de programação esportiva e também participam muito (ou participaram) de olimpíadas e outras competições. Ofereceremos a essas pessoas dignas de suas tarefas de nível e experiência interessante em um cofrinho.
A segunda categoria é composta por programadores e analistas experientes. Eles terão a oportunidade de demonstrar sua experiência e histórico. O fato é que compilamos tarefas muito diversas. Isso distingue o campeonato das competições do Kaggle - não para melhor ou para pior, apenas o Kaggle fornece algumas outras possibilidades. Lá, os compiladores geralmente fornecem tais condições e dados que permitem que você se teste em uma área específica (se desejado, os participantes têm tempo para estudá-lo). As rodadas do nosso campeonato passam em questão de horas e registram o conhecimento atual. Você não pode entender, por exemplo, tecnologias de voz ou visão computacional, mas mostre tal pensamento que, no futuro, permitirá que você mergulhe rapidamente em qualquer tópico. Obviamente, uma comparação com o Kaggle é relevante apenas para a pista ML do campeonato.
Produção
Portanto, a idéia principal permanece inalterada: oferecer aos participantes tarefas próximas às militares - aquelas que os desenvolvedores e analistas de Yandex realmente encontram. Para entender o nível e a especificidade dessas tarefas, veja quais problemas você deve enfrentar no seu trabalho se conseguir um emprego em uma empresa. Além disso, as tarefas que configuramos para o concurso ajudarão os participantes a avaliarem o desempenho deles em áreas específicas, se eles têm idéias que podem realmente ser convertidas em serviços e aplicativos aprimorados.
Aqueles que participaram do Blitz de 2017 e 2018 viram que as tarefas eram parcialmente ditadas pelo código fonte de projetos de combate. Mas as conotações de combate do desenvolvimento em uma corporação geralmente residem na necessidade de entender algoritmos - mesmo em áreas que, à primeira vista, estão longe de serem algoritmos, como front-end e desenvolvimento móvel. Portanto, os concursos dedicados a esses dois tópicos eram frequentemente julgados pelos participantes como estando perto da luta. Mas dois outros concursos - em programação algorítmica e aprendizado de máquina - exigiriam uma compreensão dos algoritmos, mesmo sem nenhum subtexto de "combate". Eles também tinham esse subtexto, mas nem sempre era possível discerni-lo de acordo com as condições das tarefas. No entanto, isso não impediu os participantes de competir, mas para nós - para implementar a idéia principal do Blitz.
Idéias idéias
Quando as tarefas da competição em programação esportiva não são compiladas por si mesmas, mas com base nas tarefas que realmente surgem nos serviços, o processo de compilação delas é completamente diferente. O motivo é que, nos serviços, o líder ou colega traz a tarefa para o desenvolvedor com uma redação diferente, em um contexto diferente do que quando a condição vem dos organizadores da competição para seus participantes. Um programador em período integral ou mesmo um estagiário, especialmente se ele trabalha na empresa há algum tempo, está muito mais imerso nos processos de seu departamento do que um desenvolvedor externo (mesmo muito talentoso). Eles não podem formular o problema da mesma maneira, principalmente porque o proponente é obrigado a encontrar uma solução em muito menos tempo. Seu ambiente de desenvolvimento também é diferente: existe apenas um arquivo de entrada e saída, e o funcionário trabalha no repositório, na interface interna, com todas as ferramentas, etc.
Condições de "limpeza"
Então, assumimos as tarefas do ambiente militar, mas sempre nos perguntávamos - os participantes entenderão? Às vezes, acontecia: para tornar a condição compreensível para um amplo público de desenvolvedores, você precisa escrever um grande preâmbulo, introduzir uma terminologia com a qual o especialista da empresa já esteja familiarizado etc. Essa abordagem nem sempre funciona: em uma competição, é importante que a condição seja ampla para que você possa lê-lo rapidamente e ir para a coisa mais importante - desenvolver uma solução. Portanto, nos casos em que, juntamente com o preâmbulo, a condição se tornasse muito complicada, tentamos reformulá-la e removemos a necessidade de um preâmbulo. Outra redação era frequentemente necessária também porque a tarefa original continha informações internas do Yandex que não deveriam ser divulgadas fora da empresa. Como resultado, a tarefa poderia se tornar mais abstrata, não mais tão semelhante aos análogos na produção de combate.
É interessante que a situação oposta - quando a condição foi imediatamente capaz de se formular de forma sucinta e não perder a proximidade da produção - muitas vezes levou ao fato de que a tarefa acabou sendo difícil. Por exemplo, isso foi visto no final do Blitz de aprendizado de máquina, em tarefas relacionadas ao reconhecimento de imagens. O campeonato deste ano não é exceção. Os participantes, entre outras coisas, estão aguardando tarefas sobre tradução automática - bem formuladas, difíceis de implementar e realmente retiradas de um projeto de combate (Yandex.Translate).
O que verificamos
Surge a questão - tornando a tarefa abstrata em comparação com a produção, não a estamos simplificando? De certa forma, sim, simplificamos - para resolvê-lo não é mais necessário ter experiência com a infraestrutura interna do Yandex, além de comunicação preliminar com os colegas. Não precisamos estar familiarizados com o processo de revisão de código, não precisamos tornar o código bonito etc. Mas mantemos a parte mais informativa de cada tarefa que requer pensamento algorítmico. E se você resolvê-lo, mesmo de uma forma um pouco simplificada, isso ainda significa que você é um excelente programador. E um excelente programador se familiarizará rapidamente com a infraestrutura interna, mergulhará no processo de revisão de código e mudará de um modo esportivo de escrever código para um industrial. É como no basquete: o principal para o jogador são as dimensões e uma boa compreensão do jogo, e o arremesso pode ser ensinado.
Mencionamos o pensamento algorítmico - no sentido de que você precisa implementar o algoritmo desejado usando o idioma escolhido: sem bibliotecas adicionais. Provavelmente, no trabalho real (antes e depois da competição), você usará várias bibliotecas adicionais que simplesmente chamam os algoritmos necessários e reduzem bastante a quantidade de código. A capacidade de conectá-los é apenas da categoria do que "pode ser ensinado". É mais interessante para nós garantir que, quando você ligar para uma biblioteca, entenda o que e como ela funciona. Conhecendo os algoritmos por dentro, você os aplicará com mais eficiência - já sem a necessidade de implementá-los.
Competição de análise
Falando sobre os objetivos do campeonato neste post, muitas vezes lembramos o Yandex.Blitz. Mas agora, os participantes podem escolher a direção da análise de dados, na qual não conduzimos o Blitz. Esta é uma nova faixa com suas próprias especificidades. Se você escolher, o conhecimento dos algoritmos também será um plus, mas em menor grau do que no aprendizado de máquina ou nas trilhas de desenvolvimento de back-end.
A idéia geral aqui é a mesma de outras áreas: verificar as habilidades usadas por especialistas em Yandex. Portanto, a questão é: quais habilidades podem ser úteis?
As principais habilidades de um bom analista no Yandex são a capacidade de gerar hipóteses, extrair um sinal útil de condições de tarefas imprecisas, dados ambíguos ou ruidosos. Nossos analistas geralmente escrevem em Python e trabalham com grandes fluxos de dados, por exemplo, com logs Yandex.Metrica, sessões de usuário, logs técnicos do servidor etc.
Para resolver problemas analíticos no âmbito do campeonato, bem como para trabalhos adicionais no Yandex, é muito útil conhecer os conceitos básicos de estatística matemática e teoria das probabilidades. Esse é o conhecimento básico que ajuda a tirar conclusões corretas e baseadas em dados sobre processos.