派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

サクッと分かるITトレンド6月号:プログラマーのスキルアップとして競プロ(競技プログラミング)に挑戦!

「競技プログラミング」を楽しんでいる人が増えています。「競プロ」とも呼ばれ、趣味としてだけでなく、スキルを磨く練習としても注目されていますが、実際のお仕事には役立つのでしょうか?競プロの世界から見えてきた「プログラミングに求められること」を解説します。

【解説】増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『エンジニアが生き残るためのテクノロジーの授業 ~変化に強い人材になれる技術と考え方~』『IT用語図鑑[エンジニア編]』(以上、翔泳社)『基礎からのプログラミングリテラシー コンピュータのしくみから技術書の選び方まで厳選キーワードをくらべて学ぶ!』(技術評論社)などがある。

プログラミングに求められるのは「正確性」や「保守性」だけ?

仕事でシステム開発をしていると、可能な限りプログラムに不具合を作り込まないことが求められます。プログラムは意図した動作をすることが期待され、不具合やエラーの発生を最小限に抑えることが大切です。

このとき、指定された仕様を満たすだけでなく、将来の保守などを意識し、丁寧にコメントを残したりすることもあるでしょう。保守性を考慮して開発されたプログラムは、変更が必要な場合に、そのソースコードを容易に理解できます。また、機能追加などが発生したときも速やかに変更でき、不具合の発生を抑えられます。

ここで、不具合がないプログラムを開発できたとしても、その開発に時間がかかりすぎて完成が遅れたり、納期を守れなくなったりすることは問題です。プログラムの目的や要求に合わせて、適切な時間で開発を進めることが重要なのです。

これは開発にかかる時間だけでなく、プログラムの実行にかかる時間でも同じことが言えます。正確な結果が得られるプログラムでも、その実行に時間がかかるのであれば、使い物にならないかもしれません。

競プロでは保守性よりも「スピード」が求められる

そんな中、注目を集めているのが「競技プログラミング」です。名前の通り、プログラミングのスキルを競うもので、出された問題を解くプログラムを作成します。このとき、次の3つの条件を満たすことが求められます。

・正確:与えられたすべてのテストパターンに対して正解を出力する
・高速:プログラムが正解を出力するまでにかかる時間を短くする
・早い:他の参加者よりも早くプログラムを作成する

そして、正確で高速なプログラムをできるだけ早く書くと、「レーティング」と呼ばれる数値が高くなります。何度もコンテストに参加していると、そのレーティングが自分のプログラミングスキルを表す数値として判断できます。このように数値化されることで、プログラミングを学ぶモチベーションにもつながるのです。

どんな問題が出るの?競技プログラミングに取り組めるサイト

競技プログラミングで強くなる(正確で高速なプログラムを早く実装できるようになる)には、一般的な業務におけるプログラミングとは違った感覚が必要になります。数学的な考え方や、高度なアルゴリズムを知り、短時間で実装できなければならないのです。このため、似たような問題を繰り返し解くなどの練習が求められます。

たとえば、次のような問題を解くプログラムを作ってみてください。普段から業務でプログラミングに取り組んでいる方でも、少し考えないと難しいでしょう。

問題文
あなたは、500円玉をA枚、100円玉をB枚、50円玉をC枚持っています。これらの硬貨の中から何枚かを選び、合計金額をちょうどX円にする方法は何通りありますか。 同じ種類の硬貨どうしは区別できません。2通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

制約

  • 0≤A, B, C≤50
  • A+B+C≥1
  • 50≤X≤20,000
  • A, B, Cは整数である
  • Xは50の倍数である

入力
入力は以下の形式で標準入力から与えられる。

A
B
C
X

出力
硬貨を選ぶ方法の個数を出力せよ。

(出典)AtCoder Beginners Selection

このような問題をより早く解くことを楽しめるサイトとして、競技プログラミングに特化した「AtCoder」や「Topcoder」が有名です。また、「Project Euler」のように、数学的な問題が多いサイトもあります。これらは毎週のようにコンテストが開催されており、多くの人が参加しています。

その他にも、年に1度ほど開催されているものがあり、Googleが主催している「Code Jam」、Metaが主催している「Meta Hacker Cup」などがあります。さらに、「ACM-ICPC」のように、世界中の大学生を対象にして毎年開催されているプログラミングコンテストもありますし、「LeetCode」のように学習サイトと一体になっているようなものもあります。

実務に競技プログラミングは活かせるか

競技プログラミングでプログラミングを学ぶことができ、高速なプログラムを書ける力を身につけられるなら、仕事にも役立つと感じるかもしれません。しかし、競技プログラミングに取り組むことは良いことだけではありません。

たとえば、ソースコードを書く速度を追求するために、ソースコードが読みにくくなるという一面があります。出された問題を解くことだけを考えると、そのソースコードを保守することはあまり考えません。このため、変数や関数につける名前などについても丁寧に考えることは少なく、コメントを書くよりもとりあえず動くソースコードを書いてしまいます。これにより、他人が見ると何をしているのかわかりにくくなる場合があります。

また、競技プログラミングで出される問題は少し特殊なものが多く、その考え方が実務でそのまま使えるとは言えないものです。このため、競技プログラミングで良い成績を残していても、実務で良い結果を残せるとは限りません。

スキルアップに最適な競技プログラミング

上記のような課題がありつつも、競技プログラミングに取り組んでいる人は、普段からソースコードを書くことに慣れています。また、早く実装しようとすると、プログラミング言語が持つ便利な関数やライブラリにも詳しくなるため、幅広い知識を身につけられます。さらに、プログラミングに興味を持ち、積極的に取り組んでいる人は、柔軟な発想能力や高いプログラミングスキルを備えていることが多いものです。

プログラミングスキルを伸ばしたいなら、力だめしも兼ねて、競技プログラミングにチャレンジしてみませんか?

▼これまでのサクッとわかるITトレンド
Pythonはなぜこれほど人気なのか
大人も自由研究!IoTでプログラミングを体験しよう
サイバー攻撃に備えている?その対策は本当に有効ですか
Javaで開発するプログラマに将来性はあるのか
ITエンジニアはWeb3とどう向き合えばいいのか
RPAとプログラマーの役割はどう分担されるのか
ITエンジニアのための“効率の良い”数学の学び方
プログラマならではの「ChatGPT」の使い方
DXへのITエンジニアの現実的な取り組み方とは