雑に描いた餅

餅は餅屋、わたしは技術屋、と言いたかった。

駆け出しエンジニアの強い味方『教養としてのコンピューターサイエンス講義第2版 今こそ知っておくべき「デジタル世界」の基礎知識』を読んだ

『教養としてのコンピューターサイエンス講義第2版 今こそ知っておくべき「デジタル世界」の基礎知識』を最近読み終わりました。

著者は『プログラミング言語C』『プログラミング言語Go』等で知られるBrian W. Kernighan氏。御年80歳。

この本はカーニハン氏がプリンストン大学で行ってきた一般人向けの講義「Computer in Our World」*1の内容をまとめたものらしいです。その講義名にふさわしく、私たちの世界を取り巻く「コンピューター」というものについて、歴史と成り立ち、これからを網羅的に語った一冊となっています。

以下、発行元の日経BPのウェブサイトから目次を引用します。

【目次】
第0章 はじめに

第1部 ハードウエア
 第1章 コンピューターとは何だろう
 第2章 ビット、バイト、そして情報の表現
 第3章 プロセッサーの内部
 ハードウェアのまとめ

第2部 ソフトウェア
 第4章 アルゴリズム
 第5章 プログラミングとプログラミング言語
 第6章 ソフトウェアシステム
 第7章 プログラミングを学ぶ
 ソフトウェアのまとめ

第3部 コミュニケーション
 第8章 ネットワーク
 第9章 インターネット
 第10章 ワールド・ワイド・ウェブ

第4部 データ
 第11章 データと情報
 第12章 人工知能と機械学習
 第13章 プライバシーとセキュリティ
 第14章 次に来るものは?

各章のタイトルから見てお分かりいただける通り、コンピューターサイエンスに入門した人、実務でソフトウェアエンジニアリングを行う中で基礎を固めたい人にとってはうってつけの内容になっていると思います。このブログ記事のタイトルにも触れましたが、まさに「駆け出しエンジニア」とされる人々にも是非オススメしたい本だと思っていますし、自分の心を駆け出しの頃に戻す上でも大きな役割を果たしてくれる一冊だと思います。

内容自体は基礎的なものが多いですが、これらの範囲を完全に理解できているソフトウェアエンジニアはそういないと思います。*2自分の自信がない部分をもう一度確認する、気になった時に再度読み返す、そうしたリファレンスのような使い方ができる本でもあると思います。

各章の概観

前書き・第0章 はじめに

カーニハン氏は本の冒頭で、コンピューターに関連する様々な事柄の中でも、「ハードウェア」「ソフトウェア」「コミュニケーション」「データ」という4つの中核的な技術領域があり、それらを知っておくべきであると述べています。実際にこれらの4項目は以降の書籍の構成にもつながっており、今後読み進める上でも助けとなる考えになってくれていると思います。

それぞれの項目について、カーニハン氏の言葉も借りて具体的に説明すると以下のとおりになります。

 ハードウェアは目に見える部分です。家庭やオフィスに置かれたり、携帯電話として持ち歩けたりする、見たり触れたりできるコンピューターです。

第1部では、ハードウェアの歴史、その中で情報がどのような形式でやり取りされているか(ビットとバイト)、ビットとバイトを用いて文書、画像、音楽、動画をどのように表現するかが説明されています。

 ハードウェアとは対象的に、コンピューターに何をすべきかを指示するソフトウェアは、ほとんど目に見えません。

第2部では、ハードウェアを動かすソフトウェアについて、どのように動いているのか、どのように動かしているのかをアルゴリズム、OS、メモリ、CPU、プログラミングといった切り口から解説しています。

 コミュニケーションは、コンピューターや電話といった機器が相互に通信して、私たちが対話できるようになることです。
 インターネット、ウェブ、電子メール、そしてソーシャルネットワークなどがコミュニケーションに使われます。

第3部では、コンピューター同士がどのようにコミュニケーションを取っているのか。ネットワーク、インターネット、ウェブと徐々に範囲を広げていきながら解説しています。

 データは、ハードウェアとソフトウェアが収集、保存、処理するすべての情報で、世界中の通信システムが送信しています。

第4部では、そうしたネットワークを通じてやり取りされたり、ハードウェア上で処理される情報について、どのようなリスクや活用方法があるのかを解説しています。

第1部 ハードウェア

ハードウェアのパートではコンピューターがどのような論理的構造から成り立っているか(=プロセッサー、メモリ、ストレージ等)、物理的構造はどのようになっており、進化してきたか(=ムーアの法則)から話が始まります。実際に目に見えやすい部分から説明が始まることで、読者としても理解しやすくなっているなと思います。

特に第3章の「プロセッサーの内部」では、コンピューターが電源が点いてからOSが起動するまでに起こっていること、プロセッサーが処理を実行する時の並行処理・パイプライン処理・キャッシングといった技術を取り扱っており、ハードウェアの基礎となる部分をしっかりおさえられるようになっています。

第2部 ソフトウェア

ソフトウェアのパートでは、線形アルゴリズム、二分探索といったアルゴリズムをテーマにすることから始まり、実際にソフトウェアを作るプログラミング、OSSの世界と歴史、OSが果たす役割(システムコールデバイスドライバー、ファイルシステムプロセッサー・メモリ・ストレージの管理等)といった内容に触れていきます。

この本の一番良かったと思える部分は、この第2部の幅広さです。アルゴリズムを取り扱う第4章では線形アルゴリズムから各ソートを経てNP問題まで、OSを取り扱う第6章ではプロセッサー、メモリ等との関わりから仮想OS、上位レイヤーのソフトウェアとの関連まで、とソフトウェアの基礎となる部分を網羅的におさえてくれています。自分が特に自信がない分野であり、Webエンジニアがあまり普段意識しない領域(かつ所謂「低レイヤー」として重要視されることもある分野)だと思うので、その部分の知識を固めたい人にとってはオススメのパートです。

第3部 コミュニケーション

コミュニケーションのパートでは、原始的に人間がどのような通信を行ってきたか(視覚信号、モールス信号、電気通信)から話が始まります。そこからやるのか?と思えるくらい歴史をさかのぼりますが、目に見えづらいネットワークの世界の導入としてはありがたかったです。

そこからローカルのネットワーク、イーサネット、無線通信、電話回線へと話を展開して、インターネットの話に移ります。インターネットを取り扱う第9章では、パケット、DNSTCP/IPTelnetSSHP2P通信といったネットワークの基礎となる知識を取り扱っています。

第4部 データ

最後のデータのパートでは、「データ」と関連するトピックを幅広く取り扱います。検索エンジンの仕組みから、トラッキング広告、サードパーティクッキー、クラウドコンピューティング機械学習、暗号アルゴリズムといったように、幅広さが見て取れると思います。

個人的には第10章のワールドワイドウェブから地続きに検索、クッキー周りの話を読み進めると、理解が深まりやすいのではと思いました。


「『低レイヤー』の知識をつけたいけど何から手を付けて良いのかよく分からない」「CSの知識や学歴がなく、網羅的な知識を身に着けたい」人にとってはオススメの一冊です。

範囲としては基本・応用情報技術者試験の午前試験の内容と重なる部分が多くあると思うので、試験勉強の副読本としても利用できるかも知れません。

*1:なおこの講義名自体は「ある日、5分以内にひねり出す必要があって付けた名称で、その後変更が難しくなってしまったもの」らしいです。

*2:もちろんですが、私も完全に理解できているとは思っていません。