コミュニティに戻る

多言語エンジニアになる

「ポリグロット」って何? という声が聞こえてきそうです。辞書によれば、いくつもの言語を知っている能力のことです! では、どうすれば「ポリグロット」になれるのでしょうか? エリック・スヒールブームに話を聞いて、その詳しい中身をのぞいてみましょう!

Youtubeで見る
長さ 57分

Jonathan: では、皆さん、こんにちは。Exercismのポッドキャスト、ライブ配信へようこそ。私はJonathanです。今日はホストを務められることを光栄に思っています。そして、Exercismチームの一員で、何年も前から関わっているEricも来てくれています。ここ数年、少しでもExercismのエコシステムに触れたことがある方なら、どこかでEricを見かけたことがあるのではないでしょうか。Eric、今日の番組に来てくれてありがとう。ストーリーや、どうやってIT業界に入ったのか、そしてIT業界のさまざまなことについての考えをもっと聞けるのを楽しみにしています。ただ、そうした話を深く掘り下げる前に、まずは自己紹介をお願いします。これまでの背景や、どうやって今の場所にたどり着いたのかを少し話していただけますか。

Erik: ええ。ありがとう。ここに来られてうれしいです。すでに話しましたが、私はEricです。オランダに住んでいます。生まれもオランダなので、人生ずっとここに住んでいます。初めてコンピューターで何かをしたのはいつだったか、考え始めたのですが、たぶんNESだったと思います。マリオを遊んでいました。それで夢中になりました。ええ、最高でした。ただ、当時のゲームは容赦なかったので、とてももどかしくもありました。

Jonathan: セーブポイントも何もなくて、また最初からやり直すだけでしたよね。

Erik: そうですね、アメリカに住んでいたか、それ以外の地域に住んでいたかで違います。実際に2つのバージョンがあったんです。でも、そうです。前面のスロットを開けて、ディスクというか、カートリッジを差し込むんです。それが本当に、本当に好きでした。うちにはNESはありませんでしたが、持っている友達が何人かいました。だからよく遊びに行っていました。遊んだ中には素晴らしいゲームも、もどかしいゲームもたくさんありました。でも本当に素晴らしいものでした。それで夢中になったんです。多くのプログラマーが、ゲームを作りたいという気持ちからプログラマーを目指して夢中になるのは、たぶんこういうことだと思います。考えましたよ。ネタバレになりますが、結局それは実現しませんでした。私はゲーム開発者ではありません。はい、はい、はい。でもそれがコンピューターを好きになった理由です。それから、父は私が生まれる前に事故に遭いました。肩から下が麻痺していて、車椅子に乗っていました。でもいつも家にいました。それは良かったです。父はいつも家にいる人でしたので、家に帰るのはいつも楽しかったです。父もコンピューターが好きでした。それで、たしか私が10歳くらいのときに、父がそれほど立派ではないコンピューターを買いました。X286だったと思います。白黒で、MS-DOSがインストールされていました。ゲームができました。ゲームがたくさんあって、友達の何人かがゲームをくれたんです。しかも、パスワード保護があったので、ゲームを起動するには、パスワードが書かれた用紙を印刷して手元に置かなければなりませんでした。説明書のようなものでした。今ではそんなことは通用しませんが、当時は許されていたんです。そうしたゲームを遊ぶのが好きでしたが、どうやって動いているのかを考えてみるのも好きでした。コンピューターを壊したこともあります。何回だったか、もう思い出せません。友達のお父さんで、コンピューターにとても詳しい人がいて、その人が私のヘルプデスクでした。システムを壊すたびにその人に電話すると、快く来てくれて、直してくれました。でも、この問題から抜け出せないと気づいたときのパニック状態は今でも覚えています。それでも、そこからたくさん学びました。

Jonathan: この問題ですね。でもそこから多くを学びました。フロッピーディスクで、何年もお金を貯めて買って、入れてみたけれど、その小さなフロッピーディスクではどうしても、どうしても読み込めなかったのを覚えています。それは、私の大きなもどかしさのひとつでした。どう直せばいいのか、考えて解決できたことはなかったと思います。でも、ゲームはフロッピーディスクで売られていて、小さなカートリッジに入れて読み込ませる、そういうものだったんでしょうか。

Erik: いや、そんなことは。

Jonathan: はい。

Erik: ええ、複数のフロッピーディスクを使うこともありました。でも、実際とても良い時代でした。MS-DOSが好きで、何ができるのかを考えるのが楽しかったです。それから、何ができないかも分かりました。本当に良かったです。

Jonathan: うん、本当に良かったです。それで、お母さんはフルタイムで働いていたんですか? お父さんは家にいたんですよね?

Erik: いいえ、母は父の介護をフルタイムでしていました。父にはたくさんのケアが必要でした。最初は手で動き回れましたが、手の自由が少しずつ効かなくなって、後にはあごを使うようになりました。それでも母はフルタイムで父の世話をしていました。だから両親はいつも家にいました。私にとっては、よその家に行って、その親が働いているというのはとても不思議でした。一日の終わりなのに、親がまだ家にいないんですから。私には本当におかしなことに思えました。でも、ただ状況が違うだけなんですよね。

Jonathan: 私には本当におかしなことに思えました。あなただけだったんですね。

Erik: いますよ、妹が一人います。3歳下です。私たちがきょうだいだなんて、誰も思わないでしょう。あまりに違いますから。昔はよく彼女とけんかしましたが、今はまったく問題ありません。結局はうまくいきました。それに、彼女はコンピューターが好きではなかったので、私のコンピューターを使う時間を邪魔することはありませんでした。

Jonathan: でも、コンピューターをめぐってよくけんかしました。彼女はSimsをやりたがりましたし、私はSimCityか何かをやりたがりました。そういう意味では、いつも張り合っていました。

Erik: うん、SimCityの選択のほうがずっと好きです。でも、彼女は実際にはコンピューターに興味がありませんでした。彼女に興味を持たせられた唯一の方法は、私がSNES、つまりスーパーファミコンを持っていたときで、マリオカートがありました。彼女はマリオカートが好きだったので、一緒にたくさん遊びました。もちろん、私のほうがずっと練習していたので、いつも勝っていましたが、それでも彼女は楽しんでいました。

Jonathan: それで、今でもいじるのが好きなんですね? ええ、MS-DOSは、間違っていなければ、かなり低レベルなものでしたよね。ええ、たぶんかなり低レベルだったでしょう。ええ、まったくそのとおりです。それで、そのシステムで遊んでいたのは何歳のときでしたか?

Erik: ええ、かなり低レベルでした。間違いなく低レベルでした。たしか10歳くらいのときだったと思います。それから、サッカーチーム、というかフットボールチームの仲間に友達がいて、彼はすでに優れたプログラマーで、実際にゲームをコーディングできました。Visual Basicでやっていました。私は完全に驚きました。彼は私のコンピューターのところに来て、何かをタイプして見せてくれるのですが、私にはさっぱり分かりませんでした。でも30分後には、画面上で何かが歩いていて、私にはもう完全に魔法のようでした。ただただ驚くばかりでした。でも、その時点では実際にプログラミングをやってみようとは思いませんでした。自分には難しすぎて、試すことさえできないと感じていました。だからやりませんでした。ただ、あれこれいじってゲームをしていました。

Jonathan: それで私は……、ちょっと口を挟みます。

Erik: それから、もう少し大きくなったとき。

Jonathan: 「ああ、ゲームをプログラミングできるんだ」という気づきと、これを本格的に、というか、もっと真剣に続けていけるものとして捉えることの間には、どういうつながりがあったのでしょうか。

Erik: ええ、それは後になってからです。たしか17歳くらいのとき、どの道に進むかを選ばなければなりませんでした。頭の中には2つの選択肢がありました。ひとつは歴史を学ぶこと、もうひとつはITをやることです。結局、かなり単純な選択でした。歴史をやるよりも、ITのほうが少し好きになれそうだと感じたからです。歴史にはとても退屈な部分があるかもしれませんが、コンピューターサイエンスには退屈な部分はないだろうと思っていました。もちろん、実際にはあります。私は間違っていたんですね。ええ、ええ。いや、それはまた別の機会に話しましょう。でも、退屈な部分はあります。とにかく、当時その選択をしました。ちょうどすべてが好調な時代で、ドットコム・バブルでした。高校、というか進学先を見学したときのことですが、それは応用科学大学でした。応用科学大学と大学のどちらかを選べたんです。でも私は応用科学大学のほうが好きでした。何かを作りたいからです。私は優れた理論家ではありません。何と言えばいいか分かりませんが、理論は得意ではありません。だから何かを作るのが好きで、とても実践的なんです。それで実践的なほうから始めました。それがとても楽しかったです。そして、すべての企業が大金を稼いでいる時代でした。卒業すれば車がもらえる、あれももらえる、これももらえる、と言われていました。ところが私が卒業するときには、ドットコム・バブルが崩壊していました。すべてがめちゃくちゃで、仕事を探すのは実際かなり大変でした。そのとき、応用科学大学のほうはとても楽しかったので、大学も試してみようかと思いました。実際にプログラミングを学んだのはそこです。でも、まあ、仕事のキャリアを少し先延ばしにして、大学に行けるかどうか試してみようと思ったんです。それで良かったです。

Jonathan: 私の理解では、ヨーロッパの教育制度では、実技志向か、それとも大学、つまりより学術的な道かで、かなり早い段階で振り分けられるんですよね。オランダでもそうなのでしょうか? 「あなたはこれに向いている」と見極めるのが上手なのでしょうか? 私の基準にしているスイスでは、とても優秀であれば、「よし、徒弟制度に入って、そうやって技能を身につけよう」と言えますよね。しかもそれは、大学に行くことと比べて劣っているとか優れているとかいう扱いではなく、対等なんです。そういう意味では、その人の好みにより合ったものなんです。オランダでも同じでしょうか? 子どものころ、そういうプロセスを経験しましたか?

Erik: 対等に扱われていたとは言いませんね。応用科学大学ではなく大学に行くほうが良いとか、難しいとか、少なくとも格が高いという考えは今もあります。得られる称号も違います。でも、私にはあまり魅力を感じませんでした。あまりに理論的すぎたからです。私はプログラミングを学びたかったのですが、その時点ではまだ学んでいませんでした。たぶん好きになるだろうとは分かっていました。HTMLのかけらは見たことがありましたが、コードを一行も書いたことはありませんでした。でも、きっと本当に好きになるだろうと確信していました。実際に始めてみると、1年目はほとんどコードを一行も書きませんでした。グループの学生たちと一緒に進んでいただけでした。というのも、そのうちの一人がすべてを知っている素晴らしいプログラマーで、何もかもやってくれたので、私が何かをする機会さえありませんでした。でも2年目に、「このままではうまくいかない。このやり方では絶対にプログラミングを学べない」と意識的に決断しました。それで全力を注いで、もう必死にプログラミングしました。そこから深く掘り下げました。最初はCから始めたのですが、初心者が始めるにはひどい言語です。Cという言語そのものについての私の考えは置いておきますが、最初に取り組むにはとても難しい言語です。2回目か3回目の授業で連結リストをやるなんて、背景知識がなければ、学生としてありがたいものでは絶対にありません。でもなんとかプログラミングできるようになり、それがとても楽しくて、暇な時間にもたくさんプログラミングをするようになりました。彼らの教え方が本当に、本当にひどかったので、私がほぼ独学でプログラミングを身につけた方法は、自分で使いたいものを考えて、それを作る、少なくとも作ってみることでした。最初はただもがいているだけで、大したことはできません。でもそれは実際に役に立ちました。結局は、練習、練習、練習なんです。プログラミングは、ただやることで身につくスキルだと分かりました。理論をいくら詰め込んでも、1000万本の動画を見てもいいですが、実際に時間をかけなければ、決して優れたプログラマーにはなれないと思います。ただやるしかないんです。それが大きな一歩でした。コードを読めるようになったことは今でも覚えていて、とてもうれしかったです。でも、コードを書かなければならないとなると、それはとても大きな一歩でした。

Jonathan: そう、コードを書かなければならないのは大きな一歩でしたね。ここ数回の番組では、人にとってプログラミングがパッと腑に落ちたのはいつか、ということを聞いています。あなたにも、急にすべてが分かって、「ああ、これで全部つながった」と思った瞬間はありましたか? それとも、理論を必死につかもうともがき続けていたのでしょうか。それとも、「よし、これは簡単だ」と思える瞬間があったのでしょうか。

Erik: 一度のひらめきで分かったわけではないと思います。何度かありました。段階を踏んでやってくるんです。最初に書いた実際のプログラムは、単語を当てるものでした。今とても人気のある、あの……そう、ハングマンのようなゲームです。ハングマンということにしておきましょう。それをCで書いて、実際に動くようになって、自分のゲームで遊べました。それで、何が起きているのか少し分かった気がして、少しずつ進んでいきました。確かミューテックスに関係するものもありました。列車があって、衝突してはいけないというものです。交差するときにミューテックスを使えます。ミューテックスは基本的に、止まれとか進めといった標識のようなものです。それがとても楽しかったです。かなり満足していました。それで教授に見せました。すると教授は、「でも、列車を4本にしたいと思ったらどうするんだ?」と言いました。私は「ああ、ああ、ああ、なるほど」と思いました。そこまでは考えていませんでした。目を開かされる思いでした。たった一文だったんです。そして、「こういうことを聞かれる可能性を考慮に入れておくべきだった」と思いました。それで週末を使ってコードをパラメーター化し、複数の列車を扱えるようにしようとしました。なんとかできました。強引に組み込んだんです。きれいではありませんでしたが、動きました。これはまた、とても、とても良いと思えた瞬間でした。こういうこともできるんだ、と。

Jonathan: いいですね。あなたがこういうことができるのは分かります。あなたを知っていれば分かりますし、コードを学ぶことからも分かります。何でもいいからとりあえず書いて、動かして、それから洗練させる、というプロセスがありますよね。あなたもそうでしたか? とにかく書いて、動かす。ほかのことは気にしない。そして後から洗練させる、という感じでしたか?

Erik: ええ、ええ。最初の1年ほどは、動けばそれでとても、とてもうれしかったです。美しさとか、そういうものはありませんでした。動けばそれで良い、というだけでした。それに、コードにコメントを付けまくっていました。教授に「コードにはコメントを付けなければならない」と言われたからです。コードとコメントの比率は、たぶん1対10とか、そんな感じで、すごい量でした。そういえば、私の一番古いプロジェクトが今もオンラインに残っています。私が公開した、最初のオープンソースプロジェクトです。ところで、メッセージを送れるMSN Messengerを覚えていますか?

Jonathan: うーん、聞いたことはある気がしますが、よくは分かりません。

Erik: Winampを覚えていますか?

Jonathan: はい。

Erik: ええ、Winampはメディアプレイヤーでした。Napsterの時代のようなものでした。MP3をダウンロードして、それをWinampで再生するわけです。私がやりたかったのは、曲を再生しているときに、その曲名がMSN Messengerの自分の名前に自動で追加されるようにすることでした。当時、私はWindowsプログラミングにかなり熱心でした。Win32です。とても古風で、今のようなものではありませんが、とても低レベルで、とてもかっこいいものでした。それでC++でプラグインを作りました。当時の私の一番好きな言語でしたが、その時点で私が知っていたのは3つだけだったので、大したことではありません。とにかくプラグインを作りました。Winampが再生中なら、凝ったWin32 APIで曲名を取得し、MSNのウィンドウに表示されている名前を更新するんです。そうすれば、私がどの曲を再生しているのか誰でも分かるわけです。それで、もしかしたら他の人も気に入るかもしれないと思って、実際にオンラインで公開しました。SourceForgeだったと思いますが、今ではもう誰も使っていません。プライバシーか何かで問題があったみたいです。でも実際に世界中の他の人が使ってくれて、とても驚きました。ダウンロード数が見えたのですが、たしか数百回のダウンロードで、私が書いたソフトウェアを人々が使ってくれていました。これ以上ない最高の気分でした。それが私の最初のオープンソースプログラムです。私はインポスター症候群に悩まされたことはありません。「これは自分のコードだ。誰かがダメだと思っても構わない。動くのだから満足だ」と感じていました。それに、他の人のコメントから学べます。私はインポスター症候群とは無縁で、私を知る人なら驚かないでしょう。

Jonathan: 驚かないでしょうね。大学の教授や先生についての経験ですが、特に際立っていた先生はいましたか? その教え方が、あなたの学びを加速させたり、プログラミングやコーディングの理解に大きな影響を与えたりしたような先生です。そして、その先生は具体的に何をして、理論から実際の実装へと橋渡しをしてくれたのでしょうか? かなり大きな質問ですね。好きなだけ細かく分けて答えてもらって構いません。ええ、ええ。

Erik: ええ、ええ。これは応用科学大学と大学で分けて話さないといけませんね。まず大学のほうから言うと、人に教えるために求められるスキルの全体的なレベルは、とても、とても低かったです。ハードルがとても低かったんです。それに、大学で教えている人の多くは、教えたくてやっているのではなく、教えなければならないからやっているのだと感じました。大学では多くの場合、研究をしたいのですが、教えるために何時間も費やさなければなりません。まあ、仕事の一部ではありますが、彼らはあまりそれを好んでいませんでした。私はプログラミングを学んだ後、もっとプログラミングを学びたかったので、そこでプログラミングの専攻を取ったのですが、ひどいものでした。彼らが私に伝えようとしているプログラミングの知識のレベルがあまりにひどくて、ほとんど腹が立ったほどで、実際にセキュリティのほうに専攻を変えました。私はセキュリティにそれほど興味があるわけではありませんが、プログラミングの内容があまりにひどかったんです。大学での経験について、私が本当に学んだのは、きちんと記事を書く方法、そしてきちんと出典を調べる方法だけだといつも言っています。出典を把握し、どんな出典でも鵜呑みにしないことです。それはあの数年間で学びましたが、プログラミングについてはまったく何も学びませんでした。

Jonathan: それは歴史にもとても通じる話に聞こえます。出典をどう吟味するか、自分の論証が筋が通っているかをどう確かめるか、そういうことです。歴史のスキルと楽しさは……

Erik: そうですね、とても通じるところがあります。

Jonathan: それらは、あなたのコーディングやコードの学び方に、もしあるとすれば、どう表れましたか? どんな共通点があったのでしょうか?

Erik: 難しい質問ですね。どちらもたくさん読むことが関わってきます。歴史は読むことですし、プログラミングもコードを読むことです。実際にコードを書く回数は、コードを読む回数よりずっと少ないんです。だから、読むことにかなり似ています。たとえば、新しい仕事に就いて、この古いレガシーシステムを前に、どう進めばいいか手探りするときは、考古学者のような気分になることがあります。あちこちの隅々をのぞき込んで、何が隠されているかを見る感じです。時には、戸棚から死体が出てくることもありますからね。探検のような感じです。つまり、これのどこが楽しかったかというと……。ほかに何かあるか、そもそもどこが楽しかったのか。

Jonathan: ありがとう。あなたにとって、この業界の楽しさはどこにありましたか?

Erik: 主には、先生たちが語ってくれた物語ですね。海賊について、船の下にロープで引きずられる話などを、とても生々しく語ってくれました。そういうのが好きでした。本当に好きでした。それから、ローマ人とその文化、どう広がっていったかが大好きでした。あとは政治です。裏切りとかですね。そういうのが大好きでした。高校ではラテン語も取っていました。ラテン語自体はまったく好きではありませんでしたが、扱う物語はとても好きでした。だから、ラテン語をやらなければならないのは嫌でしたが、翻訳しなければならない物語は好きでした。でも2年でやめました。

Jonathan: そう、それが好きだったんですね。いえ、歴史について私が聞いた理由は……

Erik: ええ、話は分かります。

Jonathan: より芸術寄り、あるいは社会寄りの、何と言えばいいでしょうか。英語の枠組みでいう「アーツ」は、芸術や歴史のようなものを指して、そのカテゴリーに入るのでしょう。でも、そういう分野を楽しんできた人が、プログラミングの学びに移っていくのを、ますます多く見るようになりました。私が興味を持っているのは、そこには明らかに……重なりがあるからで、それを少し整理してみることは、いろいろな人と交わしてきた会話の中でも、とても興味深い部分でした。全体像を持ち、自分が学ぶさまざまなことに対して多角的なアプローチができるなら、それをプログラミングに持ち込むのはとても有益だと思います。異なるスキルをプログラミングの領域に応用できるからです。ええ、それについては、ただそうコメントしておきます。それで興味深いのは、あなたは歴史が大好きで、今では30以上のプログラミング言語の経験があって、その多くを維持しているということです。まあ、維持というより、Exercismであれらすべてを管理するのにとても深く関わっている、あなたの……ええ、ええ。ええ、どうぞ話してください。

Erik: どれくらいが自分のものですか? ちょっと、今おっしゃったことに戻ってもいいですか? いろいろなタイプの人がいて、異なる興味を持つ人がプログラミングをしているとおっしゃいましたね。でも、そうなっている理由のひとつは、プログラミングが非常に技術志向の人にも訴えかけるからだと思います。厳格なルールがあり、言語はとても厳密に決まっています。文法があり、構文があります。ある決まったやり方を好む人に訴えかけるものがたくさんあります。たとえば物理学者なら、ルールや法則が好きですよね。プログラミングにもそういうところがありますが、同時に芸術のようなものでもあります。だから時々、本を書くことに例えられたりしますが、私は今でも、それがたぶん一番良い例のひとつだと思います。家を建てるという例えは好きではありません。というのも、もし私たちがソフトウェアを家を建てるように作ったら、家は一軒も建たないでしょうから。でも、本当に科学であると同時に芸術でもあると感じます。Jeremyが最近、Dig Deeperの話で、ごく簡単な演習でも何百もの異なる解答が出てくると言っていました。たったひとつの解き方しかないはずだと思っても、いつも複数のやり方があるんです。それが私がプログラミングを愛する理由です。動くものが作れて、それから他に20通りも選択肢を試せて、書いてみると「ああ、これも動くんだ」と分かる。芸術であり科学でもあるというこの組み合わせが本当に好きです。実際に創造的になれるのは、これくらいしかないと思うからです。私はまったく創造的な人間ではありません。手は2本ありますが、家の用事や大工仕事などを私がやったら、分かるでしょう、とてもそうは見えないでしょうね。私はそういうのが得意ではありません。父がちゃんと教えられなかったこともあります。本当に興味深いですね。

Jonathan: いや、それに私はそういうことに本当に興味がありませんでした。私は学校で美術をやっていました。音楽もやって、ギターを弾いたりしていました。だから私にとって、創造性の枠組みはいつも絵を描くことや音楽などのほうにありました。コードの創造的な側面については、本当に考えたことがありませんでした。それであなたがその話をしたので、あなたにとってはどうなのかと思って。楽器を弾いたりするんですか? 音楽が好きなのは知っていますが、そのふたつを結びつけようとしているだけなんです。

Erik: そうですね、ええ、やっていました。ギターを覚えようとしました。妻にはとても大変だったと思います。当時は彼女の学生用のアパートに住んでいて、たしか20平方メートルくらいでした。だからギターの練習をしていて、私たちはすごく近くにいたんです。よく妻は我慢してくれたものだと、今でも驚きます。でも私には……

Jonathan: ただ……

Erik: 楽器を演奏する生まれつきの才能はありませんでした。あるレベルに達するには、本当に、本当に、本当に努力しなければなりませんでした。それでもかなり低いレベルでした。テンポなどは、まあまあできました。でもあるとき、ギターの先生に即興演奏とソロをやるように言われて、私は完全に途方に暮れました。どうしてもできませんでした。私には音楽的な創造性がまったくないんです。

Jonathan: 音楽的な創造性がまったくないんですね。コーディングは? あなたとは違って。まっさらな状態でコーディングに臨むとき、たとえばJeremyから概要を受け取ったり、Exercismで機能のリクエストがあったりして、「X、Y、Zをやろう」というとき。そういうのは、精神的にあなたを奮い立たせますか? 「よし、面白い、これを本当に掘り下げてみよう」と思ったり、そのプロセスを楽しんだりしますか? ある意味で生き生きしてくる、と感じるのはそういうことですか?

Erik: あなたとは違って、ですね。はい、はい。つまり、プログラミングとは、アイデアを持って、それを何かにすることです。まるで小さな神様のようなもので、何もないところから始めて、アイデアがあり、そして何かが生まれる。それだけで本当に、本当に魔法のようです。スクリプトがあると、今でもとても、とてもわくわくします。一行一行のテキストがあって、それが実際に何かをしているのを見る。コンピューターが、自分がこう動くべきだと言ったとおりに動いてくれるのを見るのは、とても楽しいです。今でも好きです。だから創造性という側面は、どうやって何かを作ろうかと模索する段階にも間違いなくあります。そして一度作ったら、たぶん聞いたことがあるでしょう、リファクタリングのサイクルを。動くものができたら、それをもとに繰り返し改善して、より良くできないか試すんです。私はリファクタリングが大好きです。本が一冊あって、あれ、どこに……ああ、カメラのずっと外にあるので見えません。Martin FowlerのRefactoringです。ソフトウェアについて読んだ中でも、私のより良い体験のひとつです。とにかくリファクタリングが大好きです。動くものがあるけれど、さらに良くしたり、きれいにしたり、速くしたり、基準は何であれ、より良くできるというプロセスです。私がExercismを本当に好きなのもそのためです。まさにそのために作られていて、テストを解き、テストハーネスがあって、自分のコードで好きなことができる。緑である限り、つまり動いている限りは良い、というわけです。

Jonathan: それは良いですね。では、また別の時系列に戻っていきます。大学を終え、コードの書き方を学び、この学習プロセスにしっかり取り組もうと決意して、深く掘り下げてきたわけです。そこから、本当に腰を据えて取り組み、そしておそらくキャリアについて考え始めたわけですが、その後はどうなりましたか? 大学にいる間は、「この先の人生で何をするのか」と考えるのはいつも大きな部分ですよね。それはどう展開しましたか? そのあたり、どう考えていましたか? どんなことが目の前に広がったのでしょうか?

Erik: はい。私は自分のキャリアについて実際に考えたことがありません。人生で一度もしたことがないと思います。私が本当に大事にしているのは、自分がやりたいことをすること、そして自分から近い場所であること、あまり車を運転しなくて済むことだけです。車の運転はあまり好きではありません。でも、いいえ、キャリアについて考えたことはありません。それにとても運が良くもありました。仕事に応募しなければならなかったのは、たぶん一度か二度だけです。いつも友達か、私を知っている人がいました。Exercismも同じです。Jeremyは私を知っていて、応募して、あなたのように4、5段階の面接を経る必要はありませんでした。あなたの場合はもっとあったかもしれませんが。でも、いや、分かっていますよ。とにかく、私は一度もありませんでした。仕事を探していたときも同じでした。学校で学んでいるときも、ずっと働いていました。高校のときでさえ、少しお金を稼ごうとしていました。両親にはお金がなかったので、自分の分は自分で稼がなければなりませんでした。でも働くのは大好きです。大学に行きながら、たぶん20時間ほどプログラミングの仕事をしていました。大学で過ごさなければならない実際の時間がとても少なかったので、かなりお金を稼げました。それで、これだけの大量のDVDコレクションを買いました。

Jonathan: それはやめておきましょう。

Erik: やめておきましょう。ええ、すみません、実はほとんど手放しました。とても、とても思い入れのあるものだけは残していますが、大半は手放しました。一時は400枚か500枚のDVDを持っていました。

Jonathan: 一時は400、500枚のDVDですか。それは楽しいですね。

Erik: それに近い数でした。それに近い数でした。ええ。でも、大学にいたとき、友達がいて、私が10歳くらいのときのプログラマーだったのと同じ人です。彼は私と一緒に大学に行きました。彼は仕事をしていて、「少しお小遣いを稼ぐために、この会社に来ないか」と誘ってくれました。それで入りました。そして基本的にそこに残り、大学を終えると、博士号を取らないかと誘われました。でも、博士号で何か面白いものを見つけたという意味に私は受け取りました。ちなみにそれはまったくの偶然で、仕事はしましたが、運でした。でも、私はそれを「あなたが書くものに私たちの名前を載せて、論文を出したい」という意味に受け取りました。だから乗り気ではありませんでした。4年間も理論的なことをやりたくなかったんです。それに、学界全体が私にはあまり魅力的ではありませんでした。会社の中で実践的なことをするほうがずっと居心地が良かったです。だから、働いていたところにそのまま残りました。当時はPHPを使っていて、素晴らしいチームでした。今のチームを除けば、これほど多様で有能なチームで働いたことはありません。でも、マネジメントがひどくて、不満の多い技術環境でした。良くはありませんでしたが、それでもたくさん楽しみました。ただ、PHPは私の好きな言語ではありません。私はC#が好きでした。C#がまだ1.0だったころからのファンです。当時はかなり粗削りでした。アメリカから本を取り寄せて、追加の税金も払わなければならず、結局かなり高くつきましたが、それでもその本は本当に、本当にたくさん使いました。それで、副業ではなく仕事としてC#をやりたいと思い、応募しました。実は大学向けの仕事でもあったのですが、研究をするようなものではありませんでした。どちらかというと、大学のさまざまな部門をサポートするようなものでした。それで7年ほどC#をやりました。

Jonathan: それで7年ほどC#をやったと。そのあたりの話を聞かせてください。あなたはボランティア、あるいはコントリビューターとして始めたんですよね? そこから少しずつ積み上げてきたわけです。

Erik: ええ、ええ。大学で働いていたときは、何かを学んだり、カンファレンスに行ったりするのをとても自由にさせてくれました。それであるとき、関数型プログラミングというものを耳にしました。それで「これは知らないな」と思いました。大学で選択制の授業が1回あったのは知っていましたが、実際には何もやっていませんでした。もしかしたら関数型プログラミングを学ぶべきかもしれない、楽しいかもしれないと思いました。一緒にやりたいという同僚も見つかりました。それでCourseraの無料のScala講座を受けたんです。今なら有料ですが、当時は無料でした。講師はMartin Ordeskiで、Scalaの作者です。ScalaはExercismにもある関数型言語です。関数型プログラミングを学ぶのはとても楽しかったですが、考え方が本当に違うので、時にはかなり頭を悩ませることもありました。でもなんとか続けて、本当に好きになりました。他の受講生と、たとえば解けなかった演習について話し合えるフォーラムがありました。ある人が「Scalaをもっと学びたいなら、どんな資料を使えばいいか」と尋ねていて、誰かが「Exercismを試してみて。小さなパズルのような、いろいろな演習ができるすごいものがあるよ」と答えていました。これは良さそうだと思いました。それで参加して、Scalaのトラックをやりました。本当にたくさん学びました。それが、私が関数型プログラミングの世界に足を踏み入れたきっかけです。それならもっと深く掘り下げようと思って、Haskellに行きました。当時の私にとって、それは本当に深い掘り下げでした。ただ、当時はまだExercismのバージョン1で、コードにコメントが付くだけでした。正式なメンタリングの仕組みなどはありませんでした。でもHaskellの人たちは本当に素晴らしくて、私は基本的に彼らからHaskellを学びました。たくさんググって、とても変わった解答を見つけたり、自分でも変わった解答を書いたりしましたが、彼らはいつも慣用的で良いHaskellへと導いてくれました。それが本当に素晴らしい経験で、私も他の人に対してこういうことをするべきかもしれない、自分も助けられるかもしれないと思いました。私はいつも人を助けるのが好きでした。それでC#をやって、他の人のC#コードにコメントしようと思いました。それが気に入りました。そして気づいたんです。「C#のトラックには40くらいの演習しかないのに、Haskellにはもっとある。なぜだろう」と。それで理由を調べてみました。すると、Exercismにプルリクエストを送って新しい演習を追加できると分かったんです。それが私を夢中にさせました。それからは毎週末、演習を追加していました。C#が終わると、「そうだ、F#をやろう」と思いました。F#は関数型で、Microsoftのエコシステムにあります。どちらも好きなので、好きなものを組み合わせようと。F#でも同じことをしました。F#のメンテナーとして演習を作り、それが本当に、本当に楽しかったです。

Jonathan: 本当に、本当に楽しかったんですね。ある言語があって、「よし、Scalaをやってみよう」と思い、少し取りかかって、それから深く掘り下げていく。では、それぞれの言語を理解するのにかかる時間は、だんだん短くなっていきましたか? 今ではいくつも言語を持っていますからね。それはどう展開しましたか?

Erik: ええ、ええ。これは自然言語でも同じです。フランス語を学んでフランス語をよく知っていれば、スペイン語を身につけるのはずっと楽です。共有されている知識が多いからです。語彙を共有していたり、ほとんど方言のような関係だったりします。コンピュータープログラミングも同じです。Cを知っていてC++に移るなら、新しい概念がたくさんありますが、まったく同じものもたくさんあります。Cに似た言語の一族全体がそうで、これも私がプログラミングで好きなことのひとつです。家系図があるようなものです。Lispの系統、MLの系統、Cに似た系統があります。歴史とほとんど同じで、家系図のような系譜があるんです。「今のは大きすぎましたね」。ええ、あれはHaskellかPrologです。でも、そういう外れ値の言語も大好きです。独自のアイデアがあるからです。それが私がたいてい試したいものです。ほかのプログラミング言語と共通する知識が多くても、何か違うことをする言語を探すんです。どの言語にも真偽値論理があり、真偽値論理は決まったもので、所与です。だからどこでも同じように動きます。二つのアンパサンドを書く必要があるかもしれませんし、andという単語を使うかもしれませんが、基本は同じです。その基本を一度しっかり身につければ、他の言語にももっと簡単に応用できます。

Jonathan: 家系図のような系譜がある、歴史とほとんど同じですね。言語もより簡単に。コードを学び、自分の経験を活かすわけです。コードを学ぶために、人々はどんな行動やことをするのでしょうか? 多くの異なる分野に共通点があるはずです。あなたは、とにかく取り組んで、深く掘り下げて、理解できるまでその問題と格闘すると言っていましたね。ほかに、この人は学べる立場に自分を置いているな、と思えるような行動やことを見たことがありますか? ええ、本当に上手に。

Erik: ええと、私はいつも、自分が作りたいと思うものを作るように人に勧めてきました。私がPHPを学んでいたときは、自分が見たIMDBのトップ250の映画を記録するものを作りました。映画をたくさん見ていたので、それらをひとつ残らず確認したかったんです。そうやって、自分が作りたいものを作るだけで、PHPとMySQLをたくさん学びました。そうすれば、困難にぶつかっても、そこでやめたくなりません。続けたくなり、直したくなり、動くようにしたくなります。このコツは、プログラミングを学び始めた何人かに伝えましたが、うまくいっていました。それに今は、私が学んでいたころとはまったく違います。Stack Overflowなどを使って対処していましたからね。オンラインで見つけられる知識は膨大です。ただ、適切な資料を見つけるのも難しいです。そこでExercismが本当に力を発揮できると思います。コミュニティには、適切な資料が何かを知っている人がいますから、ほとんど門番のような役割を担えます。これは、新しい人が苦労しているのを見る点のひとつです。それに、もうひとつあります。ゼロから始めるような資料は、ほとんどありません。通常、Exercismの利用者は少なくともひとつの言語を知っています。それから別の言語に進んだり、その言語を深く掘り下げたりします。でも、プログラミングの背景がまったくない人向けではありません。forループが何か分からない、変数が何か分からない、文字列というとまったく別のものを思い浮かべる、という人には。ええ、妻が私が「文字列」の話をしているのを聞くと、いつも変な顔をされます。オランダでは別の意味なんです。

Jonathan: ええ。ここでいくつか一般論を述べます。ここ数年で、コーディングやプログラミングを意識する人がますます増えているのは、たぶん事実です。以前は、その領域をうまく進む方法を知っている人はもっと少なかったでしょう。明らかに、この業界がかなり速いペースでどんどん成長しているので、意見もたくさんあり、人はある事柄や話題について自分がどこに立つのかを探りながら進んでいます。「自分が命を懸けて守る丘」という考え方がありますが、これは要するに、健全な形で本当に戦ったり守ったりしたい意見は何か、ということです。では、あなたが守りたい、これだけは譲れない、と固執して「ここからは動かない」と言い、それを擁護しなければならないとしたら、それは何でしょうか? はい。

Erik: そういう意見はたくさんありますが、ここで説明したいのは、すでに知っている言語よりも多くの言語を学ぶべきだということです。知らない新しい言語を試し、すでに知っているものとは大きく異なる言語を試してみてください。とても簡単です。たとえばC#を知っているなら、C#にとどまっても構いません。でも、時間と意欲を見つけられるなら、何か別のもの、たとえばF#や、そうですね、Kotlinでもいいので、とにかく違うことをやって、違いを見てみてください。ずっと優れたプログラマーになれます。私がF#を学んだことでC#のプログラマーとしても良くなったと、100パーセント確信しています。両者は異なる言語で、哲学も違いますが、それでもです。今では言語間の重なりがとても大きいんです。言語がまだ若かったころ、たとえばLispはCとは似ても似つきませんでした。関数型言語は命令型言語とは大きく異なっていました。でもC#やJava、Kotlin、Rustのような現代の言語は、他の言語からも、関数型言語からも着想を得ています。大学にいたころ、「関数型プログラミングは素晴らしいが、誰もやっていない」という常套句がありました。でもそれはもう当てはまりません。関数型言語で仕事をしていなくても、関数型の考え方はどこにでもあります。JavaScriptには関数型の概念がたくさんあります。C#には高度なパターンマッチングがあり、LINQがあり、関数型の要素がたくさんあります。そして言語が至るところで概念を取り込んでいるのが分かります。だから、どの言語が関数型言語で、どの言語が単なる命令型言語なのか、はっきりしなくなっています。今はむしろ混ざり合っています。それでも、新しい言語を学び始めれば得るものは大きいと思います。毎年ひとつ新しい言語を学べと言う人もいます。私もそうしようとしています。人によってはうんざりしたり、圧倒されたりするかもしれません。でも、少なくともひとつ違う言語を試して、少しだけ居心地の悪い、快適ゾーンの外にある言語にしてみてください。約束します、たくさんのことを学び、ずっと優れたプログラマーになれます。すでに使っている言語についてもです。

Jonathan: すでに使っている言語についても、ですね。明らかに、人は特定のニーズを満たすために新しい言語を作ります。そして、命令型と関数型が少しずつ融合しつつある、とおっしゃっていました。言語が消えていき、いくつかの核となる言語だけが残るような状況は、起こると思いますか? それとも、それは甘い考えでしょうか?

Erik: いや、いや。人はそれにはあまりにこだわりすぎだと思います。だから新しい言語はいつも生まれます。毎日のように新しい言語が出てきますが、それでいいんです。でも、ふるいにかけられます。結局、人気のあるものがおそらく生き残るでしょう。JavaやC#がすぐになくなるとは思いません。たとえば、CやC++はずっと巨大な言語でした。でも今はRustが登場していて、同じ問題に、より安全性をもって取り組む新しい試みです。安全性が組み込まれています。私がもっと学ぶべき素晴らしい言語です。Rustが少しずつ同じ領域に入り込み、人々がCやC++の代わりに使い始めているのは興味深いです。個人的にはとても良いことだと思います。たとえばLinuxでは、今ではドライバーをRustで書けます。ずっとC++だったのでしょうが、今はRustでドライバーを書くことがサポートされています。これはかなり大きな一歩でした。だから、言語はこれからもあり続けると思います。すべての目的に合う言語は作れないからです。これも、複数の言語を学ぶべきだと私が思う理由のひとつです。状況によって必要な言語が違うからです。だから試せますし、まるで、何というか、ハンマーでのこぎりを扱うようなものです。何という表現か分かりませんが。

Jonathan: その表現は? つまり、のこぎりが必要なのに、ハンマーしか持っていない。どうしますか、というものですよね。はい。

Erik: ええ、ええ、そんなところです。新しい、たぶん「釘とハンマー」の話だったと思いますが、そんな感じです。英語のことわざは得意ではありませんが、オランダ語版で困らせるのはやめておきます。要するに、C#しか知らないと、何でもC#でやろうとする誘惑があるかもしれませんが、システムプログラミングや、何でしょう、AIなどには、C#よりも適した言語があるかもしれません。C#でもできるからといって、そうすべきだとは限りません。だから、より多くの言語を知っていれば、自分が働く領域により適した良い選択ができるでしょう。

Jonathan: はい、楽しくて美しいですね。Exercismコミュニティに関してですが、今週、Exercismコミュニティにぜひ試してほしいおすすめを挙げるとしたら何でしょう? 何でもかまいません。「散歩に行こう」でも、「逆立ちをやってみよう」でも。何でもいいんです。ええ、いくつ挙げてもらってもかまいません。3つ挙げてもOKです。

Erik: 楽しくて、役に立ちます。何を言うかはもう決まっています。はい。まず浮かぶのは、新しくできたDig Deeperタブをチェックしてみてほしいということです。新しい機能Dig Deeperを追加し始めました。演習を解いたあと、少なくとも一度は繰り返し取り組んだあとに、演習の解き方のバリエーションである「アプローチ」を見られるようになりました。これは、Exercismのバージョン1でコメントが付いていたころに、みんなが学んでいた方法と基本的に同じです。他の人のコードを見て、どう解いたかを確認するんです。私がHaskellを学んだのも、メンターのコメントもありましたが、主にそうやって学びました。「ああ、こんなふうにできるんだ」と見て、自分で試してみて、「これは本当にエレガントだし、もっと色々できる」と思い、それを他の演習にも応用する。こういうさまざまなやり方を見つけられることは、プログラミングの芸術的な側面、つまり物事をいろいろな方法で解けるという性質に通じます。そういうさまざまなアプローチがあるんです。私は文字列の反転について、記事とアプローチを書きました。これはIT面接でよく出る基本的な質問のひとつです。「文字列をどうやって反転させますか?」 C#にはいくつか慣用的な方法がありますが、それぞれ異なり、性能特性も違います。ひとつは性能に特化していますが、読みやすさは劣ります。サイト上で、あるやり方で解いたあとに「他にもやり方があるよ」「こうする利点はこれ」「トレードオフはこれ」と示せるのが気に入っています。異なるアプローチを見られるだけでなく、それらを選ぶ助けになる導入のドキュメントも書くようにしています。ITには常にトレードオフがあります。これが一番良いという解は、ほとんどの場合ありません。だからいつも別の書き方ができます。ええ、よくあることです。一番読みやすい解答が一番性能が良いとは限りません。トレードオフを理解し、選択するのを手助けする。これもDig Deeperタブでやろうとしていることです。私は今、暇な時間にそれらを書いています。こうした情報を書きまとめて人と共有するのがとても楽しいんです。ですから、自分で書いてみること、あるいは単にアプローチを読んでみることを、ぜひおすすめします。すべての演習にあるわけではないことは分かっています。この機能は1週間前に始めたばかりなので、まだC#の演習いくつかに限られていますが、これから大きく拡大していきます。こうしたものにはコミュニティからのPRを受け付けています。喜んで書くのを手伝い、形にするお手伝いをしますので、自分の言語の知識を共有できますよ。言語が好きな人は、他の人にも好きになってほしいと思うものです。アプローチは、自分の言語で何ができるかを見せるのにとても良い方法です。ぜひチェックしてみてください。ええ。

Jonathan: ぜひチェックしてみてください。今週のおすすめはほかにありますか?

Erik: ええと、Exercismを推す人間だと思われるかもしれませんが、私はExercismのフォーラムが本当に好きです。私のキャリアで分かったのは、技術に興味を持つ人のコミュニティで、ほとんど安全な場所のように、他の人に馬鹿にされたり、議論になったり、好戦的になったりせずに話せる場所を見つけるのは、とても難しいということです。だから、フォーラムでみんなにとって安全で楽しい場所にしようとしているのが好きですし、同時に、とても優秀なプログラマーに出会える場所でもあります。高度なスキルを持ち、自分の言語やプログラミングの領域について優れた見識を持った人たちです。他の人が書いたものをただ読むのが本当に楽しいです。「好きなプログラミング本は何ですか」というスレッドもあります。私はもういくつか、読みたい本の候補リストに入れました。すべての本に出会えるわけではありませんからね。でも他の人が読んでいる。群衆の知恵を使えるわけです。

Jonathan: 他の人が読んでいる、つまり群衆の知恵を使えるわけですね。あのスレッドには、きっと掘り出せる本当の宝物があるはずです。でも、それは本当にいいですね、Eric。もうひとつおすすめがあればぜひ聞きたいですが、なければそろそろまとめに入りましょう。何かほかに考えやコメントはありますか? ええ、ぜひ共有し続けましょう。

Erik: うん。ああ、それは動画に入っちゃいますね。いや、特にありません。3つ目を探していたんです。

Jonathan: 私はいつも3つ目を探しているんです。その場合は、もう十分ですね。でもEric、本当にありがとう。あなたの話を聞けて、それがどうIT業界につながっていったのかを聞けて、本当に良かったです。特に、歴史について少し聞けたのがとても楽しかったです。歴史とコーディング、そしてそれらがどう重なるのかについて、いずれもう少し考えて共有してみたいと思われるかもしれませんね。でも、本当にありがとう。チームに迎えられて最高ですし、私はあなたからこれまでも、そしてこれからもたくさん学び続けるでしょう。大きな声援を送ります。あなたはExercismのサイトで10万レピュテーションポイントを超えたんですよ。あなたはそれを「カンニングしたからだ」と言うでしょうが、それでも、とにかく素晴らしい達成として受け止めておきます。本当にありがとう。そして、これを聞いているあなたがまだExercismに触れたことがないなら、ぜひExercismをチェックしてみてください。きっとそのどこかでEricを見つけられるはずです。Eric、ありがとう。本当に感謝しています。ここで録音を止めますので、その後で少し話しましょう。お時間をありがとう。私と同じくらい楽しんでいただけたならうれしいです。本当に良い時間でした。

Erik: ええ、そうさせてもらいます。最高でした。はい、楽しみました。ありがとうございます。

コミュニティのその他のストーリー

コミュニティのメンバーの話を聞いて、学び、刺激を受けましょう。