こんにちわ、KazuMAXです!
現在プログラマーやエンジニアの方、もしくはプログラミングを勉強して日が浅い方でこういった方はいないでしょうか。
「プログラミングのコードは読めるけど、書けない!」
おそらく結構な割合でいらっしゃると思います。
なぜなら実際の現場にしても勉強するにしてもプログラミング力のみを鍛えるというのは難しいからです!
というのも具体的な勉強法って意外とわからないものですよね。
著者である私自身もそういった期間を長いこと抜け出せずにいたことがあります。。。
じゃあプログラミングってどうやって勉強すればいいんだ?
今回はそういった悩みを答えるべく今回経験年数2年で独立しフリーランスになった僕がおすすめする「プログラミング勉強法」を2つにわけてそれぞれ紹介したいと思います!
※プログラミング学習においてはインプット<<<アウトプットであるためアウトプットできる勉強法に絞って紹介します。
おすすめプログラミング勉強法①
最初に紹介するおすすめのプログラミング勉強法は「オリジナルアプリを開発する」です。
アプリ開発ってやっぱりいいの?
自分で開発となるとプログラミング前に環境構築で時間かかったりしない?
そういった意見すごくわかります!
なのでまずはなぜそれでも「オリジナルアプリを開発する」ことがおすすめなのかを説明します。
おすすめする理由①
まずおすすめする理由としては「プログラミングだけでなくHTMLやCSSも一緒に学べる」からです。
アプリ開発などにおいて基本インターフェース、いわゆる画面が必要になってきます。
その際にHTML、CSSがありますが、プログラミング言語と同時に勉強できます。
意外と慣れている人ではHTML、CSSの方がサーバーサイドのプログラミング言語よりも苦手という人も少なくないと思いますので初心に帰るという意味でもいい勉強になるかもしれません。
おすすめする理由②
次におすすめする理由としては「プログラミングするのに必要な概念を学べる」からです。
プログラミングをして実際にアプリを開発する際に必要となる概念が色々と存在します。
上からダーッとコードを書き連ねるのも特別機能に関して問題はないですが、アプリ自体が複雑になってきたり、規模を大きくしようとした場合、修正や機能追加する際どこに手を加えればいいのか分かりづらくなってしまったりします。
それを防ぐためにオブジェクト指向、継承、カプセル化などといった概念が存在します。(具体的な説明は省きます。。。)
これまで説明したように簡単なアプリ(電卓やtodoリストなど)でも作成できようになると「プログラミングはこういうこと」という基礎概念がまとめて学ぶことができます。
おすすめプログラミング勉強法②
次におすすめするプログラミング勉強法は「競技プログラミング」です!
ネットではよく
競技プログラミングは意味ないって聞いたことがある、、、
そもそも競技プログラミングって何?
といった内容をよく見かけます。。。
ただ、正直にいうと競技プログラミングはある程度プログラミングができる方々以外にも初心者の方にもおすすめの勉強法なのです!
実際プログラミングおすすめ勉強法①の「オリジナルアプリの作成」ですが、
実際作りたいものはないんだよなぁ、、、
何個もアイディア出てこないよ、、、
と、プログラミングを勉強したいとしてもまずその悩みをクリアしないと始められることができません。
そういった方々にとって競技プログラミングは最適なプログラミング勉強法なのです!
では具体的に競技プログラミングがなぜプログラミングの勉強にいいのか丁寧に説明していきます。
競技プログラミングをすることの一番のメリットは「アルゴリズムの構築に強くなれる」ことです!
そもそもアルゴリズムとは、ある問題を解決するための方法や、ある目標を完了するための方法が書かれた一連の「手順」のことです。
そしてこのアルゴリズムの構築力がプログラミング力を鍛えるということに密接に関係しており、それは「競技プログラミング」で磨くことができるのです!
アルゴリズムを鍛えるのが大事なのはわかったけどなんでそんなに重要なの?
そこがつながらないとなかなか重い腰も上がりませんよね!
では競技プログラミングでアルゴリズムの構築に強くなることで得られるメリットを紹介していきます。
おすすめする理由①
まず、「問題や課題解決の際に頭の中で処理の流れをイメージすることができる」ようになります。
つまり、何か実現したい機能を追加する際どうプログラミングしていいかわからないということをなくせます。
「こういう処理を作りたいなあ」という「したいこと」をプログラミングで実現する際に頭の中で処理の流れ(フローチャートのようなもの)がイメージとして捉えられるようになります。
これがより向上していくとメソッド単位からクラス単位、アプリ単位で処理の流れをイメージで捉えられるようになりその結果プログラミングを「書く力」はもちろん「読む力」も大きく向上します。
ネットで公開されているオープンソースであったりなど他人が書いたソースもすんなり頭に入っていくようになり、「こういう処理を実現したいときはこう書けば効率いいんだぁ」といった新しい知識やアイディアなど得られる機会が増えます。
実際に僕も競技プログラミングで詰まったとき、他の人の正答しているコードを読んで新しいアイディアなど多くインプットできるようになりましたし、仕事の時においても既存のソースを読む時間がだいぶ短縮されるようになったことで仕事をこなす全体のスピードも向上しました!
おすすめする理由②
次に競技プログラミングをしてアルゴリズムの構築力の向上により得られるメリットとしては「他の言語の習得が速くなる」ことです。
プログラミング言語というのは書き方の違いはあれど考え方(アルゴリズム組み立て)は同じなので、言語間の書き方の違いさえ学べば習得ができるようになります。
プログラミング言語の習得というのは英語でも同じですが、「アウトプット」しなくては身につけることはできません。
アウトプットの機会というのはなかなか見つけづらいですよね。。
英語にしても学ぶ際アウトプットしたくても、実際に外国の方と話す機会なんて滅多にないですよね。。。
英語はそれを解決するために「英会話」がありますが、プログラミングでは「競技プログラミング」がそのアウトプットの場には最適です。
たくさん書く機会があるので書籍やネットのインプットのみの学習よりも圧倒的に成長速度は早いです。
そして言語を習得できるようになると「他のプログラミング言語ではどう書くんだろう」、「最近流行りのあのプログラミング言語はどんな感じなんだろう」など次のプログラミング言語や技術に興味を持つようになると思います。
成長のきっかけ、成長意欲などを刺激するにも競技プログラミングは最適ですね。
余談
余談ですが、競技プログラミングをする際におすすめのサイトを紹介しておきます。
それは「LeetCode」です!
「leetcode」と検索すれば一番上に出てくると思います。
↑実際のLeetCodeホーム画面
*全て英語表記なので敷居が高いように思えますが、英語の学習と思って頑張りましょう!(無理ならgoogle翻訳さんに頼ってください笑)
LeetCodeがプログラミングの勉強に良い理由を3つ挙げます。
1.難易度がEasy、Medium、Hardと別れていてそこからさらに正答率をそれぞれ出してくれている
自分の感覚ですが、Easyを問題なく解けるようであれば仕事でどう書いていいかわからないといったようなことはなくなるので仕事で困ることはなくなります。
下の画像でもわかるように難易度がEasy、Medium、Hardと別れているのに加えてそれぞれのレベルごとにAcceptance(正答率)が載っているので自分のレベル感を把握しやすいです。
2.大量のテストケース(データ)を自動投入してくれる
LeetCodeの最大のメリットといっても過言ではないです。
自分でテストデータを入れて自分の作成した処理は抜け道がない確認する作業は大変ですよね。
しかも処理が複雑になればなるほど抜け道のカバーは難しくなります。
LeetCodeでは何百ものテストデータを実行時に投入してくれるので抜け道に気づくことができる機会が多くあります。
抜け道の想定をするようになることで強いアルゴリズムが構築できるようになります。
3.他の人の回答で解説してくれていることがある
最後まで答えわからないし、どう書けば正しく動くんだろう?
そうなった時に正答した他の人の回答を見ることで解決と理解の機会を得ることができます。
実際の他の人の正答したコードですが、解法(Approach)を書いていてくれたります。
これらを熟読することで、「自分のコードは何が悪いんだろう?」、「こう書けばうまく実現できるんだ!」など新たな発見や知識を得ることができます。
まとめ
今回はプログラミング勉強法を初心者、初心者以上に分けてそれぞれ紹介しました。
特に紹介した中でも競技プログラミングに関しては深掘りしてサイトまで紹介しました。
プログラミングの勉強においては本文でも言いましたが、「たくさん書くこと(アウトプット)」が大事なのです!
これに関しては初心者であろうが上級者であろうが重要度は変わりません!
僕自身プログラミングをたくさん書いて試行錯誤してエラーも全て自分に血肉に変えてきたことで経験年数2年という速さで独立するまでになることができました。
僕自身が辿ってきた道なのでこれからプログラミングを勉強する人、またはプログラミング力を鍛えたいという人は今回の記事をぜひ参考にしていただけると嬉しいです😁