Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

『モダンPerl入門』感想

id:lestrratさん期待の新刊『モダンPerl入門』をさっそく読みました。結論からいうととてもいい本で、他の言語はよく知っててイケてるコード書きまくりだけどPerlはよくわからないというひと、もっとPerlのことを知りたいひと、昔やったけど最近の事情はどうも知らないというひと、様々な方にとってマストバイな一品に仕上がっていると思いました。もちろん、僕自身にとってもいろいろ知ることが多くて、とてもためになりました。

以下、自分が実践できてるかどうかをまったく度外視して、あれこれと書いてみました(たまには書評の真似事をしてみたいブーム)。

モダンPerl入門 (CodeZine BOOKS)

モダンPerl入門 (CodeZine BOOKS)

よいコードとは

よいコードとひと口にいっても、いくつかのレイヤがあり、また、それらレイヤを貫通して重要ないくつかの側面があると思います。いくつかのレイヤとは、具体的には以下のようなものがあるでしょう。

  1. 言語に対する知識
  2. よいスタイル
  3. イディオム
  4. デザインパタン
  5. よい設計

さらに、これらレイヤの各階層において、よいコードを書く際に考慮すべき問題として、たとえば以下のような側面を挙げることができるでしょう。

  • 開発効率
  • 保守性
  • 信頼性
  • パフォーマンス

たとえば、統一されたコーディングスタイルは開発効率を向上させ、保守性も高めてくれるでしょう。イディオムをよく知り、また、それらを用いてコードを書くことにより、開発効率、保守性はもとより、よくあるパタンの非効率に陥ることを避けられます。デザインパタンを知ることにより、直接それらをそのまま用いることはないにせよ、よりよい設計の指針を得ることができますし、それはもちろん、開発効率や保守性の向上に役立つことでしょう。

Perl学習の困難

Perlを学びたいひとのために書かれた本は、これまで玉も石も含めて数多くありました。言語の文法・仕様に関していえば『プログラミングPerl』が正典といえる地位を占めていますし、初学者の最初の一歩として適切な本といえば『はじめてのPerl』『続・はじめてのPerl』があります。より進んだ内容を知りたい場合には『実用Perlプログラミング』や『Perl Hacks』を読めばいいですし、よいスタイル、イディオムを身につけたければ『Perlベストプラクティス』がよいでしょう。

しかし「よいコード」とはなんだろう?という先述の観点からいうと、どの本もあるレイヤ・側面については詳細にわたって記述されているものの、全てのレイヤ・側面について統一的に、しかもてっとり早く知りたいという人々にとっては一長一短があるでしょう(もちろんそれら全部を読むほうがいいとは思いますが)。また、Perlによる開発はCPANに非常に強く依存する傾向があり、また、流行り廃りが激しいということもあって、書籍による解説はすぐに古びてしまい、困難であるという側面もあります。

そんな中、前述の本を読み終え、さらなるステップアップを図っているひと、また、他の言語をよく知っており、「よいコード」に必要な各要素に配慮したコードを書いてきたひとが、なんらかの事情でPerlによる開発に携わることになった時など、先述の各レイヤ・要素を貫く知識をまとめて与えてくれるような書籍の需要が喚起されることと思います。そんな時、まさしく本書『モダンPerl入門』こそが、そのような要望に応えてくれるでしょう。

本書について

本書は、以下の4つの軸にそって読むことができます。その際、先述の「よいコード」を実現するための各レイヤ・側面のどこについて書かれているのかを念頭に置くことが重要でしょう。

  1. よいスタイル、イディオム、デザインパタンを知る
  2. フレームワーク、テストの導入による開発効率、保守性、信頼性の向上
  3. パフォーマンスの向上
  4. Perlについての詳しい知識を得る

よいスタイル、イディオム、デザインパタンを知る

本書は、まず7ページ目からいきなり、Perl5のオブジェクトシステムを刷新して昨年話題になったMooseを紹介し、それを用いて説明を行うことで、Perlにおけるよいスタイル、イディオム、デザインパタンまで一挙に説明してしまいます。特に、デザインパタンについては、オブジェクトが複雑にやり取りを行う現実のシステムを、どう交通整理すれば開発効率、保守性を高められるかという問題ですので、Mooseを用いることにより、ややもすると非本質的になってしまう言語仕様のいき届かなさのフォローを排して説明することに成功しています。

しかし、新規に開発するプロジェクトにおいてはMoose/Mouseを用いるべきだという著者のメッセージは感じられるにしても、読者の大半が実際に触れるコードは、やはりレガシなものが多いはずです。読者はMooseというツールに囚われることなく、そこで実践されている考え方にこそ注目して、自分のコードをよりよくするにはどうすればいいのかということを考えなくてはならないでしょう。

ただ、デザインパタンの解説については、ここで示されているような細かい例による解説よりも、たとえばWebアプリケーションにおいてよく見られるようなパタンにしぼってアプリケーションを実際に示しながら、もう少し大きな流れの中で解説していくほうがよいのではないかと、個人的には思います。ひと通り一覧したいということなら他に適切な書籍が既にいくつかあるでしょう。本書では紹介されていませんが、たとえばAdaptorパタンなど、実際に必要な場面にならなければ、なかなかその必要性というのが実感されないのではないかと思います。

フレームワーク、テスト、パフォーマンス

フレームワークの導入について、DB操作についてORマッパが、ウェブアプリケーション開発についてはウェブアプリケーションフレームワークが紹介されています。これらについては、ここで主に紹介されているDBIx::ClassCatalystを利用していないにしても、開発効率と実行効率のトレードオフをケースによって適切に判断した上で、開発効率の向上によりメリットがある場合は積極的にフレームワークの利用を進めるべきであるという考え方を読みとりたいところです。とはいえ、実行効率の問題についても、より適切なイディオムを選択することにより、実際には想像するよりも悪くはならない事例についても説明がなされています(ORMとDBIのパフォーマンス差をキャッシュを用いることによって解決する例など)。

テストは、ただ単にコードの信頼性を担保するだけのものではありません。テストを適切に導入することにより、先のレイヤにおいては、よりよいスタイル・設計が可能になることは最近つとに主張されている通りですし、レイヤを貫通した各側面においては、開発効率、保守性、信頼性の向上に大きく寄与するのは当然のことでしょう。本書は、Perl固有の習慣にのっとった開発スタイルのメリットを説き、各テストフレームワークの使用法を詳しく説明します。特に、個人的にはApache::Testによるテストといのは書いたことがなかったので、今後、本書の知識を活かしていければと思います。

開発効率がよく、保守性の高いコードを書いたところで、パフォーマンス面において顕著に劣っていれば、それは「よいコード」であるとはいえないでしょう。ただし、だいたいあのあたりが悪いだろう、あのツールを使ったせいで遅いのだろうと、やみくもにコードをいじりまわしたところで、単にコードは汚なくなっただけで、思ったより速くもならず、開発効率や保守性は下がり、バグの混入しやすい信頼性の低い状態になっただけに終わるということになりかねません。本書では、プロファイルやベンチマークのツールを解説しながら、Perlで書かれたコードを適切に最適化する方法が解説されています。

Perlについての詳しい知識を得る

個人的に本書の白眉だと考えるのは、第8章「知っておきたいC APIとXSの書き方」です。そもそもXSとはなんなのかというところから始まって、XSで書いたコードがCのコードに変換されるプロセスについて、Perl内部の構造体の解説は、perldocコマンドで読めるドキュメントに書かれていることではあるものの、英語でもあり、馴染みのない話なのでなかなか理解が難しい事柄が、わかりやすく説明されています。

さらに、ドキュメントを一読しただけではなかなかうまく使えるようになれそうもないtypemap、Magic構造体、関数呼び出しの際のスタック操作についての解説は、本当にありがたい。これを読むだけでも本書を購入する価値があるといえる程です。また、XSという仕組みがあるPerlでは、既存のCライブラリのバインディングをとても簡単に書くことができます。その具体的な方法についても、ウェブを巡っただけでは明らかにはならないtips(定数の定義を効率よく行う方法など)も含めて解説されており、先日Lux::IOというC++ライブラリのバインディングを作った際にこの本に書かれている知識があったら、いくらかは苦労が減ったのに……と思ったものでした(まあ、実際はid:tokuhiromさんが大幅に添削してくださったので、いろいろ勉強になりありがたいことです)。

まとめ

そんなわけで、本書『モダンPerl入門』は、Perl初学者、他言語からPerlに入ってきたひと、Perlについてもっと知りたいひとを問わず必読な、まさに待望されていた書籍であると思います。ぜひ読んでみることをおすすめします。