はじめに
毎日何かしらのサービスを通じてアルゴリズムの問題を解き続けて感じたことについてまとめています。
私自身、プログラミングにおける基礎力や自分で考える力が不足していると感じ、しばらくの間、ほぼ毎日アルゴリズムの問題を解いていた時期がありました。
続けているうちに、昨日まで解けなかった問題が理解できるようになり、ネットやAIで見つけたコードだけに頼るのではなく、自分でコードを組み立てたり、AIが出したコードに対して「ここはこうしたほうがいいのでは?」と考えながら、自力で書き換えたりできるようになってきました。
何より、もっと面白いコードや難しい問題を解けるようになりたいと思うようになりました。
この記事が、アルゴリズムを学ぶためのモチベーションや、日々の学習の参考になれば幸いです。
なぜアルゴリズムを毎日解こうと思ったのか
現在、「アプレンティス」というエンジニア養成機関にて学習しており、一定レベルまでアルゴリズムのスキルを上げる必要がありました。
そして私自身、そもそものプログラミングやアルゴリズムにおける基礎力の不足を痛感しており、活躍できるエンジニアになるためにも、基礎の土台を固める必要があると感じていました。
そうした外発的な要因もありましたが、本心では、「もし問題を自分のコードで組み立てて、いろんな表現ができたら面白そう」という気持ちがあり、とにかく自分でコードを組み立てたいと思っていました。
毎日解いて感じた変化
基礎力の向上
以前、自力で配列やハッシュを含むコードすら書けない時期がありました。しかし、継続することによって、順次・選択・繰り返しといった基本的な処理については、無意識にでもすぐ書けるようになりました。
それに加えて、早期リターンや三項演算子、問題文に合わせて「これは配列がいいのか、それとも処理効率を考えてハッシュがいいのか」など、より適したコードを考えるようになりました。
そして今では、ソートや二分探索、動的計画法など、さらに難しいアルゴリズムにも挑戦したいと思うようになりました。
そうして自分の頭で考えてコードを書くことができるようになったことで、自信を持てるようになった気がします。
「頭のメモリ」の変化
問題を解くとき、最初は「この処理を考えている間に、さっき考えていたことを忘れる」ということがよくありました。
しかし、繰り返し問題を解いているうちに、「今何を考えていて、そのために何を確認すればいいのか」を頭の中に置いたまま考えられる感覚が少しずつ出てきました。
それをコードに当てはめて、筋道を立てて考えることで、論理的に考える力を磨くことにつなげられたと思います。
アルゴリズム学習との直接的な因果関係は分かりませんが、日常生活でも「頭の中で情報を整理してから話す」ということが以前よりしやすくなったように感じます。
アルゴリズム学習は実際の開発にも役立つのか
大いに役立ちました。
アルゴリズムの問題では、変数や配列、ハッシュなどを使ってデータを加工する機会が多くあります。
その経験が、実際の開発でデータの流れや処理を考える際にも役立っていると感じます。
コードも以前より読めるようになったことで、エラーが起きた際に「どのデータがおかしいのか」「どの処理で問題が起きているのか」を確認しながら、スムーズにデバッグできるようになりました。
現在は、AIを使って開発を進める機会も増えていますが、AIが作ったコードが正しいかどうかの判断や、出力されたコードのデバッグも以前よりスムーズにできるようになり、開発を進める速度も上がったと感じています。
アルゴリズム学習によって基礎の土台が固まったことで、実際の開発でもかなり役立っていると感じます。
継続して感じた「やり方」の重要性
一番大事なのは、健康と安心して取り組める環境だと思います。
これがないと、そもそもアルゴリズム学習に取り組むこと自体が難しくなり、学習してもなかなか身につきにくくなると思います。
そして、アルゴリズムを解く際に、スマホやゲームなど、すぐに刺激を得られるものを長時間利用した後だと、アルゴリズムのようにじっくり考える学習が億劫になることがありました。
また、パソコンとずっと向き合っていると頭も疲れてくるので、適切に休んだり、運動したりすることも大事だと感じます。
そして、いざアルゴリズムの学習に取り掛かるときも、いきなり難しい問題に取り組もうとすると嫌になることが多かったです。それこそ、AIに丸投げしてしまうこともありました。
プログラミングには正解があると思いがちでしたが、必ずしもそうではありませんでした。コードの書き方は無数にあり、ネットやAIで見つかるコードも、その中の一つに過ぎません。
そのため、「答えを探すよりも作る」ことを意識するようになりました。
簡単な問題を解きながら、別のコードで書いてみたり、試行錯誤して遊ぶ感覚で、徐々に難しい問題に慣れていくのが良いと思います。
難しい問題においても、いきなりすべてを書こうとするのではなく、出力結果を確認しながら、まずは小さくコードを組み立てていくことが大切だと思います。
AIに丸投げしてしまうこともありますが、それでは自分で考える機会を失ってしまいます。
思考することを放棄せず、少しでもいいから自分で考えて、AIにはヒントをもらいながら解いていくのが良いと思います。
問題を解くこともそうですが、毎日少しずつ、自分で考えることそのものに意味があると思います。
おすすめサービス
Paiza
プログラミング問題に初めて取り組む人へおすすめです。
AtCoder
競技プログラミングに挑戦したい人へおすすめです。
LeetCode
より難しい問題や、データ構造・アルゴリズムを深掘りしたい人におすすめです。
個人的に好きなサービスです。
おわりに
最初はコードをまともに書けなくて、「このままだと一生、自分でコードを書くことなんてできないのではないか」と不安に感じることがありました。
しかし、それは「毎日少しずつ自分で考えて解くこと」によって、少しずつ解消することができました。
イメージでいうと、最初はゲームが下手だったけれども、いつの間にかかなり上手くなっていた、という現象に近いと思います。
プログラミングも一種のゲームなのかもしれないと感じています。
「やらなきゃいけない」という焦りじゃなくて、「どうやったら面白くなるか」という気持ちになるまで、基礎固めはしっかりやる必要があると感じています。
ゲームも最初はつまらなくて、負けて失敗し続けるけれども、続けていたらいつの間にか無意識に勝てるようになったというあの感覚です。
そんな感じで毎日、自分に合った方法で問題を解き続けることで、かなりの効果を実感できました。
この調子でコードを書き続けたいと思っています。
この記事が、アルゴリズム学習を始めたり、継続したりするきっかけになれば幸いです。