プログラミングが好きな理由

Updated:

この記事はただの感想です。科学的な根拠もありません。ただ、今考えていることを書いておこうと思います。

私の好きなもの

大雑把に言って、私が好きなものは論理で紡がれたものだけだということは、遅くとも教養学部時代にはわかっていた。ヒトにもモノにも生物にも興味がないようだということはわかっていた。

ありがたいことに、数学には向いていた。現代数学とか専門数学とか言われるものは、世間のイメージとは裏腹に実は地道で精密な作業の積み重ねで、それが私に向いていた。だから数学科に行ったら、興味が続いて卒業することができた。一命をとりとめた気がする。

計算機も好きであったが、情報科学や計算機科学と呼ばれるものの全てが好きなわけではなかった。アルゴリズムや数え上げが好きなわけでもなかった。アルゴリズムの本を読んでも数学の本のように一生懸命読む気はあまり起きない。

どうやら私の好きなものは、プログラムを書くこと、そのもののようだ。そのことに気が付いたのはごく最近だった。

情報科学との関わり

私と情報科学との関わりは、主に AtCoder で AC するプログラムを書くことである。 AtCoder は問題解決能力、アルゴリズムの設計能力、その正確な実装力を問うコンテストサイトである。

しかし、私はどうやら問題解決やアルゴリズムには興味がないらしい。やっていてこんなこというのは恐縮ですけれども。誤解を招く言い方なので補足するが、 AtCoder の問題を解くのも好きだし、解説で理解を深めるのも好きであるし、アルゴリズムを学ぶのも好きである。しかし、他のトップクラスの人のように問題を解くことに熱中することはできない。だから多分一生三段になることはないだろうと思う。

だからどうやら、 AtCoder の主目的と違うところに、私は計算機の楽しみを見出しているようなのだ。そしてそれがなんなのか、私はわかっていなかったが、ついに解答らしいものがわかった。それが プログラミングが好き ということなのである。

それを説明するためには、ビデオゲームの話をする必要がある。

ビデオゲームが好きな理由

これも何回も公言していることだが、私が一番好きなものはビデオゲームである。それも一部の特殊なゲームである。

具体的にいうと、 RPG 縛りプレイや 3D アクションが得意である。これは Red Coder レベルの実力があるらしい。

私が思うに、ゲームのうまさというのは、少なくとも以下の 3 種類はあると思う。

  1. 対戦型ゲームで強い。いわゆる e-sports はこれ。
  2. クリアの時間を競うのが上手い。いわゆる RTA や speedrun はこれ。
  3. 遊び方を工夫するのが上手い。最近になって YouTube で可視化されはじめている。

これ以外もあると思う。例えば音ゲーが好きというのはまた違うもののような気がする。が、とりあえずこの 3 つに分けておく。

私は 1. と 2. は全くダメである。 3. だけが異常に上手いらしい。どうしてこういうのが上手いのかはわからないけれども、とりあえず適性があるらしい。

このうち 3. はどこに難しさがあるのかというと 「目的がある、手段がある、その間をどうやって繋ぐか?」 という問いの形をしているということである。

例えばある難しいクエストをクリアしたいとする。よくできたゲームというのものは、プレイヤーにたくさんの手段を提供している。しかしゲームの面白いところは、その手段にここのクエストごとに優劣がつくことである。そのうち適切なものを選ぶと上手くクリアができる。それをいち早く見抜く能力が、縛りプレイや 3D アクションでは求められている。

縛りプレイの場合は、適切な縛りを自分で設定するところにポイントがある。そもそも実現不可能であったり、実現可能性が低い設定であれば、形にはならない。ゆえに、実は同じ問いの立て方をしている。

こういうゲームの場合、「正解」や「模範解答」があるわけではない。クエストクリアやステージクリアといった目的が達成できれば、それらは全て「正解」ということはできる。しかしその中で、途中過程には明らかに優劣がついている。「えっ、こんなこともできるの?」とか「人より早く気が付いてすごい」とか「こうすれば楽にできていい」という、そういうのは確実にあって、それを発見して実現するのが、私たちの醍醐味、原動力になっている。

プログラミングが好きな理由

要するに、プログラミングによる問題解決も「目的がある、手段がある、その間をどうやって繋ぐか?」という形をしている。

プログラマは、問題の設定そのものには大きくは関わらない。それを決めるのは例えば経営者であったり、管理職であったりする。アサインしている OSS ならその admin の人である。もちろんプログラマの側で問題を変形することはできるが、まるでゲームのクエストのように問題が与えられる。

プログラマは、プログラミング言語仕様や標準ライブラリ、および他のライブラリから支援を得て、目的を達成するプログラムを書く。つまり手段はいっぱいある。目的を達成できるプログラムを書けばどれも「正解」である。しかし、その途中過程には優劣がつく。例え同じアルゴリズムと時間計算量とメモリを使う場合であっても、目的を達成するまでにどの手段を使うか、つまりどのようなコードを書くかで、出来上がったプログラムは異なる。例えば保守性・拡張性が変わったりする。また次への知見を得ることができるかも異なる。適切な抽象化とライブラリの使用は、良い影響を与える。あと主観的な言い方だが、美しさが違う。綺麗なコードは他のプログラマを魅了し、良い影響を与える。

私は、この部分は AtCoder の核となる部分とかなり違うと感じている。 AtCoder はあくまで問題が出て、それに AC するコードを書くコンテストである。いくつものある実装手段の途中過程を競っているのではなく、それより前段階、つまり「正解」のアルゴリズムにいかに早く至れるかという、問題解決能力を見ている。つまるところ、答えは 1 つであり、その 1 つの答えを発見する能力を見ている。これは私の得意なものとは異質なものである。嫌いだと言っているのではない。多分そこに、私が強くなりきれない、熱中しきれない理由があるのではないかと思う。

私はエンジニアにはなれないと思う。また、言語学者にもなれないと思う(ならないように注意する必要がある)。しかし、プログラマにはなれると思う。そういう自信が今の私にはある。

自分の得意なものは他人が教えてくれる

この答えに至るまで、私はかなり時間がかかってしまった。しかしよく考えてみると、自分の得意なことは他の人が示唆してくださっていた。

特に一井先生の言葉には、もっと注意深くなっておく必要があったと思う。 一井先生は私のことを「プログラミングが得意な人」と仰っていた。その意味するところを、私はわかっていなかった。

例えば私の後輩には、だめぽ先生、足跡君、すなえもんちゃん、まのひと君という、エンジニアとして明確に私より格上の人間がいた。先輩だとしえるさんという方もいらっしゃる。そういう人たちを目の前で見てきた私としては「プログラミングが得意」と言われても、畏れ多い、とんでもない、という感想しか出てこなかった。

しかし今なら答えがわかる。確かにエンジニア力で測るとこの 5 人には絶対及ばない。しかしプログラムの設計と具体的なコーディングに関しては、精密で、保守性と拡張性に優れた、そして安全なコードが書けるような気がする。私は、エンジニアにはなれなくても、プログラマにはなれると思う。

C++11 を専門書で勉強していると、ただ言語仕様が入ってくるだけではなく、その核となるアイデアがすっと入ってくるし、あれもしたい、これもできるだろうという、アイデアが浮かんでくる。そして AtCoder をやるときも、もっといいコードが書けるようになった。その消化スピードが明らかに早い。

余談

最後に一言だけ余計なことを言っておきたい。それは プログラミングは、数学とはきっと無縁ではない ということである。 Knuth も Bjarne も数学の修士号までは持っている。

間違っていたらすみません:アルゴリズムやプログラミング言語や、プログラム検証について研究・講義・演習している大学は数多くあるけれども、プログラミングそのものを取り扱う大学は多分ない。誤解を恐れずに言えば、プログラミングは、学問の対象ではないのではないかと思う。まず歴史が浅すぎる。 C++ ができてから 30 年程度しかできていない。言語も増えていく一方である。

プログラミングは、伝統工芸のように、職人芸と技、個人の知見でできているのではないかと思う。そしてその源泉は、多分現代数学とか抽象数学と呼ばれるものだと思う。数学の研究を一応経験した身として言えるのは、数学こそ「目的がある、手段がある、その間をどうやって繋ぐか?」を競っている学問だということである。数学は途中から問題を解いて他人と競う要素はなくなってくる。今までの人類の知恵を勉強するのに時間がかかるが、最後にはそういう問いの立て方を自分ですることになる。そこで鍛えられた人は、その後のキャリア選択と修行の仕方によって、究極のプログラマになることができるのではないかと思う。

であるから、最近の数学科でプログラミングを軽視していく姿勢には、疑問を感じる。例えば数値解析では、汎用言語で計算を実行するプログラムを組ませるのは、時間の無駄だという考え方も出ている。確かに講義と演習の時間が短いから、プログラミング言語の取得に時間をかけたくないというのは尤もである。しかし、長い人生経験で考えた時には、数学科の学生に汎用言語でのプログラミング経験を積ませるのは確実にメリットが大きいと思う。

一方で最近は数学科と数理科学研究科で AtCoder が流行っているらしい。これは歓迎したいところである。私としても何かできることがあればいいと思っている。