十年内自学编程

Peter Norvig

你们着什么急?

走进任何一家书店,您将看到如何在24小时内教会自己Java,以及提供在几天或几小时内教授C、SQL、Ruby、算法等的无休止的变体。亚马逊高级搜索[title: teach, yourself, hours, since: 2000中找到512本这样的书。在前十名中,有九本是编程书(另一本是关于簿记的)。类似的结果来自于将“自学”改为“学习”,或将“小时”替换为“天”。

结论是,要么人们急于学习编程,要么编程比其他任何东西都容易得多。费莱森等人在他们的“如何设计程序”(How To Design Program)一书中,他们表示:“糟糕的编程很容易,白痴可以在21天内学会它,即使他们是假人。”这位狂暴的鹅漫画也有自己的想法。

让我们分析24小时内自学C++这样的标题可能意味着什么:

自学:在24小时内,你就没有时间写几个重要的程序,从你的成功和失败中吸取教训。您将没有时间与有经验的程序员一起工作,并了解在C++环境中生活是什么感觉。总之,你没有时间学到很多东西。因此,这本书只能谈论一种肤浅的熟悉,而不是一种深刻的理解。正如亚历山大·波普所说,一点点学习是一件危险的事情。

C++:在24小时内,您可能可以学习C++的一些语法(如果您已经知道另一种语言),但您无法了解如何使用该语言。简单地说,如果你是一个基本程序员,你可以学习用C++语法以Basic的方式编写程序,但是你不能知道C++实际上是好的(和坏的)什么。那有什么意义?AlanPerlis曾经说过:“一种不影响你对编程的思考方式的语言是不值得知道的”。一个可能的问题是,您必须学习一点C++(或者更可能的是,类似JavaScript或处理的东西),因为您需要与现有工具接口来完成特定的任务。但是你不是在学习如何编程,而是在学习如何完成这个任务。

在24小时内:不幸的是,这还不够,正如下一节所示。


十年内自学编程

研究人员(Bloom(1985)、Bryan&Harter(1899年)、Hayes(1989)、Simmon&Chase(1973))已经证明,在包括国际象棋、音乐创作、电报运算、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学研究在内的任何广泛领域,都需要十年的时间才能发展出专门知识。关键是深思熟虑的实践:不只是再做一次。再一次,用一项超出你目前能力范围的任务来挑战你自己,尝试它,分析你在做的时候和之后的表现,并纠正任何错误。那就重复一遍。再重复一遍。似乎没有真正的捷径:即使是莫扎特,他在4岁时是一个音乐天才,花了13年才开始创作世界级的音乐。在另一种类型中,披头士乐队似乎以一连串的热门和1964年的埃德·沙利文秀出现在现场。但从1957年起,他们就一直在利物浦和汉堡打小俱乐部,虽然他们很早就有了很大的吸引力,但他们的第一个重大成功,魔鬼辣椒,在1967年被释放了。

马尔科姆·格拉德威尔(Malcolm Gladwell)推广了这一理念,尽管他专注于1万小时,而不是10年。HenriCartier-Bresson(1908-2004)有另一个指标:“你的前10,000张照片是你最差的。”(他没有预料到,使用数码相机,一些人可以在一周内达到这一目标。)真正的专业知识可能需要一生的时间:塞缪尔·约翰逊(1709-1784)说:“任何部门的卓越都只能靠一生的劳动才能实现;不能以较低的价格购买。”乔叟(1340-1400)抱怨道:“莱夫太短了,手艺太长了。”Hippocrates(公元前400年)以摘录“Ars Longa,vita brevis”而闻名,该句是来自于一个更长的引用:”Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, 这段话翻译成英语就是:“生命很短暂,但是技艺却很高深,机遇转瞬即逝,探索难以捉摸,抉择困难重重”。当然,没有一个数字是最终的答案:似乎不合理地假定所有技能(例如编程、下棋、跳棋和音乐演奏)都需要完全相同的时间来掌握,也不认为所有人都需要完全相同的时间。正如K·安德斯·爱立信(K.Anders Ericsson)教授所言,“在大多数领域,即便是最有才华的人,也需要多少时间才能达到最高水平。1万小时的时间让你感觉到,我们所说的每周10到20个小时,有些人会认为,那些天生最有天赋的人仍然需要达到最高水平。”


所以你想成为一名程序员

下面是我编程成功的秘诀:

对编程感兴趣,并做一些,因为它是有趣的。一定要保持足够的乐趣,这样你就会愿意投入你的10年/10,000小时。

项目,最好的学习方式是边做边学。更严格地说,“在某一领域,个人的最高业绩水平并不是随着经验的扩展而自动达到的,但即使是经验丰富的个人,也可以通过刻意改进而提高业绩水平。”(第366页)和“最有效的学习需要一个明确的任务,适当的难度水平,为特定的个人,信息反馈,并有机会重复和纠正错误。”(第20-21页)“实践中的认知:日常生活中的思想、数学和文化”是这一观点的有趣参考。

与其他程序员交谈;阅读其他程序。这比任何书籍或培训课程都更重要。

如果你愿意,在一所大学(或更多的研究生院)待四年。这会让你获得一些需要资格证书的工作,也会让你对这个领域有更深入的了解,但如果你不喜欢上学,你可以(用一些奉献精神)独自或在工作中获得类似的经验。无论如何,光靠书本学习是不够的。“计算机科学教育不能使任何人成为专业程序员,就像研究画笔和颜料可以使人成为专业画家一样”,“新黑客词典”的作者埃里克·雷蒙德说。我雇过的最好的程序员之一只有高中学位,他制作了很多很棒的软件,有自己的新闻组,并且有足够的股票期权来购买自己的夜总会。

与其他程序员一起完成项目。在某些项目中做最好的程序员;在其他项目上做最差的程序员。当你是最好的,你可以测试你的能力来领导一个项目,并用你的远见激励别人。当你是最坏的时候,你学会了主人做什么,你学会了他们不喜欢做什么(因为他们让你为他们做)。

工作项目后,其他程序员。理解别人写的程序。看看当原来的程序员不在的时候,需要什么才能理解和修复它。想一想如何设计你的程序,让那些在你之后维护它们的人更容易。

至少学习六种编程语言。包括一种强调类抽象的语言(比如Java或C++)、一种强调函数抽象(比如Lisp、ML或Haskell)、一种支持语法抽象(比如Lisp)、一种支持声明性规范(比如Prolog或C++模板)、一种强调并行性(比如Clojure或Go)。

记住,在“计算机科学”中有一个“计算机”。知道您的计算机执行指令、从内存中获取一个单词(是否有缓存丢失)、从磁盘中读取连续单词以及寻找磁盘上的新位置需要多长时间。(答案在这里)

参与语言标准化工作。它可能是ANSI C++委员会,也可能是决定您的本地编码风格将有2或4个空间缩进水平。不管是哪种方式,你都可以了解到其他人在一种语言中喜欢什么,他们有多深,也许还有一点是关于为什么他们会这样想的。

有良好的判断力,尽快摆脱语言标准化的努力。

考虑到所有这些,仅仅通过书本学习,你能走多远是值得怀疑的。在我的第一个孩子出生之前,我读了所有的书,仍然觉得自己是一个无知的新手。30个月后,当我的第二个孩子即将出生时,我是否又回到书本上复习了一下?没有。相反,我依靠的是我个人的经验,这比专家们写的几千页更有用,也更让我放心。

弗雷德·布鲁克斯(FredBrooks)在他的文章“没有银弹”中指出了一个寻找优软件设计师的三部分计划:

        1. 有组织地辨认顶尖的软件设计人才,越早越好(尽早系统的确定一批顶级设计者队伍。)

  2. 安排一个职业导师,为其职业前景指点迷津,并谨慎对待自己的职业履历。(指派一个业务主管来负责前景的发展以及确保职业规划。)

  3. 为成长中的设计师们提供机会,让他们能够互相激发促进。(为增进设计师们的互相影响与激励提供足够的机会。)

即使一部分人已经具备了成为优秀软件设计人员的潜质,也需要经历工作的慢慢琢磨,方可展现才华。Alan Perlis 则说得更加直接:“任何人都可以被‘教’成一个雕塑匠,但米开朗基罗则被‘教’如何不要成为一个雕塑匠,因为他要做的是雕塑大师,。这个道理放到编程大师身上同样管用。”Perlis 认为,伟大的软件开发人员都有一种内在的特质,这种特质往往比他们所接受的训练更重要。但是这些特质是从哪里来的呢?是与生俱来的?还是通过后天勤奋而来?正如 Auguste Gusteau(动画电影《料理鼠王》里的幻象大厨)所说,“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”我很情愿地说,将你生命中的大部分时间花在审慎地练习和提高上,这很重要!但是“无所畏惧”的精神,才是将促使这些练习成果凝聚成形的途径。或者,就像是《料理鼠王》里那个与 Gusteau 作对的刻薄的美食评论家 Anton Ego 说的那样:“不是任何人都能成为伟大的艺术家,不过,伟大的艺术家在成名前可能是任何人。”

所以尽管去书店大Java/Ruby/Javascript/PHP 书籍吧;你也许会发现他们真的挺管用。但是这样做不会改变你的人生,也不会让你在整体经验上有什么提高。24小时,几天,几周,做一个真正的程序员?光靠读书可读不出来。你尝试过连续 24 个月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你开始上路了……


参考书目

Bloom, Benjamin (ed.) Developing Talent in Young People (在年轻人中培养人才), Ballantine, 1985.

Brooks, Fred, No Silver Bullets (没有银弹), IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits (电报语言研究:一种习惯上的收获).Psychology Review, 1899, 8, 345-375

Hayes, John R., The Complete Problem Solver (完全问题求解)Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology (国际象棋的感知), 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (实践中认知:日常生活中的思想,数学与文化), Cambridge University Press, 1988.


问答

典型 PC 系统各种操作指令的大概时间

Copyright © 1999-2020, CSDN.NET, All Rights Reserved




QQ读取浏览器历史

  登录


ajian005

关注

Peter Norvig:Teach Yourself Programming in Ten Years(自学编程,十年磨一剑) 转载

2012-11-23 14:30:23


ajian005


码龄16年


关注

黄小非译注:


本文作者 Peter Norvig 目前任职于 Google,其职位是研究主管(Director of  Research). Peter Norvig 是享誉世界的计算机科学家和人工智能专家。


他是 AAAI  和 ACM 的会员,是业界内经典书籍《Artificial Intelligence: A Modern Approach  人工智能:一种现代方法》的作者之一。


在加入 Google 之前,他曾经是 NASA (美国航空航天局)计算科学部门的主要负责人,并在南加州大学以及伯克利大学任教。以下为译文。


英文原文:Teach Yourself Programming in Ten Years




你们着什么急?

  随意步入一家书店,满目都是《7天搞定 Java 编程》这种速成书目,同样的书籍还包括 Visual Basic、Window 系统、Internet 互联网等等,它们都承诺在几天,甚至几小时之内就让你能够学会相关技术。我在亚马逊网站上做了如下的条件检索:


  pubdate: after 1992 and title: days and


  (title: learn or title: teach yourself)


  出版日期:1992年以后,题目关键字:“天”,“学会”或者“自学”


  然后得到了 248 条搜索结果。头 78 条都是计算机类书籍(第 79 条记录是《30天学会孟加拉语》)。我将“天”关键字换成了“小时”,不出意外地搜索到了 253 条记录,其中头 77 条记录是计算机书籍,第 78 条的搜索记录是《24小时语法和样式自学手册》。在总共搜索到的头 200 条记录中,有 96% 是计算机书籍。


  从上面的搜索结果可以看出来,要么就是人们对计算机技术的学习如饥似渴,要么就是计算机技术实在太简单,不费吹灰之力就能学会。相比于计算机技术书籍的如此“速成”,在其他领域的书籍里,你却很难找到诸如:“三天学会贝多芬”,或者“五天搞定量子力学”,这种速成教材,甚至连《狗狗喂养手册》这种宠物指南,都鲜有“几天搞定”的说法。Felleisenet al.在他们的著作《如何设计程序》一书中明确指出了这种“速成”的趋势,并评论到:“垃圾的编程技术当然非常容易,傻子都能在 21 天之内学会,哪怕他天生就是个白痴。”


  让我们来仔细看看《3天学会C++》这种速成教材实际上意味着什么:


学会:在 3 天时间里你几乎没有时间去写任何有意义的程序,就更不要谈什么从编程中获得经验和教训这种事情了。你也不可能有时间和有经验的程序员一起工作和交流,也不会体验到在真正的 C++ 环境下工作是什么感觉。长话短说吧,你就是没时间,也学不到什么。所以这种书籍最多也就让你有个粗浅的印象,但是绝对不可能有深入的理解。就像亚历山大教皇说的那样,“浅尝辄止是很危险的”。

C++: 如果你有其他编程语言的基础,那么3天之内你也许可以学到 C++ 的一些语法,但即使是这样,你还是无法了解如何使用该语言编程。简言之,如果你之前是一个 Basic 程序员,那么经过 3 天的学习,你会成为一个“能使用 C++ 语法编写 Basic 风格程序的程序员”,不过这样是没法发挥出 C++ 语言本身的优势的(说句不好听的,你连怎么犯 C++ 的典型错误都不会)。仅仅知道一点语法意味着什么呢?Allan Perlis 曾经说过:“一个无法改变你思维方式的编程语言是不值得学习的。”;另一种可能性是,你可以只学一点点 C++ 知识(类似的,或者一点点 JavaScript,或者一点点 Flex Script),然后就可以利用现有的工具制作应用接口,完成特定的编程任务了。但是这样的行为并不意味着你“会”编程了,你只是会使用这个工具完成任务而已。

3天:很不幸,3天是远远不够的,往下看你就知道了。



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


发现和培养软件设计人才的三步骤

  Fred Brooks 所著的著名的论文《No Silver Bullets 没有银弹》里向我们揭示了发现和培养软件设计人才的三步骤:


  1. 有组织地辨认顶尖的软件设计人才,越早越好(尽早系统的确定一批顶级设计者队伍。)


  2. 安排一个职业导师,为其职业前景指点迷津,并谨慎对待自己的职业履历。(指派一个业务主管来负责前景的发展以及确保职业规划。)


  3. 为成长中的设计师们提供机会,让他们能够互相激发促进。(为增进设计师们的互相影响与激励提供足够的机会。)


  即使一部分人已经具备了成为优秀软件设计人员的潜质,也需要经历工作的慢慢琢磨,方可展现才华。Alan Perlis 则说得更加直接:“任何人都可以被‘教’成一个雕塑匠,但米开朗基罗则被‘教’如何不要成为一个雕塑匠,因为他要做的是雕塑大师,。这个道理放到编程大师身上同样管用。”Perlis 认为,伟大的软件开发人员都有一种内在的特质,这种特质往往比他们所接受的训练更重要。但是这些特质是从哪里来的呢?是与生俱来的?还是通过后天勤奋而来?正如 Auguste Gusteau(动画电影《料理鼠王》里的幻象大厨)所说,“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”我很情愿地说,将你生命中的大部分时间花在审慎地练习和提高上,这很重要!但是“无所畏惧”的精神,才是将促使这些练习成果凝聚成形的途径。或者,就像是《料理鼠王》里那个与 Gusteau 作对的刻薄的美食评论家 Anton Ego 说的那样:“不是任何人都能成为伟大的艺术家,不过,伟大的艺术家在成名前可能是任何人。”


  所以尽管去书店大买 Java/Ruby/Javascript/PHP 书籍吧;你也许会发现他们真的挺管用。但是这样做不会改变你的人生,也不会让你在整体经验上有什么提高。24小时,几天,几周,做一个真正的程序员?光靠读书可读不出来。你尝试过连续 24 个月不懈努力提高自己么?呵呵,如果你做到了,好吧,那么你开始上路了……


参考书目

Bloom, Benjamin (ed.) Developing Talent in Young People (在年轻人中培养人才), Ballantine, 1985.

Brooks, Fred, No Silver Bullets (没有银弹), IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.

Bryan, W.L. & Harter, N. “Studies on the telegraphic language: The acquisition of a hierarchy of habits (电报语言研究:一种习惯上的收获).Psychology Review, 1899, 8, 345-375

Hayes, John R., The Complete Problem Solver (完全问题求解)Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. “Perception in Chess” Cognitive Psychology (国际象棋的感知), 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life (实践中认知:日常生活中的思想,数学与文化), Cambridge University Press, 1988.

  问答

  典型 PC 系统各种操作指令的大概时间


execute typical instruction 执行基本指令

1/1,000,000,000 sec = 1 nanosec


fetch from L1 cache memory    从一级缓存中读取数据

0. 5 nanosec


branch misprediction    分支误预测

5 nanosec


fetch from L2 cache memory    从二级缓存获取数据

7 nanosec


Mutex lock/unlock    互斥加锁/解锁

25 nanosec


fetch from main memory  从主内存获取数据

100 nanosec


send 2K bytes over 1Gbps network        通过 1G bps 的网络发送 2K 字节

20,000 nanosec


read 1MB sequentially from memory      从内存中顺序读取 1MB 数据

250,000 nanosec


fetch from new disk location (seek)        从新的磁盘位置获取数据(随机读取)

8,000,000 nanosec


read 1MB sequentially from disk        从磁盘中顺序读取 1MB 数据

20,000,000 nanosec


send packet US to Europe and back      从美国发送一个报文包到欧洲再返回

150 milliseconds = 150,000,000 nanosec


附录:语言选择

有几个人问他们应该先学哪种编程语言。没有一个答案,但请考虑以下几点:

1、善用你的朋友们;当被问到“我应该使用什么系统呢?Windows, Unix 还是 Mac?”,我的回答通常是:“看你的朋友们用什么你就用什么。”这么做的好处是,有了你朋友的帮助,你就能有效地回避操作系统固有的一些差异,对于选择编程语言来说,也是同样道理。同时,你还要有点儿战略眼光:如果选择了一种编程语言,并成为其编程社区的一员,那么你选择的语言和社区是正在不断壮大?还是奄奄一息?如果你有编程方面的问题,能不能从相关的书籍,网站以及在线论坛中得到解答?你是不是跟论坛里的人合得来?这些都是要考虑的。

2、简单实用。诸如 C++ 以及 Java 这样的编程语言都是非常专业的开发语言,适用于有经验的大型团队进行开发,需要时常考虑代码的运行效率。所以,这类的编程语言就适合于那样(复杂)的编程环境。如果你是一个初学者,那么就不要搞那么复杂。你所需要的是一种简单易学的编程语言,你靠你自己就可以搞定的语言。

3、交互(运行)。给你两种选择去学钢琴:第一种,常规做法,也是互动的做法,也就是你每敲一下琴键就能听到琴音;第二种,批量模式,等你把所有该按的琴键都按了一遍,然后再一次性放给你听。你选择哪一个呢?显然,交互式的方式对于钢琴学习来说更容易,对于编程学习也是如此。那么就坚持使用交互式模式学习编程吧。

基于上述的观点,我所推荐的编程入门语言应该是 Phyton 或者 Scheme. 但是读者自身的环境是非常复杂多变的,所以你们也许会其他更好的选择。如果你的年龄还不到两位数,那么你们应该考虑 Alice 语言或者 Squeak 语言(很多成年的初学者也认为他们很有趣)。当然,做出选择并开始行动,这个最重要。


附录:注记书籍和其他资源

模式编程:《Structure and Interpretation of Computer Programs (Abelson & Sussman)  计算机程序的构造和解释》 这本书或许是计算机科学最好的入门书籍,本书从计算机科学的角度入手,教你如何进行编程。你可以在online videos of lectures 观看本书的在线视频教程,以及 complete text online 的在线文字版。 学习本书是需要一些挑战的,相信该书会让一部分人望而却步的。

模式编程:《How to Design Programs (Felleisenet al.)  程序设计方法》是一本好书,该书介绍了如何用优雅并且有效的方式进行程序设

Python: Python Programming: An Intro to CS (Zelle) 是一本介绍 Python 的好书

Python: Python.org 官方网站上提供了一些在线教程 tutorials.

Oz: Concepts, Techniques, and Models of Computer Programming (计算机编程的概念,技术和模型) (Van Roy & Haridi) 被看做是 Abelson & Sussman(经典计算机教程《计算机程序的构造和解释》的作者——译者注)的当代传承者。该书绘制了一幅关于计算机编程的宏观蓝图,它囊括了比 Abelson & Sussman 的经典教材更广泛的知识领域,也更加通俗易懂。此书中使用了一种编程语言,Oz, 这种语言在工业领域内几乎不被使用,其主要目的就是针对于学习其他语言


注记

T. Capey 指出,Amazon 网页上那个 Complete Problem Solver (完全问题求解)页面把《21天搞定孟加拉语》以及《21天学会语法》这两本书移到了“购买此书的用户还购买过这些产品”这个区域内。我估计大部分人就是从这个区域看到这本书的。感谢 Ross Cohen 的帮助。

你可能感兴趣的:(十年内自学编程)