» コンピュータはなぜ動くのか 第2版 知っておきたいハードウエア&ソフトウエアの基礎知識
『コンピュータはなぜ動くのか』という技術書を読んだので、感想やハイライトをまとめます。
この本の概要
コンピュータの仕組みを理解するために知っておきたい、ハードウェアとソフトウェアの基礎知識がまとまっています。
僕のようにRailsフレームワークでとりあえずポートフォリオを作って転職した駆け出しエンジニアにとって、こういったプログラミング以外の知識が相当欠けているように感じていたため、読むことにしました。
読んでみて思ったこと
基本情報技術者試験の内容とかなり似ているな、と感じました。
今もし既に基本情報対策の参考書を持っている人は、新たにこの本を買うよりもその参考書をしっかり読み込めば十分だと思います。
僕はSES時代に基本情報の資格を取らずにひたすらポートフォリオづくりをしていたのですが、基本情報だけはしっかり勉強しておけばよかったな、と後悔しています。
よかった点
- コンピュータ内部の仕組みやアルゴリズムとデータ構造、オブジェクト指向プログラミング、データベース、ネットワーク、暗号など幅広い領域を広く浅く網羅してくれています。「エンジニアに必要なコンピュータの知識を一通り網羅したい」人には適切な本かなと思いました。
- 柔らかい口調や文体なので、読みやすいです。専門用語もしっかり説明されているので拒絶感なくサクッと読めました。
悪かった点
- 初版が2003年とかなり昔の本なので、描かれているIT業界がけっこう古いです。ウォーターフォール開発をはじめとする、SIer的なIT業界が前提となっているため、現代のWeb系自社開発企業とは大きく異なる価値観だなと感じました。一方でこれは、たとえ技術や開発手法が進歩していってもコンピュータの基礎は不変である、ということを示唆しているのかもしれません。
- 最終章には「SEはコンピュータ・システム構築の現場監督」という表題でシステムエンジニアがどうあるべきか、みたいな内容が書かれています。この辺は僕たちWebエンジニアにとっては無縁の話なのでスルーでいいかな、と思いました。
- 第2章の「コンピュータを作ってみよう」や第3章の「一度は体験してほしいハンド・アセンブル」は初学者にはむずかしく、駆け出しエンジニアにとっては少しオーバーワークのように感じました。純粋に「コンピュータの動作原理を知りたい」人はぜひチャレンジしてもいいと思います。僕は「エンジニアとして最低限やっていくための基礎知識を得たい」人には不要だと判断し、サラッと読み飛ばしました。
- 第2章の「コンピュータを作ってみよう」ではペンで線を引いてみましょうみたいな件があるんですが、僕は電子書籍で読んでいたのでそもそもできませんでした、、。
僕のハイライト
コンピュータの絶対的な基礎は3つある
それでは、さっそくコンピュータの3大原則をお教えしましょう。
1.コンピュータは、入力、演算、出力を行う装置である
2.プログラムは、命令とデータの集合体である
3.コンピュータの都合は、人間の感覚と異なる場合がある
コンピュータの都合の代表例は、すべての情報を数値で表すことです。
コンピュータ技術が進化する目的はただ一つ「人間に近づくこと」です。人間に近づくには、コンピュータの都合で人間の感覚に合わなくなっている部分を解消する必要があります。
コンピュータは「入力値を元に計算結果を出力するただの計算機」だと思うとだいぶ身近に感じました。
この3大原則を認識した上で学習を進めると、個別具体的な知識もスッと入ってくるかなと思いました。
配列はデータ構造の基本
変数の実体は、変数のサイズで確保されたメモリー領域です。
配列は、複数のデータを格納するためのメモリー領域をまとめて確保し、全体に1つの名前を付けたものです。
配列は、物理的なメモリーの構造(コンピュータの都合)をそのまま利用した最も基本的なデータ構造です。
僕はそもそも「メモリの構造」とかを意識したことがなかったため、CPU・メモリなどハードウェアの理解をもっと深めるべきだなと感じました。
一方でCPUを自作したりまではしなくていいかな、とも思っているのでバランスが難しい、、。
オブジェクト指向のポイントは「クラスを使いこなせるか?」
オブジェクト指向プログラミングを実践するには「私はクラスを作る人、あなたはクラスを使う人」という感覚が必要になります。
クラスを作る側になったプログラマは、プログラムの開発効率と保守性を考慮して何をクラスにすればよいかを決めます。1つのクラスを修正したら、他のクラスの修正も必要になってしまうようではいけません。
クラスという部品を使う人にとって、クラスがどのように見えるかという仕様のことを「インタフェース」と呼ぶことを覚えておいてください。
オブジェクト指向プログラミングのための設計では、バラバラになった関数と変数を後からクラスにグループ化するのではありません。最初に必要な数だけクラスを決め、後から個々のクラスが持つべき関数と変数を列挙していくのです。
僕はRailsフレームワーク等で学習を進めてきたため、あんまりクラスとかを意識する機会がなく、クラス設計・オブジェクト指向設計はピンときていませんでした。
しかしWebエンジニアに転職して思うのは「オブジェクト指向ってめっちゃ大事っぽい」です。
まだ自分自身も理解できていませんが、設計やアーキテクチャを考える際にオブジェクト指向の知識は必須となっています。
オブジェクト指向に関しては別の本を読んでより深く理解した方が良さそうです。
MACアドレスとIPアドレス
MACアドレスは、ハードウエア的にネットワーク・カードを識別するものですが、それだけでは面倒なことになります。なぜなら、企業単位でMACアドレスの上位ケタをそろえるようなグループ化ができないからです。
TCP/ IPネットワークでは、ハードウエア的な MACアドレスとは別の、ソフトウエア的な番号をコンピュータごとに設定しています。この番号がご存じ「 IPアドレス」です。IPアドレスが設定されたコンピュータのことを「ホスト( host)」と呼びます。
インターネットの世界では、 IPアドレスが付加されたデータが飛び交っています。ただし、最終的にデータを受け取るネットワーク・カードを識別するのが MACアドレスであることに変わりはありません。そこで、コンピュータには、 IPアドレスを MACアドレスに変換する「 ARP( Address Resolution Protocol)」という機能を実現するプログラムが組み込まれています。
MACアドレスとIPアドレスの2単語は聞き覚えがあるものの、両者の区別ができていませんでした。
MACアドレスは機器自体を識別する番号で、IPアドレスはインターネット上の住所を表す番号のイメージなんですね。
コメント