十年自学编程
彼得·诺维格
为什么每个人都这么着急?
走进任何书店,您将看到如何在24小时内自学Java,以及无穷无尽的变体,可以在几天或几小时内教授C,SQL,Ruby,算法等。亚马逊高级搜索[标题:自学,自学,自学,自2000年以来,共发现512本书。在前十名中,有九本是编程书籍(另一本是关于簿记的)。通过将“自学”替换为“学习”或将“小时”替换为“天”,可以得到类似的结果。
结论是要么人们急于学习编程,要么编程比其他任何事物都更容易学习。Felleisen等。 在他们的书《如何设计程序》中对这种趋势表示赞同,当他们说“错误的编程很容易。白痴可以在21天内学习它,即使他们是傻瓜。” Abtruse Goose漫画也受到了欢迎。
让我们分析一下“ 24小时自学C ++”这样的标题的 含义:
自学:在24小时内,您将没有时间编写几个重要的程序,并从中学习成功和失败的原因。您将没有时间与经验丰富的程序员一起工作,也不了解在C ++环境中生活的感觉。简而言之,您将没有时间学习很多东西。因此,这本书只能说是肤浅的熟悉,而不是深刻的理解。正如亚历山大·波普(Alexander Pope)所说,学一点东西是危险的。
C ++:在24小时内,您可能可以学习C ++的某些语法(如果您已经知道另一种语言),但是您对如何使用该语言的了解却不多。简而言之,如果您是一名Basic程序员,则可以学习使用C ++语法以Basic风格编写程序,但是您将无法了解C ++的优点(或缺点)。那有什么意义呢? 艾伦·珀利斯(Alan Perlis)曾经说过:“不影响您对编程的思考方式的语言是不值得了解的”。一个可能的观点是,您必须学习一小部分C ++(或更可能是JavaScript或Processing之类的东西),因为您需要与现有工具交互以完成特定任务。但是,那时您不会学习编程。您正在学习完成该任务。
在24小时内:不幸的是,这还不够,如下一节所示。
十年自学编程
研究人员(Bloom(1985),Bryan&Harter(1899),Hayes(1989),Simmon&Chase(1973))显示,在下棋,音乐等众多领域中发展专业知识大约需要十年的时间。写作,电报操作,绘画,弹钢琴,游泳,网球以及神经心理学和拓扑学研究。关键是商议 练习:不仅要一遍又一遍地做,还要挑战一项超越您当前能力的任务来挑战自己,尝试一下,分析执行前后的表现,并纠正任何错误。然后重复。再重复一次。似乎没有真正的捷径:即使是4岁的音乐天才莫扎特,也花了13年的时间才开始创作世界一流的音乐。在另一种类型中,甲壳虫乐队似乎爆出一连串的#1热门歌曲,并在1964年的埃德·沙利文(Ed Sullivan)演出中露面。但是自1957年以来,他们一直在利物浦和汉堡的小型俱乐部里打球,尽管他们颇具吸引力在早期,他们的第一个重大成功就是Sgt。Peppers于1967年发行。
马尔科姆·格拉德威尔尽管他专注于10,000小时(而不是10年),但他已经推广了这个想法。亨利·卡蒂埃·布雷森(Henri Cartier-Bresson,1908-2004年)还有另一个度量标准:“您的前10,000张照片是最糟糕的。” (他没想到数码相机会在一个星期内达到这个目标。)真正的专业知识可能需要一辈子:塞缪尔·约翰逊(Samuel Johnson(1709-1784))说:“任何部门的出色表现都只能靠他的劳动来实现。一辈子;不要以较低的价格购买。” 乔uc(1340-1400)抱怨说:“ lyf太短了,工艺太长了。” 希波克拉底(约公元前400年)以“ ars longa,vita brevis”的摘录而闻名,它是“ Ars longa,vita brevis,occasio praeceps,experimentum perculosum,iudicium difficile”较长引语的一部分,英语中用“ Life”表示。是短, 当然,没有一个数字可以作为最终答案:假设所有技能(例如编程,下棋,下棋和玩音乐)可能都需要完全相同的时间来掌握,这似乎是不合理的,也不会所有人都花费完全相同的时间。正如 K. Anders Ericsson教授所说:“在大多数领域,即使是最有才华的个人也需要多少时间才能达到最高水平。令人难以置信的是,10,000小时的工作时间使您感觉我们正在谈论多年某些人会说,那些天生才华横溢的人每周必须花费10到20个小时才能达到最高水平。”
所以你想成为一名程序员
这是我编程成功的秘诀:
获取感兴趣的节目,并做一些,因为它很有趣。确保它保持足够的乐趣,以便您愿意投入十年/ 10,000小时的时间。
程序。最好的学习是边做边学。从技术上来说,“在一定范围内,个人的最高绩效不会根据扩展经验而自动获得,但是即使是经验丰富的个人,由于有意改进也可以提高绩效水平。 。” (p。366) 和“最有效的学习需要对特定个体具有适当难度级别的明确定义的任务,信息反馈以及重复和纠正错误的机会。” (第20-21页)《实践中的认知:日常生活中的思维,数学和文化》是对此观点的有趣参考。
与其他程序员交谈;阅读其他程序。这比任何书籍或培训课程都重要。
如果需要,可以在大学学习四年(或者在研究生院学习四年)。这将使您能够访问一些需要证书的工作,并且可以使您对该领域有更深入的了解,但是,如果您不喜欢学校,则可以(有一定的奉献精神)独自或在工作中获得类似的经验。 。无论如何,仅靠书籍学习是不够的。《新黑客字典》的作者埃里克·雷蒙德(Eric Raymond)表示:“计算机科学教育不能像学习画笔和颜料那样使任何人成为专家程序员。” 我曾经雇用过的最好的程序员之一只有高中学位。他制作了很多很棒的 软件,并拥有自己的新闻组并且拥有足够的股票期权购买自己的夜总会。
与其他程序员一起从事项目。在某些项目中成为最好的程序员;在其他人身上最糟糕。当您处于最佳状态时,就可以测试自己领导项目的能力,并用自己的远见激发他人的才能。在最坏的情况下,您将学习大师的所作所为,并了解他们不喜欢做的事情(因为他们让您为他们做)。
在其他程序员之后从事项目。了解别人编写的程序。看看当原始程序员不在时需要理解和修复它的过程。考虑如何设计您的程序,使那些在您之后维护它们的人更轻松。
学习至少六种编程语言。包括一种强调类抽象的语言(例如Java或C ++),一种强调功能抽象的语言(例如Lisp或ML或Haskell),一种支持语法抽象的语言(例如Lisp),一种支持声明性规范的语言(例如Prolog或C ++模板)。 ,并且强调并行性(例如Clojure或Go)。
请记住,“计算机科学”中有一个“计算机”。知道您的计算机执行一条指令,从内存中获取一个单词(有或没有缓存未命中),从磁盘读取连续的单词以及在磁盘上寻找新位置花了多长时间。(在这里回答。)
参与语言 标准化工作。它可以是ANSI C ++委员会,也可以确定您的本地编码样式是否具有2或4个空格缩进级别。无论哪种方式,您都可以了解其他人在某种语言中的喜好,他们的感受有多深,甚至可能很少了解他们为什么如此。
具有良好的意识,可以尽快开始语言标准化工作。
考虑到所有这些,仅通过学习书籍就能取得多大的成绩值得怀疑。在我的第一个孩子出生之前,我阅读了所有“如何做”书,仍然觉得自己是一个笨手笨手的新手。30个月后,当我的第二个孩子到期时,我是否又回到书店复习了?否。相反,我依靠自己的个人经历,事实证明,与专家撰写的成千上万页相比,这对我来说更加有用和令人放心。
弗雷德·布鲁克斯(Fred Brooks)在他的论文《无银子弹》中 确定了一个由三部分组成的计划,以寻找优秀的软件设计师:
尽早系统地确定顶级设计师。
指派职业指导者负责潜在客户的发展,并仔细保存职业档案。
为成长中的设计师提供互动和相互刺激的机会。
假设某些人已经具备成为优秀设计师所需的素质;工作是适当地哄骗他们。 艾伦·佩里斯(Alan Perlis)更简洁地说:“每个人都可以被雕刻而成:米开朗基罗必须被教导如何不做。伟大的程序员也是如此。” 佩利斯(Perlis)说,伟人的内在素质超越了他们的训练。但是质量从何而来?是天生的吗?还是他们通过勤奋发展?正如奥古斯特·古斯托(Ratatouille的虚构厨师 )所说,“任何人都可以做饭,但只有无所畏惧的人才能做得好。” 我将其更多地看作是愿意将一生的大部分时间投入到思考实践中。但也许 无所畏惧是一种总结的方式。或者,正如古斯托(Gusteau)的批评家安东·埃戈(Anton Ego)所说:“并非每个人都能成为一位伟大的艺术家,但是一位伟大的艺术家可以来自任何地方。”
因此,继续购买那本Java / Ruby / Javascript / PHP书;您可能会从中受益匪浅。但是您不会在24小时或21天之内改变自己的生活,也不会改变自己真正的整体专业知识。如何努力在24个月内不断改进?好吧,现在您开始有所建树...
参考文献
本杰明·布鲁姆(ed。),《年轻人的发展才能》,巴兰廷,1985年。
布鲁克斯,弗雷德,《无银子弹》,IEEE计算机,第一卷 20号 1987年第4期,第4页。10-19。
Bryan,WL&Harter,N.“关于电报语言的研究:习性等级的获得。《心理学评论》,1899年,第8期,第345-375页
海耶斯(John Hayes),《完全问题解决者》劳伦斯·艾尔鲍姆(Lawrence Erlbaum),1989年。
Chase,William G.&Simon,Herbert A. “国际象棋的 认知”认知心理学,1973,4,55-81。
Lave,Jean,《实践中的认知:日常生活中的思维,数学和文化》,剑桥大学出版社,1988年。
答案典型PC上各种操作的大概时间:
执行典型的指令1 / 1,000,000,000秒= 1纳秒
从L1缓存中获取0.5纳秒
分支预测错误5纳秒
从二级缓存中获取7纳秒
互斥锁25纳秒
从主内存中获取100纳秒
通过1Gbps网络发送2K字节20,000纳秒
从内存顺序读取1MB250,000纳秒
从新磁盘位置获取(查找)8,000,000纳秒
从磁盘顺序读取1MB20,000,000纳秒
将小包美国发送到欧洲并返回150毫秒= 150,000,000纳秒
附录:语言选择
一些人问他们应该首先学习哪种编程语言。没有答案,但是请考虑以下几点:
使用你的朋友。当被问及“我应该使用哪种操作系统,Windows,Unix或Mac?”时,我的回答通常是:“使用您的朋友使用的任何软件”。从朋友那里学习的好处将抵消操作系统之间或编程语言之间的任何内在差异。还请考虑您的未来朋友:如果继续,您将成为程序员社区的一部分。您选择的语言是一个正在成长的大型社区还是一个濒临灭绝的社区?是否有书籍,网站和在线论坛可提供答案?你喜欢那些论坛里的人吗?
保持简单。诸如C ++和Java之类的编程语言是由经验丰富的程序员组成的大型团队设计的,这些团队关心其代码的运行时效率。结果,这些语言具有针对这些情况设计的复杂部分。您担心要学习编程。您不需要那种麻烦。您需要一种被设计为易于由单个新程序员学习和记住的语言。
玩。您宁愿学习弹钢琴的方式:正常的互动方式,即敲击琴键后便会听到每个音符,也就是“批量”模式,即在整首歌结束后才听到音符。 ?显然,交互模式使钢琴和编程学习变得更加容易。坚持使用交互式模式的语言并使用它。
给定这些条件,我对第一种编程语言的建议是Python或 Scheme。另一个选择是Javascript,不是因为它是为初学者精心设计的,而是因为有很多在线教程供您使用,例如 Khan Academy的教程。但是您的情况可能会有所不同,还有其他不错的选择。如果您的年龄是个位数,则您可能更喜欢 Alice或Squeak 或Blockly(年龄较大的学习者可能会喜欢)。重要的是您选择并开始。
附录:书籍和其他资源
有几个人问他们应该从中学到什么书和网页。我重申“仅靠书本学习是不够的”,但我可以推荐以下内容:
方案: 计算机程序的结构和解释(Abelson和Sussman)可能是计算机科学的最好入门,它确实教授编程作为理解计算机科学的一种方式。您可以在本书上在线观看讲座视频,以及在线全文。这本书极具挑战性,将淘汰一些可能通过其他方法成功的人。
方案: 如何设计程序(Felleisen等人)是一本有关如何以一种优雅而实用的方式实际设计程序的最佳书籍之一。
Python: Python编程:CS入门(Zelle)是使用Python的不错的入门。
Python:Python.org 上提供了一些在线教程。
Oz: 计算机编程的概念,技术和模型(Van Roy和Haridi) 被某些人视为Abelson&Sussman的现代继任者。这是一门编程的大创意,涵盖了比Abelson&Sussman更大的范围,同时也许更易于阅读和遵循。它使用一种不知名的语言Oz,但它是学习其他语言的基础。<
笔记
T. Capey指出,亚马逊上的“完全解决问题”页面现在在“购买此商品的客户也购买了这些商品”部分下有“ 21天自学孟加拉语”和“自学语法和风格”书。我猜想看那本书的人很大一部分来自此页面。感谢Ross Cohen为希波克拉底提供的帮助。