Data Structure and Algorithm を学ぶ良い点
Introduction
1年ほど生活リズムがだいぶ朝方に変わりました。家事の合間に1時間ほど時間を確保することができたので、一人でなければできないことをやろうとして Data Structure and Algorithm の学習をしていました。その結果、一年頑張っただけで、概ね LeetCode で Easy はほぼ瞬殺、Medium レベルは概ね解ける、Hard は時折解けるというレベルまで成長することができました。
ただ、多くの人が FAANG などの外資系 IT 企業への就職を目指して DS&A を学習する一方で、それが直接業務に結びつかないと考えられがちです。そして、興味本位で基礎をおろそかにして最新のテクノロジを学ぼうとする人が少なくないようです。もちろんそれ自体は悪くはないのですが、個人的には DS&A の学習は大きなメリットがありました。
今回は、DS&A を学習することでよかった点を簡単にお伝えしておこうと思います。
メリット
業務アプリケーション内では高い難易度の問題を解決でき、他分野の理解を促進できます。
複雑な処理になれる
業務アプリケーションにおいてなるべくにシンプルに設計したとしても複雑になってしまう時がよくあります。そして、DS&A で出てくるようなコードも相当複雑になります。そして、この複雑なコードに慣れていると、業務側においては脳の余剰力が生まれます。その結果、適切な命名やコンセプトづくりといったより設計にその余分な力を活用することができるようになりました。
実際に経験した例ですと、携わっていたポイントシステムの構築プロジェクトにてポイントシステムの仕様が複雑でした。それに引きずられる形で実装も非常に難易度の高いものになりました。この時に、DS&A の問題と同じようなものと捉えた瞬間に何をしているのかが明確になりました。
パフォーマンスチューニング
DS&A を学習する際に意識として芽生えるのは、どれだけ時間とメモリを消費するのかを意識する点です。そのため、どの処理に時間がかかっているのか、メモリを消費するのかを時間複雑度や空間複雑度の観点から意識することができます。
例えば、最大値を抜き出すことを考えるのであれば、ソートして値を取得するのではなく、地道に for で回す方が早いとわかります。さらに本当に必要であれば、最大値や最小値を格納するようにデータ構造を工夫する方が早いとわかります。
ただ、パフォフォーマンスチューニングをする際にはアーキテクチャの理解が一番重要です。求める性能がそもそも設計思想やその方針が適切かどうかを検討する必要がありますが、その上で、どこにボトルネックがあるのかを把握することも重要になってきます。
他のコンピューターサイエンス分野の理解促進
DS&A はコンピューターサイエンスの分野の基礎ですので、その他様々な分野に応用されています。そのため、DS&A を知っているとそれを応用することができます。
例えば、データベースのインデックスは私はあまり詳しくないですが、Hash Index が Hash Map 、BTree が Binary Tree と関連しているという点に気づけば自ずとその特性を理解することができます。ネットワークにはダイクストラ法というグラフにおいて最短経路を求めるアルゴリズムが用いられています。
このように、知っているとそれだけで他の分野の理解を促進します。
どう学習するのか?
NeetCode
DS&A の学習教材を提供するサービスです。。動画で DS&A の分野を説明してくれるのが非常に良かったです。演習問題として LeetCode の問題とその解説のコーナーがあります。僕は他にも書籍をいくらか用いましたが、正直このサービスが一番理解がしやすかったです。
LeetCode
言わずと知れたコーディング試験が投稿されているプラットフォームです。
まとめ
DS&A は他分野の学習にも業務にも間接的に役立つのでおすすめです。
Discussion