十年自学编程译文 作者: 彼得·诺维格

为什么每个人都这么着急?

原文
走进任何书店,您将看到如何在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,experimentumperculosum,iudicium difficile”较长引语的一部分,在英语中译为“生命”。是短, 当然,没有一个数字可以作为最终答案:假设所有技能(例如编程,下棋,下棋和玩音乐)可能都需要完全相同的时间来掌握,这似乎是不合理的,也不会所有人都花费完全相同的时间。正如 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)在他的论文《无银子弹》中 确定了一个由三部分组成的计划,以寻找优秀的软件设计师:

  1. 尽早系统地确定顶级设计师。
  2. 指派职业指导者负责潜在客户的发展,并仔细保存职业档案。
  3. 为成长中的设计师提供互动和相互刺激的机会。

这是假设一些人已经具备成为优秀设计师所需的素质;工作是适当地哄骗他们。 艾伦·佩里斯(Alan Perlis)更简洁地说:“每个人都可以雕刻:米开朗基罗必须被教导如何不做。伟大的程序员也是如此。” 佩利斯说,伟人的内在素质超越了他们的训练。但是质量从何而来?是天生的吗?还是他们通过勤奋发展?正如奥古斯特·古斯托(Ratatouille的虚构厨师 )所说:“任何人都可以做饭,但只有无所畏惧的人才能做得好。” 我将其更多地看作是愿意将一生的大部分时间投入到思考实践中。但也许 无所畏惧是一种概括的方式。或者,正如古斯托(Gusteau)的批评家安东·埃戈(Anton Ego)所说:“并非每个人都能成为一名伟大的艺术家,但是伟大的艺术家可以来自任何地方。”

因此,继续购买那本Java / Ruby / Javascript / PHP书;您可能会从中受益。但是您不会在24小时或21天之内改变自己的生活,也不会改变自己真正的整体专业知识。如何努力在24个月内不断改进?好吧,现在您开始有所建树...


参考文献

本杰明·布鲁姆(ed。),《年轻人的发展才能》,巴兰廷,1985年。

布鲁克斯,弗雷德,《无银子弹》,IEEE计算机,第1卷。20号 1987年第4期,第4页。10-19。

Bryan,WL&Harter,N.“关于电报语言的研究:习性等级的获得。Psychology Review,1899,8,345-375

海斯(John Hayes),《完全问题解决者》劳伦斯·艾尔鲍姆(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纳秒
从内存顺序读取1MB 250,000纳秒
从新磁盘位置获取(查找) 8,000,000纳秒
从磁盘顺序读取1MB 20,000,000纳秒
将小包美国发送到欧洲并返回 150毫秒= 150,000,000纳秒

附录:语言选择

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

  • 使用你的朋友。当被问及“我应该使用哪种操作系统,Windows,Unix或Mac?”时,我的回答通常是:“使用您的朋友使用的任何软件”。从朋友那里学习的好处将抵消操作系统之间或编程语言之间的任何内在差异。还请考虑您的未来朋友:如果继续,您将成为程序员社区的一部分。您选择的语言是一个正在成长的大型社区还是一个濒临灭绝的社区?是否有书籍,网站和在线论坛可提供答案?您喜欢那些论坛中的人吗?
  • 保持简单。诸如C ++和Java之类的编程语言是由经验丰富的程序员组成的大型团队设计的,这些团队关心他们的代码的运行时效率。结果,这些语言具有针对这些情况设计的复杂部分。您担心要学习编程。您不需要那种麻烦。您需要一种被设计为易于被单个新程序员学习和记住的语言。
  • 玩。您宁愿学会弹钢琴的方式:正常的互动方式,即敲击琴键后便会听到每个音符,或者是“批处理”模式,即在整首歌结束后才听到音符。 ?显然,交互模式使钢琴和编程学习变得更加容易。坚持使用交互式模式的语言并使用它。

给定这些条件,我对第一种编程语言的建议是Python或 Scheme。另一个选择是Javascript,不是因为它是为初学者精心设计的,而是因为有许多在线教程供您使用,例如 Khan Academy的教程。但是您的情况可能会有所不同,还有其他不错的选择。如果您的年龄是个位数,则您可能更喜欢 AliceSqueak 或Blockly(年龄较大的学习者可能会喜欢)。重要的是您选择并开始。


附录:书籍和其他资源

有几个人问他们应该从中学到什么书和网页。我重申“仅靠书本学习是不够的”,但我可以推荐以下内容:

笔记

T. Capey指出,亚马逊上的“ 完整问题解决者”页面现在在“购买此商品的客户也购买了这些商品”部分下有“ 21天自学孟加拉语”和“自学语法和风格”书。我猜想看那本书的人很大一部分来自此页面。感谢Ross Cohen为希波克拉底提供的帮助。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

你们的文章都是在哪里看的,我也想去看看。 :joy:

4年前 评论
莫名私下里 (楼主) 4年前
莫名私下里 (楼主) 4年前
Icy (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!