質問: 現在スタック、キュー、ツリー、ソートなどを始めとしたデータ構造とアルゴリズムの勉強をしています。これはエンジニアの基礎的なスキルだから(と世間様が言ってる)という理由が私のモチベーションです。 ですがここで質問です。 ### 質問 **これらが重要と認識されてる方は、これまでご自身の開発でどのようなシーンで使ってきたか教えてもらいたいです。もしできれば、実際の現場レベルでの活用事例を紹介したWebサイトの紹介もお願いしたいです** というのも、RailsやDjangoやZend FrameworkなどによるWebアプリケーションやiOSアプリ、機械学習などの領域でこれらを使ったことがあるというエンジニアが周りにいないです。私も使った記憶がありません。でもなんで世間様はこんなにもデータ構造とアルゴリズムを重視されてるのでしょうか。特にアメリカ西海岸のIT企業などで。 コーディング面接で必要であったり、Googleのような超巨大なサービスではフルに活用しないとパフォーマンス、サーバーのコストなどに雲泥の差が出てくるんだろうなとは思っています。 ですが、世の中の殆どのSEのうち、このような巨大なサービスでパフォーマンスをチューニングしてる人は一握りだけでしょう。 彼ら以外でもデータ構造やアルゴリズムをうまく活用している人たちはいるかもしれませんが、どのように用いてるのか全く検討もつきません。「XXXのような仕様のアプリケーションでフレームワークにはXXXを用いており、具体的にこういう処理で必要になる」くらいの事例をものすごく知りたいです。 例えばソートは組み込み関数で行えるので、どのソートアルゴリズムを使うのかなんて考えないです。ツリー構造でのトラバーサルなどそもそもデータをツリー構造にする時点で全然イメージがわかないうえ、post order トラバーサルとかlevel order トラバーサルやAVL木なんて実務でいつ使うんでしょうか。RDBのインデックスで使ってるとかそういうのは知ってますが、そんな低レイヤーをいじるのは一握りの人だけですよね。 長々と書きましたが、データ構造やアルゴリズムが必要とされるのはかなり一握りの人たちだけでほとんどのSEには必要のないこと、知らなくても業務はこなせるのになんでこんなにデータ構造やアルゴリズムがもてはやされてるのでしょうか、ということが気になっています。 ### 追記 実際にデータ構造やアルゴリズムの勉強をしていると、そんなのなんの役に立つの?などと聞かれることが多々あります。上長に説明しても、そんなのGAFAに入るために必要なだけでしょとか失笑されます。
回答: 巨大なシステムでは重要≒普通のシステムでは知らなくてよい、とお考えのようですがとんでもない話です。資源の少ないマイコンでは RAM も貴重 ROM も貴重、電池も貴重で、最適なアルゴリズムやデータ構造を使わないと1つ1つの処理に余計な時間がかかります。電池機器(まあ端的にはスマホっすけど)では無駄な処理は一切許されません。ほぼ同じような処理をして A 社のスマホは電池が10時間保つけど B 社のスマホは20時間保つ、とかなればお客様は B 社に流れてしまいます。この辺の事情はPCでも同じことですよ。 データ構造、アルゴリズムの * 詳しい実装までは知らなくてもよい(たいていは既にライブラリ化されているので、ありがたく使わせていただくだけで良い)のですが * 本質的に何がどう違ってどういうメリット・デメリットがあるか、は知っておかないと選択の余地がありません 他にも例えばカルドセプトというゲームでサイコロの出目がバグっている事件なんてのがありましたが、これも「疑似乱数」というアルゴリズムを正しく理解せずに使ってしまったがゆえに発生したものと推定されています。こんなバグを出してしまったメーカーの技術力は大いに疑われる、つまり市場の信頼を失ってしまいます。 知っていればもてはやされる、レベルの話ではなくて 知らないと失笑される、と考えてください。