🙄

読むとお得なソフトウェアエンジニアリングの技術書一覧

2024/12/21に公開

はじめに

この記事はLipersInSlums Advent Calendar 2024 「スラムで年収をあげる〜だが僅かばかりの友の他は、皆、スラム民を嘲った。資格取得で年収アップに挑むなどと〜」の大遅刻組の記事である。シモンは泣いていい。

筆者がプログラミングを初めた頃はインターネットの検索技術は発達しておらず、良質なコンテンツにたどり着くには一苦労だった。そのため、何か新しいことを学ぶのに最初に手を取るのは技術書であった。
今では検索技術は高度に発達し、必要な情報は検索すればたちまち手に入る用になった。しかしながらそれらの断片的な知識群を体系化し、習得するのは未だ難しい。体系的に知識を習得する上で技術書は未だ最も有力な候補となる。
この記事では主にジュニア(?)エンジニア向けに、読むとプログラミングに必要な比較的陳腐化しにくい様々な知識が体系的に身に付いて役に立つお得な技術書を簡単に紹介する。

副題:スラムの新人ソフトウェアエンジニアに読ませる本一覧

ぜひ読んでほしい技術書たち

並行プログラミング入門

https://www.oreilly.co.jp//books/9784873119595/
現代のソフトウェア開発において並行プログラミング、あるいは非同期プログラミングは避けて通れない。この本はこれらのよくある問題や実装パターンについて一通り解説している。この手の並行プログラミングに纏わる本は昨今の広がりからか増えてきているため、同様の本で勉強してもよいだろう。この本の特徴として最終章で並行計算モデルに言及する点が挙げられるが、この内容は筆者が詳しくないため、記述の正確さは保証できない。
また、非同期ランタイムの実装においてよくある並列にタスクを実行するためのWork-Stealingについての言及はない。検索すればその手の記事はあるので、RustのtokioやGoといった最近の非同期ランタイムを使うのであれば追加で調べておくといいだろう。
同様の本としてHaskellによる並列・並行プラグラミングがあり、こちらはSTMを使った並行プログラミングが詳しく解説されている。STMによる並行プログラミングの圧倒的なパワーを感じたい方はこちらも参照すると良い。

DNSがよくわかる教科書

https://www.sbcr.jp/product/4797394481/
現代でソフトウェアエンジニアリングをする上で各種インターネット技術は避けられない。例えWeb系のソフトウェアエンジニアでなかったとしても、自動化や簡単なダッシュボードの作成による作業の効率化には積極的に取り組むべきである。そういった場合、DNSの知識が必要になる。DNS周りは勘違いがあったりとインターネット検索で正確な情報を手に入れるのは難しい。そこで有識者に良い本を教えてもらったところ紹介されたのがこの本である。
平易に書かれており、各種ツールで実験して挙動が理解できるように書かれている。DNSに対する攻撃や現代では対応すべきといわれているDNSSECに関する記述もある網羅的な本である。表紙の初心者エンジニア必見の文字列が胡散臭いが、間違いなく必見の本だ。

ゼロトラストネットワーク

https://www.oreilly.co.jp//books/9784873118888/
最近各所でバズワードとしてマーケティングに使われている悲しいゼロトラストという言葉がある。この本はそういう怪しげな話ではなく、実際にゼロトラストネットワークとはなにかというのが書かれた啓蒙的な本である。ファイアウォールによる境界防御から始まり、「信頼するな信用せよ」を標語に常に検証されたセキュアなシステムを構築する理念と具体的な方法や技術が書かれている。筆者は副次的な効果として、AWSやGoogle Cloudのセキュリティ関連のシステムがなぜこのような設計になっているかの理解が得られた。
この本のプラクティスをすべて実行することは現実的には不可能[1]である。学ぶべきは、理想的なセキュアなシステムを作る上でどのような点を考慮する必要があるのか、その問題点を解決するのにどのような技術群が選定されうるかである。プラクティスのうちローコストなものの導入を推進しつつ、コストの高いものもうまく企業規模に併せてダウングレードして導入していこう。

Webブラウザセキュリティ

https://www.lambdanote.com/products/wbs
前述した通り、現代においてWebは避けては通れない技術である。その中でもWebブラウザにおけるセキュリティの諸事項を網羅的に書いた本である。通称全Webフロントエンド入門者に読ませたい本[2]。Webブラウザを自動化ツールのフロントエンドやダッシュボードとして使う際はぜひ一読しておくことをおすすめする。後述する安全なWebアプリケーションの作り方と併せて読むとなお良いだろう。

ラムダノートの本はこの後も何冊か紹介するが、購入に際しては是非公式サイトを使ってほしい。というのも書籍を買うとPDF版が無料で着いてくるのでめちゃくちゃお得だからである。PDFも変にパスワードがかかってないので気軽にタブレットで読むことができ最高である。

暗号技術入門

https://www.sbcr.jp/product/4797382228/
現代のソフトウェアエンジニアリングにおいて暗号化技術は(ry。よく聞く暗号化、証明書、ハッシュ関数などを網羅的に紹介している本である。暗号化技術を専門としない限り、この本の内容を把握していれば十分だろう。
前述するゼロトラストネットワークでmTLSやプライベートPKIの利用に対する記述があるため、TLS及びPKIのより詳しい内容が知りたいと考える人もいるだろう。そういう人はプロフェッショナルTLS&PKIを参照しよう。

リレーショナルデータベース入門

https://www.saiensu.co.jp/search/?isbn=978-4-7819-1390-2&y=2017
ソフトウェアにおいて何かしらのデータを永続化するというのは頻出パターンである。その場合、データストアとしてRDBが選択されることが多い。この本では関係代数から始め理論からしっかりRDBやRDBMS、SQLについて解説している。この本を読むことでデータベースの設計やチューニングの際に場当たり的な対応ではなく、適切な理解のもとに判断ができるようになるだろう。
続編(?)としてリレーショナルデータベース特別講義がある。結果整合性の話やDWHの話もしているが、かなりマニアックな内容が多く、おすすめできる。

Release It!

https://amzn.asia/d/ctH6S60
すべてのソフトウェアは作ったら終わりではなく、リリースし運用する必要がある。この本ではどのようにソフトウェアの安定性を確保するか、処理能力を馬鹿食いするようなありがちなアンチパターンなどを書いている。この本を読めば意識的に安定したハイコストパフォーマンスのソフトウェアを書けるだろう[3]。少々内容が古いがエッセンスは変わらないため、各自で補完してほしい。
SREを任される場合はより発展的な内容が必要だろうが、筆者はそのあたりについて全然詳しくないのでおすすめできる書籍がない。パフォーマンスチューニングに関しては現在読んでいる詳解システム・パフォーマンスはおすすめできる。
この本の問題点は2nd Editionが出ており大幅に内容が変更されているらしいが、2nd Editionは原著しかないことである。英語に問題がない人はぜひとも2nd Editionを読んでほしい。

Design It!

https://www.oreilly.co.jp/books/9784873118956/
ユーザーに届ける価値を最大にし、保守しやすいソフトウェアを作るには適切な設計が必要になる。この本はユーザーのヒアリングからはじめ、要件の設定、よくあるアーキテクチャパターンの解説、そのために使える多くの方法論が載っている。ソフトウェア開発の設計に関する本で網羅的で現代的なものは少なく[4]設計の流れが一通りわかる良い本となっている。この本に書いてあるとおり、チームにも進めてチーム全員アーキテクトという理想に向かっていこう。

プログラマーのためのCPU入門

https://www.lambdanote.com/products/cpu
高速なプログラムを書く上で書いたプログラムがCPUでどのように処理されるかのイメージは重要である。CPUに関する書籍は複数あるが、ソフトウェアの開発者がほしい内容が十分まとまっているのがこの本である。著者があのtakenobu.hsさんなのも推せるポイントである。
CPUに関するより詳細な内容が知りたい場合は、有名なコンピュータの構成と設計コンピュータアーキテクチャを参照しよう[5]
また行列計算などよくある数値計算の例に関してはスパコンプログラミング入門などのHPC系の書籍を当たると良い。

Real World HTTP

https://www.oreilly.co.jp/books/9784814400669/
現代においてWebは避けては(ry。実際にHTTPレスポンスを見ることも多く、Webサーバーを実装する上でもHTTPに対する理解は必須と言って良い。この本は歴史とともに詳しくHTTPを解説している。ブラウザからのHTTPリクエストやRESTful APIについても解説している。RESTful APIに関してはおまけ程度なので、実際の設計を含む詳細が知りたければWeb API: The Good Partsを参照しよう。
第2版で大幅加筆されたため、購入の際は最新版であることを確認することをおすすめする。

マスタリングTCP/IP 入門編

https://www.ohmsha.co.jp/book/9784274224478/
例えレイヤを分け、抽象化したとしても下のレイヤの事情を理解していないと困る場面は多い。したがって、ネットワークアクセスを行うソフトウェアを作る際にはTCP,IPといったインターネットの通信プロトコルを理解する必要がある。その手の本は多く、良い本も多い。あまり読み比べてはいないので最も有名で筆者も読んだことがあるこの本をおすすめする。インフラエンジニアだったりネットワークを専門とする業務を行わないのであれば十分な知識を学べるだろう。
さらなる発展的な要素は、同じくマスタリングTCP/IPのシリーズに当たるとよい。

徹底解説v6プラス

https://www.lambdanote.com/products/v6plus
日本において、インターネットの接続に際してNTT東西のフレッツ網を使うことが多い。これは想像するよりも摩訶不思議なネットワークで、フレッツ網に関する特殊な概念(e.g. IPoE)もある。そういったフレッツ網特有の事情を学ぶのにこの本はおすすめできる。この知識が活きる卑近な例として、新しいインターネット回線を契約する際にどれを選べが良いのかがわかるというものがある。

Linuxのしくみ

https://gihyo.jp/book/2022/978-4-297-13148-7
ソフトウェアをサーバーとして動かす場合、Linuxディストリビューション上で動かすことが多い。その場合、開発やデバッグ、運用においてOSがどのように動いているかを理解する恩恵は大きい。この本はLinuxの基本的な要素を学ぶことができる。OSをターゲットとした同様の本はヘビーなものが多く、中でもLinuxにターゲット絞ったものは少ないため、貴重な本である。
この本も増補改訂版で大幅に加筆され、仮想化技術の話が追加されている。購入の際は注意されたし。

OSを利用するプログラム側の話はシステムプログラミングの本でなされることが多い。併せてGoならわかるシステムプログラミングを読むと良い。他の節でも紹介しているTCPや並行処理に関してもOSを介した利用の記述がある。

プログラマのための文字コード技術入門

https://gihyo.jp/book/2019/978-4-297-10291-3
ソフトウェア開発において文字列と文字列操作を扱う場面はかなり多い。その場合、文字コードの知識が必要になってくる。この本は文字コードに関する知識を体系的に学ぶことができる。よく遭遇する文字コードは一通りカバーしており、実際にプログラムでどのように扱うかや遭遇する問題の調査、解決方法もまとまっている。困ったときにも頼れる一冊である。

計算機プログラムの構造と解釈

https://www.shoeisha.co.jp/book/detail/9784798135984
プログラムというのは如何にして抽象を設計するかというのが肝となる。言語設計者はユーザーがプログラムをする上で「どのような抽象を欲し、どのような保証を得たいか」を考え、言語仕様として抽象化機能を提供する[6]。プログラムを書く上で必要な様々な抽象(これはプロシージャのようなものから多段階計算まで)の理念と理論を知悉することは適切な抽象を設計するうえで必須である。しかしながら、さまざまな抽象を理解しそれを設計に活かすには多くのソフトウェアを抽象化能力の高いプログラミング言語で作りながらそれらを具に観察する必要があり、簡単に習得できるものではない。こういった抽象の詳細やパターンを多く詳解しているのがこの本である。
ぜひ読んでほしいが今まで紹介した本とは違い、文体が古めかしく、話している内容も抽象度が高く難しい[7]。また、流行っている言語とパラダイムが違いすぎるSchemeをわざわざ勉強するというのも人によっては気が乗らないかもしれない[8]。とはいえ、本書以外で包括的にプログラムの抽象を扱っている現代的な本は筆者が知る限りはない[9]。苦しいがぜひ読んでほしい。

同様な本はこの本がSICPと略されることからポストSICPなどと呼ばれることがある。言語仕様やプログラミング言語の基本的な抽象構造を言語仕様によった解説している本は他にもいくつかあり、コーディングを支える技術Concepts, Techniques, and Models of Computer Programming[10]がある。これらはSICPよりも読みやすく、現代的な内容も含んでいるのでぜひ読んでほしい。

入門 監視

https://www.oreilly.co.jp/books/9784873118642/
すべてのソフトウェアは作って終わりではなく、保守運用する必要がある。そのためには稼働しているソフトウェアの状態を観測する必要がある。この本は簡単な統計の話と監視のデザインパターンを紹介してからどのような目的を設定してどのように監視をしていくべきかを論じている入門書である。この本の面白いところはビジネスを監視すると称してKPIの話にも触れていることだろう。ビジネスも当然監視され適宜修正されるべきであるという話は組織論を論じる本での記述は多くとも、技術書の本で書かれることは少ない。

この本はあくまで監視(モニタリング)の本であって、オブザーバリティエンジニアリングの本ではない。そちらに関しては別途オブザーバリティ・エンジニアリングなどの別途書籍を当たると良い。

安全なWebアプリケーションの作り方

https://ebook.sbcr.jp/product/79736119JAAA01MBJE3X
実際にソフトウェアを作り多くのユーザーに使ってもらう場合、ソフトウェアが安全であることは必須である。しかしながら、簡単なWebアプリケーションでさえ、ナイーブな実装をすると簡単に既知の脆弱性を作り込んでしまう。この本ではありがちなWebアプリケーションの脆弱性について解説し、どのように回避するかを学ぶことができる。少なくとも有名な既知の脆弱性を作り込むことはなくなるだろう。
著者の徳丸浩さんはYouTubeチャンネルもやっており、そこでも(なんと無料で)攻撃や脆弱性の話をしており、話題になった攻撃手法の解説や対策の話もしている。チャンネル登録といいねボタンをよろしくなのだ[10:1]

みんなのデータ構造

https://www.lambdanote.com/products/opendatastructures
プログラムを書く上で効率的なアルゴリズムを学ぶことは大切である。難しい問題でなくとも、ナイーブな実装では処理に1秒かかってしまいユーザーの体験を損なったり、メモリを消費しすぎて最終的に処理時間が増えたりすることがある[11]。この本はプログラムで頻出の典型的な問題を効率よく解くためのデータ構造とアルゴリズムを学べる。同様の本は多い中この本を選出した理由は、必要最低限のデータ構造に関して書いてあり、ページ数も多く学びやすいからである。
プログラミングをする上でデータ構造とアルゴリズムに関して学びすぎるということはない。この本だけでなく同様の本もいくつか紹介しておく。

アルゴリズムクイックリファレンスはこの本が出る前に筆者が人におすすめしていた本であり、各データ構造とアルゴリズムがシンプルに纏まっている。計算幾何や空間木構造、ネットワークフローなどの少しマニアックな内容も取り扱っているため、それらが必要な場面に遭遇したプログラマには福音となるだろう。
有名なアルゴリズムイントロダクションも良い。データ構造とアルゴリズムに関してはこれ読んどけば基本的に困らないだろうというレベルで纏まっているが、分量も多く真面目に読むと挫折する可能性が高い。辞書として所持しておき時折かいつまんでいくという使い方でも良いだろう。
適切なアルゴリズムで問題を解くという視点においては競技プログラミングの入門書を当たるのが良い。蟻本の名前で親しまれるプログラミングコンテストチャレンジブックなどを読むとよいだろう。実際の開発において適切なデータ構造とアルゴリズムを選択するにはこういった問題での練習が不可欠ではある。難しすぎず頻出の問題を提供するLeetCodeなどに挑戦もしたい[12]

発展的な話題として、破壊的な更新を避けたデータ構造とアルゴリズムの本である純粋関数型データ構造や関数プログラミングにおいて既存の問題をどのように解くかを解説した関数プログラミング 珠玉のアルゴリズムデザインがある。関数プログラミングを念頭においた宣言的なアルゴリズムの方が保守しやすいため、そういうアルゴリズムを部分的に取り入れるためにこういう書籍で学ぶのもよいだろう。

データ構造やアルゴリズムで紹介されるものの中には一見使わないと思うような難しいものも多いが、実際に我々が戦う現実世界はそのような難しい問題が随所に現れる。そういった時に戦える刃を研いでおくことが大事である[13]

最後に

読むとお得な技術書ということで、比較的ジュニア向けに仕事や趣味においてもソフトウェア開発とプログラミング(あるいはプログラミング言語の)解像度が大きく上がるような書籍を紹介した。実は個人的にまだまだ沢山紹介したい本[14]があったのだが、即効性はない類の書籍なのでそれらは割愛する。また、組織論を述べる本は割愛した[15]
これらは実際筆者が読んで良かった、いろいろな解像度が上がったと感じている本である。したがって、紹介した本の中で筆者が知らなようなより良い本がある可能性もある。そういった本を知っている方はぜひとも紹介して頂きたい。
ここで紹介した本が読者の方の成長に寄与できれば幸いである[15:1]

おまけ

ぜひとも読んでほしい本だが今回の想定する読者層とずれると思って入れなかった本としてプログラミング言語の基礎理論がある。その著者の大堀先生がなんと無料でコンパイラや形式的意味論、型システム、MLを使った開発のマインドセットなどを解説している。YouTubeチャンネルを開設し日夜動画を更新してくださっている。全人類が見るべき講義集なので是非とも見てほしい[16]
https://www.youtube.com/@keisankikagaku/featured

脚注
  1. ここでいう現実的に不可能というのは、Googleのような超巨大企業並の企業体力が持つならば可能の意味である。 ↩︎

  2. 実はフロントエンドエンジニアはすでに知っている内容なので読む必要がないという可能性がある。 ↩︎

  3. これは嘘で当然そんな簡単ではないが、少なくともよくあるアンチパターンを踏む可能性は低くなる。 ↩︎

  4. 要出典 ↩︎

  5. いわゆるパタヘネ本とヘネパタ本。プログラマーのためのCPU入門が出る前はとりあえずパタヘネとヘネパタをおすすめするという修羅が多かった。 ↩︎

  6. 実際は勢いで実装してなんじゃそりゃみたいな地獄の仕様になってることも多い。また足りない機能が多く、大半をデザインパターンで頑張るプログラミング言語もあるのが実情である。というのも、プログラミング言語は相当注意深く設計しないと拡張するのが難しいためである(そのために形式的な意味論を大切にするプログラミング言語も存在する)。 ↩︎

  7. 語り口が学術的な本にありがちな難しい話が圧縮された書かれている事が多い。これはHaskellのHaskellによる関数プログラミングの思考法IFPHなどでもありがち。 ↩︎

  8. とはいえパラダイムの違いはプログラミング言語の抽象化の理念の違いであり、かけ離れたパラダイムのプログラミング言語を触ることは正しくプログラミングにおける抽象化の引き出しを増やすことなので積極的に取り組んでほしい。 ↩︎

  9. 言語仕様のような抽象を扱った本はそれなりにあるが、抽象データ型のようなデータの抽象の概念を言語によらずこのレベルで論じてる本を知らない。あったら是非とも教えてほしい。 ↩︎

  10. あんまり反応がないからなのか更新が1年前で終わってしまっている。めっちゃ貴重だからみんな応援してくれ!!! ↩︎ ↩︎

  11. GCのStop The Worldなど。 ↩︎

  12. 自戒。 ↩︎

  13. そういった問題に取り組める人間が少ないが故に、需要から最適化を主戦場とするような企業も多い。そういった企業では採用においてデータ構造とアルゴリズムを扱う能力を求めることが多く、競技プログラミングのスコアが武器になることがある。 ↩︎

  14. 虎本とかTaPLとかプログラミング言語の形式的意味論入門とかプログラミング言語の基礎理論とかガーベージコレクションのアルゴリズムと実装とか分散アルゴリズムとかリンカ・ローダ実践開発テクニックとか。 ↩︎

  15. 組織論に関しては筆者も勉強中なため。 ↩︎ ↩︎

  16. 特に筆者は大堀先生と接点があるわけではないのでステルスマーケティングではないから安心してほしい。 ↩︎

Discussion