【OS/Linux系多め】組み込みエンジニア時代(7年間)に役立った良書9選
前書き:技術レイヤーが変わる前に振り返り
2021年12月に新卒入社した会社を退職しました。
退職前の会社では、組み込みエンジニアとして働いていましたが、次の職場ではバックエンドエンジニアとして働きます。組み込みエンジニアは、ハード(機密情報)と近い関係からか、あまり情報発信しない印象があります。情報発信しようにも、「会社独自技術のネタしか無い」という業界な気がしています。
私自身、組み込みエンジニアらしい汎用的なネタを持ち合わせていません。が、組み込みエンジニア時代の最後に「役立った良書ぐらい紹介しようかな」という気持ちで、本記事を書いています。
以降では、書籍(合計9冊)を順番に紹介します。書籍タイトルはAmazonへのリンクとなっています。リーダブルコード、Effective Java、APIデザインの極意、UNIXという考え方あたりも良書だと思いますが、有名なので紹介を割愛します。本記事では「ややマイナー本」かつ「読んだ時の印象が良かった本」を取り上げようかなと考えています。
Linuxプログラミングインターフェース
THE 鈍器
1604ページの圧倒的な物量の中に、Linuxシステムプログラミングで必要な情報が体系的に網羅されています。パラパラっと目を通して、業務で必要になったタイミングで辞書的に使えます。ネットで見つからない情報も、本書を読めば大抵書いてあり、何度も助けられました。
「C言語でシステムコール(標準Cライブラリ)を叩く」ためには、必読書とも言えます。Linuxに詳しくなりたい人が下手にLinux Kernel本を読むよりも、ユーザランドに関して説明している本書を読んだ方が効果的かもしれません。
2012年12月発行なので、若干古さはあります。ただし、本書はLinux入門書で書かれているような内容を確実に網羅しており、入門書は最新のシステムコール事情なんて触れません。入門書を複数冊買うより、本書を一冊買った方が長期的に見てお買い得。
ネットワークに関して深堀する場合は「Linuxで動かしながら学ぶTCP/IPネットワーク入門」や「マスタリングTCP/IPシリーズ」、スレッドに関しては「Linuxとpthreadsによる マルチスレッドプログラミング入門」あたりがオススメです。
Xinuオペレーティングシステムデザイン 改訂2版
Xinuは、パデュー大学で教育目的で開発されたOSです。
組み込みエンジニアは、OS、コンパイラ、シェル、エディタ(VimかEmacs)あたりに興味を持つ傾向がありますが、本書はOSに関する知識を得るためには最適の一冊です。OS規模が1万行程度と小さいため、C言語中級者は本書とソースコードがあれば、大抵の内容を理解できる筈です。ちなみに、私がソースコードに日本語コメントをDoxygen形式で付けたリポジトリがあります。ご参考までに。
本書の内容は、ブート、プロセススケジューリング(コンテキストスイッチ)、プロセス間通信、デバイスドライバ(DMA、イーサネット、割り込み、tty、etc…)、ファイルシステム、C言語ライブラリ、シェルに関してです。これらを押さえていればOSの基本を理解していると言えるのではないでしょうか。
類似書籍に「はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ」がありますが、こちらはC言語が古い文法(K&R前の文法)でコーディングされています。C言語初学者には、Xinuのコードの方が読みやすい筈です。
OSに関して発展的な内容を求める場合は、OSdevが楽しいかもしれません。OSに関する日本語書籍では「新装改訂版 Linuxのブートプロセスをみる」「ゼロからのOS自作入門」あたりが取っつきやすいです。Linux Kernelの書籍は「詳解 Linuxカーネル 第3版」や「Linuxデバイスドライバ 第3版」がありますが、15年近く前の書籍であり、賞味期限切れな印象です。
C言語によるオブジェクト指向プログラミング入門
C言語でオブジェクト指向プログラミング(以下、OOPと略します)を実践する場合は、本書を手に取ると実装方法が理解できるはずです。ポインタを理解するための書籍としてもオススメ。
C言語をメインで使うプログラマは、データ構造に対して気を配らない傾向があります(「伽藍とバザール」で類似の指摘があります)。OOPの導入は、シーケンシャルなコード構造から、保守しやすい形に実装を変えてくれます。
……そんなふうに考えていた時期が私にもありました。
別記事でも書きましたが、C言語でOOPを利用した例はLinux KernelやGNOME Toolkit Libraryと数多くあります。しかし、OOPを導入するハードルの高さの割には、恩恵が少ない欠点があります。C言語の代わりにC++、Golang、Rustでコーディングした方が早いのではないかと感じる事も多いです。
本書の内容は、C言語プログラマとして必須知識と感じる一方で、全適用するのは辛い。チーム内で落とし所を考えるべきかなと。少なくとも、本書レベルのOOPを適用したOSSは殆ど見た事がありません(= 最適解ではない筈)。
OOP等のモダンなC言語開発に興味がある人は「モダンC言語プログラミング」や「テスト駆動開発による組み込みプログラミング」がオススメです。しかし、チーム全員で輪読しないと効果が薄い可能性が高いです(チームで一人だけ意識高い系になってしまう)。
ゲームで極める シェルスクリプトスーパーテクニック
シェルスクリプトに関する書籍の中で、最も特徴的な本書。書籍名に「ゲーム」と名付けているため、読者層を狭めてしまっている感じがします。
画面制御、リアルタイム入力、移植性など、本書から学ぶべき事は多かったです。ただし、本書だけでシェルスクリプトがバンバン書けるようになるかと言えば、それは厳しいでしょう。
個人的には「シェルプログラミング実用テクニック」を読んだ後に、「bashクックブック」「覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54」あたりを読めば、シェルスクリプトに関しては充分な知識が身につくと思います。
最近だと、「1日1問、半年以内に習得 シェル・ワンライナー160本ノック」あたりが注目株ですが、未読なのでオススメできません(かなり読みたい)
Inside Linux Software ~オープンソースソフトウェアのからくりとしくみ~
本書は、C言語を用いたOSSパッケージが最低限取り揃えるべきものを教えてくれます。
Autotoolによるビルド自動化(環境に合わせたビルド)、パッチ適用、manページ、国際化(i18n)、rpmパッケージに関しても記載されており、ちゃんとしたOSSパッケージを作りたい人は目を通して損がないと思います。
ただし、本書の内容は2007年段階の内容と古く、C言語がメインの内容です。また、パッケージはRPM(RedHat系)です。Debian系(Debian、Ubuntu、Kali、Raspberry Pi OSなど)ユーザーには、「[入門] Debian パッケージ」や「Debian管理者ハンドブック(無料PDFあり)」も併読すると、Debianエコシステムが理解できるのでオススメです。
OSSに詳しくなると、ビルド職人かRoot File System職人を生業とする可能性があります。ビルド職人を目指す方は「Linux from scratch」、組み込み用のrootfs職人を目指す方は「Embedded Linux Systems with the Yocto Project」あたりに目を通して、2年間ぐらいビルドエラーと格闘すれば一人前の職人になれます(私は、実際にしました)
Androidを支える技術
本書は、Androidアプリではなく、Androidプラットフォームアーキテクチャ(下図)について説明しています。AndroidはLinux Kernel上にハード抽象化レイヤー(HAL)、コロコロと仕様が変更されるRuntime、Java Native InterfaceでラッピングされたNativeレイヤーがあり、それらの上でJavaのミドルウェアが動いています。
残念な事に、本書を読んで仕事の役に立った事がありません。ただし、日本語でAndroidアーキテクチャを説明している書籍は少なく、本書は念入りに調査して記載している事が伝わってきて、読み応えがありました。OS好きな人にはオススメ。
2週間でできる! スクリプト言語の作り方
コンパイラ本であれば「タイガー本」や「flex & bison: Text Processing Tools」あたりが本格的で面白みがあります。しかし、「敷居の高さ」や「手を動かして学べない点」を考慮すると、それらを最初に読むには厳しさがあります。
その一方で、本書はJavaでStone言語を作る流れとなっており、手を動かして学びたい私にとってはピッタリでした。ただし、サンプルコードにコメントがなかったり、ビルドまでに手直しが必要であったりと、Java初心者には厳しいかもしれません(とは言え、初めてのJava学習用に本書を購入した私が対応できたので、そこまで難しい問題ではないと思います)
同様に、スクリプト言語を作る書籍としては「Go言語で作るインタプリタ」も良書でした(世間一般的にはコチラの方が良書な気がします)
メタプログラミングRuby 第2版
本書を読み、Rubyに対する見方が変わりました。
「メタプログラミングとは何ぞや」という気持ちで本書を手に取ったのですが、Ruby(動的型付け言語)の素晴らしさが伝わってきました。Rubyは設計の幅を広げる考え方が詰まっていて、学んでも書いても楽しい言語です。「Rubyは死んだ」と公言する人が多いですが、生き残りそうな雰囲気があります(言語仕様や標準ライブラリがそこまで劣っているとは思えません)
OOPに関しても、デザインパターン本(Java本)を読む前に「オブジェクト指向設計実践ガイド(Rubyの本)」を先に読めば良かったと感じた記憶があります。また、「Ruby on Rails 6 実践ガイド」でMVC(特にModelの考え方)が即座に理解できました。Rubyは分かりやすい。
これからRubyを学ぶ人には、「チェリー本」が入門としてオススメです(私が読んだのは初版なので、実はリンク先の改訂2版を未読)
詳説 正規表現 第3版
本書を読むと、「正規表現?Google検索でコピペるよ」から「パフォーマンスを意識した正規表現を書く」までに、レベルアップします。正規表現の書式、方言、ベンチマーク(効率の良い正規表現の書き方)などが体系に学べるのは、本書だけでしょう。
重点的に取り扱われている言語は、Perl、Java、.NET、PHPであり、Ruby、Python、Tcl(!!)も話題には出てきます。C言語は出てこず、自分で使い方を調べました。登場する言語がやや古いのは否めません。
正規表現は学んで損がない技術の代表格なので、色んな方に本書を手に取っていただきたいです。
最後に
選外は、「エンジニアのためのJavadoc再入門講座 現場で使えるAPI仕様書の作り方」です。コメントに何を書くべきで、何を書かないべきかがシッカリ書かれている書籍は、現状で本書ぐらいしか知らないです。
振り返ってみると、私がプログラミングを学び始めた頃よりも、初学者向けの書籍は質が上がっている気がします。プログラミング言語の説明だけでなく、テストやプロジェクト管理に関してもシッカリ記載されている書籍が増えた印象です。
(単に、初心者時代の私がテストやプロジェクト管理の記述を理解できず、読み飛ばしていた可能性もありますが……)
ロシア人と国際結婚した地方エンジニア。
小学〜大学院、就職の全てが新潟。
大学の専攻は福祉工学だったのに、エンジニアとして就職。新卒入社した会社ではOS開発や半導体露光装置ソフトを開発。現在はサーバーサイドエンジニアとして修行中。HR/HM(メタル)とロシア妻が好き。サイトに関するお問い合わせやTwitterフォローは、お気軽にどうぞ。