Hatena::ブログ(Diary)

まめめも このページをアンテナに追加 RSSフィード

2017-10-12

テスト駆動開発』を読んで

テスト駆動開発
テスト駆動開発
posted with amazlet at 17.10.12
Kent Beck
オーム社
売り上げランキング: 563

オーム社さまから電子書籍を贈本いただきました。ありがとうございます。

本書はテスト駆動開発TDD)の原典で、たいへん有名な本です。が、自分は食わず嫌いで読んだことがありませんでした。

というか、TDD 自体もちゃんと理解したことがありませんでした。なんだろう、なんか怖かった。

そんな自分が今回この本をいまさら読んでみたら、なるほどこれは確かにいい本でした。なんというか、語りたくなる感じ。ということでご紹介。

紹介

テストとプログラムを交互に書いていく開発方法 TDD を、例題を用いて実演していく本です。

TDD というと「プログラムより先にテストを書く」というところだけ強調されますが、正直それではよくわからないのでした *1 。本書によると、

  1. テストを 1 つ書き足す
  2. それをパスする仮実装を追加する
  3. 仮実装をまともな実装にする

を細かく繰り返す、というものだそうです。仮実装は本当にテキトーで、テストの期待値をそのままプログラムに埋め込んだりします。「仮実装をまともな実装にする」は、本書では「テストとプログラムの間で重複を省く」と表現されています。というのも、プログラムに期待値を埋め込むことで、その期待値がテストとプログラムの間で重複するので。この重複をいい感じに省くことで、徐々にまともな実装になっていく。

テスト駆動開発」という名前ですが、テストを書くための方法ではなく、あくまで設計開発の方法ということがよくわかりました。テストはあくまで実装のガイド。テストはそえるだけ。

構成としては、第 1 部は通貨の足し算や掛け算を扱うプログラムJava で、第 2 部はテスティングフレームワークPython で、それぞれ TDD の実演で開発してみせます。上記の繰り返しそのときどきの思考が、なんというか非常に生々しく書かれていて、ライブ感に溢れています(訳者あとがきで「まるで Kent Beck とペア・プログラミングしているかのような体験をしました」と書かれていて、まさにそんな感じ)。第 3 部は TDD にまつわる色々な話題を集めていて、まえがきによると「リファレンスとして使うのがよいだろう」だそうですが、自分の印象としてはエッセイ集みたいな感じです。ただ、第 3 部はまだ流し読みしかしていないので、あとでちゃんと読む。

本書自体も(読んだことのなかった自分には)面白い内容でしたが、この翻訳には訳者の t_wada さんによる「訳者解説:テスト駆動開発の現在」という付録がついてます。TDD の原著が出てから現在までの歴史と現状が非常にコンパクトにまとまっていて、さらに現代で TDD とどう向き合っていくべきかが書かれています。ここの良さを説明するのは困難ですが、とりあえず、自分が TDD強迫観念みたいに感じていた理由と、別に怖くない(人もいる)というのがよくわかりました。

所感

まあ、自分が TDD実践したくなったかと言うと、そうでもないです。TDD の真のポイントは TODO 管理だと思うんですよね。仮実装が一部仮のまま次のテストに進むことがあったり、テストとプログラムの間で頻繁にコンテキストスイッチしたりするので、TODO を忘れずにこなせる人でないと厳しそう。普段の生活でも TODO 管理が辛いのに。

とはいえ、テストをパスする状態を維持するというのは強く共感しました(というか、こういう本などが布教した考え方なんだろう)。Quine を書くときも、まずはでかくて不格好でもとにかく動く Quine にし、そのあとは動く状態を維持しつつ形や長さを改良する修正を少しずつやっていきますよね。うん。あと、こういう頻繁にテストを実行するやり方では、コンパイルに数秒もかかるような言語処理系では無理だよねー。

それから、TDD が別に万能ではないことがちゃんと書かれているのが好印象でした。設計のひらめき自体は TDD では得られない(83 ページ)とか、アサーションで使う述語自体が間違ってたら TDD は無力になる(27 ページ)とか。あと、通貨換算の責務は Expression ではなく Bank に持たせたい(83 ページ)と言いつつ、その後はせっせと Expression#reduce を実装してたり、最適化を実装しようとしたものの抽象度が壊れるから諦めて(128 ページ)、「パフォーマンスの懸念もあるが、実際の使われ方を見てから最適化を考えるので十分だと思う」(135 ページ)とか強がるあたり、ニヤニヤしながら読めた。そんな気取らない作風でした。

まとめ

TDD の考え方がよくわかる本でした。自分と同じように「なんか TDD とか聞くけどよくわかってない」という人は読んでみるといいです。t_wada さんによる付録で、原著以降の BDD などの歴史や現状、TDD の用法・用量までよくわかるおまけつき。TDD くらいすでに知ってるよ、という人も、この付録は読む価値があると思います。

*1:中にはちゃんと説明してくれている人もいたんだろうけど、自分の方がちゃんと聞く気がなかった。

2017-09-15

[] RubyKaigi 2017 の予稿:An introduction and future of Ruby coverage library

RubyKaigi 2017 の 2 日目に "An introduction and future of Ruby coverage library" というタイトルで発表します。事前資料の公開が推奨されていたので、簡単ですがどんな内容かを書いておきます。

要約

カバレッジ(テストカバレッジ、コードカバレッジ)は、ソースコードのどの程度の割合がテストによって実行されたかを表す指標で、「テストの良さ」に関するヒントを与えてくれるものです。Rubyでは、品質を保証する手段がいまのところテストしかないので、カバレッジをうまく使うことは重要です。

本発表では、我々が経験や見聞を通じて得たカバレッジとの付き合い方を紹介します。簡単に言うと、カバレッジは「コードに対する網羅率」に過ぎず、「仕様や設計に対する網羅率」ではないことを理解した上で、前者だけでなく後者も上げるためのヒントとしてカバレッジを活用することです。(なお、カバレッジの定義から丁寧に説明するので、前提知識は必要ありません。)

また、Rubyカバレッジ測定の現状として、SimpleCov や coverage.so などを紹介した上で、2.5 に向けての coverage.so の拡張計画を説明します。具体的には、関数カバレッジと分岐カバレッジの測定を可能にする予定で、そのために現在検討中の coverage.so の仕様を紹介します。他言語のカバレッジ管理ツールとの連携のために必要な情報を提供するように設計していて、実際に LCOV や Cobertura で可視化できることをデモする予定です。

解説

Ruby3x3 で導入される(とされている)型システムに注目が集まっていますが、プログラム堅牢性を高める手段は、なにも型だけではありません。コードレビューだって立派な品質保証手段ですし、普通の型よりも強力に検証する手段もあります。しかし、現時点で一番普及している手段は明らかに、テストです。そこでテストの度合いのヒントとなるカバレッジは重要なはずですが、テストに比べると普及度が低いように感じています。

カバレッジが十分に活用されていない理由はいろいろ考えられますが、「カバレッジの(うまい)活用方法があまり知られていない」「Rubyカバレッジ測定ライブラリが貧弱」という 2 つの問題を緩和するために、今回発表してみることにしました。

2008 年にコミッタになって最初にやった仕事が、Ruby 本体のテストカバレッジ向上でした。主にそのころに得た知見と反省などを元に、漠然と考えていた「カバレッジのうまい活用方法」を明文化してみたので、共有したいと思います。

そのころに作った Ruby カバレッジ測定ライブラリ coverage.so は、便利なラッパ SimpleCov が登場したおかげでそこそこ使われているようです。しかし、当時 coverage.so の仕様を適当に決めてしまったために、行カバレッジ以外をサポートしづらく、放置していました(すみません)。今回一念発起し、関数カバレッジと分岐カバレッジをサポートする方向で仕様の検討と実装の試作をし、昨日コミットしました。まだ細かいところが詰めきれていないのですが、2.5 のリリースまでには決めたいと思っています。

なお、超絶技巧みたいな話は今回はありません。ない予定です。ないんじゃないかな。期待しないでください。

宣伝

拙著『Ruby でつくる Ruby』が、ジュンク堂書店の RubyKaigi 出張店で販売される予定です。サイン会もあるみたいなので、ぜひお買上げを!なお、RubyKaigi 出張店は RubyKaigi 1 日め(9/18(月・祝))だけなので要注意です。サイン会も 1 日めですが、本さえあればいつでもサインするので適当に捕まえてください。

さらに、ラムダノートがRubyKaigi 2017 便乗、サイン入り書籍プレゼント企画!(connpass)をしています。RubyKaigi に参加できない方はこっちに応募してみてください!

2017-05-20

[] 『Ruby でつくる Ruby』の購入方法

書籍『Ruby でつくる Ruby』が発売されて 2 月ほど経ちました(当時の告知)。いろいろなところでわりと好意的な感想が聞こえてくるので、うれしい限りです。

本書はラムダノートにとっての最初の出版ということで、発売当初は直販サイトでしか入手できませんでした。しかし最近は、販路開拓が進んだようで購入手段が増えてきました。まだ買ってない人のために、簡単にご紹介。

ラムダノート直販サイト

『Ruby でつくる Ruby』表紙

ref: https://www.lambdanote.com/products/ruby-ruby

直販サイトです。よく知らないサイトで物を買うのは不安かもしれませんが、実体は Shopify という有名なオンラインストア用サービスなので、そんなに怖くないです。

購入方法にこだわりが無いなら、ここで買うことをオススメします。なぜなら、出版社と著者への利益が最大なので。

Amazon.co.jp

RubyでつくるRuby ゼロから学びなおすプログラミング言語入門
遠藤侑介
ラムダノート
売り上げランキング: 63,507

言わずと知れたアマゾンです。最近詐欺で有名になったマーケットプレイスですが、ラムダノート直営なので心配ありません。中古販売などではなく、ちゃんと新品が届きます。

誰かレビュー書いてください。

ジュンク堂書店池袋本店

東京・池袋にあるジュンク堂書店です。6 階に、ふつうに現物が置いてあります。サンプルもあるので中も見えます。

今のところ、現物をその場で買って帰れる唯一の手段です。「ネット通販はイヤでござる」という人はぜひこちらで。

honto

ref: https://honto.jp/netstore/pd-book_28490380.html

honto カードの honto です。自分は honto で買ったことはないのですが、とっても大手なのでまあ大丈夫でしょう。

店舗在庫状況を見ると、「在庫あり」になっているのはジュンク堂書店池袋本店だけ。ここに載ってる他のお店でも取り寄せられるのでしょうか?誰か挑戦して報告くれたらうれしいです。

ラムダノート出張販売

ラムダノートが行商するイベントに行って買う。

近いうちに行商するという予定は聞いていないので、期待しない方がいいです。「ラムダノート社長の鹿野さんに会いたい!」という動機でもない限り、おすすめしません。

おまけ

プロフェッショナル SSL/TLS』のほうも同じ手段で買えるはず。アマゾンアフィリエイトリンクを置いておきます。

プロフェッショナルSSL/TLS
Ivan Ristić 齋藤孝道
ラムダノート
売り上げランキング: 133,698

2017-03-16

"Purely Functional Data Structures" の邦訳『純粋関数型データ構造』が発売されます

純粋関数型データ構造
Chris Okasaki
KADOKAWA (2017-04-28)
売り上げランキング: 266

伝説の名著、"Purely Functional Data Structures"(通常 PFDS)を翻訳しました。4 月末にアスキードワンゴから発売されます。

20分でわかる Purely Functional Data Structures』などを通じて日本に PFDS を布教した @kinaba との共訳です。ちなみに編集さんはアスキードワンゴ編集長の鈴木嘉平さん。

関数プログラマ向けの紹介

「リストの結合が O(n) で遅いな」とか「まともなキューはどうやって作るの」とかいった問題に一度は直面したことがありますよね。純粋関数型プログラミングではどうしても無理、と思って諦めている人もいるのではないでしょうか。

この本の技法を使えば、「結合が O(1) のリスト」や「挿入・削除が O(1) のキュー」など、嘘みたいな計算量を達成できてしまいます。もちろん、破壊的更新を使わずに。ああ、15 年前の自分に教えてあげたい*1

結合が O(1) のリストがほしいだけであれば、既存実装の Data.Sequence あたりを使っとけば良いです。しかし、こういう出来合いのソリューションでは困るケースもあります。たとえば Data.Sequence は償却計算量なので、リアルタイム性が重要だと困るとか。

この本は単なる「結合が O(1) の列の実装方法」ではなく、「効率的な純粋関数型データ構造を実装するための汎用技法」を教えてくれます。効率的な列やキューの実装は、その技法適用デモとして説明されます。なので、特定のケースで必要なデータ構造もいざとなれば自作できるようになります。

ということで、関数プログラマを目指すならこの本の内容は確実に抑えておくべきでしょう。プロの方はすでに抑えてると思いますが、ハンドブックとしてお手元に是非。

Rubyist 向けの紹介

言うなれば、「すべてのオブジェクトが freeze した世界で、どこまで効率的なデータ構造を作れるか」を追究した本です。

破壊的更新が使えないのでデータ構造を実装するのが難しくなることが多いですが、逆に簡単になることもあります。たとえば、文字列の結合。普通は、メモリコピーが発生するので遅いですよね。しかしすべての文字列が freeze されていれば、コピーの必要はありません。2 つの文字列を並べた配列として表現すればいいです(こういう実装を Rope と言います)。こういう感じの考え方をひたすら深めていったような本です。

本書自体は Standard ML とかいう馴染みの薄そうな言語で説明されていて、Rubyist に全力でおすすめできる本ではないのですが、ふつうの Ruby から一歩踏み出したい方は ML 系の教科書と合わせて読んでみていただけると嬉しいです。

(『Ruby でつくる Ruby』を読んで「木って、すごく面白いな!」と思ったような人は素質あるかも)

裏話

Ruby でつくる Ruby』とほぼ同時公表となったこの本ですが、どちらもラムダノート鹿野桂一郎さんが絡んでたりします。

鹿野さんには TAPL の終わりごろから PFDS の翻訳企画を持ちかけていました。鹿野さんがラムダノートの社長と化したタイミングで再度持ちかけたら、アスキードワンゴの鈴木嘉平さんが企画しているとわかったので、繋いでくれて今回の告知に至る。*2

一方、ラムダノートでやる企画なくなったなーと思っていたら、鹿野さんから「ちょっと変わった Ruby 入門ってどうだろう」と持ちかけられ、『Ruby でつくる Ruby』につながっていきました(非公式あとがき参照)。

ということで

Ruby でつくる Ruby』と合わせて、みなさん是非読んでみてください!

*1:原著はそれより前(1998 年)に出版されているわけですが。

*2:さらっと言いましたが PFDS の翻訳も容易ではありませんでした。遅延評価の force とか suspension とか意外に定訳がない単語が多かったり、アホな誤訳をちょくちょくかましていたり。共訳の @kinaba 殿やレビュアーの方々に救われて出版にこぎつけました。感謝の限り。

2017-03-15

[] 書籍『Ruby でつくる Ruby』が発売されます

『Ruby でつくる Ruby』表紙

ref: https://www.lambdanote.com/collections/frontpage/products/ruby-ruby

おかげさまで、ASCII.jp で連載していた『Ruby で学ぶ Ruby』が紙の本になる運びとなりました。わーい。『Ruby でつくる Ruby ― ゼロから学びなおすプログラミング言語入門』と微妙にタイトルが変わったので注意。

一番大切なことを先に言っておくと、書店に並ぶ予定はありません。ラムダノート株式会社という出版社の直販サイトで購入できます。アスキーじゃないの?と聞かないでください。追記:今はいろいろ購入方法が増えました。『Ruby でつくる Ruby』の購入方法をご参照ください。

ラムダノートは『型システム入門』のときにもお世話になった編集の鹿野さんが立ち上げた新しい出版社です。鹿野さんと高尾さんの編集コンビは、技術書については知る限り最強なので、何か書きたいネタがある人はラムダノートに持ち込むといいですよ。

どんな本?

一言で言えば、RubyRuby インタプリタをつくる本です。Ruby インタプリタとは、Ruby プログラムを動かすためのプログラムのことです。この開発を通して、Ruby という言語を外側と内側の両面から学んでいけます。

環境のセットアップから説明していくので、Ruby について何も知らなくても、いっそプログラミングをしたことがない人でも読めるように書いたつもりです。そこからはじめて、たった 144 ページで、Ruby インタプリタを「自作」していきます。もちろん完全な Ruby インタプリタではなく、いろいろ端折った簡略版の Ruby(MinRuby と呼んでいます)のインタプリタですが、いちおう「ブートストラップ」ができます。つまり、自分で書いたインタプリタで、自分で書いたそのインタプリタ自身を動かせるということです。ここまでできれば胸を張って「インタプリタを自作した」と言えるレベル。本の内容については、連載開始時の記事連載終了時の記事もご参照ください。

あと、記念すべきラムダノートの初出版本 2 冊のうちの 1 冊ということで、なんか採算度外視の豪華な本になっています。なんと言っても、本文が全ページフルカラーです。絵本なのかな。hirekoke さんのかわいい(そしてエキセントリックな)挿絵が全部載っています。(なお、もう 1 冊の初出版は、"Bulletproof SSL and TLS" の翻訳本「プロフェッショナル SSL/TLS」です)

連載時からの改善点

ところで、自分にとって初の連載記事であった『Ruby で学ぶ Ruby』は、連載の恐怖を知る機会にもなりました。それは、「締め切り」、ではなくて、「公開しちゃった部分を変えられない」ということです。もちろん Web 連載なので typo なんかは直せるんですが、「これ、あのときに合わせて説明しておけばよかったな」とか「この用語、ちゃんと説明しないまま使ってしまっているなあ」などというレベルのミスは最新版で中途半端に補足するしかなくて、文章がツギハギだらけになっていく。今回、鹿野さんと高尾さんの全面バックアップの下、その手のツギハギを一掃しました。おかげで、かなり読みやすくなったと思います。

付録として自力構文解析も載せたいと思っていたのですが、こっちは残念ながら紙面の都合で載せられませんでした。ざっと見積もって、144 ページが 200 ページ超になりそうだった。一応、興味のある人向けに、further reading というか調べると良さそうなキーワードを足しておきました。この本が売れれば続編を書く機会が得られるのではないかと思うので、なにとぞ、なにとぞ!

注意点

  • 書店に並ぶ予定はありません(再掲)。ラムダノートの直販サイトから購入してください。追記:今は『Ruby でつくる Ruby』の購入方法をご参照ください。
  • 直販サイトがイヤな人は、ラムダノートが行商をするタイミングを狙いましょう。とりあえず、4/9(日)に秋葉原で行われる技術書典 2 のラムダノートのブースでは販売される見込みです。
  • 電子書籍はありません(予定もありません)。理由は大人の事情によるらしい(ぼくもよくわかってない)。ちょっともどかしいのですが、この本が売れれば電子書籍になる可能性もあるみたいです。