書評:プログラミングScala

訳者の方々とオライリー・ジャパン様より献本頂きました。厚く御礼申し上げます。ありがとうございます!


プログラミングScala

プログラミングScala


はじめに

Dean Wampler and Alex Payne著『Programming Scala』の、「株式会社オージス総研 オブジェクトの広場編集部」様による翻訳です。訳質に関してはさすがと言いましょうか、まったくストレスを感じません。内容も初頭文法の説明からアクター、DSLなどの応用編まで多岐にわたっていて、じゅんいち☆かとうさん*1や、ゆろよろさん*2もおっしゃっている通り、間違いなく良書でしょう。


コップ本*3との違いについては、「訳者まえがき」で岡本さんが説明している部分を引用します。

本書でわからないことがあったり、もう少しScalaについて深く知りたいと思ったら、『Scalaスケーラブルプログラミング』(インプレスジャパン)を参照するとよいでしょう。本書がアプリケーション開発者の視点によるScalaの解説書であるのに対して、『Scalaスケーラブルプログラミング』は言語設計者による言語解説であるため、相互に補う内容になっています。(p.xii)

この言葉がまさに的確に違いを表しています。私の感覚としては、読み物として最初から読むのであれば、『プログラミングScala』の方が適しているかと思います。(出版の順序とは逆ですが)『プログラミングScala』を読んで、Scalaの考え方を一通り学び、実際にアプリケーションを作る上で、詳細な知識が必要になったらコップ本を読む、というのがよいのではないでしょうか。


一点補足すると、「Scalaへのエントリポイント」ではあっても、「プログラミング言語へのエントリポイント」ではありません。「はじめて学ぶ言語がScalaです」という方はさすがにまだいないとは思いますが*4オブジェクト指向言語に関するなんらかの知識は前提として持っていないと、さすがに読むのはきびしいかもしれません。

アプリケーション設計のために

さて、内容に移っていきましょう。Scalaでどう書いたらいいかという観点からとらえると、Scala文法の網羅的な説明(1章〜4章)から、Scalaにおけるオブジェクト指向の考え方(5章〜7章)、再帰や畳み込みなどの関数型プログラミングの実践方法(8章)までを(あまりに難解なところは適宜飛ばしつつ)一通り読めば、普通にScalaを書く上で必要な知識はおおよそ身につきます。Scalaを軽量Javaと考えるなら、ここまでで十分でしょう。しかし、それだけではやはりもったいないですし、この本が真に優れている点も、そのさらに先にあると私は思っています。


少し複雑なプログラムを書こうとすると、必ず考えなければいけなくなるものに、モジュールの分割があります。ある言語を「習得した」と言える基準の一つに、初頭文法を超えてこうしたモジュール設計ができるようになることが上げられるのではないでしょうか。この本を買って読もうと思う人であれば、モジュール設計について何らか理解している言語を1つは持っているのではないかと思います。こうした言わば母国語は、私にとってはJavaです。


Javaを基準に考えると、Scalaではこうしたモジュール設計に関して、かなりのパラダイムシフトが起きています。これは単に「関数がファーストクラスなので効率的にアルゴリズムが実装できる」といったことに留まりません。いくつか例を挙げましょう:

  • トレイトを利用した動的なミキシン*5
  • アクターを利用したメッセージ駆動のモジュール設計(9章)
  • 暗黙の型変換を活用した内部DSLの構築(11章)
  • パーサコンビネータを活用した外部DSLの構築(11章)
  • 可視性の柔軟なコントロールによる「コンポーネント」の実現(13章)
  • 暗黙の型変換とパターンマッチを組み合わせによるVisitorパターンの置き換え(13章)


こうした考え方の基礎が、具体的なサンプルコードと共に紹介されています。雰囲気に触れるだけであれば、コードを眺めつつ本文をさらっと読むだけでもいいかもしれませんが、できることならば、実際に写経しながら取り組んだ方がよいでしょう。さらにつけ加えると、自分が理解している限りでよいので、登場するクラス(あるいはコンポーネント)の図を描きながら理解を深めていくべきだと思われます。これは厳格なUMLである必要はありません。特に暗黙の型変換が入った場合は、どういう処理を経て最終的な出力に至るかを追うのが非常に難しくなりますので、それを自分なりに整理した方がいい、ということですね。


日本語版に独自に追加された、Scala 2.8における変更点とSimple Build Toolを使ったScalaの開発に関する解説も、実際に手を動かす上で大いに参考になるでしょう。

最後に

この本は「扉を開けてくれる」本です。逆に言えば、「この本を一冊読めばScalaの全てがわかる」というものでもありません。正確には、この本の内容を全て理解するには、恐らくこの本を読むだけでは足りない、というべきかもしれません。この本は、実際にコードを書きつつ、その際に発生する問題に苦しんだときに立ち返ることのできるものです。文法を覚え、設計思想(あるいはテクニック)を学んだら、次にやるべきことは、自分で実際に何か一つ作ってみることでしょうね。読んでいるだけの時とは違った学びがあるはずです。




プログラミングScala

プログラミングScala



なお、Macをお使いの方へ。Scala2.8から、インストール時にバージョン番号を要求されるようです。

sudo port install scala28

*1:[書評] プログラミングScala - じゅんいち☆かとうの技術日誌

*2:書評:プログラミングScala - The Python Paradox is now the Scala Paradox - ( ꒪⌓꒪) ゆるよろ日記

*3:

Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)

Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)

*4:あと何年かすれば、そういう方も出てくるんでしょうね

*5:例えば、このブログで時々ご紹介しているDCIアーキテクチャは、人間のメンタルモデルを表現するために「ロール」の概念を導入しています。トレイトはこのロールの実装手段として優れた効果を発揮します。(ScalaによるDCIアーキテクチャ:ローンシンジケート再考 - Digital Romanticism