1日5分からプログラミングスキルを上げるための勉強法

こんにちは、松井です。

先日、職場の4年目の若手エンジニアから、

「松井さん、

プログラミングスキルをあげたいんですけど、
なにか良い勉強方法ありませんか?

でも、そんなに毎日ガッツリ勉強はできないので、
コツコツできるやつがいいです。」

と、意識の高いような低いような、質問をされたので、答えていきます!
(いや、勉強意欲があって、すごく嬉しいですよ!)

 

今回の勉強法がオススメなひとは、

「ひととおりプログラムのことは分かってるから、次は、更なる高みを目指したい!」

ってひとです。

まあぶっちゃけ、初心者以上のプログラマなら、全員にオススメです。

 

今回紹介する勉強法は、

プログラミングの基礎力をアップさせていくこと

が、目的になっているので、

言語問わず、全プログラマーを支えるスキルとなるはずです。

(これから先、どんな言語をやることになっても、同じように活かせるスキルであるということです。)

 

ずばり、その勉強法は、

「競技プログラミングで、アルゴリズムを学ぶ」

です。

 

アルゴリズムを学ぶことは、地味ですが、
多くのプログラマーにとって、大きな助けとなります。

 

あなたは、上司から設計書を渡された時、

「これ、どうやって実装しよう…」

とゼロから悩むことなく、

「どのアルゴリズムを使えば、
より効率的に実装できるのかなぁ」

と、

選択肢をもってのぞめることが、

どれほど自分を楽にするのか、想像できますでしょうか?

でも、競技プログラミングってハードル高くね?

とはいえ、競技プログラミングと聞くと、

「え、めっちゃハードル高くね?」

と、思う方もいるかもしれません。
(そもそも、なんじゃそれ?ってひともいるかもしれませんね。)

が。

実は、めちゃくちゃ簡単にできちゃいます。

 

競技プログラミングでは、

出題者から出された問題にたいし、
その問題を解くためのプログラムを作成していきます。

問題のレベルも
小学生の算数のような超簡単なものから、超数学級のものまで様々あって、

例えば、簡単な問題ですと、👇 このような感じで、
「与えられた数字が、奇数 or 偶数を判定する」みたいな問題が出されます。

ABC086A – Product
■問題文

二つの正整数 a,b が与えられます。 a と b の積が偶数か奇数か判定してください。

つまりは、この問題の場合、

答えが奇数なら Odd 、 偶数なら Even と出力する
プログラムを実装すれば、OKです。

 
上級者レベルになると、👇のような問題もあります。
(雰囲気だけ伝わればいいので、問題文は、理解しなくていいですよ!)

ABC161F – Division or Subtraction
■問題文
正整数 N が与えられます。2 以上 N 以下の整数 K を決めて、N が K 未満になるまで次の操作を繰り返し行います。操作:N が K で割り切れるとき、N を N/K に置き換える。そうでないとき、N を N−K に置き換える。
最終的に N が 1 になるような K の決め方は何通りありますか?

問題は、A〜Fと様々あるので、
自分のレベルにあった問題を解けば、OKです!

 

ちなみに、地味にメンドウな、環境構築は必要ありません。
ブラウザがあれば、オールオーケーです🙆‍♂
(VSCODEなどのエディターはあったほうがいいかもですが!)

めっちゃ、手軽に始められますよ!

 

そもそもなぜ競技プログラミングが そんなに大切なん?

とはいえ、

そもそも、なぜ競技プログラミングが、そんなに大切なのか?

 

端的に言えば、

プログラマーが、本当に集中すべきところに
集中できるようになるからです。

 

僕が競技プログラミングを始めたきっかけは
入社2年目くらいの時の「とある失敗」でした。

その時の僕は

内部設計書の作成や 単体テスト設計書の作成
そしてコーディング、

それらを一通り任されていました。
(小さな機能ではありましたが、)

 

しかし、

「こういった処理を作りたい!」と
頭のなかでは、想像できていても、

それをじゃあプログラムでどう実現するか?

というのが 全然、思い浮かびませんでした。

(これは、割と初心者プログラマーあるあるなのでは?)

 

とりあえず行き当たりばったりで
コードを書いてみるも、
なかなか思うような実装にはなりません…。

そのときは結局、
上司に相談して、納期を遅らせてもらい、

そのまま行き当たりばったりのコーディングを繰り返し、
その後、(仕様を満たせる)正解のコードにいきついたのですが、

同時に、

「これって、なんとか
もっと、スムーズにならんもんかね?」

って思ったんですよね。

 

確かに、

コーディングしながら試行錯誤するのは
楽しいんですけど、

それによって、
開発の納期が遅れてしまったり、

本来はもっと、
お客さん からの要求をより良く実現するための
工夫や考慮ができたところを、

なんとか作り上げました…、で
終わらせてしまうのは、

僕としては本望ではありませんでした。

 

シンプルに、悔しいですし、

プログラマーの本分は、コードを書くこと自体ではなく、

作ったプログラムによって、
お客さんの業務をよりよく改善していくこと

にあるのですから。

 

だからこそ、

「仕様を…、仕様を満たせるだけの
コーディング力が欲しい…」

と、思ってました。

 

そんな頃に、僕が出会ったのが、

競技プログラミングでした。

 

それから、朝に少し早く出社して、
1日2,3問ずつくらい解いてました。

余談ですが、

競技プログラミングは、
15分くらいあればできますし、
朝の頭のストレッチにちょうどいいです。

 

競技プログラミングをやってくうちに、

コーディングのアルゴリズム的な部分で
悩むことは減りました。

そして、その分、

「このお客さん(や、上司)の要求に応えるには、
どういう実装がよいのだろう?」

と、考える時間が徐々に増えていったように思います。

 

ひとは、余裕ができると、

今までと同じ作業をやるにしても、

他に、いろんなことを考えられるようになりますから。

自然と、仕事の視野も広がった気がします。

 

そして、

僕が、競技プログラミングをやってみて
感じたことは、

「コーディングは、2種類に分けられる」

ということです。

 

「コーディングは、2種類に分けられる」

コーディングは、2種類に分けられます。

 

それは、

1.お客さんの業務・要望に依存するもの

2.アルゴリズムに依存するもの

の2種類です。

 

1の方は、

お客さんとの打ち合わせを重ね、
互いの認識を合わせていくなかで、

決めていくものです。(いわば、仕様です。)

これは、今後、どれだけITが発展しても、
泥臭くやっていくしかありません。

そして、これをサボって、
良いシステムができることもありません。

 

それに対し、2の方は、

1を実現させるための
プログラミング的な実装部分です。

これは、 既に、ある程度のパターンが確立されて、
(例えば、幅探索、深さ探索、動的計画法、など)

学べば、(比較的すぐに)身につけられます。

 

結構、プログラミングって、

設計書を渡されて、はじめて、

さぁ、どうやって実装していこうか、

と、考えることが多いと思います。

 

しかし、実際にアルゴリズムを学んでみて感じたのは、

「アルゴリズムを知らずに、プログラムを書こうとする」

ことは、

「 数学を解くときに、公式を知らずに解こうとする」

ようなものだ、ということです。

 

数学のテスト範囲の公式を覚えずに、
テスト当日をむかえてしまった

高校時代の、あの絶望感を思い出すと、

それは、とても笑えたことではありません。

 

なのに、プログラミングではなぜか、
いきあたりばったりで、解を出そうとする。

これって、おかしいんですよね。

 

本当は、プログラミングも数学のテストと同じで、

設計書を見た時に
公式(アルゴリズム)を学んでおらず、

その場でゼロから公式を作り出そうとしていては、

時間ばかりがかかってしまいます。

 

でもそうではなく、

いくつかのアルゴリズムを知った上で、

「その設計書に合うものはどれだろう?」

と考えられるとしたら、
ずいぶん楽になると思いませんか?

 

そして、

「プログラミングの実装部分」に余裕ができることで、
より、「お客さんからの要求」に集中できるようになります。

人間でなくてもできることは、
単純化(アルゴリズム化、IT化)させて、

人間は、1のような、より人間にしかできないことに
注力すべきだと、僕は思っています。

 

アルゴリズムを学ぶことで、
コーディングにおけるすべての問題が解決される

という全能なものではありませんが、

プログラマーが、本来、集中すべきところに、
集中できるようになる

と、僕は思います。

 

基本〝以上〟のプログラミングスキルを学びたくはないか?

余談ではありますが、

プログラミングって、基本〝以上〟のことを
学ぶ機会が少ないように思うんですよね。

 

プログラミングを学ぶと、

変数、標準入出力、分岐処理、
繰り返し処理、配列などの基本構文くらいは

知っていて当然だとは思うのですが。

しかし、それ以上の、

それらを正しく、かつ効率よく利用し、

バグを作らず、より早く解くためのアルゴリズム
を学ぶ機会は、少ないように思います。

 

多くのプログラマーは、
プログラミングの〝基本〟を学んだあとは、

Ruby on Railsや、React、Flutterなどの
それぞれの言語の仕様を学ぶんだり、使える言語を増やそうとしたりと、

プログラミング言語を〝広く〟学ぶようになっていきます。

 

最近、「未経験からプログラマーになろう!」
みたいなのが、ブームですが、

ぶっちゃけ、コードが書けるのは、
スタートラインでしかなく、

その先へ進む方法は、まだまだ確立途中な気がしてます。

 

そして、

そのきっかけの1つは、

プログラミング自体を〝深く〟学ぶことのできる
「競技プログラミング」

なのかな、と僕は思います。

 

とりあえず、今日から5分でできること。

競技プログラミングをはじめるなら、
僕のおすすめは、AtCoderです。

>> AtCoder

AtCoderは、日本の企業がつくった
競技プログラミングのプラットフォームなので、
問題文も模範解答も、
日本語でちゃんと用意されいて分かりやすいのが良いです。

あと、毎週末の夜に、大会を催してくれており、
かなり活発的な活動を行ってくださっています。

大会へは、登録すれば、誰も気軽に参加することができます。

もちろん、いきなり大会に出場しなくても、
過去の大会で出題された問題を解くこともできるので、

まずはそちらから解いてみてもいいかもしれません。

>> AtCoder

 

といっても、

過去問もたくさんあって
どこからといたらよいかわからない! という方は、

まずは、AtCoderでまず解くべき10問、にチャレンジしてみては、と思います。

>> AtCoderでまず解くべき10問

この10問は、解法も探せばすぐにでてくるので、安心してチャレンジできるかと!

(例えば、C#なら、こちら。
>> AtCoderに登録したら解くべき精選過去問 10 問を C# で解いてみた

 

では、今日はこのへんで。

ありがとうございました!

 

P.S.

自分のAtCoderでのスコアが一覧で見られるサイトがあって、
勉強モチベーションアップに役立ちます。

>> AtCoder Problems

ちなみに、僕の場合はこんな感じ。
(自分が解いた問題を色づけしてくれます。)

おすすめです!