第3章: 理論と実践
受験生
2004年、高校3年生になった僕に、いよいよ大学受験が迫ってきました。中学生時代から続けてきたプログラミングが好きでしたし、得意分野でもあったので、大学は情報系に行こうと決めていました。そのときは、プログラムを学ぶと、その先は「システム・エンジニア」いわゆるSEという職業につくものらしいと何となく理解していたのですが、そのSEがどんなものなのかよくわかっていませんでした(結局僕がSEになることはありませんでしたが)。そのときの僕は大学卒業後のことよりも、とにかく大学でコンピュータについてもっと勉強をしたいと思っていました。国語、数学、物理などの科目は得意でしたが、英語は大の苦手でした。高校最後の英語のテストでは100点中17点という目も当てられない、散々な点数を取りました。情報系の学科がある大学で、英語が必要ないところということで横浜国立大学を第一志望にしました。一次試験では国立大学で一般的な5科目7教科のセンター試験があり、二次試験は数学のみの試験でした。センター試験の外国語は英語の他に中国語を選ぶことができたので、中国語ネイティブの僕は1問だけ何かを間違えたようでしたが、ほぼ満点を取りました。
横浜国立大学の二次試験の前日、それまで準備万端だったにもかかわらず、その晩は緊張してしまい一睡もできませんでした。そのまま朝になり、試験に向かったのですが、時計や文房具すら忘れ、わけもわからず試験が終了しました。みごと不合格でした。幸い、第二志望の信州大学には無事合格し、進学が決まりました。
余談ですが、受験をするにあたって、私立大学は我が家の財政事情を考えれば、初めから選択肢にはありませんでした。国立大学の学費はとても安く、入学金が約28万円、1年間の授業料が約54万円でした。これは2017年現在もほとんど変わらないようです。さらに、成績が良好で家庭の収入が低い学生には半額、場合によっては全額の減免措置があります。僕はその条件に当てはまっていたので、入学金は全額免除してもらい、授業料も半額免除してもらうことができました。祖母のお陰で日本に移住することができて、僕は本当に幸運でした。中国の大学事情はあまりよくわかりませんが、当時の家庭の事情を考えると中国にいたら、大学に行けたかどうかは定かではありません。一方で僕が今住んでいるアメリカでは上位の大学というのは大抵私立の大学です。コンピュータサイエンスの名門大学で言えば、マサチューセッツ工科大学、スタンフォード大学、カーネギーメロン大学などがありますが、もちろんどれも私立です。スタンフォード大学を例に取ると、学部の年間授業料が約6万7000ドル1(日本円で約750万円)になります。大学4年間の授業料は合計で3000万円にもなります。もちろん奨学金や学資ローンなどの援助はありますが、それでも生活費などを考慮に入れると、想像しただけで目眩がするような金額です。
日本ではお金を持っている人でもそうでない人でも、みんなに平等に機会が与えられていて、しっかり勉強さえすれば誰でもいい大学に通うことができます。
大学生
第一志望だった横浜国立大学は不合格だったものの、第二志望は無事合格し、2005年4月、僕は信州大学工学部情報工学科に入学しました。信州大学は8学部からなる総合大学で、長野県内にある5つのキャンパスにそれぞれの学部が散らばっています。工学部は僕の地元の長野市にあり、実家から車で20分ほどの場所にあります。実家から近いというのも信州大学を選んだ理由の1つでした。ただし、一年次は学部にかかわらず長野県松本市にあるキャンパスで学ぶことになっていたので、僕は実家を初めて離れ、松本市で一人暮らしを始めました。
入学時のオリエンテーションを済ませ、いよいよコンピュータサイエンスの勉強ができることに僕は心が高鳴りました。しかし僕の期待をよそに、いざ授業が始まってみると、それはまったく面白くありませんでした。待ちに待ったコンピュータサイエンスの授業では、僕が中学のときに独学で覚えたことが教えられていたのです。それもそのはずで、一年次の授業は総合的なものが多く、専門的な学習を始める前の準備段階でした。失望した僕は、だんだん授業をさぼりがちになってしまいました。課題やテストなどは適当に自学でこなし、授業に行かずにアルバイトに精を出すようになりました。いくつかのアルバイトを経て、派遣でエイデンという電機屋さんの修理カウンターでアルバイトを始めました。月に15万円、多いときには20万円ほど稼ぐようになりました。時給が1200円くらいの仕事なので、それだけの収入があったということは学業にあてるべき時間のほとんどを犠牲にしていたということです。アルバイトに明け暮れていた大学一年でした。
第二次世界大戦終結から60周年の2005年は、残念なことに中国で反日デモの嵐が吹き荒れた年でもありました。北京や上海などの大都市でデモ隊が暴徒化し、多くの日本車や日本の商店が打ち壊しになる姿が連日報道されました。在日中国人として、僕も家族もこのことを恥ずかしく思い、憤りました。僕は日本に来たことがある人や、日本で生活したことがある中国人で反日感情を持っている人に出会ったことはありません。日本を敵視し、日本製品の破壊活動を行っていた人たちの中で、本当の日本を知っている人はほとんどいなかったでしょう。一度日本に来て、伝統を重んじ、礼儀正しい日本人の姿を目にすれば彼らの考え方は違ったものになっただろうと思います。逆に言えば、中国や中国人を嫌悪している日本人もまた、中国に対して無理解な人が多いことも確かです。僕は幸運にも日本、中国、アメリカの3つの国で生活をし、多くの違った背景を持った人たちと出会うことができたので、言葉や文化、習慣、価値観などの違いを受け入れることができるようになりました。多くの人が海外に出かけ、他の文化を知ることで違いを受け入れられるようになってほしいと切に願います。
学べば学ぶほど
2006年、大学2年生になった僕は、信州大学工学部と僕の実家がある長野市へ戻りました。大学2年生ではいよいよ本格的な専門性の高い授業が始まりました。授業科目を挙げると、プログラミング言語、コンピュータ・アーキテクチャ、信号処理、論理回路、アルゴリズムとデータ構造など、名前を聞いただけでもわくわくするような授業ばかりでした。それまで独学で勉強していたプログラミングよりも一段深いレベルの学習に入り、僕は自分の知識がいかに表面的なもので、本質的なところに対する理解が足りていなかったかを知ることになりました。僕は確かにプログラミングの知識はあったのですが、それに対する数学的な理解や原理的な理解がまったく不十分でした。アルゴリズムとデータ構造の授業では特にプログラムを数学的に解析する方法や、性能を定量的に測る方法などを学びました。大学では『アプリの作り方』のような実践的なことよりも、プログラムが動く理論や原理を学ぶことの方が重要です。プログラミング言語は本を読めば独学でも学ぶことができ、それなりに動くようなものも作れるようになるので、一見早道のようにも思えます。しかし、その知識は砂上の楼閣にすぎず、見たことのない問題に突き当たったときに限界がやってきてしまいます。就職したときに即戦力になることを重視するばかりに、基礎を疎かにするような教育は大学ではすべきではないと思います。
専門的なことになじみの薄い読者のために、誤解を恐れずに例えると、それまでの僕の独学はまるでお料理番組を見て料理を作っていたようなものです。つまり、レシピがあればいろんなものを作れるし、調味料の種類もいろいろ知っている。自分でもアレンジした料理が作れるし、それなりにおいしいものが作れるといった具合です。大学で専門的な知識を学ぶことによって、料理に使う素材に対して徐々に理解が深まり、なぜこの素材を組み合わせるのか、それぞれの素材の栄養価がどうなっていて、どんな季節、場面でどんな料理を作るのがふさわしいのか、もっと根源的な理解が得られるようになったのです。
まさに「学べば学ぶほど、自分がどれだけ無知であるか思い知らされる2」の格言のとおり、勉強すればするほどわからないことが増え、勉強したい気持ちがより一層増していきました。
勉強が面白いので、自分でどんどん先に進みました。このときプログラミング言語の授業を担当していた新村先生に、MIT出版の『計算機プログラムの構造と解釈』という本を教えてもらいました。この本は1980年代からマサチューセッツ工科大学で使われている教科書で、プログラミングに関する抽象的な概念を解説した名著です。プログラミング言語には流行り廃りがあり、例えば僕が初めて学んだ言語である『Perl』はそのときはメジャーな言語でしたが、今ではあまり使われていません。しかし、プログラミングの概念は普遍的なものであるため、1980年代に書かれた本をいまだに教科書として使うことができるのです。
論理回路との出会い
大学の数ある授業の中で、僕を最も興奮させたのは井澤先生の『論理回路』という授業でした。論理回路というのはコンピュータを構成する電子回路の一種で、自動車で言えば歯車、建築で言えばネジのようなもので、コンピュータの根幹を支えるものです。それまでプログラミングだけを学んできた僕は、自分が書いたプログラムがどうして動くのか、そもそもコンピュータがどうして動いているのかを表面的にしか理解できていませんでした。車に例えると、運転はできていたけど、エンジンの中まではどういう仕組みで動いていたのかわかっていなかったと言えます。論理回路を学ぶことによって、コンピュータの仕組みを隅々まで網羅的に理解できるようになりました。井澤先生は物事をわかりやすく説明することが極めてうまく、僕はかじりつくように先生の言葉に耳を傾けました。授業が終わったあとに、もっと早く続きを勉強したいと考えた僕は、週末に井澤先生がインターネットに上げていた授業用の資料を見ながら一人で学習を進めていきました。「そういうことか!」、「わかった!」などと独り言を言いながら資料を読み進め、熱中のあまり、二学期分の課題を週末の2日で、すべて終わらせてしまいました。次の論理回路授業の時間、僕は意気揚々と井澤先生のところに課題をすべて終わらせたと報告に行きました。「全部終わったの? ほんとか?」と訝しがる先生に「はい、全部終わりました」と得意満面で返事をしました。それを聞いた井澤先生は「そうか、それならもう授業には出なくていい、好きなことをしなさい」と言ってくれました。それから僕は頻繁に井澤先生の部屋に通うようになりました。井澤先生は好きに使ってかまわないと空いていた部屋を1つ貸してくれました。その部屋にはハンダゴテなどの工具や部品がいろいろあって、小さな回路などを作ったりして遊びました。先生は僕の質問にはいつも丁寧にわかりやすく答えてくれました。
【コラム】コンピュータとは
パーソナルコンピュータ、略してパソコンをはじめとするコンピュータは、論理的、物理的に構造がミルフィーユのように幾層にも積み重なってできています。コンピュータのミルフィーユがどんな風に作られているか、簡単に説明します。
一番上にはソフトウェアがあります。中でも「アプリケーション」、もしくは「アプリ」と呼ばれる層がみなさんの一番身近にあるものです。『ポケモンGO』もアプリと呼ばれるものの1つです。アプリをすぐ下から支えている層は「オペレーティング・システム」いわゆる「OS」と呼ばれている層です。例えばウィンドウズやマック、アンドロイドやiOSがこれに当たります。この層ではアプリの管理をしたり、下の層であるハードウェアの管理を担当します。アプリやOS自体もまた幾重もの層から成り立っていますが、詳しい解説は専門書に譲るとします。「ソフトウェア・エンジニア」と呼ばれる職業はその名のとおり、このソフトウェアを作るのが仕事です。
ソフトウェアの下の層はハードウェアと呼ばれる層です。ソフトウェアが抽象的なものであるのに対して、ハードウェアは目に見えて触れられるものです。ディスプレイ、スピーカー、キーボード、プリンターなどはすべてハードウェアです。ハードウェアもソフトウェア同様、幾重もの層から構成されています。パソコンを分解してみると箱の中にはCPU、GPU、マザーボード、メモリ、ハードディスクなどが見つかります。これはゲーム機でも、スマートフォンでも細かい違いはあるものの、大まかな構成は同じです。
コンピュータミルフィーユのさらに下の層を見てみましょう。世の中には無数のハードウェアがありますので、すべてを網羅することはできません。ここではCPUを例にとって、その中がどうなっているのかを簡単に説明します。CPU複雑な「論理回路」と呼ばれるもので構成されています。論理回路は、その中を流れる電気を数字の0と1に見立て、それを使って計算をします。コンピュータの中で行われるどんな複雑な計算も、元を辿っていくと最後は0と1の羅列になります。0と1の羅列からなる数のことを「2進数」と呼びます。2進数は小さな数を表現する場合にも長い桁数が必要になってしまうため、人間が扱うときは複数の0と1を束ねたものを使います。それが第2章で僕がアクションリプレイから学んだ「16進数」なのです。16進数はあくまで人間のためにあるもので、CPUにとっては0と1だけで十分です。
CPUを構成する論理回路は「電子回路」と呼ばれるものの一種です。CPUにの中の電子回路は「トランジスタ」などの「半導体」と呼ばれる部品をつなげたものから作られています。鉄のように電気を通す物質は導体と呼ばれ、ゴムのように電気を通さないものは不導体と呼ばれます。半導体はちょうどこの中間の物質で、条件によって電気を通したり、通さなかったりします。例えば「ダイオード」と呼ばれる半導体があります。ダイオードは「足」が2本あり、そこにつなげた電気をプラス・マイナスの一方にのみ流す性質があります。豆電球に乾電池をつなぐとプラス・マイナスを逆にしても光りますが、ダイオードの一種である「発光ダイオード」は乾電池を逆につなぐと光らないのです。ダイオードをもう少し複雑にした「3本足」の半導体がトランジスタです。トランジスタでは2本の足の間を流れる電気3の量を3本目の足に流す電気で制御します。
トランジスタは原子番号14番のケイ素、英語ではシリコンと呼ばれる元素の結晶の上に少量のホウ素やリンなどの不純物を微量に添加することによって作られます。余談ですが、1955年にソニーは日本で初めてトランジスタを使ったポータブルなラジオTR-554を作り、日本の半導体産業の嚆矢となりました。アメリカでは1960年代インテルをはじめとした半導体産業が活発になり、これらの企業があった地域一帯は「シリコンバレー」と呼ばれるようになりました。僕がのちに就職するグーグルの本社もまさにシリコンバレーにあります。
最後のアルバイト
小学6年生のときに新聞配達を始めてから、アルバイトは大学2年生のときまで職種を変えながら続けていました。大学時代は、派遣社員としてヤマダ電機の店頭でダイソンの掃除機やiPod、マックなどのアップル社製品の販売をしていました。しかし、大学での勉強が面白くなるにつれて、時間が足りないと感じるようになっていきました。そしてあるとき、ふとアルバイトをしている時間がもったいないことに気づきました。大切な自分の時間をたった1200円で切り売りして、もし社会人になってから、20歳のときの貴重な時間を1時間1200円で買い戻そうとしてもできないということに気づいたのです。そう思ってから、アルバイトはすぐに辞めました。アルバイトに使っていた時間を勉強だったり、プログラミングだったり好きなことに使うようになりました。しかし、お金は必要なので奨学金を借りることにしました。未来の自分からお金を借りるつもりで、つまり未来の自分がこの20歳の時間を買っていると思うと、とても安いように感じました。このときに、大学1年生の1年間はもったいない時間を過ごしてしまったとも後悔しました。31歳になった今、あのときの判断が正しかったと振り返って思います。もし、今1時間1200円で20歳に戻れるなら、こんなにお得な話はありませんね。もしも読者が当時の僕のようにアルバイトに明け暮れている大学生でしたら、その時間を他のどんなことでもいいので自分の好きなこと、情熱を持っていることに使うようにおすすめします。
ゲーム再び
高校生以来あまり遊ばなくなってしまったゲームですが、興味を完全に失ったわけではありませんでした。大学3年生になり、コンピュータサイエンスの基礎がある程度身についた僕は、得られた知識を使って何かを作りたい衝動にかられていました。そこで思いついたのが「ファミコンを作る」ことでした。その正式名称『ファミリーコンピュータ』が示すとおり、ファミコンは正真正銘コンピュータなのです。インターネット上では有志によってファミコンは解析しつくされていたので、ファミコンがどんなコンピュータかは容易に知ることができました。1983年に発売されたファミコンはリコー製の8ビットのCPUを搭載していました。このCPUはアメリカのモステクノロジー社が1975年に開発した65025というCPUをカスタマイズしたものです。6502はアップル社のApple Ⅱに搭載されていたことで広く知られているCPUです。僕はこの古典的とも言えるCPUを今なら自分で再現できると考えました。自分でファミコンを作ってやろうと考えたのです。当時、信州大学工学部情報工学科には『エジソン・プロジェクト』と呼ばれる制度がありました。この制度は学生が自由に何か研究を行い、発表することで単位を得られるというものでした。エジソン・プロジェクトに絡めてファミコン開発をすることに決めました。
もちろんファミコンはCPUだけでなく、PPUと呼ばれるキャラクターを画面に出力するためのチップ、コントローラやカセットなど多数の部品から作られます。ハードウェアの経験がまだ少なかった僕は、いきなりそれを作るよりも、理解を深めるためにも得意なソフトウェア、プログラミングでファミコンをまずはパソコン上に再現しようと考えました。いわゆる「エミュレータ6」と呼ばれるものを開発しようというわけです。その頃に覚えた「C++言語」で開発を進めました。C++は中学生のときに勉強したものの、あまりに難しかったために挫折してしまったプログラミング言語です。しかし大学に入ってからまた独学で勉強し、このときにはすでに習得していました。中古ショップでファミコンと大量のカセットを買い、インターネットに散らばる資料を読み漁りながら、少しずつ開発を進めていきました。6502の動作は授業で勉強したCPUよりずっと複雑なものでしたが、動作原理はほとんど変わりません。メモリから命令の読み出し、解読し、実行したあと、結果を書き戻すライトバック、このCPUの基本的な動作原理に従って動いています。一方で画像処理用のチップであるPPUの方は動作原理がまったく違うものでした。CPUがキャラクターの位置や種類を計算し、PPUがそれを絵として描いてテレビ画面に出力するような具合です。試行錯誤を繰り返しながら、PPUや残りの部分もすべてC++で再現し、ついに僕は自分の作ったソフトウェアを使って、パソコンの上でマリオを走らせることに成功しました。自分で作ったファミコンのプログラムでマリオが走り出したときの喜びは何にも代えがたいものでした。このプロジェクト発表のときに聴講に来ていた学生の中に、のちに僕がグーグルへ就職するきっかけを作ってくれた岩崎さんがいました。岩崎さんは僕より2つ年上で、当時大学院1年生でした。岩崎さんは僕よりもプログラミングが得意で、いろいろな指摘やコメントをもらいました。
手作りファミコン
大学4年生になった僕は所属する研究室を決めなければなりませんでした。いろいろ迷った結果、岩崎さんがいる和崎先生の研究室に入ることに決めました。和崎研究室では形式検証と呼ばれる研究をしていました。しかし、僕は研究をしている場合ではありませんでした。それは「自分のファミコンを作る」という目標がまだ半分しか達成していなかったからです。パソコンの中ではファミコンを再現できたのですが、これはまだ第一歩にすぎません。次はいよいよハードウェアで実際に機械としてのファミコンを作りたかったのです。
手作りファミコンの設計図
和崎先生は学生に理解があり、やりたいことをサポートしてくれる先生でした。先生はファミコンを作るうえで必要な部品や工具などを購入してくれ、わからないことは親身に教えてくれました。それに加え、3年生のときに別の授業でFPGA(ハードウェアを作れるハードウェア)を使ってコンピュータの頭脳であるCPUを一から作った経験をしていた僕は、ファミコンを作る準備が整っていました。「ファミコンを作る」というのは一般的に「自作パソコンを作る」とはまったく違う性質のものです。いわゆる自作パソコンというのは、パソコンのパーツであるCPUやメモリ、それを載せるマザーボードなどのありものを買ってきて組み立てたものです。つまり、「作る」というよりも「組み立てる」といった方が正確です。一方で、ファミコンを作るということはありもののパーツを買ってきて組み立てるわけではなく、CPUから作らなければなりません。餃子の皮を買ってきて具を包むのではなく、餃子の皮を小麦粉から作るのと似ています。紆余曲折を経て、3カ月奮闘し、でき上がったのが次のページの写真にある「自家製ファミコン」です。
ファミコンなのにプレイステーションのコントローラが刺さっているのは、新村先生から借りていたFPGAの「ピン」つまりコネクタの数を節約するためでした。ファミコンのカセットは60ピンもあるため、FPGAにつなげるためには工夫が必要でした。その工夫の1つがプレイステーションのコントローラです。今では見かけることがほとんどなくなりましたが、昔のパソコンを使ったことがある方はプリンターポートというものを覚えている方も多いと思います。プリンターポートは大きなコネクタで、その名のとおりプリンターを接続するためのもので、ケーブルも小指ほどの太いものでした。これは「パラレル接続」と呼ばれるもので、たくさんの線が必要なものでした。2017年現在、ほとんどのプリンターは細いUSBケーブルでパソコンにつなげられています。USBは「シリアル接続」と呼ばれる方式で、少ない線で接続することが可能です。ファミコンのコントローラとプレイステーションのコントローラの違いはまさにパラレル接続とシリアル接続の違いです。コネクタのピンの数つまり接続する線の数を節約するためにシリアル接続のプレイステーションのコントローラを使ったのです。
大学時代の手作りファミコン実物とその裏側
このファミコンは写真にもあるように、カセットを刺して遊ぶことができます。ゲームがうまく起動しないときにはカセットを持って「フーフー」と息をかけると動くようになることも本物のファミコンと同じですし、ゲーム中に誤ってぶつかると画面が乱れ、ゲームが進行できなくなるのも同じでした。
このときはまさか夢にも思いませんでしたが、のちにこれを任天堂の故岩田社長にお見せすることになります。そのときのことはのちほど話すとして、ファミコンをゼロから自力で作れたことは自分がこれまで突き詰めてきたことの一定の結果が出たような気持ちになりとてもうれしかったです。
プレイステーション3
ファミコンの次はプレイステーションを作った……という話ではありません。2008年末、大学4年生の終盤に近づいた僕はプレステ3を購入しました。発売から数年経ったプレステ3は発売時の価格から下がり、中古であれば3万ほどで手に入るようになっていました。前々からほしいと思っていた『メタルギア・ソリッド4』も併せて購入しました。プレステ3初のメタルギア・ソリッドはストーリー、ゲーム性、ボリューム、グラフィックス、サウンド、どれを取っても一流の傑作でした。しかし、僕がプレステ3を買ったのは『メタルギア・ソリッド4』以外にもう1つ狙いがありました。それはプレステ3に入っていた「Cell」というプロセッサでした。僕は以前にコンピュータ・アーキテクチャの授業の課題として、Cellプロセッサの仕組みを調べ、発表していました。CellはIBM、ソニー、ソニー・コンピュータエンタテインメント(現ソニー・インタラクティブエンタテインメント)、東芝の4社によって共同で開発された7それまでのCPUとはまったく違う斬新なプロセッサでした。また、当時発売元はプレステ3上でプログラミングをすることを推奨していたため、個人でもプレステ3でプログラミングをすることができました。そのとき偶然、株式会社フィックスターズによって『Hack The Cell』というプレステ3のCellプロセッサを使ったプログラミングコンテストが行われていたので、これに参加することにしました。『Hack The Cell』ではメルセンヌ・ツイスタという乱数(ランダムな数字)を発生させるプログラムをCell上でどれだけ高速化できるかを競うものでした。コンテストの初期は、参加者がインターネットの掲示板で経過報告をし合っていました。初めのうちは2倍になった、3倍になったといった報告だったのが、時間が経過するにつれて10倍、20倍というような数字が出るようになりました。まるでドラゴンボールの戦闘力のようにインフレしていく速度に参加者は疑心暗鬼になり、報告が次第に減っていきました。結果から言うと、僕は60倍ほどまで高速化しましたが、優勝した方は120倍まで高速化していました。それでも、僕のコードがシンプルだったことが評価され、フィックスターズ賞という賞と併せて賞金10万円をもらいました。プレステ3のもとは取れました。
日本人
大学4年生のこの年、僕は帰化の手続きを行い、日本人になりました。日本で10年以上生活し、もはや中国に帰って生活することはないだろうと考えての判断でした。中国のパスポートにハサミが入り、このときから「野村達雄」は僕の正式な名前になりました。
-
2017年5月現在、スタンフォード大学公式ホームページ(https://registrar.stanford.edu/students/tuition-and-fees)より ↩
-
「学べば学ぶほど、自分がどれだけ無知であるか思い知らされる」……英語では“the more I learn, the more I realize how much I donʼt know” 一般にアインシュタインの言葉と言われるが、出典は不明 ↩
-
電気……正確には電流 ↩
-
『MADE IN JAPAN(メイド・イン・ジャパン)―わが体験的国際戦略』 盛田昭夫 ↩
-
コンピュータ歴史博物館の公式HP(http://www.computerhistory.org/timeline/1975)より ↩
-
エミュレータ……所定のコンピュータや機械装置を模倣するプログラムの一種 ↩
-
IBM社のプレスリリース(http://www-06.ibm.com/jp/press/20050208002.html)より ↩