程序员访谈(三):终身学习的一代人

受访者简介:Andy Matuschak,现就职于知名在线教育网站 Khan Academy 领导其移动开发团队。在之前他担任了 iOS 4.1 至 8 的 UIKit 的开发和维护工作。同时 Andy 也是 Mac 知名框架 Sparkle 的创建者。可以说无论是 iOS 开发者还是 Mac 开发者,我们其实每天都在使用着 Andy 所开发的东西。

Andy Matuschak

Andy,谢谢你抽空接受采访。可以跟我们谈谈你是如何开始编程的吗?

我想应该跟很多人一样是从游戏开始的。小时候有段时间,家里是不允许我玩游戏机的,于是我就经常去公共图书馆。在我九岁的时候,我发现那些我以为是教编程的书其实只是罗列了基本的源码。还有一些讲游戏设计的书整本都是源码。于是当我想玩游戏的时候就把这些源码输入计算机,但又常常半路遇到语法错误,而我当时还不能理解这些错误信息,也不知道如何解决。所以我不得不重来一遍,直到我终于可以玩这个游戏,如此反复之后我意识到我可以修改这个游戏,而从那以后就一发不可收拾了。我学了 C++ — 那时我大概 10 岁 — 因为人们是用它写游戏的,我试图写过一个 MUD 游戏 — 那是我第一个大项目,还进行的不错…

你完成它了吗?

单人模式下所有功能都可以很正常的运行,但多玩家的模式没有完成 — 所以我想答案应该是没有吧。因为后来我转移注意力到图形方向去了,开始迷恋上 GL 和 3D 渲染之类的事情。

然后你就继续做游戏?

我做了一阵游戏引擎之类的东西,看了所有 OpenGL 的教程,什么旋转的方块啊,颗粒引擎啊这些东西,然后我开始做真正的游戏。在那个时候,对一个 13 岁的我来说,那真是繁复的工作。我发现没有足够好的图形工具来显示游戏内容。于是,我跟我的室友开始做一个像素编辑器。我们把它叫做 Pixen。那是我第一次接触 Cocoa,还是开源的。当我们发布 1.0 版本的时候,我当时大概 14 岁吧,我们去购物中心里面苹果商店的 OS X Panther (还是 Jaguar?) 的发布会。那个时候他们就开始搞发布会了!我们想赠送我们那个像素编辑器的 CD。

是不是有其他的什么可能你就不会成为一个程序员了?你当时还对其他什么特别感兴趣吗?

我当时的理想就是成为某种工程师。我当时对电气工程,或者甚至是高中的那些化学小实验的理工科挺着迷的,所以当时是想成为这些工程师中的一种,而软件工程是我当时真正可以着手做的。当时我把这称为编程,而不是软件工程,于是有些人告诉我:“不对不对,你应该叫它计算机科学!”当然,在当时,我并不明白在计算机科学,软件工程和编程当中暗流汹涌的文化差异,我只觉得它们是很有用的清晰的术语。但其实我们常常把它们用错了。

好勒。那你现在基本上就是软件工程师了?

我肯定不是计算机科学家,虽然我是学这个的。我觉得我差不多算是软件工程师,一个深受计算机科学影响的软件工程师。不过我最近会花大概一半时间做一些儿童教育方面的研究,读论文和书籍,分析设想,我们希望能在这个方向略尽绵力。

离开 Apple 去 Khan Academy,帮助人们学习和教育,看起来是个不小的跨越。这是怎么发生的呢?是什么促动你的?

这个, 我想我可以从其他一些事来回答这个问题… 我之前去加州理工学习过一段时间,这所学院支持了大量自然科学的项目,诸如 NASA 和 DARPA,所以当时的讨论都集中在人性化影响上。当时有一个 NASA 的人过来对我们说:“好了,你们是最优秀的,而你们即将在世界上最好的研究学院之一学习,你们将拥有无数可能。这对你是无限机遇,而你们也应当把握这样的机遇,将它们利用来做些真正有意义的事情。”

当我来到更广阔的软件社区里时,我是少数的几个毕业之后没有去做研究的人之一。刚毕业的时候我希望能做一些事情,但我对大多数商业软件工程和软件销售的能产生的影响和追求的目标感到失望,于是我冥思苦想到底可以在哪个领域发挥我的专长, 而最先踏出的第一步最终决定了我的方向。我深受物理学家 David Deutsch 的影响,通过他我确认了我想要走的方向,那就是扩展人类知识和能力范围,继而我就开始思考怎样才可以做到。

如果人类能活得更久一些,那我们就能在知识能力上走得更远,所以在生物技术和化学工程会有很多的机遇。如果人类有更好的工具进行试验,也能更进一步,所以在工具制造,综合工具,虚拟现实,或者是接下去的人工智能领域也都有很多的机会。但基于我的背景和机遇,我最终决定在教育方面做一些贡献,我认为这将会是更好的选择。因为如果我可以创造终身学习的一代人,那么我们将有更多的人来解决这些问题。

那么你是想为后代打造一些帮助学习的工具以便于他们解决更艰难的问题?

是的,那是我的期望。学习的一大挑战就是元学习 (meta learning,即“学习如何学习”)。这是一种可以不必摧毁自信或摧毁学习态度的学习方式。如果我开发的这些工具不但可以让毕业生得到相同成绩,并且他们最终不但对数学有更好的认知而且会更倾向于在之后的生活中学习数学,那我就达到目标了。

看起来很显然你并不满意我们已有的教育?你可以详细谈谈吗?

是的,它还不够好,并且在很多方面都不够好。最缺乏的是没有让学生得到刚才我说到的那些机遇和资源,我觉得那是最重要并且最首要需要改善的事情。所以这就是为什么现在的任务是给所有人提供免费教育,而 Khan Academy 的使命是为大家提供世界一流的免费教育。所以现在我们会先将重点集中在为大家提供免费教育上面,接下来会是世界一流的免费教育。但那是后续的事了,因为我对现在所谓的世界一流还有些怀疑和考虑。

我有很多同学接受了最好的付费教育,由诺贝尔获奖者授课。尽管如此,他们的学习态度却很糟,认为一毕业就算完。他们只想结束这一切然后去找份稳定的工作,放空大脑,因为他们已经被系统和制度打倒,而好奇心跟智慧也已经枯竭。

听上去真让人沮丧…

是啊。如果你问人们你觉得数学怎么样,大多数人都会回答说:“哦,数学很无聊。”或者“我数学不好,我不太适合学数学。”。如果你问他们对科学的态度,答案也类似。但如果问到文学,或许他们会谈论一些他们读过的书籍里的有趣桥段,但那也只是他们学生时代读过的罢了,现在已经停止阅读了。所以我最期望影响的是改变人们认为教育随着大学毕业一并终止了这一认知。而这其实并不是一个技术上的问题,所以我对给我自己贴上“软件工程师”的标签有些顾虑。虽然我大部分的经验与之相关,但我的目标是却不是这个方向。

既然你现在在终身学习上面有这样一个大计划,那你对你十年后的愿景是怎样的呢?你期望达到什么目标?

眼下,学习的标准含义已经被普遍认可。不论是读教课书,看一个视频还是听一个演讲,你都是被动的吸收知识。你只用坐在那接收,或许如果你比较有钱的话还可以在之后有个对话交流之类的。但当你毕业之后,你必须自己去创造这样的学习环境。我对所谓的构建式学习环境 (constructivist learning environments) 很感兴趣。这是一位几十年前的学习研究者 Papert 创造的术语。在构建式学习环境下,学生由被动的从教科书里学习转变成自主的创造知识。在这样的模式下,会更像是创造了一种环境,让你在这样的氛围中积极主动的理解事物继而掌握它们。

Papert 的研究里有一个例子,他尝试用 Logo 来教学生抽象及程序性思维,而不是编程本身。 他甚至有一个教室里挂了一个 Logo 的海龟的标志。那时候还有一种机械海龟,可以在真的纸上作画。这个教室四周挂满了画,有些是源代码生成的,有些不是。这些画作会随着一批批的学生换掉,因为比如有些学生会看到一朵花然后说:“哦,我喜欢那个图,能给我吗?”然后教师会说:“当然可以,不过你必须输入这些代码,海龟会按代码画出这个图。”接着学生会说:“好的。”然后开始画画。之后他或许又看上其他画作,但那些并没有源代码,于是他就得自己想办法。

教室里这些没有源码画作是被设计出来的,需要学生理解原理后制作出来。创造性环境就这样塑造出来了。我正在研究这个很可能会被研究很多年的假说,首先是允许人们自助的构建知识,那么将很可能得到同样的学习效果,当然如果达到这一结果我会非常高兴,不仅如此,他们还会在自我认知,学习态度和学习兴趣上都比其他同学高出不少。

除了用构建式方式鼓励人们更主动的学习之外,另一个相比你在 Khan Academy 做的和更传统的教育方式之间的主要区别是更自由地选择想学习什么以及什么时候学习。那么你觉得这个改变有什么影响呢?

另外有一个儿童教育研究者 Piaget 对此有很多的研究成果。他认为对青年一代的开发当中最重要的事情之一是对自主性的训练。而这里的自主性比我们平时认为的自主性还要更宽范一些。不是“我可以随便的玩”这样的自主性,而是“我正在对我生活中所有的的事情做决定”。这跟其他人来告诉你要怎么分配你的时间或诉诸权威是相抵触的。比如说,常规性的回答 “Bobby 在玩游戏的时候作弊了” 这样的问题,会是 “哦,我去找他谈谈”。与之相反的,如果是自主性的回答将会是 “那么你是怎么跟 Bobby 说的?”。我认为自主性的训练在各方面都是非常重要的。有些研究认为这会在短期内得到更好的效果,但我认为从长期来说也会引导出更善于思考的人。

我对那种一整天的日程都被别人安排的情况很质疑。我认为如果一个导师以日复一日的调整学生的学习环境来达到修正学生学习进程的方式会是更积极的。确切一点,举个例子,比方说与其一次性给学生全部人类知识的目录,并且把每个知识点都按重要程度分类,我认为更好的方式是把所有的知识都看成是书架上的书,然后按难易程度由低到高的摆放。

那么在 Apple 有没有什么很让你怀念的呢?

当然,我怀念那儿的人,这太重要了。事实上这正是我对这个行业感到一些失望的地方。有这么多优秀的人被局限在这些巨型公司里,他们只是偶尔被善加利用,但更经常的情况下他们只是一台机器的零件,但以他们的智慧其实可以做更大更影响深远的贡献。我并不是说一定要来我这个项目,我是指更广泛的情况。让我觉得有点伤感的不仅仅情感上的想念,我更怀念的是诸如当时在 NeXT 和那些非常有经验的人进行的非常有激发性的谈话。我仍然希望他们可以发挥更大的影响力。

可以多分享一下在 Apple 的时光吗?开发一个被如此多人使用的框架是个什么体验?而你又是怎么从做游戏一步步达到的?

填补这中间的鸿沟的一件事是当我 16 岁的时候,我写了一个叫 Sparkle 的框架。它让我认识到了到了一些框架开发的现实,比如说你要修改大家正在用的 API,他们就会非常生气。这是框架开发的基本现实之一,但老实说其实我在到 Apple 之前并不知道我当时在干嘛。我完成了学业,我有了更大的雄心,而 Apple 看起来是个非常好的学习地点,事实上也是。其实现在也仍然是,所以我还是会跟那些跟我当时抱一样想法的人提出相同的建议。跟我共事的团队是开发了这个体系超过十年的人们,而我差不多是当中垫底的。于是我被迫非常快速的学习和理解许多设计这种规模框架所需的独特的角度。尤其是考虑框架的二进制兼容(binary compatibility)问题,而 Sparkle 并没有考虑过。幸运的是,我周围的人都非常慷慨的付出他们的时间和精力帮助我进步。在犯了很多很多错误之后,我终于意识到我都干了些什么蠢事儿,而当我几年后离开,之后大概再也用不到那些技术。

开发这样大型规模的框架里面最让你吃惊的是什么

我认为二进制兼容是最让我吃惊的事情。我当时并不理解当中的困难和复杂。想象一下这类的 bug 吧:在 iOS 8 里按钮是白色背景,但在 iOS 7 里面却是透明的。iOS 8 还没有发布,所以这肯定是我们自己的问题。于是你开始一点点钻研,发现可能在 iOS 7 里调用的一个方法是控制这个的,但这个方法在 iOS 8 里已经不被调用了。然后很快的你为了知道怎么回事,去分解,追溯,结果发现这是一个第三方的代码所为,而且你还没有源代码。基本上有一半的时间,有些人在做一些奇怪的令人发指的事以达到效果,而另一半时间我们用一些非常规的手段做了些改动,于是我们需要因此增加一些防御措施。

听上去有好多事儿…

是啊,差不多就像侦探似的工作。

听上去 Peter Steinberger 走的是另一个方向,反编译 UIKit 来改 bug

是的,肯定是。每个版本都是很机密的,我们不可能问:“嗨,Facebook 的哥们儿,你们为什么要这么做啊?”我们必须自己搞明白。在这一点上我非常的敬佩 Peter 跟他的团队的工作。我认为那是非常好的事情,也很乐意看到更多这样的事。我期待看到更多框架开发的团队。Facebook 做出了非常好的表率,GitHub 也是。

我从来没想过 Apple 也需要反编译其他人的二进制来分析 bug

是啊,我现在作为一个第三方开发者,也不得不时不时的反编译UIKit,因为我想知道“UIKit,你在干嘛啊?”这样的问题,而回答这个问题最简单的方式就是逆向编译。

去年有无数的新东西面世,有没有哪个让你激动?你对 Swift 的出现兴奋么?

是,我得说这些都挺让人激动的。如果说真正让我激动的事,却并不是在消费软件工程行业。可以帮助我工作的那一类里面,最让我激动的是真正的交互式原型工具。比如你想要做一个以前从来不存在的交互,或者有这样的概念但并没有真正的工具的交互的时候。我们大多数仍然只是在 Photoshop 中去设计它。当你在 Photoshop 上设计的时候,你只是在创造一个你在 Photoshop 中设计的一样的东西。我记得在 Apple 的时候,我可以分辨出最初从 Photoshop 还是 After Effects 还是现场模型中得来的需求,这之间有非常大的区别。现在有一些工具可以做这件事,虽然我觉得它们都乏善可陈,但我还是非常热诚的关注着,希望能有所贡献。

你是指像 Framer 这样的工具吗?

是的,Framer 是一个不错的例子。我对刚刚被 Google 收购的 Form 这样的产品很感兴趣,当然还有 Origami,也很有意思。我在 Apple 参与了一个原型工具的内部项目,它在有些方面要做的好一些,而另一些方面欠缺一点。每种工具都有优点缺点,我们差不多维护了一个罗列着“这个工具可以用来干这个,那个工具更适合做那个”的表单,我们不得不来回挑选。我认为它们除了做那些非常类似于早已存在的工具做的事情之外并没有在某个方面特别的擅长。

你是否觉得 storyboard 也在朝这方面走呢?

这个我并不这么认为,但我想我必须进一步解释一下。交互有离散模式和连续模式。像鼠标点击就是离散模式的交互,而手势就是连续模式的交互。类似的,你的应用也有离散状态和连续状态。例如滚动就是连续的而在导航栈中导航到其他层就是离散的。

Storyboard 只允许你控制那个四四方方的空间内的离散区域。因此你可以点屏幕上一个部件,然后通过一个离散的转场把你引导到另一个地方。这种交互是最常见的也最没意思的,而且说实话我认为这种交互占统治地位的原因是因为我们没有一个工具来让我们思考其他模式的交互方式。

不过从 iOS 7 起,这种离散模式也的边界也开始比较模糊了。比如可以点击一个表单的单元格然后展出单元格下面的内容。这是一些很简单的例子,但却很难用 storyborad 实现。

我们需要更多像 Bret Victor 这样的人来解决这种问题。

译者注:可以看看这个网站的炫酷交互,可以说是连续交互的楷模

是的,那也是为什么我希望没有那么多人去做照片分享类 app 的原因。

你之前提到说消费类软件工程不是你感兴趣的领域,那么这个领域之外你感兴趣的是什么呢?

我阅读了各种不同领域的论文,我仍然在思考这个问题。最近让我注目的是儿童发展或者说教育,教学模式这些方面。我读到的最让我兴奋的调查结果是有一个班的只有五岁的一年级学生,老师并没有给他们常规的数学指导,而是一个氛围,由一系列慢慢调整的活动组成,而这些活动都是游戏。一年之后,他们进行了评估,虽然这些学生并没有学习正式的算术方法,但他们都能够答对问题并且有非常独特的认知。这样的事情让我非常的激动。

那么你在 Khan Academy 开始工作以来学到的最重要的事情是什么

队伍不好带啊…

为什么?

这是一种独特的技能,而我之前并没有经验。在软件行业,我们总是让一些有贡献的工程师去做领导的角色,并期望他们脱颖而出。当然,鉴于领导别人是一项特殊的技能,我们必须感激他们做的不错,因为这需要学习大量的知识。

你之前提到过你在 Apple 有很好的导师,为什么他们如此出色?而你又从他们那学到什么呢?

首先因为他们真的非常慷慨的花时间来做我的导师。在 Apple 总是有很多的挑战,但 Apple 的文化有个问题是它并不看重导师的价值。因为 Apple 对此没有特别的奖励,而且教导和学习也没有被纳入企业文化构建当中来。

不管怎样,我真的非常幸运能有人花了很多时间来教我做事,并且当我犯了严重错误的时候能花时间主动帮助我。那么是什么让人印象深刻呢?大概是他们的经验吧。这个行业现在非常有趣,因为充斥了新毕业生,而正是这些新毕业生在 Twitter 上叽叽喳喳,在会议上演讲。但这个行业已经形成有一段时间了,肯定有很多有 15 或 20 年相关领域经验的大神级软件工程师,但他们并不经常唧唧喳喳。你很难一直读到他们的文章,因为他们基本都被雪藏在公司里,这种情况下他们无法发声也很低调,但是他们肯定知道很多。

在 Khan Academy,你跟你的团队很快就适应了 Swift。你可以跟我们分享一下你的经验吗?

我们大概有 20000 行 Swift 的代码,那个项目有四位开发人员,都用 Swift 写代码。我们所遇到问题或者说我们称之为问题的东西,其实是实用主意和理想主义的冲突。我相信语言本身的问题都是暂时的,并不能造成宏观的影响,对于你可以在 6 个月时间做出来的 app 来说,这些问题都不重要。所以完全可以对我的抱怨不置可否,只要专业软件开发的生态系统能长期健康发展,我认为这门新语言将会是一个非常好的贡献,而头几个月的磕磕碰碰不值一提。

积极的一面来说,Swift 让我们的代码更清晰。这是我读 Swift 接口的时候让我最高兴的事情。比如 Swift 的 block 代码,我可以更清楚当前发生以及接下来要发生的事情。我可以看到返回值并且可以从中理解更多。我可以用更准确的方式来枚举模型里的系统状态。我们可以更准确的以约束,限制,依赖的方式来使用值类型 (value types)。更广的说,我很赞同这种把 UIKit 当成一种库而不是框架的模式。

如果说问题的话,没有工具,工程师也不能去深究。事实上我其实觉得 Apple 的 Swift 开发团队是 Apple 里最优秀的工程师团队,但是工作还没有完成。现在还到处都是 bug,经常崩溃,偶尔还会生成错误代码。更严重的是,它真的很慢。非常非常慢。不能增长式编译是最大的问题。我们构建的是一个有 UI 的应用,所以我们得花上和考虑如何促进学习差不多相同的时间来打磨应用的用户交互和动画 ,然而每次都要花接近两分钟才能看到效果实在是很伤 — 并不仅仅是效率而是士气。这让所有人都很愤怒,基本上所有时间所有人都很愤怒。更糟的是,这让我们变懒了。因为太慢,我们不想改东西,所以如果用 Swift 实现的 UI 比 Objective-C 实现的 UI 更难看我一点都不会吃惊,因为在上面的迭代总是让我们崩溃。

但那只是暂时的,我对此并不担忧。他们知道这些而且肯定会修正这个问题。只是你无法管理预期,不是出于恶意,我认为 Apple 其实不明白而且之前并没有做过这么大型的东西。

你认为 Swift 会对 Apple 框架的 API 造成什么影响呢?你认为短期内会有什么变化吗?

我没有什么内部消息,所以我只是猜测,但我认为这会是长期的工程。至少当我在那儿的时候,团队的主要工作是维护和提升现有的框架,然后支持诸如新屏幕尺寸或者新硬件之类的市场需求。这都会花很多的时间,所以对大型的决定会更谨慎,我认为并不会很快。

我认为如果我们快进到十年之后,API 将会完全不一样。我对此深信不疑,不然肯定会让人非常的失望。但要是只是一年之后的话,我想大家一定会看到注释得更好的头文件…(不得不说,黑的漂亮!)

或者我们可以有像 Reactive Cocoa 那样的人,把它封装的更好看一点…

是啊,短期内一定会这样的。Facebook 的组件项目 (components project, 其实就是 React) 就做得很好,但那不是 Swift,是 C++,我认为超级赞,这主意太棒了。React 是个不错的设计。我对我在 Apple 最大的怨言就在此,因为 Apple 的文化并不看重学习,所以没有人阅读。我的意思是没有人读正经的东西,没有人读期刊,也没有人读论文,没有人知道现在外面正在发生的什么。人们不知道 React 之类的东西,这真让人沮丧。

不管怎样,我认为那是非常不错的,而且毋庸置疑的是肯定会有人把 UIKit 或者其他框架当做是库来把它们封装的更好。不过,除非 Apple 自己来做否则不会是一个更好的解决办法,也会总是落后,总是不匹配一样。

既然你离开了 Apple,你也开始做更多写作和演讲方面的事情。你有什么其他的计划吗?

基本上都一样。我希望可以发布更多的开源的东西。我之前在这上面吃过亏。很有意思的是,当你发布开源项的时候,人们还希望你去维护它。我想大家对软件开源社区的期待还没有被明确。有一些开源软件有自己的社区也能被很好的维护,而另外有一些开源软件是以教育或兴趣的目的被分享的,就不怎么被维护。我基本上只有精力做到后者,因为老实说,软件工程并不是我现在感兴趣处理的问题。

回到

顶部