Inspiriert von Produktion und Basketball: Wie Yandex eine Programmiermeisterschaft vorbereitet

Ende Mai beginnt unsere Programmiermeisterschaft . Es findet online statt und ermöglicht es Ihnen, sich in einem von vier Bereichen zu testen: Backend- oder Frontend-Entwicklung, maschinelles Lernen oder Datenanalyse. Die Aufgaben für die Sektionen wurden im Management von Maschinenintelligenz und Forschung, Suche und Geodienstleistungen entwickelt.

Bild

Alle Teilnehmer müssen zunächst die Qualifikationsrunde überwinden. Nach der Bewerbung entscheiden Sie, wann Sie es einnehmen möchten. Die Qualifikation beträgt 4 Stunden und umfasst 4 bis 6 Aufgaben. Wir werden die Besten einladen, am Finale teilzunehmen, das am 1. Juni auch online stattfinden wird. Die Ergebnisse werden am 5. Juni bekannt gegeben. Die Gewinner in jeder Richtung erhalten 300.000 Rubel, der zweite Platz - 150.000 Rubel, der dritte - 100.000. Die Registrierung ist offen und dauert bis zum letzten Tag der Qualifikationsrunde - dem 26. Mai. Es ist jedoch besser, die Bewerbung frühzeitig zu senden.

In diesem Beitrag werden wir die Erfahrungen mit der Durchführung solcher Wettbewerbe teilen - in Bezug auf das Publikum und die Vorbereitung komplexer algorithmischer Probleme.

* * *

Die Meisterschaft ist eine Weiterentwicklung der Idee, die wir 2017–2018 in der Yandex.Blitz-Reihe umgesetzt haben. Der Unterschied ist, dass Blitz nur eine Reihe von getrennten Wettbewerben in verschiedene Richtungen war. Sie waren nur durch das Format vereint und fanden zu ganz anderen Zeiten statt. Lesen Sie unbedingt habrastati mit einer Analyse der Aufgaben für jeden Wettbewerb: beim maschinellen Lernen , Backend , Frontend und mobilen Entwicklung .

Bei der Vorbereitung der Meisterschaft und dieses Beitrags haben wir viel mit denen gesprochen, die einen hohen Platz in Blitz einnahmen und dann einen Job bei Yandex bekamen. Es war wichtig, die reale Erfahrung der Jungs und die Sichtweise des Teilnehmers zu berücksichtigen, um den Wettbewerb noch transparenter und interessanter zu machen.

Warum lohnt es sich teilzunehmen?


Die Meisterschaft ist wie der vergangene Blitz ein kurzer Weg zum Unternehmen: Teilnehmer von oben können nach einem vereinfachten Interviewschema zu uns kommen, um zu arbeiten. Wir warten aber nicht nur auf diejenigen, die Arbeit suchen und Yandex in Betracht ziehen. Wir erwarten, dass an dem Wettbewerb Vertreter von zwei weiteren Kategorien von Entwicklern teilnehmen werden. Die erste Kategorie sind diejenigen, die sich für Algorithmen interessieren, sich mit Sportprogrammierung beschäftigen und auch viel (oder an) Olympiaden und anderen Wettbewerben teilnehmen. Wir bieten solchen Menschen, die ihrer Level-Aufgaben und ihrer interessanten Erfahrung in einem Sparschwein würdig sind.

Die zweite Kategorie sind erfahrene Programmierer und Analysten. Sie haben die Möglichkeit, ihre Erfahrungen und ihren Hintergrund zu demonstrieren. Tatsache ist, dass wir sehr unterschiedliche Aufgaben zusammengestellt haben. Dies unterscheidet die Meisterschaft von den Wettbewerben bei Kaggle - nicht zum Guten oder zum Schlechten, nur Kaggle bietet einige andere Möglichkeiten. Dort geben die Compiler normalerweise solche Bedingungen und Daten an, die es Ihnen ermöglichen, sich in einem bestimmten Bereich zu testen (falls gewünscht, haben die Teilnehmer Zeit, dies zu studieren). Die Runden unserer Meisterschaft vergehen in wenigen Stunden und zeichnen das aktuelle Wissen auf. Sie können beispielsweise Sprachtechnologien oder Computer Vision nicht verstehen, zeigen jedoch ein solches Denken, dass Sie in Zukunft schnell in ein Thema eintauchen können. Ein Vergleich mit Kaggle ist natürlich nur für die ML-Strecke der Meisterschaft relevant.

Produktionsähnlich


Die Hauptidee bleibt also unverändert: den Teilnehmern Aufgaben anzubieten, die denen des Militärs nahe kommen - denen, denen Entwickler und Analysten von Yandex wirklich begegnen. So können Sie das Niveau und die Spezifität dieser Aufgaben verstehen und sehen, mit welchen Problemen Sie bei Ihrer Arbeit konfrontiert sind, wenn Sie einen Job in einem Unternehmen bekommen. Darüber hinaus helfen die Aufgaben, die wir für den Wettbewerb eingerichtet haben, den Teilnehmern zu beurteilen, wie gut sie in bestimmten Bereichen gepumpt haben und ob sie Ideen haben, die wirklich in verbesserte Dienste und Anwendungen umgewandelt werden können.

Diejenigen, die am Blitz von 2017 und 2018 teilnahmen, sahen, dass die Aufgaben teilweise durch ihren Quellcode aus Kampfprojekten bestimmt wurden. Die Kampf-Obertöne der Entwicklung in einem Unternehmen liegen jedoch häufig in der Notwendigkeit, Algorithmen zu verstehen - selbst in Bereichen, die auf den ersten Blick weit von Algorithmen entfernt sind, wie z. B. Front-End- und Mobile-Entwicklung. Daher wurden die Wettbewerbe, die diesen beiden Themen gewidmet waren, von den Teilnehmern oft als kampfnah beurteilt. Zwei weitere Wettbewerbe - algorithmische Programmierung und maschinelles Lernen - würden jedoch ein Verständnis der Algorithmen erfordern, auch ohne Subtext „Kampf“. Sie hatten auch einen solchen Untertext, aber es war nicht immer möglich, ihn anhand der Aufgabenbedingungen zu erkennen. Dies hinderte die Teilnehmer jedoch nicht am Wettbewerb, sondern an uns - die Hauptidee von Blitz umzusetzen.

Ideen Ideen


Wenn die Aufgaben für den Wettbewerb in der Sportprogrammierung nicht von selbst zusammengestellt werden, sondern auf der Grundlage von Aufgaben, die tatsächlich in den Diensten auftreten, ist der Prozess der Zusammenstellung völlig anders. Der Grund dafür ist, dass der Leiter oder Kollege im Dienst die Aufgabe dem Entwickler in einem anderen Wortlaut und in einem anderen Kontext vorlegt, als wenn die Bedingung von den Organisatoren des Wettbewerbs an seine Teilnehmer gestellt wird. Ein Vollzeitprogrammierer oder sogar ein Praktikant, insbesondere wenn er einige Zeit im Unternehmen gearbeitet hat, ist viel tiefer in die Prozesse seiner Abteilung eingebunden als ein externer (sogar sehr talentierter) Entwickler. Sie können das Problem nicht auf die gleiche Weise formulieren, zumal der Bieter in viel kürzerer Zeit eine Lösung finden muss. Seine Entwicklungsumgebung ist auch anders: Es gibt nur eine Eingabe- und Ausgabedatei, und der Mitarbeiter arbeitet im Repository, in der internen Schnittstelle, mit allen Tools usw.

"Reinigungs" -Bedingungen


Also haben wir die Aufgaben aus dem militärischen Umfeld übernommen, aber dann haben wir uns immer gefragt: Werden ihre Teilnehmer verstehen? Manchmal stellte sich heraus: Um die Bedingung für ein breites Publikum von Entwicklern verständlich zu machen, müssen Sie eine große Präambel schreiben, eine Terminologie einführen, mit der der Spezialist des Unternehmens seit langem vertraut ist usw. Ein solcher Ansatz würde nicht immer funktionieren: In einem Wettbewerb ist es wichtig, dass die Bedingung ausreichend ist Damit Sie es schnell lesen und zum Wichtigsten gehen können - um eine Lösung zu entwickeln. In Fällen, in denen die Bedingung zusammen mit der Präambel zu umständlich wurde, haben wir versucht, sie neu zu formulieren und die Notwendigkeit einer Präambel zu beseitigen. Eine andere Formulierung war häufig erforderlich, auch weil die ursprüngliche Aufgabe interne Yandex-Informationen enthielt, die nicht außerhalb des Unternehmens offengelegt werden sollten. Infolgedessen könnte die Aufgabe abstrakter werden und den Analoga in der Kampfproduktion nicht mehr so ​​ähnlich sein.

Es ist interessant, dass die gegenteilige Situation - als die Bedingung sofort prägnant formuliert werden konnte und nicht die Nähe zur Produktion verlor - oft dazu führte, dass sich die Aufgabe als schwierig herausstellte. Dies wurde zum Beispiel im Blitz-Finale des maschinellen Lernens bei Aufgaben im Zusammenhang mit der Bilderkennung gesehen. Die diesjährige Meisterschaft ist keine Ausnahme. Die Teilnehmer warten unter anderem auf Aufgaben zur maschinellen Übersetzung - gut formuliert, schwer umzusetzen und wirklich einem Kampfprojekt (Yandex.Translate) entnommen.

Was wir überprüfen


Es stellt sich die Frage, ob die Aufgabe im Vergleich zur Produktion abstrakt ist. Vereinfachen wir sie nicht? In gewisser Weise vereinfachen wir es - um es zu lösen, sind keine Erfahrung mit der internen Infrastruktur von Yandex sowie keine vorläufige Kommunikation mit Kollegen mehr erforderlich. Wir müssen nicht mit dem Codeüberprüfungsprozess vertraut sein, wir müssen den Code nicht schön machen usw. Wir behalten jedoch den informativsten Teil jeder Aufgabe bei, der algorithmisches Denken erfordert. Und wenn Sie es lösen, auch in einer etwas vereinfachten Form, bedeutet dies immer noch, dass Sie ein ausgezeichneter Programmierer sind. Und ein ausgezeichneter Programmierer wird sich schnell mit der internen Infrastruktur vertraut machen, sich mit dem Codeüberprüfungsprozess befassen und von einem sportlichen Modus zum Schreiben von Code zu einem industriellen wechseln. Es ist wie beim Basketball: Die Hauptsache für den Spieler sind die Dimensionen und ein gutes Verständnis des Spiels, und der Wurf kann gelehrt werden.

Wir haben algorithmisches Denken erwähnt - in dem Sinne, dass Sie in der Lage sein müssen, den gewünschten Algorithmus in der von Ihnen gewählten Sprache zu implementieren: ohne zusätzliche Bibliotheken. In der realen Arbeit (sowohl vor als auch nach dem Wettbewerb) werden Sie höchstwahrscheinlich verschiedene zusätzliche Bibliotheken verwenden, die einfach die erforderlichen Algorithmen aufrufen und die Codemenge erheblich reduzieren. Die Fähigkeit, sie zu verbinden, ist nur aus der Kategorie, was „gelehrt werden kann“. Für uns ist es interessanter sicherzustellen, dass Sie beim Aufrufen einer Bibliothek verstehen, was und wie dies geschieht. Wenn Sie die Algorithmen von innen kennen, können Sie sie effektiver anwenden - bereits ohne sie selbst implementieren zu müssen.

Analytics-Wettbewerb


Wenn wir in diesem Beitrag über die Ziele der Meisterschaft sprechen, erinnern wir uns oft an Yandex.Blitz. Jetzt können die Teilnehmer die Richtung der Datenanalyse wählen, in der wir Blitz nicht durchgeführt haben. Dies ist ein neuer Track mit eigenen Besonderheiten. Wenn Sie sich dafür entscheiden, ist die Kenntnis der Algorithmen ebenfalls von Vorteil, jedoch in geringerem Maße als beim maschinellen Lernen oder bei der Entwicklung von Backends.

Die allgemeine Idee hier ist dieselbe wie in anderen Bereichen: die Fähigkeiten zu überprüfen, die von Spezialisten in Yandex verwendet werden. Die Frage ist also, welche Fähigkeiten nützlich sein können.

Die Schlüsselkompetenzen eines guten Analysten in Yandex sind die Fähigkeit, Hypothesen zu generieren, ein nützliches Signal aus Fuzzy-Task-Bedingungen, mehrdeutigen oder verrauschten Daten zu extrahieren. Unsere Analysten schreiben normalerweise in Python und arbeiten mit großen Datenflüssen, z. B. mit Yandex.Metrica-Protokollen, Benutzersitzungen, technischen Serverprotokollen usw.

Um analytische Probleme im Rahmen der Meisterschaft sowie für die weitere Arbeit in Yandex zu lösen, ist es sehr nützlich, die Grundlagen der mathematischen Statistik und der Wahrscheinlichkeitstheorie zu kennen. Dies ist das Grundwissen, das hilft, korrekte, datenbasierte Schlussfolgerungen über Prozesse zu ziehen.

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


All Articles