2021年に読んで印象に残った本について

2021年の振り返りでも書きましたが、昨年は、隙を見ては本を読んだりコードを読んだりして過ごしていました。印象に残っている本について、ジャンルごとにまとめてみたいと思います。

Java 関連の本

昨年転職してから、仕事で本格的に Java を読み書きするようになりました。勉強のためにいくつか本を読んだのですが、印象に残っているのは以下の2つです。

Effective Java

これは、Java プラットフォームの多くの機能の設計及び実装を経験してきた著者ジョシュア・ブロックさんが、Java の様々な機能についてその使い方や注意点を説明した本です。言語の機能を設計する側だった人が著者なので、記述について信頼性や納得感があるのが特徴です。

自分は Java の文法は把握していたものの、「Java にとっての良いコードとはどういったものか」の知見がなかったので、とても勉強になりました。特に、Java は長い歴史の中で機能が追加されてきた背景もあり、同じことをするのにもいくつか異なる記述が可能となっているので(e.g. 配列 vs List、null vs Optional、for loop vs stream、etc)、どういったメリット・デメリットがあるか、どう使い分けるのかについて知見を得られたのが良かったです。

Java パフォーマンス

Java アプリケーションのパフォーマンス改善に必要な知見をまとめた本です。パフォーマンス計測についての一般的な知識から、Java 特有の知識(Java 用のツールや JVM の挙動、etc.)までをまとめています。

個人的には、JVM の挙動について理解が深められた点が有用でした。JVM には JIT コンパイラGC アルゴリズムとしていくつかの種類があるのですが、その種類や挙動、チューニング方法についてまとめられていて、勉強になりました。

なお、原著が出たのが 2014 年と Java 8 が最新だった時代なので、情報が少し古い点については注意する必要があります。

OS・コンピュータアーキテクチャ関連の本

ゼロからの OS 自作入門

これは、著者が自作した OS のコードが GitHub 上で公開 されていて、動くコードを読み書きしながら、手を動かして OS について学べる本です。あまりに内容が面白かったので、購入してしばらくはずっとこの本を読んでいました。

基本的には「著者が書いた OS のコードについて説明を行う」という内容なのですが、完成形のコードについて説明をするのではなく、とてもシンプルなコードからスタートしてステップバイステップで少しずつ機能を足していく構成となっているのが特徴です。そのため、常に全体像を理解した状態でコードを動かすことができます。

本物の PC で、自分の書いたコードを USB ブートで起動して遊ぶことができるのも素晴らしい点です。自分は昔利用していたノート PC を引っ張り出して動かしてみていたのですが、それだけでもとても楽しかったです。

x86 の仕様や UEFI の機能について、OS を動かす上で必要になる知識を網羅的に学べるので、PC についての「ソフトウェアから見た全体感」を掴むことができるのも良い点でした。「さらなる学び」の出発点となることが出来る本だと感じてます。

構造化コンピュータ構成

「ゼロからの OS 自作入門」を読んで、コンピュータについてもっと詳しくなりたいと感じた時に古本屋で見つけた本です。コンピュータアーキテクチャを「1. デジタルロジックレベル」、「2. マイクロアーキテクチャレベル」、「3. ISA レベル」、「4. オペレーティングシステムマシンレベル」、「5. アセンブリ言語レベル」という5段階の階層からなるものとして捉えた上で、下から順に積み上げる形で説明がなされています。コンピュータアーキテクチャの全体像を下から上まで包括的に理解するための優れた本という印象です。

原著が 1998 年発売なので時代は感じるものの、幅広いトピックについて扱われていてとても勉強になりました。個人的には、バス(特に ISA バスや PCI バス)についての知識が得られた点と、マイクロアーキテクチャを実例を通して学べた点が特に気に入っています。

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

ARM アーキテクチャを題材に、デジタル回路やコンピュータアーキテクチャについて説明した本です。x86 以外の ISA について知りたくなり、ARM について学ぶために読みました。序盤はデジタルロジックレベルの説明なので ARM は関係ありませんが、説明がかなり丁寧で良い内容でした。中盤以降は ARM の命令セットについて理解を深めることができる内容となっていました。

x86 はよく命令が複雑と呼ばれていますが、実はこれまではあまりピンと来ていませんでした。しかし、後方互換性を保つために増え続けた命令や可変長で複雑なマシン語などを見ていると、確かに ARM(特に AArch64)と比較すると複雑だと感じるようになりました。比較対象が出来たことで理解が深まったように感じています。

Linux デバイスドライバ関連の本

「コンピュータについてもっと詳しくなりたい」と感じた気持ちの延長で、一時期 Linux デバイスドライバ関係の本を読んでいました。

Linuxデバイスドライバの開発

Linuxデバイスドライバについてベーシックな内容を学べる本です。デバイスドライバの書き方自体については、本当に基礎的な部分だけを説明されている印象です。ただし、動かせるコードサンプルがついているので、自分で書き換えながら学べる点が気に入っています。

最初の数ページでいきなり Buildroot を利用した Linux カーネルのビルドを行うことになり、その点については少し驚きました。しかし、そのおかげで Linux カーネルのビルドに対して心理的抵抗が減ったのは結果的には良かったです。

Linux デバイスドライバ 第3版

Linux用のデバイスドライバについて詳細な解説がなされた本です。デバイスドライバについてもう少し詳しい内容が知りたいと思い、買いました。こちらも豊富なサンプルコードをもとに解説されている点がとても良いです。古い本であるため記述やサンプルコードが古いのが難点ですが、以下のレポジトリでは、現在の Linux Kernl で動くサンプルコードが公開されています。(自分の手元の Ubuntu 20.04 でもちゃんと動きました)

https://github.com/martinezjavier/ldd3

Linux デバイスドライバにはいくつか種類があるのですが、基本的には device file としてインターフェースを表現し、必要な callback 関数(e.g. open, read, etc.)を実装することでその機能を実現する、という内容を学べたのが良かったです。

並行プログラミング関連の本

並行プログラミング入門

並行プログラミングというトピック自体が好きなので、発売と同時に買って読んだ本です。最初に並行性、並列性についてきちんと定義を述べた上で、アセンブリ言語のレベルから高級言語のレベルに至るまで並行処理に必要な機能について説明されている点が良かったです。

個人的に、ARM (AArch64) の ldaxr や stlxr などの Load-Link/Store-Conditional 命令については知らなかったので、勉強になりました。x86 のように compare and exchange 命令を持っているものと思い込んでいたので、異なるアプローチをとっていることが驚きでした。

全体的にコードでのサンプルが豊富に掲載されているので、動かしながら学べるのも良い点です。Rust のコードが多数掲載されていて、Rust についての勉強にもなりました。

まとめ

2021年に読んで印象に残った本について、ジャンルごとにまとめてみました。全体的に、コンピュータの基礎について学び直す内容が多かったように思います。すぐに応用には結びつかなくとも大事な部分ではあるので、ゆっくりと学ぶ機会を作れて良かったと考えています。