2022年上半期に読んだ技術書
2022年上半期はとある都合もあってかなりの数の技術書を読んだので、その中でも良かったものとかの感想をまとめておきます。
2022年上半期で一番良かった技術書
A Philosophy of Software Design
ソフトウェア設計の目的は複雑さを軽減することであるとして、その複雑さの定義と軽減する手法が書かれています。最近まで2年ほどフリーランスで色んな会社の開発に参加して、DDD的な設計やクリーンアーキテクチャを採用している現場が多かったもののそれらが逆に開発効率を低くしているのではという感想を持っていました。そこでこの本を読み、それらの目的であるはずの「複雑さを軽減する」という視点が抜けていたのかなと気付かされました。コードを読み書きしていて複雑さを感じなければモノリスでもMVCでもいいケースは多いと思います。複雑さを軽減する手法を解説する章では、やりすぎると逆効果であるとは何度も書かれていてそのへんのバランス感覚を身に着けたいなと思った技術書でした。
DDDをわかったつもりになった技術書
Domain Modeling Made Functional
プログラミング言語のF#を用いて関数型言語の持つ表現力をDDDに活用するといった内容です。本の前半でDDD自体の入門があって、よくある受注・精算・出荷といった例なのですがドメインエキスパートと会話する中でモデリングをしていく内容になっていてとてもわかりやすかったです。後半のF#を使った関数型言語とDDDの組み合わせについても、関数の合成や直和型といった機能の活用がF#を知らなくてもわかりやすく解説されています。F#もちょっといいなと思いましたがF#って元気なんでしょうか。この本と次に挙げるセキュアバイデザインまで読んで、そこからエヴァンス本やPofEAAを読む気合が湧いてこなかったのでDDDに対してはにわかポジションでやっていこうと思っています。
セキュア・バイ・デザイン 安全なソフトウェア設計
タイトルからは分かりづらいですがDDDをベースとした設計をきちんとすることでセキュリティを高めるという主旨で、ここでいうセキュリティとはDDoSやXSSのような技術的なものよりも本を-100冊買われてしまうといったドメイン上の不備に起因するものを指しています。Value Objectとバリデーションを使ってプログラムから「-100冊の注文」というありえない状態をなるべく早い段階でなくすテクニックがメインに書かれていて、仕事で使用している言語との相性などもあると思いますが導入してみたいやり方だと思いました。
GraphQLについて周回遅れになっていることがわかる技術書
Production Ready GraphQL
個人的にGraphQLが好きで、ネット上の記事を読んだり動画を見たりして蓄積したつもりの知識がここに全部書いてあるじゃんという本でした。GraphQLでは未だに話題に上がるN+1とかスキーマの設計、エラーハンドリングとかもう大体書いてあります。GraphQLを仕事で使うならこの本読んでおかないと周回遅れのまま先人が既に経験して解決済みの苦労をまた無駄に重ねるだけになると思うので強くおすすめです。
前述のDomain Modeling Made Functionalとの組み合わせで、境界づけられたコンテキストをF#の言語機能を使って定義していたのはGraphQLスキーマでもできるような気がしました。この本でもスキーマ設計とドメインロジックは密接に関連すると書かれていますし、ディレクティブなどを活用するとGraphQLスキーマの表現力は十分に高いと思います。マイクロサービスとApollo Federationに当てはめると境界づけられたコンテキストに沿ってサービスが分割されて、それぞれのサービスが自分のコンテキストをGraphQLスキーマで表現し、コンテキストをまたいだ意味の差異がFedrationでまとまるというのは話の筋が通っているとは思うのですが、その規模でのGraphQL経験がないので妄想でしかないです。GraphQLやりたい。
結局一番分厚くて詳しいのを最初に読むのが良いと思った技術書
プログラミングRust 第2版
それまでも薄めのRustの技術書やネット上の記事を読んでいたのですが、やっぱり所有権とかFuture周りとか難しいのでこの一番分厚くて詳しい技術書を読むのが結局は遠回りのようで近道のように感じました。
プログラミングってどの言語でも結局はスタックとヒープがあってデータを書いたり読んだり要らなくなったりなんで、それがそのまま言語の型とかに表れてプログラマが制御するのもありなのかなという本とはあまり関係ない感想を持ちました。結局GCありの言語でも参照や可変性は意識するしバグの温床でもあるし、メモリリークやパフォーマンス対策にVMの知識を持ってチューニングとかするならRustの言語機能に助けられて自前でメモリ管理すればいいよ派がいるんでしょうか。Rust書きたい。
Kubernetes完全ガイド
何年か前にオライリーの入門Kubernetesは読んでいて、忘れていた知識をここでもやはり一番分厚くて詳しい本を読むのが近道のように感じました。この本はまだ途中なのですが今どきの技術書らしくGitHubにサンプルコードがあってGKEで動かしながら読めて面白いです。
手元で動かしながら読めて面白い技術書
基礎から学ぶ 組込みRust
WioTerminalというデバイスを別途購入する必要がありますが、それとUSB変換ケーブルさえあればMacbookに繋いでRustで組込み開発の体験ができるおもしろ技術書です。定番のLチカから始まりスピーカーやボタン入力、ディスプレイ表示など一通りできます。組込みってあるピンを入力・出力のどちらかに設定して、入力に設定したピンを誤って出力のように扱うとバグるとのことなんですが、この本で扱っているRustのライブラリだとピンの入出力が型レベルで保証される仕組みになっています。
let my_pin: Pin10<Input<Floating>> = get_my_pin();
10番ピンを浮動小数点の入力に使うというのが型でわかって、 my_pin
に対して出力ピン向けのメソッドを呼ぶとコンパイルエラーになります。プリミティブな組込み開発でこんな型レベルのテクニックが出てくるのがゼロコスト抽象のRustらしさなんでしょうか?そこのミスマッチが面白かったです。
入門WebAssembly
WATというWebAssemblyのアセンブリ言語を中心にNode.jsやブラウザでWASMを動かす本です。実務上WATを書いて運用することはないと思いますが、WASMがどうやって外部環境とやり取りするかとか、WASMが現状は非常にプリミティブな演算しかできないので大きい機能を持ち込むとバイナリサイズが大きくなってしまうとかそのへんが理解できたと思います。WATが仕事ではあまり触る機会のないアセンブリ言語だったり、めずらしい仮想スタックマシンでそれ自体も面白いと思う方はいると思います。npmとブラウザがあれば仮想スタックマシンとアセンブリ言語を学べるという逆の動機でこの本を読むのもありかもしれません。
マイクロサービスがなんかわかった気になった技術書
ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ
主旨として役職としてのアーキテクトに向けた技術書ではありますが、すべてはトレードオフであるとしてアーキテクチャの特性や評価軸、様々なアーキテクチャスタイルの持つトレードオフの解説などがなされています。途中のアーキテクチャスタイル解説でスペースベースアーキテクチャとかはこれ今後使わないかなとかいう箇所もあります。A Philosophy of Software Designとあわせて、設計やアーキテクチャの目的を明らかにした上で銀の弾丸はなくその中でもベターな選択ができるようになりたいなと思いました。
モノリスからマイクロサービスへ ―モノリスを進化させる実践移行ガイド
地に足がついたというか堅実に、デメリットも理解した上でマイクロサービス化すると決めてモノリスから移行する際のパターンがまとまっています。個人的には経験はないですがモノリスからマイクロサービスに移行する際は必読な感じがしました。
その他のよかった技術書
HTML解体新書-仕様から紐解く本格入門
なんとなく書いている言語No.1(要出典)のHTMLをきちんと解説している技術書です。divだらけにせずmainやnav, footerといったセマンティクスにあった要素を使いたくなります。アクセシビリティについても現時点でのスクリーンリーダーの動作なども含めて丁寧に説明されています。これに加えてCSSの解体新書も欲しいです。
問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本
アルゴリズムとか競プロとか全然わからないのですが丁寧にアルゴリズムの背景にある数学から解説されています。本に記載されている問題がAtCoderにもあるので、実際にコードを書いて採点を受けながら進められるのが面白い体験でした。個人的にはRust入門したくらいのタイミングだったのでRustでコードを書く機会にもなってちょうどよかったです。
チームトポロジー 価値あるソフトウェアをすばやく届ける適応型組織設計
CI/CDやコンウェイの法則、マイクロサービスを前提としてどのようなチーム構成にしてチーム間のインタラクションがどうあるべきかなど、技術よりもチーム構成の側面から多くの学びを得られました。特にチームAPIという考え方が好きで、そのチームに何を期待すべきかが明確になると働きやすそうだなと思いました。その一方でチーム構成をいじる権限を持つポジションでないならこの本を読んでもやれることは少ないので「いいなぁ」で終わってしまいそうという寂しい感想を持ちました。
個人的にあまりよくわからなかった技術書
これらの技術書が良くないというのではなく、個人的な技術の興味範囲とかそういう感じのことです。
進化的アーキテクチャ――絶え間ない変化を支える
アーキテクチャのいろんな側面に対して「適応度関数」を使って状態を可視化して進化していこうという内容の技術書です。ですが例えばアーキテクチャの拡張性や保守性など、アーキテクチャの特性のほとんどは重要だけど数値化しにくいはずで、そこへの解が無いままだったような気がします。
記号と再帰 新装版: 記号論の形式・プログラムの必然
ちょっと難しかったです。記号論の考え方が関数型とオブジェクト指向に当てはめたときにいろいろと説明がつくというのが出発点だと思うのですが、書籍の中に書いてあるように記号論自体が基本的な理論を確立していないとのことなので、結構手探り感が抜けず読むのが大変な感じがしました。記号論とこれらのプログラミング言語上の概念がある一面では一致しているということに対して、それを仕事やコーディングに役立てるとか発展した考えを持てなかったです(自分には難しくて)。プログラミング言語自体に強い関心がある方とかであれば違った感想になると思います。
まとめ
ここ数年あまり技術書を読まなくなっていたので、これほどのペースではないにしても今後も技術書を読みたいなと思いました。A Philosophy of Software Designは本当に読んで良かったと思うし、Production Ready GraphQLに既に書いてあることをあれこれ言わなくて済んだし、もちろん興味ある技術について良質な知識を得られるのは単純に楽しいです。ここに挙げていない技術書もあるのですが、自分は組織系の問題にはあまり興味がないんだなというのがつけていた読書記録で如実にスピードが落ちていることからわかったりしました。仕事で使っている技術に関してもベースの知識をおろそかにしてはいかんなと思えたので今後も精進です。
Discussion