プロダクションとバスケットボールに触発された:Yandexがプログラミング選手権を準備する方法

5月末に、 プログラミングチャンピオンシップが始まります。 オンラインで行われ、バックエンドまたはフロントエンド開発、機械学習、またはデータ分析の4つの分野のいずれかでテストできます。 セクションのタスクは、マシンインテリジェンスと研究、検索、およびジオサービスの管理で開発されました。



画像



すべての参加者は最初に予選ラウンドを克服する必要があります。 応募後、あなた自身がいつ服用するかを選択します。 資格は4時間で、4〜6つのタスクが含まれます。 6月1日にオンラインでも開催される決勝戦への参加をお勧めします。 結果は6月5日に発表されます。 各方向の勝者は30万ルーブル、2位-15万ルーブル、3位-10万を受け取ります。 登録は公開されており、資格審査の最終日である5月26日まで続きますが、申し込みは早めに送信することをお勧めします。



この投稿では、このようなコンテストを開催した経験を共有します-聴衆と複雑なアルゴリズム問題の準備の観点から。



* * *



チャンピオンシップは、2017年から2018年にYandex.Blitzシリーズで実装したアイデアを発展させたものです。 違いは、電撃戦は異なる方向の一連の別個のコンテストであったことです。 彼らは形式によってのみ団結し、全く異なる時期に行われました。 機械学習バックエンドフロントエンドモバイル開発など、各競技のタスクを分析したhabrastatiを必ずお読みください。



チャンピオンシップとこのポストを準備するとき、私たちはBlitzで高い地位を獲得し、Yandexで仕事を得た人々と多くのことを話しました。 競技をさらに透明で興味深いものにするために、参加者からの意見、参加者の実際の経験を考慮することが重要でした。



なぜ参加する価値があるのですか?



過去のBlitzのように、チャンピオンシップは会社への近道です。トップからの参加者は、簡略化されたインタビュースキームに従って仕事に来ることができます。 しかし、仕事を探してYandexを検討している人たちだけを待っているわけではありません。 開発者のさらに2つのカテゴリの代表者がコンテストに参加することを期待しています。 最初のカテゴリは、アルゴリズムに興味があり、スポーツプログラミングに携わり、オリンピックやその他の競技会に多く参加(または参加)した人です。 私たちは、そのようなレベルの仕事に値する人々と貯金箱での興味深い経験を提供します。



2番目のカテゴリーは、経験豊富なプログラマーとアナリストです。 彼らは彼らの経験と背景を実証する機会を持つでしょう。 実際、非常に多様なタスクをまとめました。 これにより、チャンピオンシップとKaggleでの競技が区別されます-良くも悪くも、Kaggleはわずかに異なる機会を提供します。 そこで、コンパイラは通常、特定の領域で自分自身をテストできるような条件とデータを提供します(希望する場合、参加者はそれを勉強する時間を持っています)。 チャンピオンシップのラウンドは数時間で終わり、現在の知識を記録します。 たとえば、音声技術やコンピュータービジョンでは理解できませんが、そのような考え方を示すことで、将来、あらゆるトピックにすばやく飛び込むことができます。 もちろん、Kaggleとの比較は、チャンピオンシップのMLトラックにのみ関連します。



生産的



そのため、主なアイデアは変更されていません。参加者に軍事タスクに近いタスクを提供することです。Yandex開発者とアナリストが実際に遭遇するタスクです。 そのため、これらのタスクのレベルと特異性を理解し、会社に就職した場合に仕事で直面しなければならない問題を確認できます。 さらに、コンテストのために設定したタスクは、参加者が特定の分野でどれだけうまく機能しているか、実際に改善されたサービスやアプリケーションに変換できるアイデアがあるかどうかを評価するのに役立ちます。



2017年と2018年のBlitzに参加した人は、タスクが戦闘プロジェクトのソースコードによって部分的に指示されていることを確認しました。 しかし、企業における開発の戦闘の倍音は、多くの場合、アルゴリズムを理解する必要性にあります-一見しただけでは、フロントエンドやモバイル開発などのアルゴリズムとはかけ離れている分野でもです。 そのため、これら2つのトピックに専念する競技会は、参加者によってしばしば戦闘に近いと判断されました。 しかし、他の2つのコンテスト-アルゴリズムプログラミングと機械学習では、「戦闘」サブテキストがなくても、アルゴリズムを理解する必要があります。 彼らにもそのようなサブテキストがありましたが、タスクの条件に従ってそれを常に識別することはできませんでした。 しかし、これは参加者が競争するのを止めませんでした、そして私たちにとって-ブリッツの主なアイデアを実装するために。



アイデアアイデア



スポーツプログラミングコンテストのタスクが単独で作成されるのではなく、サービスで実際に発生するタスクに基づいて、それらをコンパイルするプロセスが完全に異なります。 その理由は、サービスでは、リーダーまたは同僚が、競技会の主催者から参加者に条件が来るときとは異なる文脈で、異なる文脈で開発者にタスクをもたらすためです。 フルタイムのプログラマーまたはインターンでさえ、特に会社でしばらく働いている場合は特に、外部の(非常に才能のある)開発者よりも、彼の部門のプロセスに深く没頭しています。 特に入札者ははるかに短い時間で解決策を考え出す必要があるため、同じ方法で問題を定式化することはできません。 彼の開発環境も異なります。入力ファイルと出力ファイルのみがあり、従業員はリポジトリ、内部インターフェイス、すべてのツールなどで作業します。



「クリーニング」条件



だから私たちは軍事環境からタスクを取ったが、それから私たちは常に自分自身に尋ねた-彼らの参加者は理解するだろうか? 状況が判明する場合があります:幅広い開発者に条件を理解できるようにするために、大きな序文を書いたり、会社の専門家が長い間知っている用語を導入したりする必要があります。すぐに読んで、最も重要なことであるソリューションを開発することができます。 したがって、プリアンブルと一緒に条件が面倒になりすぎる場合、私たちはそれを再定式化し、プリアンブルの必要性を排除しようとしました。 元のタスクには内部のYandex情報が含まれていたため、別の言葉遣いもしばしば必要でした。 その結果、タスクはより抽象的なものになり、戦闘制作の類似物とはもはや類似しなくなります。



反対の状況-条件がすぐに簡潔に定式化でき、生産への近接性を失うことがなかった-が、しばしばタスクが困難であることが判明したという事実につながったことは興味深いです。 たとえば、これは画像認識に関連するタスクでの機械学習のBlitzフィナーレで見られました。 今年の優勝も例外ではありません。 参加者は、とりわけ、機械翻訳に関するタスクを待っています-よく定式化され、実装が難しく、実際に戦闘プロジェクト(Yandex.Translate)から取得されます。



私たちがチェックするもの



問題は、生産と比較してタスクを抽象化することであり、単純化していないのですか? ある意味では、私たちは単純化しています。それを解決するには、Yandexの内部インフラストラクチャの経験や同僚との予備的なコミュニケーションが不要になります。 コードレビュープロセスに精通する必要はありません。コードを美しくする必要もありません。しかし、アルゴリズム的思考を必要とする各タスクの最も実質的な部分を維持します。 そして、あなたがそれを解決するならば、たとえいくらか単純化された形式であっても、それはあなたがまだ優秀なプログラマーであることを意味します。 そして優秀なプログラマーは、内部インフラストラクチャをすぐに理解し、コードレビュープロセスを掘り下げ、コードを記述するスポーツモードから工業用に切り替えます。 それはバスケットボールのようなものです。プレイヤーにとっての主なものは、ゲームの次元と十分な理解であり、スローを教えることができます。



追加のライブラリなしで、選択した言語を使用して目的のアルゴリズムを実装できる必要があるという意味で、アルゴリズム的思考に言及しました。 最も可能性が高いのは、実際の作業(競合の前後)で、必要なアルゴリズムを呼び出してコードの量を大幅に削減するさまざまな追加ライブラリを使用することです。 それらをつなぐ能力は、「教えることができる」というカテゴリーにあります。 図書館に電話するときに、図書館が何をどのように行うのかを確実に理解することは、私たちにとってより興味深いことです。 内部からアルゴリズムを知っていれば、より効果的にそれらを適用できます-すでに自分で実装する必要はありません。



分析の競争



この投稿でチャンピオンシップの目的について話すと、Yandex.Blitzをよく思い出します。 しかし、今では、参加者はデータ分析の方向を選択できますが、そこではBlitzを実施しませんでした。 これは、独自の特性を持つ新しいトラックです。 これを選択すると、アルゴリズムの知識もプラスになりますが、機械学習やバックエンドの開発トラックよりも程度は低くなります。



ここでの一般的な考え方は、他の分野と同じです。Yandexの専門家が使用するスキルをチェックすることです。 質問は、どのスキルが役立つかということです。



Yandexの優れたアナリストの重要なスキルは、仮説を生成する能力、あいまいなタスク条件、あいまいなデータまたはノイズの多いデータから有用な信号を抽出する能力です。 通常、アナリストはPythonで記述し、Yandex.Metricaログ、ユーザーセッション、テクニカルサーバーログなどの大きなデータストリームを処理します。



チャンピオンシップの枠内で分析問題を解決するため、およびYandexでのさらなる研究のために、数学的統計と確率理論の基礎を知ることは非常に有用です。 これは、プロセスに関する正しいデータベースの結論を下すのに役立つ基本的な知識です。



All Articles