谷歌研究主管论人工智能以及程序员自我修养
谷歌研究主管Peter Norvig在文中介绍了他对人工智能、个人计算和地图服务诸多领域的看法。文中提供了Peter写了大量AI笔记的个人网站和公开课视频地址。Peter Norvig 并不相信计算机能力的增强会把我们带到奇点。他还认为,至少要花上10年或10000小时才可能学好编程。
董飞:Peter Norvig任职于Google,其职位是研究主管(Director of Research). Peter Norvig是享誉世界的计算机科学家和人工智能专家。他是 AAAI 和 ACM 的会员,是业界内经典书籍《Artificial Intelligence: A Modern Approach (人工智能:一种现代方法)》的作者之一。在加入Google之前,他曾经是NASA计算科学部门的主要负责人,并在南加州大学以及伯克利大学任教。本文前半部分是英国卫报的采访,谈到了人工智能、个人计算、地图服务诸多领域。后半部分是他谈自学编程的态度,抨击了一堆想速成投机浮躁的人们。
首先给一些他的资料,个人网站很酷,http://norvig.com/,里面有大量AI笔记,最有意思的是他曾经用Python写了21 行, 完成一个功能完备的拼写检查器。中文由Eric Xu翻译版本 http://zqpythonic.qiniucdn.com/data/20090728222556/index.html
他还曾经TED发表一个著名演说:容纳十万人的教室,讲他创办在线教育网站 Udacity的故事
他在Udacity开了两门免费公开课:
Design of Computer Programs:https://www.udacity.com/course/design-of-computer-programs--cs212
Intro to Artificial Intelligence:https://www.udacity.com/course/intro-to-artificial-intelligence--cs271
Part 1: 英国卫报的采访
Google 研究团队汇聚了业界顶尖的人才,不过它并一定适合所有人。如果你希望创办自己的公司,或者希望在小公司工作,并不适合你。除了无人驾驶汽车之外,Google 也不会资助硬件上的研究。
“在内部我们仍然需要做出选择。这里比初创公司更加*一些:坏的决策不会立刻导致破产,但是你不能说,我要做些事情,给我 20 个工程师吧。”显然,这涉及到优先级的问题,虽然有些优先级项目听起来非常奇怪。
在 60 年代、70 年代的时候,许多重大科技成果来自贝尔实验室、IBM 沃森研究中心、施乐帕克研究中心(Xerox PARC),它们都研究与公司核心业务无关的技术,而许多发明都没有获得商业上的成功。对此,Peter Novig 非常了解,他提到了一本 1999 年的书:《探索未来:施乐如何创造、然后错过了首个个人计算机》。
“书中说他们在探索未来,但他们以某种方式发明了未来”,他说,“我觉得他们租借了未来。有一天人们能够买得起 PC,但是我们仍然没有走到那一步,于是拿出 20 万美元给研究员配备个人计算机,这样可以看到未来会是什么样子的。从某种程度上来说,我们在 Google 做的事情也是一样的”。比如无人驾驶汽车、智能眼镜,或者使用 1 万多台计算机检查 1000 万的图片去识别猫脸。
和上述那些研究中心不同,Google 的研究和公司的其它业务是紧密联系的。“从某些方面看,我们做的事情很像英特尔,那里的研究团队会设法开展新业务,如果他们做成了某种东西,但其他人从新业务中获得更多利润,他们并不担心,只要业界仍然买英特尔的芯片。
我们也是一样——如果我们发明了新东西,即使我们不拥有它,只要它能让两个人开始使用互联网,就有可能有一个人会变成我们的用户。因此,如果我们开创了一个新行业,对我们来说就是成功。”
无人驾驶汽车、智能眼镜就是这样的产品。“我们把它们当做已有优势的延伸——汽车是地图能力的延伸,同样,眼镜是通讯和本地服务的延伸。”
Peter Norvig 的职业生涯中,人工智能是重要的一个方向,从 80 年代中期开始,他开始研究概率推理和不确定性。这涉及到贝叶斯的理论,当时在人工智能领域,对于这位 18 世纪数学家的想法仍然充满怀疑。不过,随着计算机的发展,他的理论已经获得了广泛应用。Peter Norvig 说,构建一个可用的系统是说服他人的最好方法。
他提到了 Google 翻译,这个服务并不是由语言学家开发的,而计算机学习语言的过程与人类完全不同,它利用的是广阔的互联网,从大量的翻译文档中学习将不同的语言配对。这和 Google 利用上万台计算机辨认猫一样,属于模式辨认。
Peter Norvig 并不相信计算机能力的增强会把我们带到奇点,即人工智能赶上人类智能的时刻。他支持奇点研究院的原因是因为他认为一切都会加速变化,并且会改变社会,人们应该意识到这一点,不过,“我最大的担心是,人们太关注特定日期了”。我们并没有处于一个特殊的时间点上,“我们在创造新东西,但是和过去比起来,今天做的并没有什么不同。”
科技的进步并没有改变人和机器的关系,“我是比较抗拒智能可以无限扩展自己的想法的。智能可以帮助你解决更难的问题,但是有些问题是抵抗智能的,你会到达这样一个点,聪明不会对你有任何帮助,我认为我们的许多问题都是这样的。就像政治——我们不会说,只要有一个更聪明的政治家就可以解决所有的问题”。
人们是否过分高估了智力的价值?对此,Peter Norvig 说,“ Kevin Kelly 与我讨论过这个问题;他将此称作‘Intelligentism’——认为智力是唯一重要特性的一种偏见。我们认为智力是重要的,并以此称呼自己的种族,但是,如果我们是大象,或许我们会希望得到超级力量,或者如果我们是猎豹,会希望获得超级速度。有些社会问题很难,是因为它们就是那个样子,那不是我们足够聪明之后就可以解决的”。
Part 2: 十年自学编程
随意步入一家书店,满目都是《7天搞定Java编程》这种速成书目,相比于计算机技术书籍的如此“速成”,在其他领域的书籍里,你却很难找到诸如:“三天学会贝多芬”,或者“五天搞定量子力学”,这种速成教材,甚至连《狗狗喂养手册》这种宠物指南,都鲜有“几天搞定”的说法。Felleisen et al.在他们的著作《如何设计程序》一书中明确指出了这种“速成”的趋势,并评论到:“垃圾的编程技术当然非常容易,*都能在21天之内学会,哪怕他天生就是个白痴。”
让我们来仔细看看《3天学会C++》这种速成教材实际上意味着什么:
学会
在3天时间里你几乎没有时间去写任何有意义的程序,就更不要谈什么从编程中获得经验和教训这种事情了。你也不可能有时间和有经验的程序员一起工作和交流,也不会体验到在真正的C++环境下工作是什么感觉。长话短说吧,你就是没时间,也学不到什么。所以这种书籍最多也就让你有个粗浅的印象,但是绝对不可能有深入的理解。就像亚历山大教皇说的那样,“浅尝辄止是很危险的”。
C++
如果你有其他编程语言的基础,那么3天之内你也许可以学到C++的一些语法,但即使是这样,你还是无法了解如何使用该语言编程。简言之,如果你之前是一个Basic程序员,那么经过3天的学习,你会成为一个“能使用C++语法编写Basic风格程序的程序员”,不过这样是没法发挥出C++语言本身的优势的(说句不好听的,你连怎么犯C++的典型错误都不会)。仅仅知道一点语法意味着什么呢?Allan Perlis曾经说过:“一个无法改变你思维方式的编程语言是不值得学习的。”;另一种可能性是,你可以只学一点点C++知识(类似的,或者一点点JavaScript,或者一点点Flex Script),然后就可以利用现有的工具制作应用接口,完成特定的编程任务了。但是这样的行为并不意味着你“会”编程了,你只是会使用这个工具完成任务而已。
3天:很不幸,3天是远远不够的,往下看你就知道了。
研究人员(Bloom (1985)、 Bryan & Harter (1899,见文后参考书目)、Hayes (1989)、Simmon & Chase (1973,见文后参考书目) 的一系列调查研究显示,在各个领域内,要想获得专业级别的水平,大约需要10年时间的努力。参与此项调查的领域包括:国际象棋,作曲,发报,绘画,钢琴演奏,游泳,网球等。科学家们从神经心理学和拓扑学的角度对这些领域进行研究,并得出结论。若要在某一领域内达到专家级的水平,其关键在于“审慎地重复”,也就是说,并非是机械地,一遍又一遍地练习,而是要不断地挑战自我,试图超越自身当前的水平,通过不断的尝试挑战,并在尝试的过程中和尝试之后对自身的表现进行分析和总结,吸取经验,纠正之前犯过的各种错误。把这一“审慎”的过程不断重复,才能取得成功。
所谓的“捷径”是不存在的,即使对于莫扎特这种天才来说,也没有捷径可走,尽管4岁就开始作曲,可是他也花了13年的时间,才真正地写出了世界级的作品。再举一个例子,甲壳虫乐队(The Beatles),他们似乎在1964年凭借一系列热门单曲和其在艾德沙利文秀(The Ed Sullivan show)上的演出一炮而红,但是你也许不知道,他们早在1957年就在利物浦和汉堡两地进行小规模演出了,而在此之前的非正式演出更是不计其数。甲壳虫乐队的主要成名曲《Sgt. Peppers》,则是1967年才发行的。Malcolm Gladwell公布了他对柏林音乐学院所作的一项研究的报告,该研究对比了一个班里的学习成绩为上、中下三个档次的学生,并逐一询问他们进行音乐练习的时间
这三个档次中的所有人,大约都是在5岁的时候开始练习音乐的,一开始的时候大家练习音乐的时间都差不多,大约一周2到3小时。但是到了八岁左右,大家的区别就开始体现了。后来成为班里最好的那一部分学生开始比别的学生练习得更多,大概每周6到9小时,12岁的时候每周8小时,14岁的时候每周16小时,往后则越来越多,直到20岁左右,他们每周练习音乐的时间已经超过30小时了。在20岁的年纪,那些精英级别的演奏家们都有累计超过10000小时的音乐练习时间。相比之下,仅有部分优等生能达到8000小时的累计练习时间,而那些音乐教师级别的学生,他们的累计练习时间只有4000小时左右。
所以,也许这个让你能达到专业等级的神奇时间应该是10000小时,而不是10年。(Henri Cartier-Bresson (1908-2004)说过,“(作为摄影师),你所拍摄的头10000张照片都是垃圾”,但即使是垃圾作品,他拍一张照片也要花接近一小时。)Samuel Johnson (1709-1784)认为这个时间应该更长:“在任何一个领域要想做到极好,势必穷尽一生的精力,否则根本无法企及。” Chaucer (1340-1400)也发出过“生命如此短暂,技能如此高深”的感叹。Hippocrates (c. 400BC)因写下了如下的句子而被人称颂:“ars longa, vita brevis”,该句是来自于一个更长的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 这段话翻译成英语就是:“生命很短暂,但是技艺却很高深,机遇转瞬即逝,探索难以捉摸,抉择困难重重”。这段话是用拉丁文写的。在拉丁文里,ars可以翻译为“技艺”或者“艺术”,但是在古希腊文里,ars只能做“技能”的意思,而没有“艺术”的意思。
你想当程序员么?
下面是我列举的程序员成功“食谱”
●沉醉于编程,编程是为了兴趣。保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。
●程序. 最好的学习方式是“在实践中学习”。更技术一些地说:“一个人在某个专业领域方面能够达到最高水平,并不是因为这个人经验增长了以后而自动获得的,而是这个人为了进步所做出了专门的努力之后产生的结果。”(p. 366)“最有效的学习包括如下几个要素:明确并且难度适当的任务,适应学习者个人情况,及时的信息反馈,有重新开始和改正错误的机会)(p. 20-21) 《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》这本书提供了上述有趣的观点
●同其他程序员交流,多阅读其他人写的程序。这些远比你看书或者上培训班重要
●如果你愿意的话,就选择去读一个计算机科学专业吧(当然你还可以去念这个专业的研究生)。如果你能做到这点,那么你就有机会找到一些需要计算机学位认证的工作,也会让你对这个行业有更深的理解。不过,如果你不是上学的料,那么你可以(当然需要有足够的毅力)靠自己学习,或者通过工作来积累经验。无论你采用哪种途径,光依靠书本是远远不够的。“如果说仅仅靠学习油画和调色技术无法创造出顶尖的画家的话,那么光学习计算机科学课程更不能造就顶尖的程序员。”,Eric Raymond这样说过,他著有《新黑客字典》一书。我所聘用过的最好的程序员仅仅只有高中文凭; 他写了很多伟大的软件,他有他自己的新闻组,并且通过股权赚够了钱,还开了家属于自己的夜店。(作者说的这个人是Jamie Zawinski,他是网景浏览器(Netscape)的早期开发这者之一,也是开源项目Mozilla和XEmacs的主要贡献者,他开了一家叫做DNA_lounge的夜店,位于旧金山的SoMa区——译者注)
●与其他程序员一起做项目。在某些项目中要尽量做到最好,在某些项目中却别做那么好。当你是最好的时候,你的领导能力就会得到锻炼,并激发你高瞻远瞩的视野。当你做得不好的时候,你就能知道你的领导怎么做事,以及他们不喜欢哪些事(因为领导总是把那些他们不爱做的杂事丢给他们认为不得力的人去做)
●尝试跟随其他程序员一起做项目。尝试去理解其他人所写的代码。看看如果你无法找到代码的作者本人的情况下,理解和修正他写的代码需要花费什么样的代价。同时也思考,如何规划你自己的程序代码,让它们更容易被其他人理解和维护。
●至少学习半打编程语言。包括一种支持类抽象的语言(例如Java或者C++),一种支持函数抽象的语言(例如Lisp或者ML),一种支持语法抽象的语言(例如Lisp),一种支持声明式编程的语言(例如Prolog或者C++模板),一种支持协同程序的语言(例如Icon或者Scheme),一种支持平行并发编程的语言(例如Sial)
●牢记“计算机科学”中包含着“计算机”这个词。了解计算机需要花多长的时间执行一条指令,花多长时间从内存中获取一个字(word)(包括缓存命中和不命中两种情况),如果连续从磁盘中获取数据,时间消耗如何?以及需要花多少时间才能再磁盘上定位一个新的位置?
●尽量参与语言的标准化过程。往大了说,你可以试着加入ANSI C++委员会这样的专业组织,往小了讲,你也可以从自己的代码规范入手,限定代码缩进是需要2个空格宽还是4个空格宽。无论采用哪种方式,你都需要了解其他人对于语言的喜好,以及他们的喜好的程度,甚至你要知道他们为什么产生这样的喜好的原因。
●有良好的意识,能尽快适应语言标准化的成果。
要掌握上面所说的所有内容,光靠看书学习应该是很难做到的。当我的第一个孩子出生的时候,我几乎阅读了市面上所有的《如何…》指南书籍,但是我读完了以后还是觉得自己是个菜鸟。30个月以后,我的第二个孩子快出生时,我难道还要做一个书虫么?不!相反,我此时更依赖我的个人经验,这些经验相比于那些上千页的书籍,则更加有效和让我放心。