結城浩にインタビュー

『プログラマの数学』

結城浩

『プログラマの数学』出版を記念して行われたインタビュー記事です。

目次

はじめに

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

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

『プログラマの数学』というタイトル

RUCM: 今回の結城さんの本は『プログラマの数学』というタイトルなんですが、 このタイトルのあたりからお話をうかがえますか。

[カバー画像]
数学的な考え方を学ぶ『プログラマの数学』

結城: はい。 一言でいえば、プログラミングをしている方々、まあプログラマですね、 そちらのほうを向いてこの本を書きましたというニュアンスを強く出したかったのです。

RUCM: なるほど、それで「プログラマの〜」というタイトルになるのですね。

結城: はい。 プログラマとコンピュータは共同で問題を解きます。 プログラマの仕事の1つは、問題の中から「構造を見いだす」ところにあります。 構造・規則性・性質・まとまり・グループ・仕組み…まあ何と呼んでもいいのですが。 とにかく複雑でややこしいものを目にしたときに、それをそのままにしておくのではなく、 いろんな技法を使って解きほぐします。

RUCM: 問題を解きほぐす技法、ですか。

結城: はい。 論理を使うかもしれません。 小さい数を使って実験して周期性や規則性を見つけるかもしれません。 あるいは再帰的な構造を見抜いたり、漸化式を作ったりするかも。 ともかく、さまざまな方法でややこしいものを分解し、把握しようとする。 それが、プログラマにとって重要な仕事だと思うのです。 キャッチフレーズ風にいうならば、 「構造を見抜け、パターンをあばけ」 ということになるでしょうか。

RUCM: 構造を見抜け、パターンをあばけ…。

結城: はい。 「構造を見抜こう」というメッセージを、 クイズやパズルを通して、あるいは図や解説文を通して、 読者に伝えたいなと願っているのです。

数学に対する苦手意識

RUCM: プログラミング言語の入門書を たくさんお書きになっている結城さんが、 今回はじめて『プログラマの数学』という数学の本を出されるということで、ちょっと驚きました。

[上巻のカバー画像]
Javaを基礎から学ぶ『Java言語プログラミングレッスン』

結城: はい。 『プログラマの数学』の出版のことをWebでアナウンスしてから、 いろんな方にメールをいただきました。 みなさんたくさん励ましてくださるのですが、多くの方が「数学の本とは驚きました」と書いていらっしゃいましたね。 私は逆にそれに驚いてしまったのですが。

RUCM: と言いますと?

結城: というのは、私の中では、 数学とプログラミングというのは「同じ」とまでは言えないにせよ、 とても「近い」と感じることが多いと思っていたものですから。

RUCM: 学校では数学が苦手で文系だったけれど、 いまはプログラマをやっているという人もよくいらっしゃるようです。

結城: あ、それはそうみたいです。 多くの方々から『プログラマの数学』に関してメールをいただいたのですが、 「自分は文系プログラマですから」という表現をしている人が、とても多かったんです。 文系プログラマで、数学は苦手ですとか、 数学をきちんと勉強したことがないので、数学に対してコンプレックスを持っています、 といったメールもよくありました。 数学の中でも、特に「数式」に対する苦手意識を持っている方が多かったです。 数式が出てくると頭がいたくなるとか、見たくもないとかですね。 プログラムを実際に書くときに高度な数学が必要になるケースは少ないのですが、 心のどこかで、自分は数学をわかっていない、 自分には数学をわかることはできない、と思っているのですね。

RUCM: ははあ、そうですね。 恥ずかしながら、私も「数式を見ると頭が痛くなる」というタイプです。

結城: なるほど。 実は私もそうなんです(笑)。 まあ、頭が痛くなるというわけではないのですが、 読んでいる本の中に、ちょっと難しい数式が出てくると、 つい読み飛ばしたくなるんですね。 少し先を読んで、話がどうしてもわからなかったらこの数式に戻ってこようと思うのですけれど、 結局戻ってこないという(笑)。

RUCM: でも、数学の本をお書きになった。

結城: そうですね。私は数学者ではないですけれど、 プログラミングの中で「数学的な考え方」は日々使っているように思います。 専門的に高度な数学は使わなくとも、数式を駆使しなくても、 数学的な考え方は、日々のプログラミングに大いに役立っている、と感じているんです。

「数学的な考え方」について

RUCM: その「数学的な考え方」のあたりをもう少しおうかがいしたいですね。

結城: 代表的な話としては「論理」があります。

RUCM: 三段論法とか、ソクラテスは死ぬ、とかいうのですよね。

結城: ええ、そういうのです。 でも、それよりももっと基本的なところが、プログラミングでは重要になります。 論理の基本はtrueとfalseという2つに「分割する」というところにあります。

RUCM: 分割、ですか?

結城: そうですね。たとえば「アリスは10歳以上である」という文章を持ってきて、 この文章はtrueかfalseかのどちらかである、ということにしましょう。 厳密なことを言い出すと「アリスって誰?」とか「いつ判断するの?」という問題が生じますが、 まあそれは置いておいて。

RUCM: trueからfalseかのどちらか、ということですね。

結城: はい。 この文のようにtrueかfalseかの判断ができる主張のことを「命題」といいます。 命題は、trueの場合とfalseの場合の必ずどちらかになります。 両方になったり、どちらでもない、ということはありません。 きっちりと、どちらかになるわけです。 そうすると、ある命題についてきっちりと物事を考えたいときには、 「trueの場合」と「falseの場合」の2つを考えればよいということになります。 …あたりまえの話ですよね。

RUCM: え、ええ。すみません。何だか話を聞いていて当たり前じゃないかなあ…と。

結城: はい。当たり前ですよね。 命題はtrueかfalseかのいずれかですから、 「trueの場合」と「falseの場合」ですべてを尽くしたことになる。 見落とし、考え落としがない。 ここがポイントです。 「これですべてを尽くした」という感覚が、プログラミングでは非常に重要なんです。

RUCM: ほほう。

結城: プログラムはコンピュータの上で動きます。 コンピュータは、人間よりもずっと高速に、ずっと大量の処理を行うことができます。 でも、コンピュータはプログラムに書かれたとおりのことしかできません。 プログラムには非常に複雑な判断がたくさん書かれています。 そこで、人間がプログラムを書くときには 「絶対に間違いなく、絶対に考え落としがないように」 するというのが大事になってくるんです。

RUCM: ふむふむ。

結城: それで、プログラマが論理を学ぶことで、 その「絶対に考え落としがない」というあたりが訓練できることになるのです。 私の書いた『プログラマの数学』ではそのことを「もれなく、だぶりなく」と表現しています。 そして各章ではこの「もれなく、だぶりなく」という主題が、さまざまな変奏曲となって現れてくるのです。

RUCM: もれなく、だぶりなく…。

数式は出てこない?

RUCM: 結城さんのお話をうかがっているうちに、 『プログラマの数学』に書かれている「数学的な考え方」というものが、 ちょっとだけわかってきました。 ところで、数式はまったく出てこないのでしょうか。

結城: いや、そんなことはないです。 足し算、引き算、掛け算、割り算は出てきますよ。 それから、累乗や階乗、対数なども出てきますけれど、 ちょっと数式がややこしくなるときには、必ずていねいに説明しています。

RUCM: あのう、こういう尋ね方はおかしいかもしれませんけれど、 シグマなども出てくるのでしょうか。

結城: いえ、シグマは出てきません。…… おっと、本の前書きに「シグマは出てきません」と書きましたから、1個は出てきますけど(笑) …… ともかく、シグマが今回の私の本の難しさの上限ですね。 数式の難しさはシグマ未満——というのは変な表現ですけれど。 でも、だからといって、内容がないわけじゃないんですよ。 単なるオハナシだけではつまらないので、 重要なポイントに関しては、きちんと学べるように工夫がこらしてあります。

RUCM: 素人考えですけれど、 数学を数式を使わないで解説するって難しいことではないんでしょうか。

結城: ええ、その通りです。 数式を使わないということは、厳密な表現をしないということになりますから、 単なるオハナシになってしまう危険性があります。 ですから『プログラマの数学』の中では「読み飛ばしたくなるような難しい数式」は書かないけれど、 説明に必要な数式は書いています。 大切なのは、伝えたいことが読者に伝わることだと思っていますので。

構造を見抜け、パターンをあばけ

RUCM: 論理以外に面白いトピックがありましたら、ご紹介いただけますか。

結城: そうですね。 『プログラマの数学』は全部で9章あり、各章ごとに面白いトピックが登場します。 第1章では「ゼロ」、第2章では「論理」、第3章では「剰余」 …そう、特に楽しいのは第3章の「剰余」でしょうかね。 この章はクイズが特に多い章になっています。 他の章にもクイズは出てきますが、この章は多いですね。

RUCM: すみません。剰余、って何でしたっけ。

結城: 剰余(じょうよ)は、 簡単に言えば割り算の「あまり」のことです。

RUCM: 「あまり」がそんなに重要なんでしょうか。

結城: ええ、重要なんです。特にプログラミングでは。 学校では剰余は割り算のときにちょっと出てくる程度ですけれど、 剰余を使うと、大規模で難しい問題を小さな問題に帰着することができたりするんですよ。 また、あれこれ試さなくては解けないように見える問題を一発で解いたりするのも剰余の力です。 ケーニヒスベルクの橋渡りの問題というのは、グラフ理論で有名な問題ですけれど、 あれも広い意味での剰余が関係しますね。パリティ・チェックの問題です。

RUCM:プログラマの数学』にも、その橋渡りの問題が出てくるんですか。

結城: ええ、出てきます。 あれは楽しく、また深い示唆に富んだ問題ですね。 動的に、試行錯誤を繰り返して解くのではなく、 静的に、各頂点を調べて解くという問題です。

RUCM:プログラマの数学』は前から順番に読むのがよいでしょうか。

結城: ええ。各章を単独で読んでも問題はありませんし、 よく分かっている人は適当に飛ばし読みをしてもよいと思いますが、 順番に読むのが一番よいと思っています。 あちこちに細かい「仕掛け」がありますので、 それを見つけて楽しみながら読んでいただければうれしいですね。

RUCM: 目次を拝見しますと、数学的帰納法が出てきます。 学校で習ったような記憶がおぼろげに…。

結城: はい。第4章が「数学的帰納法」、第5章が「順列・組み合わせ」、 第6章が「再帰」、第7章が「指数的な爆発」と続きます。 数学的帰納法は学校で習って「だまされたような気分」になった人が多いはずです。 学校の先生も教えるときに一苦労する話題ですね。

RUCM: 詳しい話はもう忘却のかなたにあるのですが、nとかn+1が出てきたくらいしか。

結城: ええ。第4章では、整数に関する主張から書き起こして、 数学的帰納法を例やクイズを交えながらていねいに解説しています。 そして、単に数学としての説明だけではなく、 プログラミングと絡めた話題になるようにしていますよ。

RUCM: 順列・組み合わせというのも学校でやりました。 何だかCやPが出てきてたくさん掛け算をさせられたような記憶しか残っていないのが悲しいですが。 公式なんか1つも覚えていないです…。

結城: 順列・組み合わせは、いわゆる離散数学の基本になります。 プログラマとしては、基本的な知識の1つとして、よく身につけておく必要があります。 でも、大事なのは公式を覚えることではなく、 どうやってその公式を導いたか——いいかえれば、どうやって数え上げを行ったか——なんです。 それはいま注目しているものの性質や構造を見抜くということにつながるからです。

RUCM: ははあ。

結城: そう。ここにも「構造を見抜け、パターンをあばけ」というテーマが顔を出すんです。

RUCM: あっ。それぞれの章が、つながっているんですね!

結城: はい。 『プログラマの数学』では、そのあたりにたくさんの「仕掛け」があって、 読者が楽しめるように工夫しているんですよ。 ただの数学解説書ではありません。

RUCM: 何だかわくわくしますね。

中学生でも読める?

RUCM: ちょっと思ったんですけれど、 『プログラマの数学』はたとえば中学生でも読めるんでしょうか。

結城: まあ、個人差が大きいとは思いますが、私は中学生でも十分楽しめると思っています。 数学的なものに興味がある子なら、小学生でも読めるかもしれません。

RUCM: でもいちおうプログラミングの知識は必要とする?

結城: いえいえ、プログラミングの知識は特に必要ではありません。 プログラムそのものも、例の一部として数点出てくる程度ですね。 ですから、プログラマではなくても楽しく読める本になっています。

RUCM: 逆に、プロのプログラマには易しすぎるということはありますか。

結城: どうでしょうか。もちろん、熟練したプログラマならば、 『プログラマの数学』に出てくる話題は知っていると思います。 たとえば「再帰」の章では「ハノイの塔」が出てきます。 ハノイの塔を知らないプログラマは少ないでしょう。

RUCM: ハノイの塔、聞いたことがあります。

結城: でも、もしかしたら、 ハノイの塔の問題の中にある「構造」をきちんと見抜いていないプログラマは、 意外に多いかもしれませんね。

RUCM: あ、また「構造を見抜く」という話題ですね。

結城: ええ、そうです。「再帰的な構造」ですね。 まあ、『プログラマの数学』の難易度が気になる方は、 本屋さんで立ち読みしてご判断なさるのがよいと思いますよ。 本には相性というものがありますし、ね。

RUCM: 相性、ありますね。確かに。

結城: 自分を読む本は、自分で判断するのが一番です。 自分が読んで面白いと感じる。自分が読んでよく理解できる。 そういう本を選ぶのは大事なことですね。

「数えられない数」とは?

RUCM: ところで、 目次を読んでいると、不思議なタイトルがちらほらあります。 第8章「計算不可能な問題」のサブタイトルにある「数えられない数」っていったいなんでしょう。

結城: ああ、それは、可算と非可算の話ですね。 『プログラマの数学』の中で、第8章だけはちょっと骨のある内容を扱っています。 普段私たちは「無限」という概念を1つのものだと思って使っていますよね。

RUCM: だって「無限」って、無限ですよね。無限に種類があるんですか。

結城: ええ、あるんです。無限には「大きさ」の違いがあるんですよ。 コンピュータで扱うことができるのは実際には有限ですけれど、 メモリをどんどん増やしていけば、理論上は無限のものを扱えます。 でもその無限には「限界」があって、その外側にはもっと「大きな」無限があるんです。

RUCM: へえ!? よくわかりませんが。

結城: わかりませんよね。私もはじめて学んだときには驚きでした。 第8章では、カントールという有名な数学者の対角線論法のお話をします。 そして、無限の種類のお話、 そしてそれが今度は「プログラムでは原理的に解けない問題がある」 という話につながっていきます。 「お話」ではありますけれど、 ちゃんと理屈の通った、知的刺激が満載の物語ですよ。 第8章「計算不可能な問題」が、『プログラマの数学』のクライマックスでもあります。 この章では、数の話、数え上げの話、 論理の話、再帰の話、無限の話がぎゅうっとまとまっていくんです。 第8章はそれなりに難しいんですけれど、 その分だけ喜びが大きいですね。

RUCM: 結城さん、何だか楽しそうですね(笑)。

結城: そうですね。楽しいです(笑)。

ファンタジーの法則って?

RUCM: あとお聞きしたかったのが、 最終章になっている第9章に書いてある「ファンタジーの法則」なんですが……。 ファンタジー?

結城: ああ、それですね。 第9章「プログラマの数学」はまとめの章で、 ファンタジーの法則はそこに出てくるのですが…… それは、まあ、読者のお楽しみ、ということにさせてください。 もったいぶるわけじゃないですけれど、 はじめから順番に読んできて、 ファンタジーの法則まで来たほうが、 より楽しめるかと思いますので。

RUCM: 何だかドキドキしますね。

結城: いや、別にそれほどすごい話ではないです。 まあ、本全体のまとめですね。

本を書くということ

RUCM: 今回の本から少し話題がそれますけれど、 結城さんは本当に幅広い話題の本を書いていらっしゃいますね。 プログラミング言語の入門書だけではなく、 2003年には 『暗号技術入門』を出版なさっています。 この本もずいぶん評判がよかったようですね。

[カバー画像]
現代の暗号技術をやさしく解きほぐす『暗号技術入門』

結城: ええ、おかげさまで、 多くの読者さんがあの『暗号本』を楽しんでくださったようで、 著者としては本当にうれしいです。 あの本は私が書いたはじめてのプログラミング以外の本なんです。 だから、私としては自分のフィールドが広がった感じがして、うれしく思っています。

RUCM: 日記などでもときどき本を書くことについて触れていらっしゃいますが、 結城さんにとって、本を書くというのはどんな意味を持っているのでしょうか。

結城: そうですねえ…。まあ一言で言えば「喜びと楽しみ」でしょうか。 「学ぶ喜び、知る楽しみ」ですね。私は本を書くときの気持ちは「アマチュアでいよう」と思っているんです。

RUCM: といいますと?

結城: 何というか…仕事として「いやいや」やるのではなく、 自分の趣味のつもりで、自分の楽しみのために書こう、と思っているんです。 もちろん仕事は仕事ですから、ちゃんとやるわけですけれど。 まずは、自分がよく知らないことについて、しっかり学んで本を書きたいと思っているんです。 題材は、いままで自分がよく知らなかったことでかまわない。 よく見聞きはしているけれど、まだ人にはうまく説明できないこと。 そういうことを、自分で調べて学び、自分の中で「なるほど、そういうことか」という感覚をつかむまで消化して、 それを他の人とシェアしたい、と思っているんです。

RUCM: なかなかそれは、すごいことですね。 普通は自分のよく知っていることを書こうとするものではないんでしょうか。

結城: ええ、もちろん、本を書き終えた時点ではよく知っていなければならないと思います。 でも、すでに自分がよく知っていることを書き始めるのはちょっとつらいです。 それよりも「学びつつ書く」ほうが好きだし、楽しいですね。 本当に心の底から納得するまでよく考え、言葉を選び、例を練り、「どうやったらこの面白さが読者に伝わるだろうか」 ということに心を砕くのは、本当にエキサイティングな楽しみだと思っています。

RUCM: 結城さんの本の面白さや分かりやすさは、「学ぶ態度」にあるのかもしれませんね。 ところで、今回『プログラマの数学』をお書きになって、 今後はどういう方向の本をお書きになるんでしょうか。

結城: いや、私にもよく分かっていないです。 いつも自分の中では「次に書けそうな本」というのは数冊分ストックがあるのですけれど、 おうおうにして、それとはまったく違う本がいきなり盛り上がったりするので…。 つまり、キューではなく、スタックのような順番で仕事していますね。

RUCM: もうプログラミングの本はお書きにならないんですか。

結城: いや、とんでもないです。 数学近辺の話もアイディアはまだまだたくさんありますけれど、 プログラミングの本もどんどん書いていきたいです。

読者が学ぶ「きっかけ」を作る本を

RUCM: 結城さんのお話をおうかがいしていると、何だか、 頭や心が活性化してくるような感じがします。 結城さんのご本を読んでもそうですね。

結城: そう言っていただけると嬉しいです。 私の本を通して、読者に何かを知っていただきたいのはもちろんそうですが、 それだけではなく「もっと学びたい」とか「他の本も読みたい」といった感覚を持っていただけるとうれしいですね。 『増補改訂版Java言語で学ぶデザインパターン入門』の読者からも似たような反応をいただきました。

カバー画像
『増補改訂版Java言語で学ぶデザインパターン入門』

RUCM: どんな反応ですか。

結城: 以前GoF本(デザインパターンの原典と呼ばれている本)を買っていたけれど、 難しくて積読になっていた。 でも私(結城)の本を読んだ後で、もっと学びたいという気持ちになり、 GoF本も読むようになった。 すると、以前は読めなかったGoF本が読めるようになっている。 それがすごくうれしかった、という言葉をいただいたんです。

RUCM: それはうれしい反応ですね。

結城: ええ、ほんとうに。 学ぶっていうのは、個人的なプロセスだと思うんです。 自分が時間を使って、自分の頭や手を使って考えるのが重要。 いくら本を買っても、いくら他の人の話を聴いても、いくら高いお金をかけて講習会にいっても、 自分が理解しないことには、何もはじまらない。 他の人がみんな理解していても、自分が理解できなかったらつまらない。 逆に、自分が理解できれば、どんどん面白くなるし、面白くなると、もっと学びたいという気持ちが自然にわいてくるものです。

RUCM: それはそうですね。

結城: 私は、読者が学ぶ「きっかけ」になるような、そんな本を書いていきたい、といつも思うんです。 私の本に全部書いてあるから、これだけ読め、他の本は読むな、というのではなく、 私の本を通して基本的なことをがっちり学び、さらに「はずみ」をつけて、他の本を読んだり、 より深く考えていったり…。そのような読者の活動の一助になればよいなあ、と思っています。

RUCM: 何だか、お話を聞いているだけで、私のほうも何か始めたくなってきました(笑)。

結城: いいですね(笑)。 私は自分の子供に「学ぶことは人生の最大の楽しみの1つ」ってよく言うんです。 自分の自由になる時間に好きな本を読んで、 自分の頭であれこれ考える。考えたことを話したり、書いたりする。 そういう活動は、地味だけれど、深い喜びがあるように思うんです。

RUCM: そうですよね。喜びですよね。

結城: いまはブログが大流行ですけれど、 自分が学んだことをブログで公開するっていうのは、 現代的な学びの方法かもしれませんね。

RUCM: 何だかもっとお話をお聞きしたいのですが、 もう時間が来てしまいました。 本日はありがとうございました。 これからも、さまざまな活動をがんばってください。

結城: ありがとうございます。 (^_^)

リンク

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

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

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

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

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

更新履歴

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

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