みんなのコンピュータサイエンスという本を読んだのでメモ。
動機
「未経験からフリーランス!」だとか「文系出身Webエンジニア!」なんて人たちがたくさんいて大活躍しているこの業界において、僕の強みは「高専5年間でコンピューターサイエンスの基礎的な訓練を(一応)受けたこと」にあると思う。そのはずが、趣味や業務でコードを書く中でそれらの知識をうまく使えている気がしないなーという問題意識があった。
5年間で学んだはずの知識をもう一度思い出しながら学び直したいなぁという気持ちがあり、良い本はないかなぁと探していたら、ちょうど最近(2019年1月)に発売されたこの本を見つけた、というわけだ。
読み進めるにあたって、高専時代に学んだことを思い出し脳内にインデックスを作りつつ、「あぁ自分はこの分野が特に抜けているなぁ」というのを知る、知ったあとはまた別の本なりWebなりで学び直す、という自分なりの方向性を決めた。
紹介
出版元の翔泳社のWebサイトには以下のような事が書いている。
本書はコンピュータサイエンスが扱う「基礎」「効率」「戦略」「データ」「アルゴリズム」「データベース」「コンピュータ」「プログラミング」という8つのジャンルにしぼり、そのエッセンスと背景となる考え方を紹介します。
コンピューターサイエンスの全体像を俯瞰するために、いい感じにジャンルを選び出してくれている。このジャンルがそのまま章立てに対応している。
各章の序文では、各ジャンルを学ぶ動機づけとこの章で学ぶことを絵文字と海外サイトやTwitterでよく見るインターネットミーム*1とともに紹介してくれている。本文も図と絵文字が多く、また他の書籍に比べて堅苦しくない印象を受けるので、楽しみながら読むことが出来ると思う。まさに、「みんなの」コンピュータサイエンスというわけだ。
所感
当初の狙い通り、コンピューターサイエンスの全体像を俯瞰しなおす事ができた。特に計算量とアルゴリズムの部分は自分が弱かったという事を再認識できたし、その他の章についても思い出しつつ新しいことも知る、という楽しい読書体験を得ることが出来た。
1章の基礎の部分で、2章以降で扱う問題を解決するためのツールの紹介と題して、フローチャートや擬似コード、モデルといった概念から、論理、順列と組み合わせそして確率などわりと数学の基礎の部分から軽い説明を入れてくれている。お恥ずかしながら忘れていた部分もあったので助かった。
一部の人々は数学が苦手だと思い、自分はプログラマの適正がないと思ってます。しかし、私は高等学校の算数で落第した程度ですが、でもまだコンピュータ業界で働いています。優れたプログラマを育てる算数は、学校で学ぶ数学の通常の試験で必要とされているそれとは違います。
WladstonFerreiraFilho. みんなのコンピュータサイエンス
その他の章でも、例えばDBの章では「インデックスを張ると早くて便利(なことが多い)だけど、なんで全部のカラムに張っちゃダメなんだっけ、何となく分かるけど他人に説明は出来るかなぁ」という疑問の答えが載っている。プログラミングの章では「式と文の違いってパッと見てなんとなくでわかるけどちゃんとした定義ってなんだっけ」という疑問の答えが載っている。「時間的局所性と空間的局所性の話」は久々に聞いた。
これらの「たぶん学生時代に習ったはずなんだけど、僕が普段あんまり気にしなくて忘れていた知識」がこの本に詰まっているわけだ。
おわりに
「高専1〜2年生くらいのときにこの本に出会ってたら良かったなぁ」なんて思いながら読んでいた。学校で数学と情報工学の基礎を学びつつ、個人の趣味でプログラミングを学び始めたのがそのくらいだからだ。学校で各分野を詳細に学ぶ前に、全体を俯瞰できたらどんなに良かったことか。
とはいえ、一旦学生を終えてフルタイムのプログラマとして働き始めたこのタイミングで出会ったのも悪い話では無いと思う。なんとなく知っていて使っていた事柄をコンピュータサイエンスの用語を使って説明できるようになるきっかけとなったし、高専時代の良い復習となった。
プログラミング始めたての学生から、それなりにコードを書く経験を積んできた初〜中級者くらいまで幅広い人にオススメ出来る良い本だった。
*1:xkcd.comとかgeek-and-poke.comとかで見るやつ