Не было бы счастья, да спортивное программирование помогло

1か月前、次のACM-ICPC世界プログラミング選手権が終了し( 結果 )、サンクトペテルブルクとエカテリンブルクのチームが見事に演奏しました。 モスクワ、ペルミ、ノボシビルスク、サラトフ、サマラのチームは、少し悪化しました。 トムスクのチームは素晴らしい結果を残しました。ファイナルへの唯一の道はすでに多くの人にとって驚きでした。 ほとんどすべての都市は億万長者であり、大規模な大学や興味深い企業があります。 今、あなたはすべての子供時代を人口5万人の都市に住んでいて、疑わしい教育の質のある小さな大学のある隣の都市に移動し、月に2万ルーブルの工場で働く見込みがあることを想像してください。 この暗い道から抜け出すための効果的な方法があり、そのうちの1つはACM-ICPCです。 私の話を共有し、日常業務でのACM-ICPCの経験がどのように役立ち、これらの競争が私の人生のチケットになったかを伝えたいと思います。 あなたが1年生から2年生で、お金を稼ぐか、トーナメントのプログラミングの準備をするかを選ぶなら、この記事があなたの決定に役立つことを願っています。





写真icpcnews icpcnews / CC



まず、私自身について少しお話しします。 私は最も普通の小さな町の最も普通の学校で勉強しました。 隣の都市の大学に入学するまで、プログラミング競技については知りませんでした。 この話はどの州でも発生する可能性があるため、都市と大学の名前は重要ではありません。 ACM-ICPCの参加者に時間通りに参加できたことは幸運でしたが、大学ではこれらの競技について直接知りました。 定期的にトレーニングを行っているチームは1つしかなく、生徒同士の競争はなく、全ロシアの学校オリンピックの優勝者もいないという事実にもかかわらず、チームはワールドカップのメダルを数回獲得しました。 だから私は、ACM-ICPCの田舎から決勝戦まで、そして大規模な連邦企業でチームリーダーに成長した後、長い道のりを歩きました。 私のチームメイトも成功を収めました。1人は同じ会社の主要なプログラマで、もう1人はGoogleで仕事をしました。 私たちの以前のチームの人たちは、有名な会社で働いたり、自分の会社を開いたりして、ロシアと海外の両方で素晴らしい気分です。 繰り返しますが、学齢期に超能力を示した人はいませんでした。 それらを結び付けるのは、学生時代に解決された膨大な数のプログラミング問題です。 そして、彼らは絶望的な都市の最も普通の大学で勉強していても、あなたが光に出ることができるという事実の鮮明な例です。





写真icpcnews icpcnews / CC



それで、あなたにまともな教育を与えることができない大学で勉強したらどうしますか? 自分を開発する! 講義を記録したり、臨床検査を解いたり、チケットを詰め込むだけでは不十分です。 本を読んで、技術を学び、基礎知識を深めてください。 最終的には、スポーツやKVNをプレイできます。空いた時間を無駄にしてしまうよりはましです。 開発する1つの方法は、プログラミング競技会に参加することです。 トーナメントからトーナメントに参加することも、週5日までプロとして参加することもできます。 さらに、専門家について具体的にお話しします。



時々私は学生とトーナメントに行きますが、1年目または2年目を過ぎるとしばしば彼らは競技への興味を失い、できるだけ早く仕事に就くようにします。 そのような生徒にとって、ACMはアルゴリズムと関連付けられているのはアルゴリズムだけであり、仕事で役に立たない可能性が最も高いため、トーナメントへの参加は実用的ではありません。 1回または2回以上、次の質問を聞きました。「ここで、ACMに数年間参加しています。 だから、これらのアルゴリズムはあなたにとって便利ですか?」最初に学ぶことは、古典的なアルゴリズムがACMのほんの一部にすぎないということです。 これは問題の解決に役立つツールです。 プログラミング言語とまったく同じですが、ソリューションの記述が不可能な知識がありません。 ほとんどのタスクは一意であり、その解決策はよく知られたアルゴリズムの使用に基づいていません。各問題に対して独自のアルゴリズムを発明し、一般的な解決策の一部として古典的なアルゴリズムを組み込みます。 ほとんどの場合、Dijkstraアルゴリズムや作業中のセグメントツリーを記述する必要はありませんが、ACMでは、それらを基礎ではなくブリックとしてのみ使用します。



元ACMはひどいコードを書くと広く信じられています( 1、2、3 )。これは、時間が不足し、品質について考える時間がない競争に非常に慣れているためです。 しかし、同じ成功を収めていると言えば、レーシングドライバーは規則に従ってスケーターを運転する方法を知らない、つまりスケーターは他のみんなと一緒に輪になってスケートをすることができません。 まず、それは個人です。 第二に、多くの場合、解決するためには品質を節約することが不可能なほど多くのコードを書く必要があります:エラーを修正するのに多くの貴重な時間がかかります(そして世界チャンピオンは同じ意見を持っています)。 さらに、現代の開発環境は、ライティングをきちんと刺激し、簡単かつ迅速に記述できるようにします。 ACMはバカな男ではなく、実際のプロジェクトではコードが高品質でなければならないことを理解しており、同僚からこの品質を観察する方法をすぐに学びます。 少なくとも、研究室での仕事以外に人生で何も見たことがない学生よりも遅くはありません。 プロジェクトの開発者の4分の1はACM-schikiであり、原則として全員がコードレビューを簡単に通過します。



それでは、ACMは何を提供しますか? まず、基礎知識と数学的装置。 講義ではアルゴリズムの複雑さについては話されていませんでした。グラフの理論については勉強していませんでした。 ACMは、計算および離散数学、確率理論、理論コンピューターサイエンスのさまざまなトピックにおける膨大な数の問題のおかげで、この巨大なギャップを埋めています。 各タスクでは、アルゴリズムの計算の複雑さを分析する必要があり、使用するデータ構造の有効性について考えさせます。 経験のおかげで、ACMは組み込みのデータ構造の操作の複雑さを考えません。これらの値はメモリのキャッシュから取得します。 特定のバージョンのコンパイラで実装の複数の機能に遭遇したため、彼らは自分のデバイスと仕事の複雑さを知っています。 インタビューでは、経験豊富な開発者でさえ、同じハッシュを使用して.NETのハッシュテーブルに異なるキーを追加するとデータが消去されると考えることが多いことに驚いていますが、実際には衝突はなく、 誕生日のパラドックスについて学ぶことに驚いています。 多くの候補者は、毎日使用しているものをどのように使用するかまったく理解していません。内部ではリスト<T>にリンクリストがあり、インデックスアクセスは遅い操作であると思われます。 データベースデバイスについて話すことさえできません。



第二に、ACMは思考とタイピングの速度を向上させます。 これは、競技に十分な時間がないという事実によって促進されますが、多くのタスクがあるので、heすることはできません。 さらに、学習中のいくつかの場所では、トーナメントの準備中と同じくらい多くのコードを書くことができます。 クイックウィットを最大限に活用できる場所はほとんどありません。 これにより、産業開発において、ACM-schikiはプロトタイプをすばやく作成し、コードをリファクタリングできます。TDDの最初の2つの部分は競争の精神に基づいているため、これらのスキルを組み合わせてTDDで効果的に機能します:さまざまなケースのテストを考え出し、コードを記述し、合格します。



第三に、ACMはマインドフルネスを開発します。 トーナメントでは、間違ったコードは罰金で罰せられるため、正しいコードを書くことが非常に重要です。 テストできることが非常に重要です。 バグをすばやく見つけることは非常に重要です。 私たちのプロジェクトの16人の開発者のどれも、レビュー段階でACM-shchikiよりも多くのバグを見つけません。 これは長年にわたって開発された単なるスキルであり、産業開発において非常に価値があります。



第4に、ACMで重要な開発を達成したため、多くの世界のIT企業で簡単にインタビューに合格できます。 たとえば、GoogleとYandexでは、インタビューはほぼ完全にACMのようなタスクで構成されています。 これらの会社に就職したくない場合でも、面接に行くのはとてもクールです。 ですから、例えば、私はチューリッヒでのインタビューのためにグーグルの招待のおかげで最初に海外に行きました。



最後に、ACMは多くの非技術的なグッズを提供します:全国旅行、さまざまな都市からの友人や知人、英語での流readingな読書(ほとんどのタスクは英語で書かれています)、トーナメントでの賞品、奨学金の増加、教師、クラスメート、同僚からの敬意。 ACM-ICPCは多様性に命を吹き込みます。





写真icpcnews icpcnews / CC



最後に、重要な点に注意する価値があります。ACMは何も保証しません。 これはある種の魔法の薬ではなく、単なるツールです。 問題を非常に上手く解決できるかもしれませんが、人々とコミュニケーションをとる能力がなければ、あなたはまだ成長と発展が可能なチームに参加できません。 ACMエクスペリエンスは、あなたのスキルを完璧に補完するものです。 これは履歴書の良い行です。気付かれることでしょう。簡単に技術面接に合格できますが、マネージャーとのコミュニケーションに失敗することは簡単です。 そして、トーナメントへの参加があなたの学習に役立つという事実からはほど遠い。 まったく逆です:この運動があなたの大学で開発されていない場合、教師がそれを聞いたことがない場合、トレーニングと学習を組み合わせるのは非常に難しく、経営者はトーナメントへの旅行にお金を割り当てることに非常に消極的です。 しかし、多くの大学では、誰もがゼロから始めました。すべては、学生の純粋な熱意に基づいています。



大きな成功を収めると、すべてが変わります。 これらの成功は、地域の大学のほとんど唯一の顕著な成果であり、リーダーシップはいくつかの困難な問題に対処し始めており、教師は未完成の実験室作業に目をつぶって試験に出席しています。 同時に大学の優秀なリーダーもいる場合、彼は奨学金とスポンサーシップのサポートを増やしたいと思っています。何年もシニアコースで働いているだけでなく、貯蓄も貯めています。 しかし、このすべてのために、あなたは一生懸命に働き、多大な努力をする必要があります。そうすれば、すべてがうまくいきます。 ACM-ICPCは、興味深く有用な課外活動の素晴らしい組み合わせです。



あなたがゴッドフォーサケンの街にあるあまり知られていない大学の学生である場合、「自分の見込みは何ですか?」という質問を自問してください。答えに満足できない場合、「クールな会社」になりたい場合、野心的な目標を設定し、複雑な問題を解決する準備ができている場合、仕事をするだけでなく、自分の仕事に誇りを持ちたい場合、学生時代を無駄にしたくない場合、ルーチンを実行する代わりに、ACM-ICPCはすべてを達成する大きなチャンスを与えます。 ロシアで最も人気のあるプログラミングコンテストの開催と議論の場であるCodeforcesのトーナメントに参加することから始めます。 リーダーを見つけ、チームを編成し、地域のトーナメントに参加し、トレーニングします。 ACMへの参加は数年しか続きませんが、その反響は非常に長い間感じられます。 私にとって、ACM-ICPCは人生への大きな投資になりました。あなたにとっては、少なくとも有用で刺激的な体験になるでしょう。



All Articles