zoukankan      html  css  js  c++  java
  • [转] Peter Norvig:自学编程,十年磨一剑(节选)

    研究人员(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个月以后,我的第二个孩子快出生时,我难道还要做一个书虫么?不!相反,我此时更依赖我的个人经验,这些经验相比于那些 上千页的书籍,则更加有效和让我放心。

  • 相关阅读:
    Java 泛型 泛型的约束与局限性
    Java 泛型 泛型方法
    Java 泛型 泛型数组
    Java 泛型 协变性、逆变性
    Java 泛型 协变式覆盖和泛型重载
    Java 泛型 泛型代码和虚拟机
    Insertion Sort List
    Remove Duplicates from Sorted List II
    String to Integer (atoi)
    SpringMvc源码入门
  • 原文地址:https://www.cnblogs.com/crazii/p/2671487.html
Copyright © 2011-2022 走看看