最近読んだ技術書

フロントエンド→サーバーサイド開発に移ったことが濃く反映されたラインナップ

Node.jsデザインパターン 第2版

「5章 ストリーム」の終わりまで。

仕事で画像合成サーバーを触っていて、Node.js ( CoffeeScript )で実装されている。なんか最近開発チームで各メンバー専門領域を持ちましょう、それに伴って「xxx大臣」を名乗りましょうというムーヴメントがあって、面白そうだなと思ってた画像合成サーバーの大臣になった。

画像の合成はヘビーな処理なので、可能な限りStreamで扱うようになってる。一方で自分のStreamについての理解は「なんか流れていくアレ」という感じで、そういえばStreamとBufferの違いがよく分かってなくて、大臣なのにヤバいと思って読んだ。

この本については過去にブログで言及した記憶があって、検索してみたらちょうど2年前だった。懐かしい。

Node.jsデザインパターン読んだ

半分も理解できなかった
寝かせることにした


一回挫折した本ということで身構えてたけど今回は普通に読めた。成長。とてもいい本で、StreamとBufferの違いもしっかり理解した。

とてもいい本なんだけど、扱ってるNode.jsのバージョンが11と古い。和訳が出ていない次の版でもNode.js 14とのこと。うーむ。

UNIXという考え方

今年の誕生日に欲しいものリストから買っていただいた本。

技術書やブログを読んでると「これはまさにUNIX哲学的で〜」みたいな文章に遭遇するけど、その度に「そもそもUNIX哲学についてちゃんと知らないんスけど....」と微妙な気持ちになっていた。そのような経験を重ねるごとに、プラトンの洞窟の比喩的な感じで、いろんな角度から照らされた影から何となくUNIX哲学なるものの像が自分の中に浮かび上がりつつあり....(何が言いたいか分からなくなってきた)

とにかく、様々な機会に目にするUNIX哲学というものについて本当のところというやつを確かめたかった。

ちょうどいいタイミングで以下の記事が投稿されたので、本と合わせて楽しく読めた。


テスト駆動開発

最近になってやっとテストが役に立つことが分かってきた。実装するとき安心するし、厚く書くとレビューが通るのが早くなる気がする。

こんなに役に立つのならもっと得意になるべきだと思って、何か本で体系的な知識をゲットしておこうと一番有名なものを選んだ。サンプルコードがJavaだったけど、同じ内容を普段使っているRuby + RSpecで書きながら読み進めた。

読み終わってから何ヶ月か経って、本の内容で今一番役に立ってるのは「実装の前にTODOリストを作る」ということかもしれない。考えるのが面倒だからと無鉄砲に実装を進めていた頃と比べて、効率良く進められるようになったと思う。めっちゃいい本だったのでまた読み返したい。

良いコード/悪いコードで学ぶ設計入門

この本もサンプルコードはJavaが多め。

メンバー変数を全てイミュータブルにして、変更ではなく新しいインスタンスを返すようにするというやつが面白かった。こういうやつ。

class Money
  attr_reader :amount
  def initialize(amount:)
    @amount = amount
    self.freeze
  end
  
  def add(other)
    added = amount + other.amount
    Money.new(amount: added)
  end
end

前述の「テスト駆動開発」第1部2章でも同じテクが登場してたし、kazuhi_raが知らなかっただけで結構一般的なものなのだろうか。

あとJavaのコードをまともに読んだのが初めてだったんだけど、公称型ってやつがちょっと羨ましくなった。TypeScriptで同じようなことは出来なくはないけど、結構大変(だからやりたくない)。

シス管系女子

Linuxにもっと慣れたいなと思って、9月はこの本を読みながらVPSで遊んでいた。めちゃくちゃ分かりやすいし、主人公のみんとちゃんがかわいい。

VPSはWebARENA IndigoというNTTのやつを使っている。ネットの評判が一部微妙だけど激安ですごい。

プログラミングの基礎

サイエンス社の公式サイトからだと電子版が買える。Amazonは物理本オンリー。

僕の向こう数年の目標として、型システム入門 を読破するというのがある。が、難しすぎるからまだ読み始められていなくて、準備の準備の準備の本を読んでる感じ。それがこの本で、関数型言語OCamlを使ってひたすら再帰関数とそれを使ったアルゴリズムを書く練習をさせてくれる。

この本が型システム入門に何の関係があるかというと、今後読もうと思っている型システムの本の説明にOCamlが使われている....

読むとOCamlが好きになる本だと思う。OCaml型推論のされ方がTypeScriptと違っていて面白い。例えば関数を書くとき

(* ユークリッドの互除法 *)
let rec gcd m n =
  if n = 0 then m
  else
    gcd n (m mod n);;

上から順にコードを書いていったとして、let rec gcd m n =の段階ではm, nの型は未確定。その次の行のif n = 0を書いた時点でnの型がintと定まる。0と等価性を比較できる、ということから推論される。引数の型が推論されるという、不思議な体験。

このように演算子が型の推論をしやすいように設計されていて面白い。例えば実数と整数の加算をしようとすると

print_float (4.2 + 2);;

File "main.ml", line 1, characters 13-16:
Error: This expression has type float
but an expression was expected of type
         int

エラーになる。+という演算子は左右にint型しか取れないようになっている。加算は+でのint同士、あるいはfloat同士での加算をしたい場合は+.という変わった演算子を使わないといけない。

その昔TypeScriptとしのぎを削ったFacebookのFlowはOCaml製で、その推論のされ方はOCamlに近いっぽい。


余談だけど趣味でOCaml、仕事でRuby, TypeScriptを書いてると等価性の比較が=, ==, ===で、混乱して週に一度は事故る。


他にもちょびちょび読んでるけどこの辺で。