結城浩にインタビュー

Java言語で学ぶデザインパターン入門

結城浩

目次

はじめに

このページは、 プログラミング情報誌『R.U.Certainマガジン』編集部(以下、RUCM)による 企画「結城浩にインタビュー」を再編集したものです。

テープ起こし後のテキストファイルを提供くださった RUCM編集部に感謝します。

『Java言語で学ぶデザインパターン入門』とオンラインレビュー

RUCM: 結城さんは、この本について刊行前からインターネットでアナウンスなさっていらっしゃいましたね。 実は編集部でもインターネットでこの本のことを知ったのですが。

結城: ええ、そうですね。 本の刊行前から、というよりも執筆の途中からずっとアナウンスしていました。 Webページで「レビューア」を募集して、 書き上げた章をその方々にメールして意見を求めたりもしていました。

RUCM: 結城さんのページにあるレビューアさんの感想メールは読ませていただきました。 1章書くごとにメールを送っていたのですか。 それは、書く側にとってすごいプレッシャーではないのでしょうか。

結城: ええ、1章書くごとに順番にメールを送っていました。 ちょうどメールマガジンのような感覚です。昨年の秋から冬にかけてのことです。 この『Java言語で学ぶデザインパターン入門』は本当に楽しみながら書けた本なので、 プレッシャーはそんなになかったです。 調子が上がっているときには毎日1章ずつ送っていたので、 レビューアさんの方がプレッシャーを感じていたようです。

RUCM: インターネットを使って本をブラッシュアップするというのは、 編集者としてとても興味があります。

結城: 私は「半分バザール方式」と呼んでいます。 Linuxの開発で有名になった「バザール方式」というソフトウェア開発技法がありますが、 それを文章にちょっぴり応用したと言えます。 完全に文章をオープンにしているわけではないので「半分」バザールなのです。

RUCM: レビューをしてくださる方はプログラミングの専門家なのですか。

結城: さまざまです。 初心者に近い方もいらっしゃいましたし、 学生さん、ソフトウェアの開発者、 それに学校の先生もいらっしゃいましたね。 性別では男性が20人、女性が5人。 年代は20代がほとんどでした。 レポートをメールで返信してもらうのですが、 技術的な間違いを見つけていただいたり、 わかりにくい表現を指摘してもらったり、 また執筆を励ましてもらったりと、 私にとってはとてもありがたかったです。

RUCM: なるほど。

リンク

『Java言語で学ぶデザインパターン入門』の内容

RUCM: 今回の『Java言語で学ぶデザインパターン入門』ですが、 これは一言で言うとどういう本になるのでしょうか。

結城: この本は「デザインパターン」というものを紹介した本です。 非常に簡単にデザインパターンというものを説明しますと、 プログラムを設計・開発しているとき、 「繰り返し登場するパターン」があることを多くの人が感じています。 デジャビュといいますか、 「以前同じようなことをやったことがある」という感覚ですね。 言い換えればそれは設計者・開発者の「経験」ということになるのですが、 デザインパターンというのは、 そのような経験に名前をつけてカタログ化し、 利害得失を検討して整理したものです。

デザインパターンをやさしく紹介しています
結城浩『Java言語で学ぶデザインパターン入門』

RUCM: 難しいですね。 それはプログラムにおける「定石集」のようなものでしょうか。

結城: いや、そんなに難しい話ではないんです。本当は。 「定石集」と言える部分もありますが、 定石集と理解するとプログラミングのテクニック的な側面が強くなりますね。 デザインパターンはもっと広く、またプログラミング言語にはそれほど依存しない話です。

デザインパターンの原典

RUCM: デザインパターンというものは結城さんが考えられたのですか。

結城: いえいえ、とんでもないです。 デザインパターンの「原典」というべきは、 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissidesという4人の人が書いた "Design Patterns: Elements of Reusable Object-Oriented Software" という本です。 ソフトバンクパブリッシングから翻訳も出ています。この本では、23個のデザインパターンが詳しく解説されています。 これは感動的な本なのですが、なかなか難解で、 読みこなすのにはかなりの力を必要とすると思っています。 今回私が書いた『Java言語で学ぶデザインパターン入門』は、 その23個のデザインパターンをやさしく、わかりやすく解説したものです。

デザインパターンの「原典」
『オブジェクト指向における再利用のためのデザインパターン(改訂版)』

RUCM: 先ほど、デザインパターンはプログラミング言語には依存しないというお話がありましたが、 今回の『Java言語で学ぶデザインパターン入門』はJavaで書かれているのですか。

結城: ええ、そうです。 原典ではC++がメインになっていました。 私の『Java言語で学ぶデザインパターン入門』ではJava言語で書いたサンプルプログラムをつけました。 サンプルプログラムはできるだけ短いものにし、 省略がなく、実際にコンパイルして動かせるものを作成しました。 デザインパターンそのものは言語に依存しませんが、 具体的な言語で書かれたプログラムがないと理解しにくいものですから。

デザインパターンの例

RUCM: デザインパターンの簡単な例を挙げていただけますか。

結城: そうですね。 じゃあ、Adapter Pattern(アダプターパターン)のお話をします。 ここに2つのプログラムがあるとしますね。 オブジェクト指向のプログラミングに慣れている人ならクラスがある、 と思った方がわかりやすいかもしれませんが、まあ、プログラムがあるとします。 プログラムには普通「インタフェース(API)」と呼ばれるものがあります。 簡単に言えば、そのプログラムにどういう入力を与えたら、 どういう出力が得られるかを決めたものですね。

RUCM: ええ、何となくわかります。

結城: 2つのプログラムのインタフェース(API)が うまく適合していると——つまりこっちの出力をこっちの入力にうまく流し込めれば——問題はありません。 でも、現実の開発現場ではそうでない場合もあります。 2つのプログラムをうまくつなげられればうれしいんだけれど、 インタフェース(API)があわないためにつなげられない、ということがあります。 それはちょうど、 交流100ボルトの電源が用意されていて、ノートパソコンの直流12ボルトにつなげられればいいのになあ… という状況に似ています。 こんなとき、どうすればいいですか?

RUCM: え? ええと、電源をつなぐ…?

結城: その通りです。 ACアダプターを使って交流100ボルトを直流12ボルトにつなぎます。 インタフェース(API)があわないとき、それをうまく変換してやって適合するようにしてあげる存在がいればいいんです。 それを一般に「アダプター」と呼びます。ACアダプターと同じですね。 デザインパターンのAdapter Patternは、簡単に言えば、このような考え方を表現したものです。 具体的な実現方法になると、 継承を使ったAdapter Patternと、委譲を使ったAdapter Patternという二種類があるのですが、 それを話すと長くなるのでやめておきます。

RUCM: Adapter Patternというのは何となくわかりました。 インタフェースを変換するようなデザインパターンなのですね。

結城: その通りです。 Adapter Patternは、例の23個のデザインパターンの1つになります。 『Java言語で学ぶデザインパターン入門』でももちろんわかりやすく解説しています。 実際、『Java言語で学ぶデザインパターン入門』では、 ACアダプターを例にとってAdapter Patternのお話をしています。 他のデザインパターンについてもできるだけわかりやすいたとえ話や比喩を使って、 まずは直感的に「どんなパターンなのか」がつかめるように心がけました。

RUCM: なるほど。何だか面白そうですね。

結城: 面白いですよ。

Adapterパターン

リンク

デザインパターン・メーリングリスト

RUCM: 結城さんは、デザインパターンのメーリングリストも運営なさっていますね。

結城: ええ、 デザインパターン・メーリングリストというMLを、 FreeMLという無料のメーリングリストサービスを借りて運営しています。 これは本当にはじまったばかりですが、 急激に参加者数が増えていてびっくりします。 開始したのが2001年5月24日なのですが、一週間で300人の参加者がありました。 6月5日にはそれが600人を越しています。

RUCM: そこではどんな議論が行われているのでしょうか。

結城: まだはじまったばかりなので、 それほどまとまった「議論」があるわけではありません。 参加なさっている方々も様子を見ている部分があるでしょうし。 現在は、デザインパターンに関する書籍やWebページの情報、 現在注目されているエクストリームプログラミング(XP)についての情報などが流れています。 オブジェクト指向全般、設計の話題、プログラミングスタイルなどの話もあります。

RUCM: メーリングリストの管理というのは大変ではありませんか。 技術的に高度な話をまとめたり、もめごとの仲裁をなさったりもするのでしょうか。

結城: それほど大変とは感じないです。 デザインパターン・メーリングリスト以外にもいくつかMLを管理していますが、 どこでも、もめごとはあまり起きていません。 みなさん紳士的で、とても感謝しています。 「仲裁」のようなことは必要ないですね。 私は「管理」っぽい管理は何もしていません。 すべての発言にレス(フォロー)を入れるようなこともしていませんし、 私の理解できない話題も出ることがありますが、 熱心に話し合っている人に水を指すようなことはしないようにしています。 できるだけ、居心地のよい、でも技術的に面白い場になるといいなあ、 と願ってはいます。

RUCM: これは失礼な質問かもしれませんが、 結城さんの本の批判は、MLではしにくいんじゃないでしょうか。 管理者の批判になるようで(笑)。

結城: うーん、どうでしょうか(笑)。 私としては、批判や意見、改善案などをぜひぜひ聞きたいところなのですが。 もちろん、自分が書いた本は、けなされるよりほめられる方がうれしいですけれど、 「ここはこうした方がいいんじゃないか」とか「ここは間違っている」という意見は、 ただのほめ言葉よりも大事にしたいです。 そういう意見が出てくるということは、 私の本をよく読んでくださっているということじゃないですか。 それはとてもうれしいことですし、 意見を言うというのは私の本に期待をしている、ということでもありますから。 私は本を書きますが、本を書くときに重要なのは「読者のことを考える」ということだと思っています。 ですから、読者の声は本当に大事にしたいんです。

RUCM: なるほど。

リンク

プログラミングの学習について

これまでに書いた本

RUCM: 本を書く、という話になりましたが、 今回の『Java言語で学ぶデザインパターン入門』は何冊目の本になりますか。

結城: 改訂版もぜんぶ含めますと11冊目になります。

RUCM: それは全部プログラミングの本ですか。

結城: そうですね。 CGIの本はちょっと毛色が違いますが、 プログラミング言語の本ばかりを書いています。 C、Perl、それからJavaの本です。

基礎編 応用編 (上巻) (下巻)

RUCM: 言語がお好きなのですね。

結城: ええ、とても好きです。日本語も好きです。 プログラミング言語の本というのは、 プログラミング言語、という言葉の話を、 日本語、という言葉で書くので、二重の喜びがあります。

プログラミングにセンスは必要?

RUCM: プログラミング言語を習得する、 というのは難しいと思うのですが、 プログラミングというのはセンスが必要なのでしょうか。

結城: 私は「プログラミングはセンス」という言葉はあまり好きじゃないです。 この言葉には何となく「だから自分にはできない」「だからあの人にはできない」というような否定的な香りがするからです。 特に、さあ今からプログラミングというものを学ぼう、と張り切っている初心者に向かって 「プログラミングはセンス」という言葉を投げつけて、何か生産的なことが起こるとは思えません。 私は「プログラムはセンスで書くのではなく、言葉で書く」と茶化すこともあります。

RUCM: 確かに「センス」と言われたら、不安になります。

結城: でしょ? プログラミングを学ぶにはいろんな資質が必要なのは確かです。 書かれているものを丹念に読む根気とか、論理的に考える力とか、 複雑にからんだものを解きほぐす能力、 もちろん記憶力も必要ですし、 開発のためには他の人とのコミュニケーション能力も必要でしょう。 その中の1つとして「センス」というものも必要かもしれませんが、 それがすべてではない。 人はそれぞれ得手不得手、得意不得意がありますよね。 自分の得意なところは充分に利用した上で、 不得意なところはうまく補ってやるのが学習のコツだと思います。

RUCM: 得意不得意のところをもう少し具体的にお話願えますか。

結城: 例えば記憶力が弱い、としますよね。 そのときには、それを補う方法を考えるのがいいんです。 自分が覚えられなかったら、ドキュメント(文書化)に力を入れる。 自分が覚えていなくても大丈夫なようなプログラミングスタイルを考えるんです。 タイピングが遅かったら、プログラムの自動生成について考える。 もともと、人間の情報処理能力には限界があるわけですから、 うまくコンピュータを使ってそこを補うようにしなくては。 自分がうまくできないこと、不得手なことは何か、を恐れずに見つけ出す。 見つけ出したら、どうやったらそこが補えるかを考える。 例えばコンピュータを使う、例えば他の人を使う。 そういう風に頭を使うと、自分が不得手な部分が自分の武器になるんです。

RUCM: なるほど。

結城: プログラミングに関して天才的な能力を持っている人の中には、 うまく人とコミュニケートが取れない人もいます。 あるいは自分の考えを人にわかりやすいように説明したり、 理解しやすい例を考え出すのが苦手な人もいます。 その反対に、プログラミング能力は高くなくても、 天才的な何かを見つけ出す嗅覚が鋭い人や、 理解しやすく話を噛み砕くのがうまい人もいます。

RUCM: ええ、よくわかります。

学習意欲をなくさないように

結城: 話が大きくなっちゃったのでプログラミングに話を戻しますが、 プログラミング言語を学びながら、 自分の得意なこと不得意なことを見つけ出していくのは大事なことだと思います。 もちろん、努力して不得意なことを改善していくのも重要ですが、 なかなかうまくいかなくて自信をなくしたり、 挑戦する元気や学習意欲までなくしてはもったいないですよね。

RUCM: お話を聞いていると、何だかよくわからないんですが、 私自身がはげまされているような気分になってきました(笑)。

結城: 私、はげますの大好きなんです(笑)。

リンク

Webサイトの運営について

Webサイト開始は1995年ごろ

RUCM: 結城さんは 「結城浩:The Essence of Programming」というWebサイトを運営していらっしゃいますが、 はじめてから何年になりますか。

結城: はじめたのは1995年頃です。 プロバイダは リムネットでした。現在もリムネットのサービスを利用しています。

RUCM: Webサイトを開始されたきっかけは何ですか。

結城: ええと、よく覚えていないんです(笑)。 仕事の都合でインターネットの電子メールが欲しくなって、 それでプロバイダと契約し、 Webページというものが開けるということで設置したのだと思います。 あやふやですみません。 当時は自分の本の紹介や自己紹介が書かれた、たった一枚のページでした。

RUCM: 現在は何ページくらいあるのですか。

結城: よくわからないですが(笑)、 たぶん500ページくらいじゃないかと思います。

技術ページ以外も

RUCM: 結城さんは、技術的なページだけではなく、 キリスト教関連のページや、 心の健康のページも同じサイトに置いていらっしゃいますね。

結城: そうですね。私はクリスチャンなのですが、 技術的な情報を求めて来られた方が、 聖書に触れ、 キリストの福音に出会われることを願っています。

RUCM: 結城さんのページを見て、 クリスチャンになったという方もいらっしゃるのでしょうか。

結城: ええ、いらっしゃいます。 数人の方からそういうメールをいただいたこともあります。これはとてもうれしいです。 でも、いつも「私のページを見たからこの人はクリスチャンになったんだ」 とは思わないようにしています。

RUCM: え、それはどういうことでしょうか。

結城: 私はつい「自分がこれをやった」「自分の働きによってこれが起こった」と考えがちなのですが、 それはすごく傲慢な考え方だと思うんです。 確かに私のページを見て聖書を読み始め、教会に通いはじめ、 そしてキリストの救いを受け入れた方もいらっしゃいます。 でも、それは、何というか「時が来たから」あるいは「神さまの計画のほんの一部」だと思うんです。 たまたま、私のページがきっかけになったけれど、それまでに多くの人がその方のために祈っていたり、 あるいは周りにいたクリスチャンのフォローアップがあったり、 何よりも神さまが「その時にそうなさろうと思った」ということだと思うんです。

RUCM: ははあ。 それはずいぶん謙遜な考え方ですね。

結城: うーん。こういうことを書くと 「謙遜なふりをして、実際にはすごく傲慢」な自分が出てきていやなんですが、 でも、自分に言い聞かせるようにいつも「これは自分の働きではない、自分の働きではない」 と考えるようにしています。 「神さまに栄光をお返しする」と表現してもいいです。

いやがらせメールはこない?

RUCM: Webページで自分の信仰を表明するというのは、危険なことはないんでしょうか。 宗教団体からいやがらせのメールが来たりはしませんか。

結城: ほとんど来ません。 1995年にWebサイトをはじめてから、悪意に満ちたいやがらせのメール、 というのは数えるほどしか来ていないと思います。 いや、よく覚えていないんです(笑)。 サイトに関する意見はときどき来ます。 でも、こちらが恐縮するくらい丁寧なメールが多いです。 細かな不具合の指摘もよく来ます。 Not foundになる、ページ中のURLが間違っている、 誤字があるなどですね。 ダイレクトメールの類いはたくさん来ますが、 ゴミ箱に入れて終わりなのであまり気にしていません。

RUCM: いやがらせのメールがほとんど来ないというのは意外です。 不具合の指摘が来るのはうるさくありませんか。

結城: とんでもないです。 どんな細かな不具合でも、千金の価値がある、と私は思っていて、 可能な限り感謝の返事をしています。 なかなか時間の都合で返事ができませんが。

RUCM: 本を執筆なさって、メーリングリストを運営なさって、 Webサイトを管理なさって…結城さんはいつ眠っているんですか(笑)。

結城: メールマガジンも(笑)。

RUCM: メールマガジンも(笑)。

結城: いつ眠っているか、というのはよく聞かれるんです。 この間もお世話になった編集の方から聞かれました。 夜はしっかり寝ています。 でも、インターネットで日記めぐりをしていると、 私なんか比べ物にならないくらい活発に仕事をなさっている方がたくさんいらっしゃいますよ。

RUCM: そうなんですか。

結城: そうです。

リンク

今後の活動

RUCM: 今後の出版予定や、やりたいことについて教えていただけますか。

結城: 今年は 『Perl言語プログラミングレッスン』入門編と『Java言語で学ぶデザインパターン入門』という二冊を出すことができました。 いま作業中なのは、プログラミングの本の翻訳です。 これはもっともっと頑張らなくちゃ駄目です。 祈りつついかなくちゃ、です。 それから、Javaの次の本も書くことを計画中です。 今言えるのはそれくらいです。 その前の段階の企画はたくさんたくさんありますが、 どれが芽を出すかはまだわかりません。

RUCM: JavaとPerl以外の言語はいかがでしょう。 例えばRubyなどは?

結城: Rubyはすごく興味があります。 日本発の言語ということもあって、心から応援しています。 でもまだ私がRubyの本を書く計画はありません。 いつか書きたいという気持ちはあります。

最後に

RUCM: もっといろいろお話をおうかがいしたいのですが、 もう時間がきてしまいました。 最後に、このインタビューを読んでいる方へのメッセージをお願いします。

結城: んー、では、 厳しい納期を抱えてお仕事なさっている人へ… 本当に毎日ご苦労なさっていることと思います。 どうか、煮詰まらないようにうまく休息をとり、気分転換をはかってください。 こんなことを言ってはいけないかもしれませんが、 自分がばらばらにならないように、うまくさぼってくださいね。 それから… イエスさまはあなたと共におり、 あなたの心をノックしていらっしゃいます。 いつかあなたがイエスさまのノックの音に気がつき、 心の扉を開き、 イエスさまをあなたの心のうちにお迎えすることができますように。

RUCM: 今日は、お忙しい中、長時間ありがとうございました。

結城: こちらこそ、ありがとうございます。 あなたの上にも神さまの祝福が豊かにありますように。

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

更新履歴

お気づきの読者も多いと思いますが、 『R.U.Certainマガジン』という雑誌は実在しません。 このページは結城の活動を対話形式で紹介するためのものです。 読者の混乱を招かないよう、ここでお断りしておきます。

豊かな人生のための四つの法則