なぜ「アルゴリズム」と「データ構造」なのか

『プログラミングワンダーランドへ,いらっしゃい』

プログラミングワンダーランドへ,いらっしゃい (Standard Technology Books)

プログラミングワンダーランドへ,いらっしゃい (Standard Technology Books)

プログラミングに関する初歩的な知識がとてもわかりやすく書いてある。わりと低レベル(変数とメモリの関係とか)なところまで噛み砕かれているのがよい。

分節化によって思考がはじまる

ひとは言葉を覚えて世界を区切り意味を与える。分節化する。虹が6色に見えたり7色に見えたり、見分けのつかない雪をべつの名前で呼び分ける民族がいる。区切っているのかまとめているのか、言葉が先か認識が先かは知らないが、世界の見方はあらかじめ決まっているものではない。
見方を知らないものに「あれしろ」「これしろ」と言っても、伝わらない。もちろん、言っていることの意味はわからないし、どうすればいいかも知らないはずだ。しかしそれ以前に、何が何であるか、わからない。何って何?
ものの見方がなければ考えることはできない。言葉を話せるようになったときにはなんらかの見方をもっているから、「思考するまえに分節化しなさい」だなんて妙なことを教えるお母さんはいない。人間にとっては自明なこと。

データ構造は実装される

この本はハードウェアや低級言語から出発するので、アルゴリズムとデータ構造の重要さを理解しやすい。コンピュータは単純な仕組みを複雑に組み合わせてやっと動く。しかしプログラミングするときには細かいことを気にしないように工夫されている。その工夫自体が、複雑な組み合わせによって実現される。コンピュータはやっぱり本質的に難しいということがわかる。
コンピュータは0と1を識別することしかできない。たとえば、机の上に積み上げた本をひとかたまりとして認識することができない。「この本をそこの山に積んでおいて」と頼んでも理解できない。ものごとのまとまりには、こういうちょっとした操作が加わることもある。データ構造といっても一枚の図で表せるとは限らない。ものごとをどんなふうに見て、そして扱うかという仕組みである。
アルゴリズムは手順だといわれる。コンピュータはいわれたことしかできないから、手順を明確にするのはたしかに重要だ。しかし手順はものの見方があってはじめて当てはめることができる。だからコンピュータにはデータ構造という世界観をまず教えてあげる。
データ構造を根本から実装するのは難しい。でも、すでに実装された便利なデータ構造がいっぱいある。もしかしたら、新しいデータ構造を設計し、実装しなければならないかもしれない。そういうときにデータ構造の知識が、ないよりはあったほうがいい。「自分なりのものの見方をコンピュータに教えてあげる」って考えると、けっこうすごい。

ヒューリスティックを実装する

アルゴリズムとデータ構造を知らなくてもプログラミングはできる。複雑なアルゴリズムをつくるためにはアルゴリズムの深い理解が必要だ。しかしアルゴリズムを道具として組み合わせることは勘でもできる。複雑なアルゴリズムは賢いひとがつくって、道具になる。
でもアイデアを実現するために自分でアルゴリズムを考えないといけないかもしれない。そういうとき、もしかしたら既存のアルゴリズムを模倣できるかもしれないし、ぜんぜん参考にならないかもしれない。
思いつきのアルゴリズムは人間くさくてぜんぜん合理的じゃないかもしれない。高度化のしようがないから、アルゴリズムをてきとうに組み合わせるくらいしかできない。実装っていっても、道具を試しながら手探りで手順を並べかえることだ。
そういうアルゴリズムは単純っていうより素朴ってよぶべきだ。そういうのを「ヒューリスティック」とよぶのかな。試行錯誤や経験測によって問題を考えること。ヒューリスティックの精度を理論的に検証することは難しいけれど、コンピュータの馬力と組み合わせることで想像以上の結果を返してくれるかもしれない。
っていうわけで、高度な理論は賢いひとに任せておけばいいけど、素朴なアルゴリズムだとしても結局は実装しなきゃいけない。そのためにコンピュータに仕組みを教えてあげるっていうやさしさが必要で、そのやさしさを学ぶのがアルゴリズムとデータ構造だ。

メモ

モデリングを学習するうえでプログラミングを理解することは有効か。
コンテンツをマネジメントする技術においてデータ構造を設計する難しさ。