読むとお得なソフトウェアエンジニアリングの技術書一覧
はじめに
この記事はLipersInSlums Advent Calendar 2024 「スラムで年収をあげる〜だが僅かばかりの友の他は、皆、スラム民を嘲った。資格取得で年収アップに挑むなどと〜」の大遅刻組の記事である。シモンは泣いていい。
筆者がプログラミングを初めた頃はインターネットの検索技術は発達しておらず、良質なコンテンツにたどり着くには一苦労だった。そのため、何か新しいことを学ぶのに最初に手を取るのは技術書であった。
今では検索技術は高度に発達し、必要な情報は検索すればたちまち手に入る用になった。しかしながらそれらの断片的な知識群を体系化し、習得するのは未だ難しい。体系的に知識を習得する上で技術書は未だ最も有力な候補となる。
この記事では主にジュニア(?)エンジニア向けに、読むとプログラミングに必要な比較的陳腐化しにくい様々な知識が体系的に身に付いて役に立つお得な技術書を簡単に紹介する。
副題:スラムの新人ソフトウェアエンジニアに読ませる本一覧
ぜひ読んでほしい技術書たち
並行プログラミング入門
また、非同期ランタイムの実装においてよくある並列にタスクを実行するためのWork-Stealingについての言及はない。検索すればその手の記事はあるので、RustのtokioやGoといった最近の非同期ランタイムを使うのであれば追加で調べておくといいだろう。
同様の本としてHaskellによる並列・並行プラグラミングがあり、こちらはSTMを使った並行プログラミングが詳しく解説されている。STMによる並行プログラミングの圧倒的なパワーを感じたい方はこちらも参照すると良い。
DNSがよくわかる教科書
平易に書かれており、各種ツールで実験して挙動が理解できるように書かれている。DNSに対する攻撃や現代では対応すべきといわれているDNSSECに関する記述もある網羅的な本である。表紙の初心者エンジニア必見の文字列が胡散臭いが、間違いなく必見の本だ。
ゼロトラストネットワーク
この本のプラクティスをすべて実行することは現実的には不可能[1]である。学ぶべきは、理想的なセキュアなシステムを作る上でどのような点を考慮する必要があるのか、その問題点を解決するのにどのような技術群が選定されうるかである。プラクティスのうちローコストなものの導入を推進しつつ、コストの高いものもうまく企業規模に併せてダウングレードして導入していこう。
Webブラウザセキュリティ
[2]。Webブラウザを自動化ツールのフロントエンドやダッシュボードとして使う際はぜひ一読しておくことをおすすめする。後述する安全なWebアプリケーションの作り方と併せて読むとなお良いだろう。
前述した通り、現代においてWebは避けては通れない技術である。その中でもWebブラウザにおけるセキュリティの諸事項を網羅的に書いた本である。通称全Webフロントエンド入門者に読ませたい本ラムダノートの本はこの後も何冊か紹介するが、購入に際しては是非公式サイトを使ってほしい。というのも書籍を買うとPDF版が無料で着いてくるのでめちゃくちゃお得だからである。PDFも変にパスワードがかかってないので気軽にタブレットで読むことができ最高である。
暗号技術入門
前述するゼロトラストネットワークでmTLSやプライベートPKIの利用に対する記述があるため、TLS及びPKIのより詳しい内容が知りたいと考える人もいるだろう。そういう人はプロフェッショナルTLS&PKIを参照しよう。
リレーショナルデータベース入門
続編(?)としてリレーショナルデータベース特別講義がある。結果整合性の話やDWHの話もしているが、かなりマニアックな内容が多く、おすすめできる。
Release It!
[3]。少々内容が古いがエッセンスは変わらないため、各自で補完してほしい。
SREを任される場合はより発展的な内容が必要だろうが、筆者はそのあたりについて全然詳しくないのでおすすめできる書籍がない。パフォーマンスチューニングに関しては現在読んでいる詳解システム・パフォーマンスはおすすめできる。
この本の問題点は2nd Editionが出ており大幅に内容が変更されているらしいが、2nd Editionは原著しかないことである。英語に問題がない人はぜひとも2nd Editionを読んでほしい。
Design It!
[4]設計の流れが一通りわかる良い本となっている。この本に書いてあるとおり、チームにも進めてチーム全員アーキテクトという理想に向かっていこう。
ユーザーに届ける価値を最大にし、保守しやすいソフトウェアを作るには適切な設計が必要になる。この本はユーザーのヒアリングからはじめ、要件の設定、よくあるアーキテクチャパターンの解説、そのために使える多くの方法論が載っている。ソフトウェア開発の設計に関する本で網羅的で現代的なものは少なくプログラマーのためのCPU入門
CPUに関するより詳細な内容が知りたい場合は、有名なコンピュータの構成と設計やコンピュータアーキテクチャを参照しよう[5]。
また行列計算などよくある数値計算の例に関してはスパコンプログラミング入門などのHPC系の書籍を当たると良い。
Real World HTTP
Web API: The Good Partsを参照しよう。
第2版で大幅加筆されたため、購入の際は最新版であることを確認することをおすすめする。
マスタリングTCP/IP 入門編
さらなる発展的な要素は、同じくマスタリングTCP/IPのシリーズに当たるとよい。
徹底解説v6プラス
日本において、インターネットの接続に際してNTT東西のフレッツ網を使うことが多い。これは想像するよりも摩訶不思議なネットワークで、フレッツ網に関する特殊な概念(e.g. IPoE)もある。そういったフレッツ網特有の事情を学ぶのにこの本はおすすめできる。この知識が活きる卑近な例として、新しいインターネット回線を契約する際にどれを選べが良いのかがわかるというものがある。
Linuxのしくみ
この本も増補改訂版で大幅に加筆され、仮想化技術の話が追加されている。購入の際は注意されたし。
OSを利用するプログラム側の話はシステムプログラミングの本でなされることが多い。併せてGoならわかるシステムプログラミングを読むと良い。他の節でも紹介しているTCPや並行処理に関してもOSを介した利用の記述がある。
プログラマのための文字コード技術入門
ソフトウェア開発において文字列と文字列操作を扱う場面はかなり多い。その場合、文字コードの知識が必要になってくる。この本は文字コードに関する知識を体系的に学ぶことができる。よく遭遇する文字コードは一通りカバーしており、実際にプログラムでどのように扱うかや遭遇する問題の調査、解決方法もまとまっている。困ったときにも頼れる一冊である。
計算機プログラムの構造と解釈
[6]。プログラムを書く上で必要な様々な抽象(これはプロシージャのようなものから多段階計算まで)の理念と理論を知悉することは適切な抽象を設計するうえで必須である。しかしながら、さまざまな抽象を理解しそれを設計に活かすには多くのソフトウェアを抽象化能力の高いプログラミング言語で作りながらそれらを具に観察する必要があり、簡単に習得できるものではない。こういった抽象の詳細やパターンを多く詳解しているのがこの本である。
ぜひ読んでほしいが今まで紹介した本とは違い、文体が古めかしく、話している内容も抽象度が高く難しい[7]。また、流行っている言語とパラダイムが違いすぎるSchemeをわざわざ勉強するというのも人によっては気が乗らないかもしれない[8]。とはいえ、本書以外で包括的にプログラムの抽象を扱っている現代的な本は筆者が知る限りはない[9]。苦しいがぜひ読んでほしい。
同様な本はこの本がSICPと略されることからポストSICPなどと呼ばれることがある。言語仕様やプログラミング言語の基本的な抽象構造を言語仕様によった解説している本は他にもいくつかあり、コーディングを支える技術やConcepts, Techniques, and Models of Computer Programming[10]がある。これらはSICPよりも読みやすく、現代的な内容も含んでいるのでぜひ読んでほしい。
入門 監視
すべてのソフトウェアは作って終わりではなく、保守運用する必要がある。そのためには稼働しているソフトウェアの状態を観測する必要がある。この本は簡単な統計の話と監視のデザインパターンを紹介してからどのような目的を設定してどのように監視をしていくべきかを論じている入門書である。この本の面白いところはビジネスを監視すると称してKPIの話にも触れていることだろう。ビジネスも当然監視され適宜修正されるべきであるという話は組織論を論じる本での記述は多くとも、技術書の本で書かれることは少ない。
この本はあくまで監視(モニタリング)の本であって、オブザーバリティエンジニアリングの本ではない。そちらに関しては別途オブザーバリティ・エンジニアリングなどの別途書籍を当たると良い。
安全なWebアプリケーションの作り方
著者の徳丸浩さんはYouTubeチャンネルもやっており、そこでも(なんと無料で)攻撃や脆弱性の話をしており、話題になった攻撃手法の解説や対策の話もしている。チャンネル登録といいねボタンをよろしくなのだ[10:1]。
みんなのデータ構造
[11]。この本はプログラムで頻出の典型的な問題を効率よく解くためのデータ構造とアルゴリズムを学べる。同様の本は多い中この本を選出した理由は、必要最低限のデータ構造に関して書いてあり、ページ数も多く学びやすいからである。
プログラミングをする上でデータ構造とアルゴリズムに関して学びすぎるということはない。この本だけでなく同様の本もいくつか紹介しておく。
アルゴリズムクイックリファレンスはこの本が出る前に筆者が人におすすめしていた本であり、各データ構造とアルゴリズムがシンプルに纏まっている。計算幾何や空間木構造、ネットワークフローなどの少しマニアックな内容も取り扱っているため、それらが必要な場面に遭遇したプログラマには福音となるだろう。
有名なアルゴリズムイントロダクションも良い。データ構造とアルゴリズムに関してはこれ読んどけば基本的に困らないだろうというレベルで纏まっているが、分量も多く真面目に読むと挫折する可能性が高い。辞書として所持しておき時折かいつまんでいくという使い方でも良いだろう。
適切なアルゴリズムで問題を解くという視点においては競技プログラミングの入門書を当たるのが良い。蟻本の名前で親しまれるプログラミングコンテストチャレンジブックなどを読むとよいだろう。実際の開発において適切なデータ構造とアルゴリズムを選択するにはこういった問題での練習が不可欠ではある。難しすぎず頻出の問題を提供するLeetCodeなどに挑戦もしたい[12]。
発展的な話題として、破壊的な更新を避けたデータ構造とアルゴリズムの本である純粋関数型データ構造や関数プログラミングにおいて既存の問題をどのように解くかを解説した関数プログラミング 珠玉のアルゴリズムデザインがある。関数プログラミングを念頭においた宣言的なアルゴリズムの方が保守しやすいため、そういうアルゴリズムを部分的に取り入れるためにこういう書籍で学ぶのもよいだろう。
データ構造やアルゴリズムで紹介されるものの中には一見使わないと思うような難しいものも多いが、実際に我々が戦う現実世界はそのような難しい問題が随所に現れる。そういった時に戦える刃を研いでおくことが大事である[13]。
最後に
読むとお得な技術書ということで、比較的ジュニア向けに仕事や趣味においてもソフトウェア開発とプログラミング(あるいはプログラミング言語の)解像度が大きく上がるような書籍を紹介した。実は個人的にまだまだ沢山紹介したい本[14]があったのだが、即効性はない類の書籍なのでそれらは割愛する。また、組織論を述べる本は割愛した[15]。
これらは実際筆者が読んで良かった、いろいろな解像度が上がったと感じている本である。したがって、紹介した本の中で筆者が知らなようなより良い本がある可能性もある。そういった本を知っている方はぜひとも紹介して頂きたい。
ここで紹介した本が読者の方の成長に寄与できれば幸いである[15:1]。
おまけ
ぜひとも読んでほしい本だが今回の想定する読者層とずれると思って入れなかった本としてプログラミング言語の基礎理論がある。その著者の大堀先生がなんと無料でコンパイラや形式的意味論、型システム、MLを使った開発のマインドセットなどを解説している。YouTubeチャンネルを開設し日夜動画を更新してくださっている。全人類が見るべき講義集なので是非とも見てほしい[16]。
-
ここでいう現実的に不可能というのは、Googleのような超巨大企業並の企業体力が持つならば可能の意味である。 ↩︎
-
実はフロントエンドエンジニアはすでに知っている内容なので読む必要がないという可能性がある。 ↩︎
-
これは嘘で当然そんな簡単ではないが、少なくともよくあるアンチパターンを踏む可能性は低くなる。 ↩︎
-
要出典 ↩︎
-
いわゆるパタヘネ本とヘネパタ本。プログラマーのためのCPU入門が出る前はとりあえずパタヘネとヘネパタをおすすめするという修羅が多かった。 ↩︎
-
実際は勢いで実装してなんじゃそりゃみたいな地獄の仕様になってることも多い。また足りない機能が多く、大半をデザインパターンで頑張るプログラミング言語もあるのが実情である。というのも、プログラミング言語は相当注意深く設計しないと拡張するのが難しいためである(そのために形式的な意味論を大切にするプログラミング言語も存在する)。 ↩︎
-
語り口が学術的な本にありがちな難しい話が圧縮された書かれている事が多い。これはHaskellのHaskellによる関数プログラミングの思考法やIFPHなどでもありがち。 ↩︎
-
とはいえパラダイムの違いはプログラミング言語の抽象化の理念の違いであり、かけ離れたパラダイムのプログラミング言語を触ることは正しくプログラミングにおける抽象化の引き出しを増やすことなので積極的に取り組んでほしい。 ↩︎
-
言語仕様のような抽象を扱った本はそれなりにあるが、抽象データ型のようなデータの抽象の概念を言語によらずこのレベルで論じてる本を知らない。あったら是非とも教えてほしい。 ↩︎
-
GCのStop The Worldなど。 ↩︎
-
自戒。 ↩︎
-
そういった問題に取り組める人間が少ないが故に、需要から最適化を主戦場とするような企業も多い。そういった企業では採用においてデータ構造とアルゴリズムを扱う能力を求めることが多く、競技プログラミングのスコアが武器になることがある。 ↩︎
-
虎本とかTaPLとかプログラミング言語の形式的意味論入門とかプログラミング言語の基礎理論とかガーベージコレクションのアルゴリズムと実装とか分散アルゴリズムとかリンカ・ローダ実践開発テクニックとか。 ↩︎
-
特に筆者は大堀先生と接点があるわけではないのでステルスマーケティングではないから安心してほしい。 ↩︎
Discussion