第3章: 理论与实践
备考生
2004年,上了高三的我,大学入学考试迫在眉睫。因为我从初中时代就一直喜欢编程,而且这也是我的强项,所以我决定报考信息相关专业的大学。那时,我大致了解到学习编程之后,通常会成为”系统工程师”,也就是所谓的SE,但对SE具体是做什么并不太清楚(结果我最终并没有成为SE)。当时的我与其考虑大学毕业后的事情,不如说只是单纯地想在大学里学习更多关于计算机的知识。虽然语文,数学,物理等科目我都很擅长,但英语却是我的弱项。高中最后一次英语考试,我只得了17分(满分100分),成绩惨不忍睹。于是我把横滨国立大学作为第一志愿,因为那里有信息系的学科,而且不需要英语。第一轮考试是国立大学通用的5教科7科目的中心考试,第二轮则只考数学。中心考试的外语可以选择英语以外的中文,作为中文母语者的我只错了一题,几乎得了满分。
横滨国立大学第二轮考试的前一天,尽管我做了充分的准备,但那晚因为紧张而完全无法入睡。就这样到了早上,我前往考场,甚至连手表和文具都忘了带,考试结束后我一片茫然。不出所料,我落榜了。幸运的是,我顺利通过了第二志愿的信州大学,确定了升学去向。
题外话,在准备考试时,考虑到我家的经济状况,从一开始私立大学就不在选择范围内。国立大学的学费非常便宜,入学金约28万日元,一年的学费约54万日元。这似乎在2017年至今都没有太大变化。此外,对于成绩优良且家庭收入低的学生,还有半额甚至全额减免措施。我符合这些条件,因此获得了全额免除入学金和半额免除学费的待遇。多亏了祖母,我才能移居日本,我真的很幸运。虽然我不太了解中国的大学情况,但考虑到当时家庭的状况,如果留在中国,我能否上大学还是个未知数。而现在我居住的美国,顶尖大学大多是私立的。计算机科学的名校如麻省理工学院,斯坦福大学,卡内基梅隆大学等,当然都是私立的。以斯坦福大学为例,本科年学费约为67000美元1(约合750万日元)。大学四年的学费总计高达3000万日元。当然有奖学金和学生贷款等援助,但考虑到生活费等,仅仅想想就令人头晕目眩。
在日本,无论是有钱人还是没钱人,每个人都有平等的机会,只要努力学习,任何人都能进入好大学。
大学生
虽然第一志愿的横滨国立大学落榜了,但第二志愿顺利通过,2005年4月,我进入了信州大学工学部信息工程系。信州大学是一所拥有8个学部的综合大学,各学部分散在长野县内的5个校区。工学部位于我家乡长野市,从家里开车只需20分钟左右。选择信州大学的原因之一就是离家近。不过,一年级无论哪个学部的学生都要在长野县松本市的校区学习,所以我第一次离开家,开始了在松本市的独居生活。
完成入学培训后,我对终于能学习计算机科学感到心潮澎湃。然而,与我的期待相反,当课程开始后,它一点也不有趣。在我期待已久的计算机科学课上,教的都是我初中时就自学掌握的知识。这也不奇怪,因为一年级的课程多是综合性的,是专业学习前的准备阶段。失望的我逐渐开始逃课。我随便应付作业和考试,不去上课而是专注于打工。尝试了几份工作后,我开始在名为爱电的电器店修理柜台做派遣工。每月收入15万日元,多的时候能达到20万日元。时薪约1200日元,能有这样的收入意味着我牺牲了几乎所有应该用于学业的时间。大学一年级就是这样在忙于打工中度过的。
2005年是第二次世界大战结束60周年,遗憾的是,这一年中国也刮起了反日示威风暴。北京,上海等大城市的示威队伍变成暴徒,许多日本车和日本商店被打砸的场景每天都在报道中出现。作为在日中国人,我和家人对此感到羞愧和愤怒。我从未遇到过来过日本或在日本生活过的中国人对日本怀有敌意。在仇视日本,参与破坏日本产品活动的人中,几乎没有真正了解日本的人。我相信,如果他们来过日本一次,看到尊重传统,礼貌有礼的日本人,他们的想法可能会有所不同。反过来说,厌恶中国和中国人的日本人中,很多人对中国也缺乏了解,这也是事实。我很幸运能在日本,中国,美国三个国家生活,结识了许多不同背景的人,因此能够接受语言,文化,习惯,价值观等的差异。我衷心希望更多人能出国旅行,了解其他文化,从而接受这些差异。
学得越多
2006年,升入大学二年级的我回到了信州大学工学部所在地,也就是我家所在的长野市。大学二年级开始了真正专业性更强的课程。课程包括编程语言,计算机架构,信号处理,逻辑电路,算法与数据结构等,光听名字就让人兴奋的课程。比起之前自学的编程,我进入了更深层次的学习,并意识到自己的知识多么肤浅,对本质的理解多么不足。我确实有编程知识,但对它的数学理解和原理理解完全不够。特别是在算法与数据结构课程中,我学习了如何数学地分析程序,如何定量测量性能等。在大学,比起学习”如何制作应用”这类实践知识,学习程序运行的理论和原理更为重要。编程语言可以通过读书自学,也能制作出能够运行的程序,这看起来像是捷径。然而,这种知识如同沙上楼阁,一旦遇到从未见过的问题就会遇到瓶颈。我认为大学不应该过分强调就业即战力而忽视基础教育。
为了让对专业知识不熟悉的读者理解,不怕被误解地打个比方:我之前的自学就像看烹饪节目做菜。也就是说,有菜谱就能做各种菜,也知道各种调味料。能自己改良菜肴,也能做出相当美味的食物。通过在大学学习专业知识,我对烹饪材料有了更深的理解,明白为什么要组合这些材料,每种材料的营养价值是什么,在什么季节,场合做什么菜最合适,获得了更本质的理解。
正如”学得越多,越发现自己无知”2这句格言所说,越学习越发现不懂的东西增多,学习的欲望也越发强烈。
因为学习很有趣,我自己不断地向前推进。这时,教授编程语言课程的新村老师向我推荐了MIT出版社的《计算机程序的构造和解释》这本书。这本书自1980年代起在麻省理工学院使用,是解释编程抽象概念的名著。编程语言有流行和过时,例如我最初学习的”Perl”语言当时很主流,但现在很少使用。然而,编程概念是普遍的,因此即使是1980年代写的书,至今仍能作为教科书使用。
逻辑电路的邂逅
在大学众多课程中,最让我兴奋的是井泽老师的”逻辑电路”课。逻辑电路是构成计算机的电子电路的一种,就像汽车中的齿轮,建筑中的螺丝,是支撑计算机核心的组件。之前只学习编程的我对自己写的程序为何能运行,计算机本身为何能运行只有表面理解。比如说,就像能开车但不知道发动机内部原理一样。通过学习逻辑电路,我能全面深入地理解计算机的运作机制。井泽老师非常擅长通俗易懂地解释事物,我全神贯注地听他讲课。课后,因为想更快地学习后续内容,我在周末通过井泽老师上传到网上的教学资料自学。一边自言自语”原来如此!”,”我明白了!”一边阅读资料,如此沉迷以至于在周末两天内完成了整个学期的所有作业。下一次逻辑电路课上,我兴高采烈地向井泽老师报告我完成了所有作业。”都完成了?真的吗?”老师怀疑地问道,我得意地回答:”是的,全部完成了。”听到这话,井泽老师说:”这样啊,那你就不用来上课了,去做你喜欢的事吧。”从那以后,我经常去井泽老师的办公室。井泽老师借给我一个空闲的房间,说随便用。房间里有烙铁等工具和各种零件,我用它们制作小电路玩耍。老师总是耐心详细地回答我的问题。
【小专栏】什么是计算机
个人计算机(简称PC)等计算机在逻辑和物理结构上像千层酥一样由多层叠加而成。下面简单解释计算机的”千层酥”是如何构成的。
最上层是软件。其中被称为”应用程序”或”应用”的层是大家最熟悉的。《精灵宝可梦GO》就是应用程序的一种。紧接着支撑应用的是”操作系统”,也就是所谓的”OS”层。例如Windows,Mac,Android或iOS都属于这一类。这一层负责管理应用程序和下面的硬件层。应用和OS本身也由多层组成,但详细解释就留给专业书籍了。”软件工程师”这一职业顾名思义就是制作软件的工作。
软件下面的层是称为硬件的层。与软件是抽象的不同,硬件是可见可触的实体。显示器,扬声器,键盘,打印机等都是硬件。硬件和软件一样,也由多层组成。拆开电脑,盒子里可以找到CPU,GPU,主板,内存,硬盘等。游戏机或智能手机虽有细微差别,但大体构成相同。
让我们看看计算机”千层酥”更下面的层。世界上有无数种硬件,无法全部涵盖。这里以CPU为例,简单解释其内部结构。CPU由复杂的”逻辑电路”组成。逻辑电路将流过的电流视为数字0和1,用它们进行计算。计算机内部进行的任何复杂计算,追根溯源最终都是0和1的序列。由0和1序列组成的数被称为”二进制数”。由于二进制表示小数字也需要很长的位数,人类处理时会将多个0和1打包使用。这就是第2章中我从Action Replay学到的”十六进制”。十六进制只是为了方便人类使用,对CPU来说,0和1就足够了。
构成CPU的逻辑电路是”电子电路”的一种。CPU内的电子电路是由连接”晶体管”等”半导体”部件制成的。像铁这样导电的物质被称为导体,像橡胶这样不导电的物质被称为绝缘体。半导体正好处于中间,会根据条件导电或不导电。例如有一种叫做”二极管”的半导体。二极管有两个”脚”,它的特性是只让电流从一个方向流过。小灯泡连接电池时,无论正负极如何连接都会亮,但”发光二极管”(一种二极管)如果电池接反则不会亮。比二极管稍复杂的”三脚”半导体就是晶体管。晶体管通过第三只脚的电流来控制另外两只脚之间流动的电流3量。
晶体管是通过在原子序数14的硅(英语称为Silicon)结晶上添加微量的硼或磷等杂质制成的。顺便一提,1955年索尼制造了日本第一台使用晶体管的便携式收音机TR-554,开创了日本半导体产业的先河。在美国,1960年代以英特尔为首的半导体产业蓬勃发展,这些企业所在的整个地区被称为”硅谷”。我后来就职的谷歌总部就位于硅谷。
最后的兼职
从小学六年级开始送报纸以来,我一直在换着工作打工,直到大学二年级。大学期间,我作为派遣员工在山田电机门店销售戴森吸尘器,iPod和苹果公司的Mac等产品。然而,随着大学学习变得有趣,我开始感到时间不够用。有一天,我突然意识到打工的时间是多么浪费。我意识到我正在以每小时1200日元的价格出售我宝贵的时间,如果将来成为社会人后想以每小时1200日元买回20岁时的宝贵时间,是根本不可能的。想通这一点后,我立即辞掉了兼职工作。我开始将原本用于打工的时间用于学习,编程或自己喜欢的事情。不过,因为还是需要钱,所以我决定申请奖学金。我把它想象成是从未来的自己那里借钱,也就是说,未来的自己正在购买这20岁的时间,这样想来感觉非常划算。这时我也后悔浪费了大学一年级的一整年时间。现在31岁的我,回顾那时的决定认为是正确的。如果现在能以每小时1200日元回到20岁,那就再划算不过了。如果读者中有像当时的我一样忙于打工的大学生,我建议你将时间用在其他任何自己喜欢,有热情的事情上。
重返游戏
自高中以来我很少玩游戏,但并没有完全失去兴趣。升入大学三年级,掌握了一定计算机科学基础的我,被一种创造欲望所驱使,想用所学知识制作些东西。于是我想到了”制作任天堂红白机”。正如其正式名称”Family Computer”所示,红白机确实是一台计算机。在互联网上,志愿者们已经彻底解析了红白机,所以很容易了解红白机是什么样的计算机。1983年发售的红白机搭载了理光制造的8位CPU。这款CPU是美国Mostek公司1975年开发的65025定制版。6502因搭载在苹果公司的Apple II上而广为人知。我认为现在的我可以重现这款堪称经典的CPU。我决定亲自制作一台红白机。当时,信州大学工学部信息工程系有一个称为”爱迪生项目”的制度。这个制度允许学生自由进行研究并发表,以此获得学分。我决定将红白机开发与爱迪生项目结合起来。
当然,红白机不仅包括CPU,还有称为PPU的用于在屏幕上输出角色的芯片,控制器和卡带等众多部件。由于我在硬件方面经验尚浅,比起直接制作,我认为先用擅长的软件编程在电脑上重现红白机,有助于加深理解。也就是说,我想开发所谓的”模拟器6“。我用当时学会的”C++语言”进行开发。C++是我初中时学习过但因太难而放弃的编程语言。不过,进入大学后我又自学了它,这时已经掌握了。我在二手店买了红白机和大量卡带,一边查阅互联网上发布的资料,一边逐步推进开发。6502的运作比课堂上学到的CPU复杂得多,但基本原理几乎相同。它遵循CPU的基本原理:从内存中读取指令(fetch),解码(decode),执行(execute),然后写回结果(write back)。而用于图像处理的PPU芯片则有完全不同的工作原理。CPU计算角色的位置和类型,PPU将其绘制成图像并输出到电视屏幕上。经过反复试错,我用C++重现了PPU和其余部分,最终成功地用自己制作的软件在电脑上让马里奥奔跑起来。看到马里奥在我自制的红白机程序中奔跑的喜悦是无可替代的。在这个项目发表时,来听讲的学生中有岩崎先生,他后来成为我加入谷歌的契机。岩崎先生比我大两岁,当时是研究生一年级。他的编程能力比我强,给了我许多指点和评论。
手工制作的红白机
升入大学四年级的我必须决定加入哪个研究室。经过各种考虑后,我决定加入岩崎先生所在的和崎老师研究室。和崎研究室研究的是形式验证。然而,我当时无暇进行研究,因为我的”制作自己的红白机”目标只完成了一半。虽然在电脑中重现了红白机,但这只是第一步。接下来我想真正以硬件形式制作红白机机器。
手工制作的红白机设计图
和崎老师对学生有深入的理解,支持我们想做的事情。老师为我购买了制作红白机所需的零件和工具,耐心地教我不懂的东西。此外,我在大学三年级时通过另一门课程已经使用FPGA(可以制作硬件的硬件)从零开始制作了计算机核心CPU的经验,为制作红白机做好了准备。”制作红白机”与通常所说的”组装自己的电脑”完全不同。所谓组装电脑,是购买现成的电脑零件如CPU,内存,主板等然后组装起来。严格来说,与其说是”制作”,不如说是”组装”更准确。而制作红白机并非购买现成零件组装,而是需要从CPU开始制作。这就像不是买现成的饺子皮包馅,而是从面粉开始制作饺子皮。经历了种种波折,奋战了3个月,终于完成了下一页照片中的”自制红白机”。
红白机却插着PlayStation的控制器,这是为了节省从新村老师那里借来的FPGA的”针脚”即连接器数量。因为红白机卡带有60个针脚,连接到FPGA需要一些技巧。这些技巧之一就是使用PlayStation控制器。现在几乎见不到了,但使用过旧电脑的人可能还记得打印机端口。打印机端口是一个大型连接器,顾名思义是用来连接打印机的,电缆粗如小指。这是所谓的”并行连接”,需要很多线。到2017年,大多数打印机都可以用细细的USB线连接到电脑。USB是一种称为”串行连接”的方式,可以用少量线路连接。任天堂红白机控制器和PlayStation控制器的区别正是并行连接和串行连接的区别。为了节省连接器针脚数量即连接线数量,我使用了串行连接的PlayStation控制器。
大学时代手工制作的红白机实物及其背面
正如照片所示,这台红白机可以插入卡带游玩。游戏无法顺利启动时,拿出卡带”呼呼”吹一口气就能恢复,这点与真正的红白机相同;游戏中不小心碰撞时画面会混乱,导致游戏无法继续,这点也一样。
当时我做梦也没想到,后来我会有机会向任天堂已故的岩田社长展示这个作品。关于那次经历我稍后再讲,能够从零开始完全靠自己制作出红白机,让我感觉自己所有钻研的努力终于有了一定的成果,非常开心。
PlayStation 3
接下来不是制作PlayStation的故事。2008年底,接近大学四年级尾声时,我购买了PS3。发售几年后的PS3价格已经下降,二手的话约3万日元就能买到。我同时购买了一直想要的《合金装备固体4》。PS3首款合金装备固体在故事,游戏性,内容量,图像,声音等各方面都堪称一流杰作。但我购买PS3还有另一个目的,那就是PS3中的”Cell”处理器。我之前在计算机架构课程的作业中研究并发表了Cell处理器的工作原理。Cell是由IBM,索尼,索尼电脑娱乐(现索尼互动娱乐),东芝四家公司共同开发的7,与之前的CPU完全不同的创新处理器。此外,当时发行方鼓励在PS3上编程,个人也可以在PS3上进行编程。恰巧,Fix Stars公司举办了一个名为”Hack The Cell”的编程比赛,利用PS3的Cell处理器,我决定参加。”Hack The Cell”比赛是看谁能在Cell上最大程度地提高梅森旋转算法(生成随机数的程序)的速度。比赛初期,参赛者在互联网论坛上互相报告进展。一开始是报告提速2倍,3倍,随着时间推移,出现了10倍,20倍这样的数字。参赛者对这些如同龙珠战斗力一样不断膨胀的速度产生怀疑,报告逐渐减少。结果,我将速度提高了约60倍,但优胜者达到了120倍。尽管如此,由于我的代码简洁,获得了Fix Stars奖和10万日元奖金。PS3的成本回来了。
日本人
大学四年级这一年,我办理了入籍手续,成为了日本人。在日本生活了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》 盛田昭夫 ↩
-
计算机历史博物馆官方网站(http://www.computerhistory.org/timeline/1975) ↩
-
模拟器…模仿特定计算机或机械装置的一种程序 ↩
-
IBM公司新闻稿(http://www-06.ibm.com/jp/press/20050208002.html) ↩