私は現在、交大の資工(CS)修士課程で学んでいます。CS の道を選ぶまでには長い時間がかかりました。本記事ではできるだけ最初から振り返り、私の CS への興味がどのように少しずつ形作られていったかを語ります。人それぞれ物語は違いますが、私の経験が誰かのヒントや学びになれば嬉しいです。

my photo cover
(発表しているときの私)

大学に入る前、私は自分が物理学者になると思っていました。高校の物理の定期試験は全然できず、物理オリンピックの問題も 1 問も解けないのに、それでも疑っていませんでした。ただ、研究をすること自体には少し熱意があって、物理の科学展覧会でもほんの少しだけ成果が出たので、「きっとこのまま進めるはずだ」と思っていたのです。ところが実際に大学に入ってから、微積分も一般物理もあまり良い成績ではなく、「自分には本当に才能がない」と分かりました。物理学科に本当に向いている人は、数学と物理に才能があります。周りにも物理が異常に強い友人がいて、見ていれば分かるほどです。そしてこの頃、私の才能は物理ではない、ということもようやく理解しました。

その後、CS に進むしかないと確信するのは大学 2 年になってからですが、実はコンピュータに初めて触れて興味を持ったのは小学生の頃でした。当時の私はセキュリティが格好いいと思っていて、「他人のコンピュータに侵入できたらクールだ」と感じていました。市販の本はトロイの木馬やウイルスの紹介が中心で、図書館で借りて読んだものです。そこではツールが例として使われることが多かったのですが、今から考えるとああいう本は本当に役に立ちません。ハッカーになるなら、当然ツールは自分で書くべきだし、脆弱性も自分で探すべきです。私が子どもの頃は『PCHome 電腦家庭』のような雑誌もまだ新鮮で、Ubuntu の入れ方などのチュートリアルが載っていて、私はそれを真似して遊んでいました。つまり、子どもの頃からコンピュータに対する好奇心はありました。

中学生になって C++ 入門書を読んだことがあります。当時は基本文法は理解できたのですが、クラスやテンプレートの説明になるとさっぱり分かりませんでした。「プログラムはそのまま書けばいいのに、クラスに何の意味があるの?」と思っていたのです。ある日、数学の先生(趙麗蓮先生)に「劉安齊、あなたは頭がいいから、Wii のコントローラとプロジェクタを組み合わせて電子ホワイトボードを作れない?」と聞かれたことを覚えています。そのとき私は難しすぎると思い、「できません」と答えました。今振り返ると、実現に必要な技術はそこまで難しくありません。Wii の API にアクセスできれば簡単にできたでしょうし、赤外線の発射器と受信器で 3D 空間の軌跡を解析する、といった方法でもできたはずです。同学年に程肯という学生がいて、後に Yale CS に進学し、高校時代に情報と物理のオリンピックで金メダルを取った人でした。私はこの程度のことなら彼は中学生の時点でできただろうと思いますが、私は大学に入ってからようやくそのレベルに到達しました。

中学時代の私は天文物理の世界にどっぷり浸かっていて、宇宙を扱う市販の本をほぼ全部読んだくらいでした。不思議なことに、天文や宇宙を語る科学読み物は本当にたくさんあります。当時の私は「全部読めば強くなれる」と素直に信じていました。しかし後になって分かったのは、科学読み物は科学リテラシーを育てるだけで、本当に強い人は中学生の段階で大学レベルの一般物理、力学、電磁気をすでに読んでいるということです。誰もそのことを教えてくれなかったのが少し悲しいです。私は理科クラスに入ってから実力が落ちたと感じたのですが、それは中学時代に正しい方法で勉強していなかったからだと思います。他の理科クラスの学生は、中学生の頃からすでに原書を読んでいたのです。

高校に入って、高 1 でプログラミングの授業がありました。先生はプログラミングのロジックを説明し、たとえば if とは何か、条件が真か偽かによってプログラムの挙動が変わることなどを教えます。次に先生は問題を投げます。だいたい「小明が身分証番号の妥当性をチェックしたい。規則は、最初の文字は英字で、後ろの数字は何桁目×何桁目+ある数がいくつになる…」のようなものです。それを練習して、最後に検査プログラムを動かします。ここでまたプログラミングへの好奇心が湧き、私は自分で C++
入門書を探して読み直しました。相変わらずクラスやテンプレートが何のためにあるのかは分かりませんでしたが、授業の進度は明らかに超えました。授業で教わる内容は全部できました。クラスメイトの中には授業が分からない人もいて、私は彼らに教えていましたが、彼らは今では電機や CS に進んでプログラミングをしています。

同時に、学校に情報競技(プログラミングコンテスト)があることを知りました。先生が Facebook で問題を出してくれて、私は面白そうだと思って挑戦しました。先生は参考資料として、いわゆる「演算法筆記」のようなものも提示してくれて、学びながら解くうちに、プログラミングが本当に楽しいと感じました。「演算法筆記」や、「鳥哥の Linux」、そして「Beej のネットワークプログラミング」などには感謝しかありません。これらはほぼ教科書レベルの名文で、しかも無料で公開され、多くの学生を救ってきました。

こうして高 1〜高 2 のある期間、私は情報競技(つまりデータ構造とアルゴリズム)に没頭しました。問題を解くのが楽しく、AC を取れたときは特に達成感があります。ただ、私は競技プログラミングに本当に向いていないと思います。根本的には、私の数理的な論理がそこまで強くないのだと思います。数学やアルゴリズムのような抽象的思考が得意ではなく、考えるのに時間がかかるし、類推もあまり効きません。そのため、典型問題(LCS、LIS など)のテンプレートから少しでも変化があると、どうすればいいか分からなくなります。とても挫折感があり、「自分は情報には向いていない」と思ってやめてしまい、物理の科学展覧会や物理ディベートに戻りました。

高校時代には中研院の原分所で物理のトレーニングにも参加しました。その中に、数値シミュレーションで原子・分子間の相互作用を計算し、どの構造が安定かを研究する授業がありました。原分所には自前の計算機室があり、当時はたしか PS3 コアを大量に積んだような構成だった気がします。その頃はまだ NVIDIA の GPU を使う時代ではありませんでした。後に深層学習が爆発的に流行し、世界中が NVIDIA GPU を買い漁るようになるとは誰が想像したでしょうか。いずれにせよ、この体験は私にとって新鮮で、科学において情報処理が重要なツールであることを理解できました。

物理の科学展覧会でもプログラムは書いていましたが、当時の私はとても浅い使い方で、単にデータを回す程度でした。その後、学測が終わって「何か意味のあることをしたい」と思い、数値シミュレーションで感染症を研究する科学展覧会をもう 1 つ作りました。科学展覧会についてはこの記事この記事に記録しています。簡単に言うと、仮想世界を作り、その中の人々が相互作用し、誰かが病気になったときに相互作用を通じてどう感染が広がるかをモデル化しました。仮想世界を作るのは本当に面白いと思います。映画『Matrix』や『ソードアート・オンライン』の人工フラクトライトのように、似た SF 作品も多いです。私は不可能だとは思いません。人類がどれくらい時間をかけて実現するか、というだけです。仮想世界を作ることを想像するだけでワクワクします。高校時代の私も今の私も同じです。だからまたプログラミングの練習を始めました。今回は競技プログラミングのようなアルゴリズム問題ではなく、プログラムでモデルを構築していました。感染症の問題が研究の本体で、プログラムは道具に過ぎませんが、その道具を上手く使うのもまた奥が深いもので、その過程でまた「プログラミングは面白い」と感じるようになりました。

しかし私は「CS の学生は情報競技が得意であるべきだ」と思い込んでいましたし、さらに「自分は物理学者になる」とも思い込んでいました。だから大学の志望を出すとき、第一志望は台大物理、第二志望は台大大気にしました。後は何を書いたか覚えていません。ただ、当時の点数は交大資工に入れる点数でした。今でも「最初から交大資工に行っていたらどうだっただろう」と考えることがあります。しかし、おそらくそうしなかったからこそ得られた経験もあります。交大に行けば別の機会があったかもしれませんが、私は台大で起きた出来事がとても好きです。台大の色々な学部の友人に出会ったこと、1 年のときに電機の選択科目を取って打ちのめされたこと、集思論壇や緑領に参加したこと、暇なときに学内の講演を聴きに行ったこと、台北という地理的利点でインターンを探しやすかったことなど。台大の時間が今の私を形作りました。

CS に進むと確信したのは大学の段階です。大学時代の詳しい話は「台大心得與觀察系列」に書いてありますし、独立した話もほとんど記録しているので、ここでは書き直しません。簡単に整理すると、最初は Web を学んでフロントエンドに興味を持ち、フロントとバックは結びついているのでバックエンドも学びました。小さなプログラムを書くことでは満足できず、大型 OSS に貢献したいと思うようになり、偶然からブラウザに興味を持つようになりました。Mozilla の Servo に貢献しただけでなく、Puffin ブラウザの開発機会も得ました。CS の授業もいくつか取り、DBMS が面白いと感じて玩具の DBMS を自作しました。その後 Skymizer で ONNC(クロスプラットフォーム機械学習コンパイラ)を開発しました。さらに OSS 活動にも多く参加し、台湾と香港の OSS カンファレンスで講演をし、Rust 公式サイトの翻訳プロジェクトを率い、COSCUP で Rust のトラックも主持しました。どれも私にとってはとても刺激的な経験です。

CS への興味は大学前はまだ芽生えの段階でしたが、大学以降は急速に発展しました。興味を見つけてからは、OSS、インターン、授業など、自分が「面白い」と思うことを積極的に取りに行きました。それが結果につながったのだと思います。ただ、経験が豊富に見えても、裏では多くの企業に落とされてもいます。また、私は非 CS 出身なので基礎が足りず、目指す高さに追いつけていないことも理解しています。だからこそ資工の大学院に進み、足りない基礎を補おうとしました。今は自分を鍛え、第一級のコンピュータサイエンティストになれるよう努力しています。