摘自Objc Issue #20 Interviews, 01.2015
原文地址 ;作者Andy Matuschak
安迪,谢谢你抽空接受我们的采访。你能否稍微谈谈当初你是如何走上编程这条路?
我想,和很多朋友一样,是通过游戏。实际上在我小时候一段时间内,我被禁止玩游戏,于是我就经常去公共图书馆。在我九岁的时候,我发现那些所谓教你如何编程的书籍实际上只是众多基本的源码清单。还有一些讲游戏设计的书整本都是源码。所以当我有机会玩游戏时我会把这些源码输入计算机,当然经常会在半路出现语句错误并且我既不能识别错误信息也不知道如何修复。因此我只能重头再来,直到我能玩上游戏。几次这样尝试之后我意识到我有能力修改游戏,自那以后事情就一发不可收拾了。
我想我是在十岁的时候学会了C++,因为那时人们都用C++写游戏;之后我尝试去写一个多用户网络(MUD)游戏,这是我个人第一个大的项目。它运作得还不错。
你完成它了吗?
在单人游戏场景中,它运作的很流畅;但是显然它还没完成多用户网络游戏中的多玩家模式。所以我想答案是没有。后来我着迷于图形、GL、3D渲染之类的事物。
之后你有继续在制作游戏吗?
我曾经做过一段时间的游戏引擎,看了所有标准的OpenGL教程:旋转立方体、颗粒引擎以及其他诸如此类的事情,然后我开始制作真正的游戏——那真是在13岁年纪瞎忙的活生生例子。我意识到那时没有一个适用于制作游戏内容的图表工具,因此我的室友和我开始制作一个像素工具。当时它被叫做Pixen。那是我第一次接触Cocoa而且它还是开源的。当我们推出1.0版本时,我想我还是14岁,我们去商场中苹果商店的OS X Panther(应当是Jaguar?)的发布会。他们那个时候开始搞发布会了!我们想要把Pixen的CD送给他们。
如果当时你不成为一名程序员,有可替代的选择吗?在其他任何事情上你有过极大兴趣吗?
我那时候就想成为某种工程师。我曾痴迷于电力工程甚至高中的化学小实验,所以这些方向也不妨是一个选择,而软件工程是我当时真正能着手做的。那个时候,我还称呼其为编程而不是软件工程,然后一些人告诉我「不,不,你应该称之为’计算机科学’!」当然,那个时候我并没有明白在计算机科学、软件工程以及编程之间暗涌的有趣的文化差异,我只是觉得它们都是实用清晰的术语。但是我们偶尔会犯某种程度上的误用。
没错。所以目前基本上你算是一个软件工程师?
尽管我是学计算机科学的,但我显然不是一个计算机科学家。我会说某种程度上我是一个软件工程师,一个深受计算机科学影响的软件工程师。最近我会花约一半时间在幼儿成长方面做更多的研究工作,论文和书籍阅读以寻找灵感看看我们如何能这块儿领域贡献力量。
离开苹果并加入可汗学院,帮助人们学习和教育,看起来是相当大的跳跃。为什么会做出这样的选择?什么事情激励了你?
恩,有很多方面可以来回答这个问题。我之前去了加利福尼亚理工学院,一所支持许多国家科学项目诸如NASA、DARPA以及诸如此类的学院。因此在那儿的讨论总是关于人性化影响。当时有一个NASA官员过来对我们说 是,你们是最棒和最聪明的。你们将进入世界上最好的研究性学院之一,而且你们将是享有特权的。所有对你们有益的机会都将开放给你们。现在,你们必须使用他们来创造价值,你们必须做一些有意义的事。”
当我来到更广阔的软件社区时,我是少数几个毕业之后没有去做研究的人。我大学刚毕业那时候我想要做出点事儿,但我又失望于多数商业软件工程和销售的追求以及所产生的影响,所以关于在什么领域我能发挥所长我深思了很久。第一步显然是明确我的方向:「什么是影响、什么是有意义的」。那时我已经深受物理家David Deutsch的影响,通过他我确认了我想要走的方向:延伸人类知识和能力范围。之后我开始考虑对此我该怎么做。
如果我们能活得更久,那我们对知识能触及得更远,因此在生物和化学工程方面有许多可能性。如果我们有更好的试验工具,我们也能走得更远——这也是为什么虚拟和合成的工具、虚拟现实以及人工智能领域如此吸引人。但是结合个人背景和机会,我认为在教育领域做一些贡献应当是我最明智的选择,因为如果我能创造终生学习的一代人,那么我们会影响并吸引更多人来解决这些问题。
所以你想要为下一代创造工具来学得更好,因此他们能够解决难题并不断前进?
是,这是我的愿景。学习的一大挑战就是「元学习」(meta learning,即「学习如何学习」)。这种学习方式不会摧毁你的学习自信以及态度。如果我开发的工具能够使得毕业生们获得相同的数学成绩,与此同时他们对待数学有更好的态度和认知而且对在之后生活中学习数学这件事更感兴趣,那我就知足了。
因此你很明确地指出目前已有的中学和大学教育并不足够好,关于这点能否做详细的说明?
是,他们不够好,而且从很多维度看他们都不够好。最重要一点就是大多数人没有办法接触到我刚刚所描述的那些机遇和资源,而这点恰恰是我认为当前要改进而且是首要的,这就是为什么人人都能免费受教育是当前的使命。可汗学院的使命实际上就是为人人创造世界一流的免费教育,因此当前我们首先关注人人都能免费受教育,其次再是世界一流的免费教育。但是说到第二点,所谓的「世界一流」定义我还保留意见。
我有许多获得最好的教育经费并受指导于诺贝尔获奖者的同学,尽管如此,他们对于学习这件事依旧抱着糟糕的态度,而且心心念着一旦毕业就要结束学习。他们只想着赶快离开并找到稳定的工作,好在职场中让大脑停工,因为他们被体系搞得着实精疲力尽因此他们的好奇心和才智已经被严重破坏。
这可听起来真让人沮丧阿…….
认同。我想你应该问过大多数人他们对于数学的观点,他们不是说「噢,数学真无聊」就是「我不擅长于数学,我不是个数学家」在科学学科方面,你得到的回应也会类似。但是如果你问人们关于文学的事情,或许他们会讨论一些自认为情节有趣的书籍,然而那也只是他们在学生时期常常阅读罢了,至于现在可能早已停止。因此我想我最希望推进的进步是改变所谓「教育在大学之后就结束」的固有观念,这不是真正意义上的科学难题,也是我某种程度上对于「软件工程师」这个标签有所犹豫的原因,确实软件工程是我专攻并积累经验的领域,但我追求的目标与志向并非这个方向。
伴随着「专注终身学习」这样一个宏大的计划,你是否有想过十年后的情况吗,你期望达成了什么目标?
目前,标准的学习方法已经约定俗成。我的意思是你读一本教科书,那么你被动地要去吸收当中的知识;或者你看一段视频,还得看演讲类的内容。意味着如果你要学习,你得坐下来并进行吸收消化。或许之后你有钱了还可以来个对话交流什么的。在你毕业之后,你必须自己去创造这样的学习环境。
对于所谓的「建构主义学习环境」我真的很好奇,这是几十年前的一位学问研究者帕波特定义的术语。在一个建构主义学习环境,学生自发性地创造知识,而不是一味地被动进行课本阅读和吸收。在这些模型中,更多的是一个环境被建构好,为了能理解一些知识,其特性将激励或要求你去熟练使用。
帕波特研究的其中一个例子,他努力使用Logo语言进行关于抽象与程序化思维的教学,而不是编程本身。他还有一个教室里放着Logo turtle的标志,那时候还有一种机械海龟可以真的在纸上画画。所以教室周围挂满了机械海龟画的画,一些画上是源代码,一些不是。这些画也会随着时间因学生的更替而变换,比方说一个学说可能看到一朵花然后说:“哇,我喜欢这幅图,我能拥有它吗?”然后老师会说:“好呀,当然可以,不过你得先输入代码,海龟会照着代码画出这个图。”然后学生会说:“没问题。”接着他就开始作画。之后可能他会看上另外一幅画,但是那幅画没有源代码,那就只能自己想辙了。
在建构主义学习环境中,设计其他图示也是为了要求学生进行创造前要先理解。因此,创造性环境就这样被塑造出来了。我正在研究而且很可能会研究很多年的假说,其实是允许人们自主创建知识,我想能看到这样的产出首先我会很高兴;其次,他们在「元认知」上也会大幅提高,在自我认知、学习态度以及学习兴趣上都会比其他同学高出不少。
除了以建构主义学习环境来鼓励大家更加主动学习之外,可汗学院与更传统的学习方式之间另一个主要区别在于人们能更自由地选择要学什么,什么时候学,你觉得这个改变有什么影响吗?
另一个幼儿成长研究者 Piaget 在这方面有很多研究成果,他说青年思维开发阶段重要的事情之一就是自主性训练,而且这里的自主性相较我们平时讨论的又要宽泛很多。它不是指「我能自由地玩耍」而是指「我能对我生活中所有正在发生的事情做决定」。这其实和一些人总是提醒你要如何分配你的时间,强调行为规则的权威性是相悖的。打个比方,对于「Bobby玩游戏的时候作弊了」这件事不自主的回答就是「好,让我来和他说」,相反地,自主性的回答会是「那你和Bobby说了什么吗」。我想自主性的训练在各方面都很重要。有一些研究表明这会在短期内有更好的产出,但是我相信从长远来看这将引导出更优秀的思考者。
我对于那些一整天的日程被安排满满的情况保持怀疑。如果教育者能够日复一日地,优化学生的学习环境来修正学习进度,我认为这反倒更加积极。再确切一些,比如我想与其把所有人类学知识的目录按重要程度进行分类一股脑给学生,倒不如把所有人类学知识看成一个书架,按难易程度由低到高进行排放。
那么在Apple工作的经历有没有什么让你怀念的?
恩,我怀念那儿的人,这真的很重要。实际上这也是目前我对于这个行业真正感到失望的地方。那么多有才能的人被这些巨型公司套牢,而他们只是偶尔被良好利用,更多时候他们只是一台机器的齿轮,但他们的聪明才智完全能做更大更深远的影响。我不是说一定要来我的项目里干,而是更宽泛地。在情感角度,我会难过是因为我真的怀念他们,比方说怀念当时在NeXT的时候和那些经验丰富的同事共同激发出来的对话。然而我也希望他们的影响能够更加深远。
你能分享更多一些你在Apple的时光吗?开发一个能够被那么多人使用的框架是什么感觉?你又是如何从做游戏开始一步步完成那么多?
填补这段差距的一个例子是我在16岁的时候完成的一个名叫Sparkle的框架。当时它教会我认识到框架开发的一些事实,换句话说当你修改大家正在用的API,他们就会生气。这是框架开发的事实之一,但坦诚来说其实我去Apple之前我不清楚自己在干嘛。我完成了学业,有了更大的野心,不过苹果看起来似乎是非常好的学习平台,它曾经是,它现在依旧是。因此我会对任何与我有相同抱负的人给予一样的建议。当时与我共事的同事都是有过十几年编译框架经验的人,我想我应该是团队中垫底的。没办法,我被逼着要快速的学习和理解许多在设计框架的时候所需要的独特的思考方式,特别是考虑框架中的二进制兼容,而先前的Sparkle并没有。幸运的是,我周围的每个人都很慷慨地付出时间与精力来指导我。在犯过许多许多错误之后,我终于明白了我都做了什么,而几年后当我离开,可能我再也用不到那些技术了。
开发这样大型规模的框架中,什么是最让人吃惊的?
我想「二进制兼容」应当是我最吃惊的。当时我并没有理解当中的难点与复杂程度,你可以想象下:在iOS8里头按钮是白色背景,但在iOS7中,它是透明的。iOS8还没有被发布,所以这一定是我们的问题。于是你要开始一点点钻研,你意识到也许在iOS7中调用的方法是来控制这个的,但这个方法在iOS8中已经不调用了。为了去搞清楚到底怎么回事,我们要迅速去分解、辨析,发现这是第三方的代码同时我们还缺少源代码。
大约一半的时间,一些人在做一些可耻的事情以求达到目的,而剩下一半时间我们要以非常规的行为来进行修改,因此我们有理由需要去增加防御措施。
这听起来有很多繁琐的工作…
没错,就好像侦探的活儿一样。
听起来Peter Steinberger在走另一个方向,反汇编UIKit来修复错误。
是阿,当然了。每次发布都很秘密以至于我们不能问:「嘿,Facebook的哥们儿,你为什么要这么做?」我们必须得自己搞清楚。在这一点上,我很敬佩Peter和他的团队做的事。我觉得那是很棒的事,也很想去看到更多这样的事。我很想的
我从来没想过Apple也要不得不去反汇编别人的二进制来分析错误。
是阿,如同我现在作为第三方开发者,还是不得不经常反汇编UIKit。因为我就像这样:「UIKit,到底怎么回事儿?」那么获得答案的最简单方式就是分析反汇编。
去年有无数多新事物的出现,哪些会让你感觉很激动?你对Swift的出现感到激动吗?
是,我得说它们确实让人激动。不过当我们谈论让我真正感到激动的东西,它并不再消费软件工程行业。但是就能帮助我完成工作的工具而言,我感到最兴奋的品类是真正的交互式原型工具,比如你要做以前从来不存在的工具,或者之前有过概念但是还没有工具能真正实现交互。所以我们大部分人依旧只在Photoshop中进行设计而已,当你在Photoshop中设计时,你创造的东西看起来就像是Photoshop的产物。我记得之前在Apple,我能看得出来自于Photoshop、After Effects还是现实模型的不同需求的区别,这之间有很大的区别。现在已经有一些工具能够实现这一点,我想它们都还没有绝对成熟完善,但我很热忱地关注着这些进步,也希望能有所贡献。
你是指像Farmer这样的工具吗?
是阿,Farmer是一个非常不错的例子。我对刚被Google收购的Form很感兴趣,以及Origami,当然也很有趣。我在苹果参与了一个原型工具的内部项目,它再一些方面更好一些,在一些方面又稍逊一筹。每个工具都有它的优缺点。实际上我们还编排了一个关于「你可以用这个工具干这个,你可以用这个工具干那个」,后来我们发现我们不得不来回挑选。我感觉除非它们做已有工具在做的事情,否则它们并没有在其他方面有特别优秀的表现。
你觉得storyboards是不是也往这个方向发展?
实际上我不这么看,但我得解释一下。关于交互,现在有离散模式和连续模式。像鼠标点击这一类交互就是离散模式的交互而手势这一类交互就是连续模式的交互。相似地,你的应用也有离散状态和连续状态。例如滚动就是连续的而导航堆栈中导航到其他层级就是离散的。
Storyboards只允许你操作控制那个四方形中的离散部分,因此当你点击屏幕上的一个部位,你就能通过离散转换到完全不同的地方。但是我发现这是最没有意思的交互方式,坦诚来讲我认为我们的用户接口主要被那样的交互方式所控制是因为我们没有工具允许我们思考其他的交互方式。
但是从iOS 7起,这种离散模式的边界也逐渐变得模糊。举个比方,点击一个单元格的时候能够展开单元格以下的内容。这是非常琐碎的例子,然而storyboard却很难呈现。
我们需要更多像Bret Victor这样的人来解决这类问题。
确实,这也是为什么我希望少些人来做照片分享类的app。
你之前提到消费类软件工程不是你感兴趣的领域,那么这个领域之外你感兴趣的是?
我读了不同领域的很多论文,至今我仍在思考这件事。就目前我最感兴趣的是幼儿成长或教育、教学模式。最让我激动的是我读到一篇调查,一个只有五岁孩子的班级,老师并没有进行常规的数学教学,而是通过不断改变的一系列活动来塑造学习环境进行施教,这些活动都是游戏。一年以后,他们的评估表明尽管他们没有受到正式的算术教学,但是他们都能答对问题而且具备优秀的认知。这件事真的让我非常激动。
所以你在可汗学院工作依赖,学到的最重要的事是什么?
带团队可不容易…
为什么呢?
这是一项我没有经验、且截然不同的技能。在软件行业里,我们总是让有所贡献的工程师去担当领导的角色,并期待他们能表现优异,显然这是截然不同的技能,因此我们必须要清楚这点并加以欣赏。这里头有很多学问。
你提到过你在Apple有很好的导师,是什么让他们如此优秀以及你又从他们那儿学到了什么?
首先他们愿意慷慨地花之间来指导我。在Apple挑战总是无处不在,但Apple的问题在于它的文化并不看重导师的价值。没有奖励机制,而且指导和学习也没有融入到企业文化中。
但不管怎样,我真的太幸运能有人愿意花很多时间来指导我,而且当我在项目中犯了极其严重的错误的时候他们也会花时间来指导我。那么,是什么提高了效率?应该是他们的经验吧。现在这个行业是个有趣的领域,因为这里充斥了应届生,也正是这些应届生在Twitter发声、在会议上演讲。但是这个行业的形成又不是这一时半刻,肯定有很多在这个领域具备15到20年专业经验的软件工程师,他们很少发声,甚至你很难督导他们的文章。因为他们被公司雪藏,因此他们不为人知,但他们肯定懂得很多。
在可汗学院,你与你的团队很快就适应了Swift,你能和我们分享一些经验吗?
我们拥有20000行的Swift代码,以及每个项目都有四个开发者,都用Swift进行编译。所以那些问题或者我们称之为问题的东西实际上是实用主义与理想主义的冲突。我确信语言自身的问题只是暂时的,实际上它们并不会造成宏观层面的影响;对于你在六个月内做出的app来讲,这些问题同样不重要,因此尽管忽略我的抱怨。
只要专业软件开发以及生态系统能够长期健康发展,我想这门语言会是非常卓越的贡献,而头几个月的跌跌撞撞根本不算什么。
从积极的一面来说,Swift帮助我们写出更清晰的代码。这是我读Swift接口时感到最高兴的事。当我读Swift的block代码时,我对正在发生的以及即将发生的有了更清晰的理解。我可以看到返回值并且能从中理解更多。我能使用枚举法来更精准地为系统状态建模:更精确的是,我们可以使用值类型来约束、限制从属关系;更宽泛的是,我赞同把UIKit当做库而不是框架的模式。
就问题而言,如果没有工具,工程师也没有去深入解析。实际上我恰巧觉得Swift开发团队是Apple里最棒的队伍,但是它还没完成。现在它都是bug,经常崩溃,时不时还产生错误的代码。更为要紧的是,它真的好慢,相当相当慢。对我而言,缺少增长式编译是目前最大的问题。我们构建一个有UI的应用,我们得花上与思考如何促进学习一样的时间来打磨应用的交互和动画。而且每次要花上将近两分钟的时间才能看到效果真的太伤了,这不仅效率低下,还挫败士气。每个人总是生气。更糟糕的是,它让我们变得懈怠。我们不再想去做改动,所以我丝毫不会惊讶于Swift实现的UI比Objective-C实现的UI效果更差,因为这上面的迭代简直让人抓狂。但这是暂时的,其实我丝毫不担心。他们清楚这些问题而且会去修复。只是我们没有办法很好地管理预期,不是出于恶意地,但是我确实觉得苹果之前不了解这些问题而且没有做过这么大型东西的经验。
你觉得Swift会对Apple框架的API带来什么样的影响?短期内你期待会有什么变化吗?
显然实际上我没有什么内部确切信息,我也只是猜测而已,但我想这会是个长期公称。至少当我在苹果的时候,团队花了大把时间来支持诸如新屏幕尺寸或者新硬件的市场需求,而不是维护和提升现有框架。那些工作已经花了大把时间了,所以做任何重要举动时都要慎重考虑,所以我不认为这会很快就来。
我认为我们快进到未来的十年后,API将会完全不一样。我坚信这会实现,否则会让人极其失望。即使是一年以后,我想你们也一定能拿到更优注释的头文件。
或者我们能有像Reactive Cocoa那样的人,把它包装地更好看一些?
没错,短时间内一定会有的。Facebook现在就在做他们的组件项目(Component project),不过这不是Swift,是C++,我觉得这很勇敢,想法很赞。React是很不错的设计。而我对苹果的怨言之一也正在此,因为苹果的文化不评估学习的价值,因此没有人阅读。我其实是借鉴当科学家讨论阅读时他们所表达的意思。现在没有人读刊物,没有人读报纸,没有人知道外面在发生什么。正如人们不知道React以及诸如此类的东西,这可真让人沮丧阿。
不管怎样,我认为它们都是非常赞的事物而且我坚信会有人把UIKit以及其他框架当做库来对待并把它们包装得更好。然而,除非苹果亲自来做,否则不会被良好的适应,它们会总是落后并且感觉很不匹配。
自打你离开苹果后,你也完成了更多写作与演讲方面的事。除此之外你还有什么其他的计划吗?
基本上还是那样。我希望可以发布更多开源的东西,过去我在这上头有过教训。不过相当有趣的是,当你发布开源项时,人们还期望你能维护它。我想我们对大众对开源软件的期待没有明确的约定。有一些开源软件有自身的社区能被很好地维护,而有一些开源软件仅是作为教育或兴趣的目的被分享,就没有被真正地维护。至于我,基本上只有精力做到后者,因为,坦诚来说,软件工程目前不是我感兴趣的,要努力解决问题的部分。
(完)