『API デザインケーススタディ』の紹介

著者の田中哲さん (@tanaka_akr) から献本をいただきました! *1

本(電子版)をもらったのは RubyKaigi の前日の夜。翌日に TRICK 2015 の発表を控えていましたが、読み始めると面白すぎて、発表前までに読み終えてました。ちなみに献本とは別にジュンク堂 RubyKaigi 店で一冊買いました。(サインもろた)

自分が思った、読者層ごとの勝手な紹介を書いてみます。

普通の Ruby ユーザへの紹介

子プロセスを起動する Process#system 、#spawn 、open3.rb *2 あたりを使ったことがあるでしょうか? C の system 関数は使えない子として有名ですが、Ruby の Process#system たちはプロセス起動に関して「こんなことできたらいいな」と思うことが、たいていできます。しかも、簡単・ポータブルに。たとえばこの辺りの設計をしたのが、著者の akr さんです。

この本では、Ruby の I/O 、プロセス、時刻など、いろんな API 設計事例がオムニバス方式で説明されています。あくまでケーススタディの本なので、API 設計のやり方を体系的に手取り足取り教えてくれるわけではありませんが、節ごとに教訓が短くまとめられているので、Ruby でライブラリとか作るときに重要な示唆を得られるはず。汎用性の高そうな教訓の例をいくつか引用しておきます。

  • 「使いやすいというのは、実際に使う状況での使いやすさが重要ですから、実際に使う状況を調べることが重要です」(1.05節 0バイト読んだときに何を返す? - 用例を探して良い挙動を判断する)
  • プログラマが間違った方法を使ってしまうのを避け、正しい方法に誘導しています。」(2.03節 Socket.ip_address_list - 自ホストのIPアドレスを正しく簡単に得る)
  • プログラマの既に持っている知識を利用して学習しやすいものとするのが狙いです。」(5.04節 Integer#bit_lengthメソッド - 用途と前例を調べる)

他には、使いやすいライブラリ API デザイン(akr さんの RubyKaigi 2006 の発表) を読んで感銘を受けたら、読んで損はないと思います。

特に、Ruby に機能提案をしたいとか考えてる人は読むといいですよ。あわせて読みたいmatz を説得する方法(akr さんの RubyKaigi 2008 の発表)

また、「I/O」「ソケット」「プロセス」など、UNIX システムプログラミング寄りの内容が多めです。Ruby でそういうことをやりたい人にはとても参考になると思います。必読と言ってもいいかも?

歴戦の Ruby ユーザへの紹介

Ruby をよく使っている人なら何となく感じてると思うんですが、Ruby の組み込みクラスって玉石混淆なんですよね。なんというか、設計・実装の熟考度にムラがある *3 。その中で、ふと何か感心することのある部分は、たいてい akr さんが背後にいます。

そういう部分がどれほどの熟慮を重ねて設計されてきたか、この本を読めば分かります。それも、背景知識の説明を含めて、極めて理路整然とわかりやすく説明してくれます。Ruby マニアにとってこんな貴重な本はないです。

Ruby 以外のプログラミング言語ユーザへの紹介

Ruby を題材として API 設計のケーススタディを紹介する本なので、Ruby を知らない人にも読みやすいとは言いにくいですが、しかし他に類書ってあるんですかね *4 。言語やライブラリの API 設計について考えてみたい人は読むといいんじゃないでしょうか。ついでに Ruby を使ってみたくなるかもしれません。

追記akr さんが『APIデザインの極意 Java/NetBeansアーキテクト探究ノート』という類書を教えてくれました。こちらは互換性最優先という感じだそうです。

Ruby 以外のプログラミング言語の開発に携わっている人への紹介

あなたの言語の I/O 周り、プロセス周り、時刻周りについて、設計不備や機能不足を知ることができます。いや実際のところ、プログラミング言語のいわゆる泥臭い部分の API 設計についていろいろ書いてあるので、重宝するはず。

実用的なプログラミング言語を作りたいと思っている人への紹介

それがどれだけ遠い道のりなのかを痛感させてくれます。評価器とか GC とかだけでは実用的なプログラミング言語は作れないのです……。

プログラマではない人への紹介

世界各国の変態サマータイムについて豆知識が得られます。

Ruby 開発者への紹介

え、まだ読んでないの?

*1:自分と akr さんとは Ruby コミッタつながりです。

*2:1.8 のころの open3.rb を知っている人はネガティブな印象を持っているかもしれませんが、Ruby 1.9akr さんが大改修して現在は安心・安全の akr プロダクトになってます。詳しくは 3 章に書いてある。

*3:たとえば、カバレッジ API とかひどいですよね。カバレッジ測定を細かく制御できないとか、パスカバレッジへの拡張性を全く考えてないとか。

*4:強いて言えば C 言語の rationale とか?