この書評は、掲題書についての一個人の考えを述べ、改善に資せんとするものである。つまりここから先に書かれていることの冒頭には遍く「私見では」と見えない文字で書かれているということだ。
この本は初学者向けの教科書または副読書として不適切であり、おすすめしない。加えて、中級者・上級者向けの本としても無理があるように思う。詳細はこの後で詳しく述べる。2700円はかなり強気だ。しかし私はもう2700円(そして日本国政府と自治体に外税を)支払ってしまったのだから、真摯にレビューすることが読者の権利と義務であると信ずる。
まだ夜の闇に冷たい質量が残っており、街に緑が萌えるよりも前の話である。Scala 3の書籍が出るとネットで聞き及んだ。Scalaを扱った和書が出るのは久しぶりであり、なおかつScala 3の本はおそらく初めて出るとあって、私はかなり期待して予約していた。しかも初心者向けと銘打っているから、教材としても期待できるのではないかと皮算用していたのだ。 そして先日、新刊の掲題書が届いたというわけである。
私の主張の要点だけまとめると以下の通りである。
- そもそも初学者向け書籍は、網羅的に情報を並べるのではなく取捨選択の必要に迫られ、時として嘘スレスレの大幅な簡単化が求められ、なおかつこれを直列化して理解に導く必要がある。このため難易度がそもそも高い
- 例えば小学校の教科書でかけ算の順番を固定するのは「嘘スレスレの大幅な簡単化」の好例である
- しかしながら、本書は初学者向けの適切な取捨選択が行われていないように思える。また、体裁上の問題を抱えている。すなわち、
- 文章の癖が強く読みにくい
- 書籍の論理構成に無理がある
- 体裁に無視できない問題を抱えている
このため、初学者にはおすすめしない。また、中級者や上級者にとってもさほどおすすめできない。これらについて以下に説明する。
文章について
さほど本質的ではない外形的な話からになるが、 全体として文章が読みにくい。係り受けの不足、節立ての筋道のちぐはぐさが目立った。読んでいて迷子になる局面が複数回発生した。 それを差し引いても、パラグラフの主張が不明瞭なまま文章が続いていくため、着いていくのが困難であった。
また、用語法が独特で、聞き慣れない用語が断りなく登場した。「関数プログラミング(関数型プログラミングと書くのが一般的だと思う)」「集合体(コレクションを指していると思われるが一般的だとは思えない)」「ジェネリック(ジェネリクスと書くのが一般的ではないか)」など。技術書では技術者間で一般的に通用する語彙を選ぶほうが良い。
(追記)「関数プログラミング」に関しては昔から使用例があるとのことです。この点補足します。
https://x.com/tadsan/status/1927445663752622319
また、用語法の不統一があるように見受けられる。「Setオブジェクト」と「集合オブジェクト」などである。
しかしこれは校閲者の職掌であろうからあまり深入りしても仕方がない。本来ならば書評でこういうことを書くべきではない。
構成に関して
本書のターゲットが分からなかった。このためどのようなつもりで読めばよいか分からなかった。例えばC言語を履修したての学生なのか?それとも多少なりとも他の言語の経験があるユーザか?いずれにしても焦点がぼやけており、印象が薄かった。読者がどこまでは知っていてどこからは知らないつもりで話が進むのかが明らかにならない。例えばenumといった中級難易度の言語機能を紹介する一方で、半角スペースと全角スペースを間違えないようにしましょう、といった注意書きが登場したりするため、粒度にばらつきがあった。
書籍を読むことで辿り着くゴールも不明確であり、示されなかったため、読者は霧の中を歩かなければならない。この本は誰に何をさせたい本なのか?というのが良くわからなかった。
また、章立について、章同士の関連性が曖昧であった。初歩的なmain
の実行、そして初歩的なList
操作をするところまでは良かったと思う。しかしそこからOOPとFPに分かれていく過程で、これから何をします、どのように説明していきます、という説明が欲しかった。
とりわけ「関数プログラミング」に関しての記述は非常に難解で、理解を追い付かせることができなかった。
@main
などの説明は良かったと思う。
また、説明不十分な要素があった。例えば登場したにもかかわらず特に説明がなかったタプルや、同じく登場したが特に掘り下げられなかったMap
である。自分だったらコレクションに関して触れる場合はSeq
、Set
、Map
という
言語機能を紹介するためのコードの題材が練られていない印象を受けた。例題が恣意的で著者のモチベーションについていけなかった。例えば突然Box
というクラスが登場してどんどんフィールドが足されたりしていくが、うん?なんですかこれは?と読者が思っているうちにどんどん次の話が始まってしまう。
体裁
ソースコードがフォーマットされていない。これはプログラミング言語の入門書籍としてありえないのではないか。非常に驚いた。
次に、「(Setの実装に関して)Scalaのユーザーフォーラムによると」とあるが、標準ライブラリは公開されているので、コードを追ってほしい。 「はじめての」と銘打っているからには責任を持ってほしい。あらゆる局面において、はじめてを奪うということには責任が生じる。ちなみに具体的な実装は以下にある:
Set
に要素を追加しても、4要素までは特殊な実装が使われるが、4要素に到達するとHashSet
を用いる実装に自動的に切り替えられる。
次に、式(if
など)を文と書いている箇所が散見される。Scalaにおいて、if
やmatch
は式である(match
は式と書かれていた)。この言語においてこの取り違えは大きいので、間違えないでほしかった。
また、JavaのAPIを呼び出せることの例示として取り立てられた時刻処理に関して、java.time
ではなくjava.util.Calendar
を意図的に利用したことの理解に苦しむ。その理由も特に述べられなかったため、困惑した。Deprecatedになってこそいないものの、現代においてjava.util.Calendar
を新規に採用する理由はない。全くない。
全体
そもそもプログラミング言語の初学者向けの説明を160ページで駆け抜けるのは非常に大変だと思う。であるからこそ、より練った説明や章立てが必要だったのではないかと思わざるをえない。 校閲者は寝ていたのだろうか?初学者向けであるから細微な点にツッコむことはやらなかったが、それを差し引いても内容があまりに無軌道すぎる。2700円(外税)なのでこれくらいにしておくが、これが3000円を超えていたら血圧が上がって6月の健康診断に間に合わなかっただろう。大いに反省してほしい。
それはそうと、Scala 3の書籍が世に刊行されたことは素直に喜びたいと思う。産まれたての赤子なのだから仕方がない。