Don't Repeat Yourself

Don't Repeat Yourself (DRY) is a principle of software development aimed at reducing repetition of all kinds. -- wikipedia

今年読んだ技術書(2019年)

今年も多くの技術書を読みました。その中で印象に残ったものをご紹介したいと思います。今年は忙しくて休日しか時間がなかったので、読んで知識を体系的に整理できたと思った本の冊数は少ないですが…

Functional Programming

2019年の4月くらいに5年目がはじまるということでやりたいこととしてあげたうちのひとつに、「関数型プログラミングについて深堀りする」というものがありました。その文脈で何冊か読みました。

Debasish Ghosh の書いた『Functional and Reactive Domain Modeling』は、いわゆる DDD によるアプリケーション構築をどう関数型に仕上げていくかを紹介してくれるいい本でした。これまで、Reader や Kleisli、Free などは名前を知ってはいたものの、実際のアプリケーションでどのように使っていったらいいか、想像がついていませんでした。しかしこの本を読んだことによって、アプリケーションの中でそれらの道具がどう使われるか、コード込みでわかるようになりました。この本は、関数型プログラミングのエッセンスである「小さな汎用性の高い部品を上手に組み合わせながら、大きいアプリケーションを作り上げる」を学習する上で非常にいい構成を取っていると思います。社内では私がこの本を紹介したことがトリガーとなり、この本を使った読書会も開かれており、私もそこに参加しています。

Miran Lipovača の『すごい Haskell たのしく学ぼう!』も読みました。本腰を入れて Haskell をやったのは今年が初めてです。最近、型システムや関数型プログラミングの理論周りに関連する論文を読む機会が増えてきており、その中に Haskell のコードが登場してくるものの、読むのに毎回 Google していました。ということで、せっかくなので勉強してみよう!ということで勉強しました。現状のわたしの Haskell 力は、「読めるけど」「1からはスルスル書けない」です。見ながらは書けるんだけど。この本は関数型プログラミングに登場してくる道具たちを細かく解説してくれていて、関数型プログラミングの入門にもいい本だと思いました。

また、Haskell のような言語を扱い始めると登場してくる「モノイド」や「モナド」の数学的な意味が知りたくなって、野崎昭弘『なっとくする群・環・体』や Saunders MacLane の『圏論の基礎』も読んでみました。先日書いた記事の通りで、モノイドやモナドについての数学的な側面が、ほんの少しだけ分かるようになってきました。圏論の本はまだ全然読み進めている最中ですが、「自己関手の圏におけるモノイド対象」と言われてもなんとなくどういう意味合いがあるのかがわかるようになってきました。これらの本を学ぶ中で、数学という学問がそもそも何を議論していて、それがどうプログラミングという分野に応用されてきたかがなんとなくわかってくるのがとてもおもしろかったです。

全体的に、関数型プログラミングの勉強については、今年は実りの多い年だったと思います。ただまだまだ Haskell で行うような型レベルプログラミングについては慣れていない面が大きく、来年はそちらにチャレンジしてみたいなと思っています。

Kubernetes

今年は仕事で Kubernetes にはじめて取り組みました。私の部署はとても恵まれていて、Kubernetes のプロが多くいます。彼らにすべてを託してもよかったのですが、何もわからずに議論しても何の実りもないと思ったので、自分でも勉強することにしました。同僚の @amsy810 さんが書いた『Kubernetes 完全ガイド』を読みました。Kubernetes は、私のようなインフラ・ネットワーク苦手系アプリケーションエンジニアに武器を与えてくれるすばらしいエコシステムです。Kubernetes そのものはとても広大ですが、完全ガイドはその名の通り、完全にガイドしてくれます。この本を読みながらコツコツエクササイズして、家で遊びながら楽しく学ぶことができました。

Distributed Systems

今年は一冊決定版が出ました。Martin Kleppmann の『Designing Data-Intensive Applications』です。夏くらいに日本語版も出ていたんですね。分散システム(大量のデータ、大量のアクセスを何個かノードを分けてさばく、くらいの意味に捉え直すといいでしょうか)については、これまでその場しのぎをして何度か乗り切ってきたのですが、この本を読んではじめて体系的に学ぶことができました。この本を読んで思ったことは、「道具は先人たちがたくさん用意しているのだから、あとはそれらの特徴を学んで、適切に道具を使いこなしていこう」でした。また、高度な分散システムは、それ自身が何をしているかを把握するのがとても難しくなってきています。1つのノードで障害を起こすと、それがバタフライ・エフェクトのように広く波及してしまいます。こういった複雑な問題に立ち向かう道具もたくさん用意されており、それを学ぶという点でもすばらしいですし、またそもそもそういった道具を適切に使いこなせば未然に防ぐことのできる問題も多いでしょう。私のように決して分散システムのプロではなく、知識もなく、闇雲に複雑性と戦っていたエンジニアを巨人の肩に乗せてくれるすばらしい本でした。

また、Brendan Burns の『分散システムデザインパターン』も、今の時代には必読だと思いました。サイドカーなど、分散システムを構築する際にわりと前提として語られがちな用語をひとつひとつさらっていくことができます。私のように、アプリケーションエンジニアだけれどもシステムアーキテクトもつとめていて、けれどもコンテナ側の知識が若干怪しくて議論に参加できないという人におすすめできる本だと思います。

Designing Software

ソフトウェア周りをどうデザインすべきかについては、今年は一冊いい本があり、人にも多くお薦めしました。John Ousterhout による『A Philosophy of Software Design』です。邦訳はまだ出ていない感じですかね。洋書を読むことに抵抗のない方は、ぜひ読んでみてほしいです。私は新人さんにとりあえずお薦めしています。この本では、「なぜソフトウェアデザインをしっかり行わなければならないか?」という問いを立て、その答えのひとつとして、「複雑性への対処」をあげます。複雑性があるというのは、変更をした場合にそれが他の多くの場所に伝播してしまうような状態や、あるいはコードを読む上で認知負荷が高い状態をそうであると定義しています。私がハッとさせられたもののよく考えさせられたのは deep module と shallow module の章で、これらの違いに意識したことがなかったため、これまでのコードを思い返させるいい章だったと思いました。同時に実現性の難しさも感じましたが。

Computer Science

プログラミング言語の基礎的な理論を深めたいと思っているので、猪股 俊光、山田 敬三による『計算モデルとプログラミング』を読みました。この本は大学の講義ノートを本に起こした本のようですが、大学ではこのくらい濃密な授業が行われていて羨ましいです。計算モデルにはいくつか種類があり、それらの間の計算能力には差がないことを一旦説明したあと、チューリングマシンについてまず議論し、そこから抽象機械型計算、命令型計算、関数型計算として帰納的関数λ計算、最後にPrologのような論理型計算をていねいに紹介していきます。プログラミング言語のモデルにどのような種類のものがあるかを整理できたいい機会でした。まだまだマスターできているとは言えませんが、何度も振り返りつつ自分で使いこなせるようにやりきりたいと思っています。

コンピュータそのものやネットワークに対する理解も深めたくて、引き続き何冊か読みました。『CPUの創りかた』は言うまでもない名著だと思いますが、はじめて読みました。私は電子回路は中学生の知識で止まっていたのですが、本書は順を追って説明してくれて大変実りある読書になりました。CPU 周りにでてくる用語はこれまでさっぱり知らなかったのですが、この本を読んでだいぶ何をしている存在かわかるようになりました。また、『マスタリングTCP/IP』と『TCP技術入門』も読みました。今回会社のゼミでネットワーク周りを扱うことになったのですが、TCP/IP の仕組みをさっぱり知らず、これも「それではまずい」と思って読みました。「輻輳制御」を読めるようになったので、入門は突破したと思います(笑)。

林 高勲、川合 秀実による『作って理解するOS x86系コンピュータを動かす理論と実装』も読み進めています。前半の OS に関する座学の章を読むだけ、という読み方をしていますが、それだけでも十分実りある読書になっています。ここまで細かく踏み込んで解説してくれている本はなかなかないと思います。さすがに自分で1から作る時間はまだ確保できていませんが、やりたいことの優先度を整理していつか取り組みたいと思っています。