一言でプログラミングといっても範囲は多岐にわたりますが、競技プログラミングというのを聞いたことはあるでしょうか。
すごく簡単にいうと、出された課題を解くプログラムを作成し回答するものです。
例えば、とても人力では計算できないような膨大な情報量を、機械の処理能力を使って解きます。
他には、膨大な計算が必要なものを、数式や発想の転換などで解決させるものもあります。
要するに、知識と頭をフル活用して早く正確に回答を目指すということです。
実際に仕事の役に直接立つことは珍しい
私自身は、学生自体に少し競技プログラミングをやっていました。
※紹介しておいてなんですが、成績は優秀でなかったです。
当時から言われていたのは、実際に仕事などで役に立つのか、ということです。
これに関して言うと様々な意見があるのは承知ですが、個人的な意見を書くと「無駄にはならない」程度だと考えています。
競技プログラミングで求められることは、なんといっても早く正確に問題を解くことです。
数学の知識を求められることは多いものの、だからといって公式を知っていれば解けるというものではありません。
難しい問題では、必ず一工夫や二工夫を必要とします。
課題に差し掛かった時、発想を変えて乗り越えることは仕事でも役に立ちます。
コーディングミスを減らすことができれば、仕事の効率も向上します。
ではなぜ「無駄にはならない」程度と示したかというと、仕事に役立てるには遠回りと感じるからです。
研究職や画像、AI系のライブラリ開発などの一部には直接生きるかもしれませんが、アプリ開発やシステム開発者などへの恩恵は大きくないと考えています。
アプリを作りたいならアプリの書籍を買って勉強した方が早く、システムの開発をしたいなら言語を軽く触った後フレームワークを学習した方が近道です。
そもそもビジネスで直面する課題は、直接的なプログラミング能力よりも要件定義や設計段階、あるいは人的な問題が多いです。
頭の体操をしながらコーディング能力を養う、程度のものと考えてください。
ここ何年かは採用に競技プログラミングを活用する企業も出てきており、就職面でも恩恵は存在します。
ただ上でも書いた通り、決まった会社があって内容が分かっているなら関連する技術を学んだ方が効果が高いと思います。
上位に組み込めるのであれば違ってくると思いますが、そもそも上位に組み込める脳がそもそも就職には苦労しない気がします。
要は競技プログラミングで優秀な人材になったのではなく、元々優秀だったから競技プログラミングでも好成績を出せたということです。
※競技プログラミングで有名な方を探してみてください。高学歴のオンパレードです。
総合的に見て、どうしても遠回りな印象が否めないのが正直なところです。
競技プログラミングは目的が決まっていない方にこそおすすめ
上記の内容では批判色が強いかもしれませんが、「楽しみながら学ぶ」という手段において有用だと考えています。
こちらについても異論はあると思いますが、プログラミングを学びたいがどこから手を付けていいか分からないといった方におすすめしたいです。
プログラミングの言語を学ぶ書籍やサイトは多数出ていますが、「この後どうするの?」となることがあります。
あくまで言語はプログラムを記述する手段であって目的ではないので、サービスや製品などの形で成果物が必要になります。
具体的な目標が決まっていない中で、楽しみながら勉強を続けていくには良い教材ではないでしょうか。
競技プログラミングでは、同じような問題でも解くたびに理解が深まり段々と洗練されていくはずです。
無駄がなくすっきりしたコードは、バグを生みにくく修正しやすいコードになりやすいです。
ガシガシ問題を解いて、コーディング能力を鍛えてみましょう。
ちなみに競技プログラミングでコードを圧縮するための「テクニック」(中括弧の省略や一行に全部書くなど)がありますが、仕事でやると他人が読めなくなります。それは競技中だけにしておいてください。
競技プログラミングの始め方
step
1エディタまたは統合開発環境(IDE)を用意する
競技プログラミングを始める前に、開発環境の準備が必要です。
回答を提出する前に、サンプルのデータできちんと回答ができるかを確かめます(デバッグ)。
特定のキーワードを強調したり、エラーか所を指摘したりとかなり便利なので、必ず入れておきましょう。
用意するものは、エディタでもIDEでも構いません。
エディタはEdit(編集)が目的で機能が控えめで、IDEは開発をする「環境」ごと提供するものなので最初から完結をしています。
最近のエディタは性能が高くデバッグも可能で、個人的にはエディタの方がおすすめです。
IDEに比べ軽量で起動や動作も早いのですが、最初から全部載せのIDEよりも事前の設定が必要になりがちです。
扱うプログラミング言語の特性もあるので、学びたい言語を選んでから決めてしまっても良いと思います。
OS、言語を問わず及第点を取れそうなものは、「Visual Studio Code」ですね。
仕事でも現在進行形で使っている優秀なエディタです。
step
2サービスに登録する
後述する競技プログラミングのサービスに登録します。
ゲストでもできるものがありますが、お試し後はログインして使った方が早いです。
step
3簡単な問題を解いてみる
開発環境とアカウントを用意したら、後は問題を解いて提出するだけです。
HelloWorld的なテスト用の問題があると思うので、まずはそれをやってみましょう。
問題の流れが理解出来たら、後は好きな問題を選んでガシガシ解いていくだけです。
step
X問題に詰まったら
学校のテストではないので、解答があれば見てしまうのもありです。
また数学的な知識や、色々なアルゴリズムの知識が求められます。
問題を解きながら、知識を養っていきましょう。
競技プログラミングをするなら数学とアルゴリズムの学習は必須
競技プログラミングには数学の知識が必須です。
趣味でやるか上を目指すかにもよりますが、上を目指すなら高度な知識を求められます。
はっきり言って、上位で紹介される問題は高度な数学や脳のパズル、とんちをきかせたような問題ばかりです。
個人的には、とにかく高度な問題を目指していくよりも、色々な種類(文字列処理や探索系など)の問題に触れてみるのが良いと思います。
競技プログラミングサービスの例
レビューできるほど色々なサービスを利用してはいませんが、いくつか主流なものをご紹介します。
下記の内のどれかを選んでおけば無難だと考えています。
導入のハードルが上がるため海外サービスは紹介していません。
- AtCoder
言わずと知れた競技プログラミングのサービスです。
日本の競技プログラミングサービスと言ったらこれです。
コンテストが豊富で競い合うのが好きな方にお勧めです。 - AIZU ONLINE JUDGE
古参の競技プログラミングサービスです。
カテゴリ毎に問題が選べるので、とっつきやすいと思います。
この記事で推奨している楽しみながらという目的であれば、一番使いやすいと思います。 - paiza
就職サービスに力を入れているサービスです。
企業からの推薦も得られるため、就職を同時に叶えたい場合におすすめです。
ただし前述している通り、就職に対して競技プログラミング自体が遠回りであるため手段と目的が合っているかは確認しておきましょう。
競技プログラミングは楽しみながら勉強できることにつきる
見直してみると批判記事のように見えてきますが、すすめているつもりです。
対象が万人ではなく、目的が決まっていないがプログラミングは勉強したいという方です。
そのためすすめ方もかなり控え目にしています。
この記事を書いたきっかけは久しぶりに自分でやりたいと思ったからです。
今となっては趣味の範疇を超えませんが、既にプログラマーの方もやってみると意外と面白いかもしれないので興味が出たらやってほしいと思っています。
既にプログラマーになってから取り組むメリットは、、、ちょっと思いつかないです。
続けるかどうかはやっぱり趣味でしょうか。