@kyanny's blog

My thoughts, my life. Views/opinions are my own.

最近のペパボの技術書読書会について

最近ペパボでは Lean とかアジャイルとか開発プロセスの改善に関する取り組みが活発で、具体的にどんなことをやっているかは antipop さんhsbt さんのブログにたくさん書いてあるのですが、そういう全社的な取り組み以外にも有志による読書会・勉強会などもちょくちょく開催されています。

その読書会が今日ひとつ終了しました。以前このブログでも紹介した Working with UNIX Processes をかいつまんで読みました。だいたい週一のペースで一章ずつ、半分くらいの章をピックアップしたので二ヶ月ほどかけたのかな?


次は Crafting Rails Applications を早速来週から読み始めます。その後も Rails Guides を改めてちゃんと通して読んでみるとか、 Eloquent Ruby を読もうとか、いろいろやりたいことがあって楽しみです。

Working with UNIX Processes がどんな本なのか興味がある方は http://blog.kyanny.me/entry/2012/03/25/001940 などもどうぞ。いまは Pragmatic Bookshelf からも購入できます。

また、六月から 2012 年度新卒エンジニアの OJT が始まっていますが、「丸投げ & 放置」に陥ってスキルにばらつきが出ないように、業務の一貫としてウェブサービス開発に必要な知識・技術の座学も行なっています。今週からプログラミングの基礎体力固めと応用的な使い方を学習するためのポインタとして、「初めてのRuby」の読書会を開始しました。こちらはマネージャーや新卒デザイナーも参加するなど盛況で、毎日三十分ずつですがじっくりと取り組んでいます。

「RSpec は英語として読みやすいから良い」というお題目はなんだったのか

rspec-2.11 がリリースされましたね。いくつかの変更点の中に、今後は should ではなく expect を推奨し、デフォルトでは expect のみが有効化されるようになる、というものがありました。

http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax

個人的にこの変更は説得力に欠けるなーと思っていて、 expect 推しにする理由が

  • should は Kernel にはえるので Kernel を include しない BasicObject のインスタンスに対して should を呼ぶとおかしくなる
  • 標準ライブラリ delegate は Kernel のメソッドの一部だけを include するので rspec と delegate のどちらが先にロードされるかによって should の挙動がおかしくなる


なのだけど、ずいぶん限定された状況でのみ起こる問題で、この変更がもたらすインパクトの大きさに見合った理由かという点で疑問を感じます。*1

でもまあ、 should が使えなくなるわけではないし、ライブラリのアップデートで API が変わるのは珍しいことじゃないし、たとえ将来ぜんぶの spec を expect に書き換えなきゃいけなくなったとしてもその手間に十分見合うと思うし、そもそもオープンソースなのだから今からでも議論に参加して should の正当性を主張したり BasicObject や delegate の扱いに対するパッチを書いたりすればいい。*2そういう努力をせずに文句だけ言うのはダメだろ、という意見は正しいと思うし、なので RSpec に対して文句を言うつもりはありません。*3

でもね。これだけは言いたい。一部の TDD 信者みたいな人たち*4が、「RSpec は英語として自然に読み書きできる表現だから素晴らしいんだ!」みたいな主張でもって RSpec の優位性を喧伝してたと思いますが、あれはいったいなんだったんだ。彼らは expect 推しの件についてどう思ってるんですかね。 expect(foo).to be < 10 をみてもまだ「英語として自然」と主張できるのか。 Test::Unit オワコンみたいな雰囲気を出してたけども assert foo < 10 よりも読みやすいと、本当に本気でそう思うのか。

別に個人的に TDD 信者な人たちに恨みがあるわけではないし、論破したいわけでもないですが、少なくとも「RSpec は英語として自然に読み書きできる表現だから素晴らしいんだ!」という主張には説得力なかったよね、過剰に言い過ぎてたんじゃないの、ということは言っておきたい。だって should が英語表現として優れていてそれが RSpec の優位性だったのなら expect 推しに変更するはずがないので。それとも英語ネイティブにとっては should も expect も全く同じように読みやすいものなんでしょうか。そんなわけないと思うんだよなー、 should のほうが読みやすいって外国人も言ってるし。*5

要するに Rspec の開発者たちは英語としての読みやすさ書きやすさなんてものにはさほど入れ込んでいなくて、 TDD を広めたい一部の人たちが「ほら、 xUnit 系の assert_XXX よりも should be_XXX のほうがよっぽど自然な英語に近くて読みやすいでしょう?」などといってことさら強調しすぎたからおかしな広まり方をしたんじゃないの?それってコミュニティの欺瞞だったんじゃないの?っていう部分に、恨みはないけど憤りを感じずにはいられない。どんなコミュニティにもある話なんでしょうけど、一部の声の大きい人たちが言ってることが正しいってことになってしまって、実際は全然正しくもなんともないことがまかり通ってしまう、それ以外のやり方や考え方が異端扱いされて不当に貶められる、みたいな残念な例だったのかなー、と思います。振り回されるほうが悪い、と言われればそれまでですが。

TDD 信者の皆様の反論をお待ちしております :)

*1:同様のコメントをしている人がいた http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax#comment-558984276

*2:delegate に関しては ruby core のほうにパッチを投げてもいいのかもしれない

*3:rspec-mocks のほうは should_receive としか書けないようで、そのへんの統一感を崩してしまってる点でもやはり説得力に欠けるなーとは思う

*4:そういうコミュニティ全体のことであって、特定の個人の話ではないです

*5:http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax#comment-558583533