访谈嘉宾:

平山尚
1977年生于北海道,曾在京都大学研究生院工学研究科进行分子生物学的研究,2002进入世嘉株式会社,参与了《电脑战机》(PS2)、《超级网球大奖赛3》(AC、PS3)、SEGA CARD-GEN MLB(AC)、《超级网球大奖赛4》(PS3、360、Wii、VITA)的开发。他编写的《游戏编程权威指南》获得2009年CEDEC最佳著作奖,并被指定为SEGA公司新人培训教材。 enter image description here

视频访谈:

日语版链接

访谈内容:

大家好。本期图灵访谈我们有幸请来了《我的第一本编程书》的作者平山尚老师。平山尚老师毕业于京都大学,研究生期间主攻生物学。2002年进入世嘉公司后参与了“电脑战机”“超级网球大奖赛”等游戏的开发工作。他的处女作《游戏编程权威指南》在日本广受好评,被世嘉公司选为新人培训教材。最近的《我的第一本编程书》同样大获成功,至今已重印数次。

平山老师,感谢您百忙之中接受采访。

不用客气。

平山老师的履历中写到,研究生期间主攻的是生物学专业。那么为什么会选择进入游戏行业呢?

其实是为了逃避生物。我并不擅长生物学的实验。生物实验即花费时间,顺序又难懂,我有时甚至不理解一些实验步骤的做法。因为耗时过长,我又心急,所以实验做的很差。生物学中需要记忆的内容很多,搞不清理由也要死记硬背下去。而且我的英语不好,不善于阅读论文,更别说是让我写了。同时英语交流也不在行,总之不敢再沿着生物学的道路走下去了。于是试着面试了游戏公司和IBM这样的企业,正好通过了世嘉的面试,所以就进入游戏业工作了。

原来这样。那么进入公司前有多少编程经验呢?

进入公司前为了处理研究用的数据,或多或少使用过C++和Visual Basic。但在这之前,我已经先拿到了入职许可。从参加面试到拿到入职许可这段时间,我几乎完全没有写过代码。仅能用Perl写个留言板的水平,却让我拿到了入职许可。

那么刚进入公司时一定受了不少苦吧?

不可思议的是,开始编程后自然而然就学会了。所以(对于其他人)可能没有太大的参考价值吧。不过,虽说开始编程后自然而然就学会了,但我用在编程上的时间绝对不算短。新人培训结束后会,员工会被分配到各个小组中。从那之后,我每天10点到公司一直呆到深夜1点,每天写15个小时的程序。中午也几乎不怎么休息,可以说15个小时都用来编程了。虽然周日休息,但周六也会上班。每周六天,每天写15个小时程序的话,我想自然也就能学会编程了吧。

在学习编程的过程中,会用到算法、数据结构以及相关的数学知识。您怎么看待它们的重要性以及与编程的关系。特别是我经常看到“在工作中很少用到算法的知识,为什么面试中还要考呢?”这样的意见。您对这种观点有何看法?

这个问题很难回答。因为在工作中是否要用到算法是因人而异的。需要使用的人当然存在,我就是其中一员。像矢量、矩阵、四元数、排序、检索,等等,我每天都会用到。所以要是问我“为什么明明不用,却要学习?”的话,我会回答“不不,要用到的啊”。如果负责“在游戏中人物怎样移动比较有趣”“这个道具的出现概率应该是多少”这些内容的话,肯定用不到算法吧。

所以,不能一概而论。有一点需要补充的是,这种基础知识有助于锻炼大脑。我们在中小学学到的很多内容都是用来锻炼大脑的,只有一部分能拿来即用。算法大概也属于这一类吧。

无论是在中国还是日本,让小孩去上钢琴班、算数班等情况均不罕见,您觉得编程教育应该从何时开始呢?此外,怎么样才能让初学者对编程产生兴趣呢?

我没有教过对编程不感兴趣的人,小时候也没学过编程,所以这个问题不好回答。不过,我觉得没必要过早开始。可以试着把计算机和程序的书籍放到孩子身边。如果他们自己会去看的话,那会是个很好的契机,我想那个孩子一定会进步得很快。但如果没有这样的机会,却硬要在课堂上教中小学生编程,我想结果不会很好。首先老师就很难教好吧。在我看来,会编程的人一般来说都会去从事编程的工作,而老师们大多不会编程。

平山老师可否谈谈编写本书的缘由?

最直接的契机就是在九州大学授课的经历。本来是别人请我的前辈去讲,但因为他比较忙,所以前辈就让我去了。可是那里的学生大多属于艺术系,对编程并不在行。如此一来,我考虑先做一个半成品,让他们感受一下制作游戏的乐趣即可。就像是做菜时只需要把菜切好入锅,就能做出美味料理的半成品,有点类似于Unity的做法。但是这种方法用的人太多,没有什么新意,还不如不使用任何编程语言,让学生在只有点的状态下制作出游戏来。尝试之后发现效果还不错。

因此您选择在书中介绍程序员的思考方法,而非实际的解决方案,对吗?

实际的解决方案多种多样。不但制作的东西种类多样,而且游戏程序员与其他行业的程序员也完全不同。同时,语言、开发环境、机器均千差万别。10年前的游戏和现在的游戏也不一样吧。10年前根本想象不出智能手机上的游戏是什么样子。所以记忆一些库的用法意义并不是很大。“无论是怎样的开发环境和程序语言,我都能应付得了”--这样的状态才是最好的。为了达到这种“任何情况下我都能编出程序”的状态,我认为需要学会在没有任何道具的情境下编写程序。如果能学会在“只能绘制点”的情况下写出俄罗斯方块一般的游戏,那么在任何情况下都不会陷入窘境吧?

是的,那可否谈谈读者应该如何阅读本书呢?

按照我编写本书时的想法,依照顺序一边阅读,一边自己编写代码并加以确认是最有效的。不过若是别人让我来阅读本书,我肯定不会这么做。编程教科书中,是不是都有许多练习题?我从没做过。学校里的教科书亦然。无论是化学、数学还是生物,我都觉得太麻烦。所以我会选择一直读下去而不进行练习。像我这样的人肯定不少,这样的读者直接读下去就好了。等读完后发现了应该练习一下的部分,再去编写代码,重新确认也是完全可行的。

除本书以外,您的著作《游戏编程权威指南》在日本也博得了很高的人气与评价,可否告知一下此书的创作背景?

应该是2007年的时候,我负责新人培训工作,对来到我们部门的4名新人进行编程教学。但我发现市面上没有一本可以直接推荐给他们的书。虽然有一二十本以上关于数学、物理、C++的优秀书籍,但要让他们去读这些书,就太勉为其难了。他们的时间也不多,而且刚刚进入公司,若是直接把这些书一股脑给他们,难免会让他们产生厌恶的情绪。所以我就想到,难道不能用一本书解决吗?但我没能找到这样的书,所以只能自己制定课程,让他们学着做一些简单的游戏,或者去模仿一些游戏。培训结束后,我在自己的博客上写道,“要是有这样的书就好了啊。”正巧我的博客被出版社的人看到,就问我要不要试着写一本这样的书。一般而言,在公司里工作的人是不会写书的,又不怎么赚钱。但我询问了上司后,上司竟然同意了。正好当时也不太忙,所以就开始编写。没想到花费的时间远远超出想象,本以为大概会写300页左右,没想到最后的书长达900页,花费了9个月的时间。实在有点对不起我的上司。

说到游戏开发,随着Unity的普及以及移动游戏的逐渐流行,游戏制作的门槛已经低了不少。特别是使用Unity的话,可以不必再去学习曾被认为是必学语言的C++,平山老师怎么看待Unity这款游戏引擎?您认为游戏开发的入门者还需要学习C++吗?

我认为Unity非常优秀,为游戏制作提供了一条捷径。有了Unity这样的引擎,许多至今而言比较枯燥的部分、依靠程序员的死记硬背编写出来的部分就不再需要了。可以说这是时代进步的必然结果。比如我们生活中的快递公司,它们肯定不会自己去造运输用车吧。这种理所当然的事情在游戏界曾经不算理所当然。这种游戏引擎的出现,使得高级程序员才能做的东西不再是必需的了。我认为这是正确的趋势。

至于C++,也是同样的道理。如果不再需要了的话自然不用再去学习。但必须要说,学了自然比不学要好。在生活中,自然是会的东西越多越好。要是有余力的话,学一下总是好的。不过要是为了将来可能的需要而去学习的话,难免遇到挫折,也不会感到什么乐趣。所以需要用到C++时再学就行了。如果想提前学习的话,可以让自己的工作内容变得需要用到C++,比如说,进入到一些比较传统的游戏公司,依然需要编写C++的程序。进入这种公司的话,即便厌烦也必须去学习的吧。把自己放到那样的环境中就行了,不要想着等到学会C++后再去那样的环境中工作。学会C++后,就能了解到Unity的内部到底在做什么。因为Unity内部是用C++写成的。如此一来,就算是仅仅使用一下Unity,也能使用得更熟练一些。像性能优化、载入时间等内容,都会在了解了内部的程序后有所掌握。比如垃圾回收器突然开始运行导致程序变慢后,你就能想到“因为用C++写的话是这样的,所以会这么慢”。如此一来,就能和不会C++的人拉开很大的差距。

伴随着程序开发工具和游戏引擎的进步,仅仅数人就能完成游戏的开发与销售。那么专业的程序员应该如何提升自己的竞争力呢?

大方向应该分两种吧。第一种,去做一般的程序员做不了的工作。比如进入Unity内部后,肯定要用C++编写代码。那么像性能优化这种不需要像过去一样费心研究的内容依然不可或缺。这种人需要拥有很高的技术实力。因为现如今大部分地方都不需要钻研这些内容,所以不做到世界上数一数二的级别是不行的。总之,成为一流程序员是一种办法。另一种方法是着眼于现在Unity并没有提供,但是最好能用C++写出来,需要专业编程能力的部分。比方说,虽然相关的资源可能有一些,Unity中并没有过多涉及人工智能的内容。如果自己能编写这一部分的程序,那么一般人肯定无法做到,自然就有竞争力。这两种之外还有一个方法,就是成为能够展现出游戏本来趣味的人。也就是说,涉足策划领域。一个游戏成败与否,与参数的调整、AI的行为动作息息相关。如果掌握了这些一般人难以掌握的内容,那么一定能做出有趣的游戏。单纯的程序员做不到这些,单纯的策划人员因为不会编程,也无法直接写出游戏。若能两者兼修,就能找到自己的生存空间。

在平山老师眼中,编程到底是怎样一种存在?编程对您的生活和人生带来了哪些影响?

首先,编程是挣钱的工具。在我意识到自己能够编程前,我一直因为找不到赖以生存的技能而担心不已。生物学又不好,虽然是生物专业的研究生毕业,却完全不觉得自己擅长这方面。是不是件很痛苦的事情?但进入游戏公司,开始编程后发现自己做得还不错。可以说人生发生了很大的转变。因为我终于意识到,我可以凭借它挣钱的。可以说这改变了自己的人生。虽然编程只是个工具,但它给我指出了一条生存的道路,我必须要感谢它。

但与此同时,我要冒险说一句,我认为我并不热爱编程。我的一些同事,对编程有深深的爱,在家也会写程序。他们会把许多程序和开源代码拿来进行研究。我却不会在家编写代码,也不会去看别人的代码或者查一查有什么库存在。所以,我应该并不爱编程。但是,真正编写时是很开心的,因为我喜欢锻炼自己的大脑。总之,编程对我而言既是玩具,又是工具,但却说不上热爱。真是很奇妙的感觉。

访谈的最后,有什么想要对中国的读者说的吗?

那么就谈谈这本书吧。本书是写给那些认为自己“不能不学编程”的读者的。所以家长要是让孩子根据这本书进行学习的话,可能会有难度。因为没有特意添加什么有趣的要素。相较而言,不如让孩子去试试Unity或者Minecraft。这本书的对象是希望学习编程、希望自己能够编程的读者。针对这些读者,我尽了自己最大的努力去构思,去排除掉可能产生干扰的要素,希望能帮助所有有学习欲望的读者学会编程。

但不得不说,这依然是一份苦差事。在书中,我会有意写一些存在问题的代码,并在很多页后才指出来。整个阅读过程肯定不会轻松。若是先略加浏览后再编写代码的读者,对书的内容会有所把握,问题还不算大。但如果是从开头就认认真真边练习边阅读的话,需要做好受苦的准备。可我必须要说,能够克服这些辛苦的读者,才是最能从本书中获益的读者。因此,想要自己尝试一下编程,想要学会如何编程,以及虽然读过许多编程书却仍云里雾里的读者,已经工作却依然不自信是否能够编程的读者,比如因为“虽然掌握了某个库的使用方法,却不知道在其它环境下会怎样”而忐忑不安的读者,不妨尝试着阅读一下本书。

好的,谢谢您参加本期的图灵访谈。

谢谢。

图灵访谈特约记者: 张沈宇 《我的第一本编程书》译者,毕业于九州大学。大学期间主攻人机交互设计。现居日本东京,从事以自然语言处理为主的人工智能相关技术的研究与开发工作。