四十三庵

蔀の雑記帳

なぜデータ構造とアルゴリズムを学ぶか

2020/2〜3月にデータ構造とアルゴリズムを勉強したので、その勉強ノートをブログで公開して行こうと思う。
下記の本を使いました。

データ構造とアルゴリズム (新・情報 通信システム工学)

目次

方法と期間

五十嵐健夫さんの「データ構造とアルゴリズム」をもとに、独学していく。
本自体は薄く、記述も簡潔なのだけど、それゆえに初学者にはわからないことも多かった。
わからないときはネットでもうちょっと説明的な資料を探す、という風に使った。

単に読んで終わりだと、力になった感じがしなかったので、実際に自分で手を動かして書いてみることにした。
僕が何も見ないで書ける言語が今のところSwiftなので、Swiftで書くことにした。

で、その中で大変参考になったのが、Swift Algorithm Clubだった。

github.com

Swiftで有名アルゴリズムを書こう、というコンセプトで、神サイト(クラブ?)だった。
正直僕が今まで見たことないようなソート方法も扱っている。
本当にアルゴリズム極めたい人は、このサイト掘れば、それだけでもうほとんど網羅できてしまうんじゃないか、というぐらい質と量がすごかった。

教科書序盤は、教科書の疑似コードを見て、自分で実装という風に進めていたんだけど、
グラフ理論あたりから自分で書くのが厳しくなってきて、SACのコード読んで理解、という風に妥協した。

当初一ヶ月で終わらすつもりだったが、思ったより難しくて、二ヶ月かかった。

目的

なんで今更こんな勉強をはじめたのか、という話。

2020年に入ってから、自分の中で技術力の伸び悩みを感じていた。
iOS開発はそこそこキャッチアップして、一人前ぐらいにはなっていたけれど、
そこから上に一つ突き抜けられる感じがしなくて、このままだとモダンな環境でルーティンワークやってるだけの、
単なる作業者になってしまうな、という悩みがあった。

アメリカのCSの学位が欲しいなと思って調べてみたが、ざっくり学費だけで1年500万くらいかかるっぽくて、
学力や英語力云々の前に、金銭的に無理だったので、流石に諦めた。
同じことを独学でできないか? と思っていた。

「データ構造とアルゴリズム」の教科書自体は2019年5月には買っていたけれど、
なかなか取っ付きづらくて、積んだままにしていた。

2月は仕事が落ち着いていた時期でもあったので、ちょっと集中してやってみよう、と急に思い立って、学習に着手した。

というわけで、学習の目的は技術力が欲しいから。
もっと言えば、より良いソフトウェアをつくりたいから。

技術力とは?

技術力という言葉はよく使われるが、実体は曖昧で多義的だ。
正直「これがわかっていれば良い」という単純なものではないと思う。

ただ、フレームワークは上辺のもので、流行り廃りがある。
時代が変わっても不変のコアな技術力は、抽象度が高いものになる。
つまり、コンピューターサイエンスにおける、データ構造とアルゴリズムを学ぶことは、
フレームワークに左右されない、より本質に近い技術力を得られると思う。

フレームワークがあれば不要だよ論

「単価の高いプログラマーになりたければ、低レイヤーがどうだの、アルゴリズムがどうとか言ってないで、
ひたすら美味しい技術の実務経験を積めよ」みたいな論もあるかとは思う。

正直教科書に出てくるような、「本質的な」アルゴリズムを実務で書くことってあまりないと思う。
競技プログラミングもそうだけど、実際の開発現場で求められていることとはちょっと乖離があるのは確か。

しかし、より良いプログラムを書きたければ、計算量の理解は必須となる。
どれだけコンピュータの性能が上がったとしても、計算量の多いコードを書けばどれだけリソースがあっても足りない。
どういう風に書いたら計算量が減るのかを突き詰めていくと、
データ構造とアルゴリズムの体系的な知識が欲しいね、と思った。

次回予告

データ構造とアルゴリズムノート 目次 - 四十三庵を作成したので、
基本的にはここに記載したタイトル通りに書いていく。
Evernoteに書いた自分用ノートを、公開用に整形して載せていくだけなんで、三日ぐらいで掲載が終わると思う。

こういう技術記事に興味ない人にはごめんなさい……
まあでも学生時代も大学の勉強ノート公開してたんで、それと同じ感覚で、ね?
(了)