multiplus

気まぐれに書評とか。

今書いている「コード」の理解を一段階深める一冊―『コーディングを支える技術』

型、型というけれど、「型」とは何でしょうか?あるいは、そもそもSystem.out.println(“Hello, World!”);は、どのようにして「Hello, World!」とコンソールに出力するのでしょうか?これらの問いは、普段コードを書いているうちにはとくに何の疑問ももたずに通過してしまう話です。

しかし、よりパフォーマンスを重視しながらコードを書く必要が出てきた場合や、コードをリファクタリングしてより保守性・メンテナンス性の高いものにする必要が出てきた場合、どうしても「物事の根本原理」に立ち返る必要が出てくる場面に直面します。パフォーマンスチューニングの場合だと、そもそも変数はどのようにメモリ上に管理されているか、という話に表れてきますね。また、リファクタリングしようとする際にも問題になってきます。Javaではインターフェースあるいは抽象クラスという道具があり、そのどちらを使うとより effective なコードになるか、という点を追求するには、オブジェクト指向に対する深い理解が鍵となってきます。

本書は、「変数」「スコープ」「型」などといった、プログラマが「そういうものなんだ」と入門書で飛ばしながら読んでしまう箇所を深く追求しつつ、それらの概念の理解をより深めるには最適な一冊だと思います。「あ、そういうことなんだ」となること間違いなしです。

何より、ひとつの概念を説明する際にさまざまな言語を比較しながら説明してくれるのは非常にありがたいです。知っている言語があると、その言語を手がかりにその概念の理解を深めることができますし、知らない言語・名前を聞いたことがあるだけの言語があったとしても、「この言語にはこういう機能があるのね」と自分の了見が広がること間違いなしです。

if文とは?traitとは?

私が読んでいてとても興味深いと思った箇所は2箇所ありました。ひとつは、if文についてです。そしてもう一つは、traitという概念です。

if文は、普段は何気なく使ってしまう文法ですし、どの言語にもある文法です。そして何より、プログラミングを何もわからない初心者に一から説明せよ、というお題を与えられたとき、説明せずには通れない文法でもあります。では、ifとは何でしょうか?処理の分岐ですか?0と1しかないコンピュータの世界で、どのようにそのような複雑な概念を表現しているのでしょうか?ここまで説明できる人は、なかなかいないと思います。

if文は、アセンブリを解析するととても明快です。ifとはスキップ(go to XXX)のことです。ただ、スキップといっても処理を飛ばすことではありません。あるラベルに飛んで、別の処理を行い、次のラベルに飛んでいく一連の流れをifは指し示しています。これはなかなかおもしろく、ではswitchとifはどのように違うか?ということもまた追求可能です。こちらも、アセンブリを解析してみると結構違う処理をしてるんだなあという発見ができるかと思います。

traitについては、そもそもJavaをやっているうちはあまりなじみのない概念かと思います。しかし、Javaのインターフェースを「不便だなあ」と思い始めると、途端にtraitが欲しくなってきます。私も最近、Javaジェネリクス×インターフェースという組み合わせで何度も「不便だなあ」という思いに駆られたので、traitのある言語をメインに使っていけたらなあと思ってしまうくらいには便利だと思います。

traitも説明が難しいですが、近い概念で有名なもので説明すると、Rubyのモジュールがそれに近いです。モジュールは、クラスにincludeすることでモジュールの持つメソッドをそのクラスで呼び出し可能になります。もっとも、コードを見ていると本来のそのような機能を目的に使っているというよりは、名前空間の確保のために使うことが多いようですが。

Javaの場合、Rubyのモジュールのようにメソッドを差し込む機能はないので、親元のインタフェースにメソッドを追加で記述する必要が出てきてしまいます。しかしそれですと、抽象度の高い実装は難しくなってしまいます。(最近では default メソッドも出てきましたが・・・)

trait、便利ですね。

他にも、スレッドの話であったり、オブジェクトがそもそも何なのかといった話も載っており、今使っている言語の理解がより深まること間違いなしなので、ぜひ読んでみてください。