彼得·诺维格(Peter Norwig):10年学习编程

译者注: 本文由 彼得·诺维格 Peter Norvig)在2001年发表 根据2001年的版本, 翻译成俄文 2014年,文章已更新,但翻译未更新。 因此,我完成了2014年现代版文章的翻译。 我认为该文章虽然有些过时,但并没有失去其相关性。 如果发现任何翻译错误,请以个人身份写。

每个人都在哪里这么着急?


转到任何书店,您将立即看到一本关于如何在24小时内学习Java的书,以及关于如何在几天或几小时内学习C,SQL,Ruby,算法等的无穷选择。 Amazon Advanced Search [ 书名:自学成才,自学时间,自2000年以来 ]列出了512本书。 在前十名中,有九本是编程书籍(只有一本是关于会计的)。 通过将“自学”替换为“学习”,将“小时”替换为“天”,您将获得相同的结果。

由此得出结论:要么人们急于学习编程,要么以某种神话般的方式比其他任何东西都容易学习编程。 Felleisen 等。 在他们的《 如何设计程序》一书中提到了这一点,他们写道:“糟糕的编程很容易。 “白痴即使在书呆子里也很充实,但可以在21天之内学到这一点。” 漫画网站Abtruse Goose也讨论了这个话题( 这里是链接 )。

让我们看看《 24小时自学C ++ 》一书的标题可能意味着:

  • 自学:在24小时内,您将没有时间编写一些重要的程序并从成功和失败中得出结论。 您将没有时间与经验丰富的程序员一起工作,也不了解C ++的意识形态。 简而言之,在短时间内您不会学到太多。 因此,这本书仅是表面的认识,而没有深刻的理解。 正如亚历山大·波普(Alexander Pope)所说:“ 小知识是一件危险的事情 。”
  • C ++:在24小时内,您很有能力从C ++语法中学习一些东西(如果您已经知道另一种编程语言),但是您并不怎么使用该语言。 简而言之,如果您是一名Basic程序员,那么您将学习如何使用C ++语法编写Basic风格的程序,但是您将无法理解C ++的真正优点(或缺点)。 那又怎么说呢? 正如Alan Perlis所说:“ 如果一种语言不会改变您对编程的理解,那么学习它就毫无用处 。” 好吧,除了您需要学习一些C ++才能理解如何针对特定任务使用某种类型的库。 但是在这种情况下,我们不是在谈论用语言进行程序设计。 您只是在学习完成特定任务。
  • 24小时内:不幸的是,正如我在下面显示的那样,这个时间还不够。

10年学习编程


研究( Bloom(1985)Bryan&Harter(1899)Hayes(1989)Simmon&Chase(1973) )指出,掌握特定领域的技能大约需要十年,例如,下棋,音乐创作,使用电报,绘画,弹钢琴,游泳,网球,神经生理学和拓扑。 秘密在于深思熟虑的实践中:不仅是机械重复,而且还搜索比当前水平更高的任务,解决它们,在解决过程中和解决之后分析您的行动,纠正所犯的错误。 再来一次 再来一次 没有比这更短的路了:即使是4岁的莫扎特(Mozart)成为音乐奇迹般的孩子,他也花了13年才开始创作世界一流的音乐。 甲壳虫乐队(1964年)受到了热烈欢迎,并在埃德·沙利文(Ed Sullivan)的表演中亮相。 但在此之前,他们自1957年以来就一直在利物浦和汉堡的小型俱乐部中打球。 尽管在乐迷中享誉全球,但他们在音乐评论家中的第一个成功就是1967年Sergeant Pepper的上映。

马尔科姆·格拉德威尔Malcolm Gladwell)在他的书中推广了这个想法,尽管他讲的是10,000小时,而不是10年。 著名的摄影师Henri Cartier-Bresson (1908-2004)表示以下想法:“ 前10,000张照片将是您最糟糕的照片 ”(他甚至不怀疑使用数码相机的人会在一周内达到这个数字)。 真正的经验与生命息息相关: 塞缪尔·约翰逊Samuel Johnson (1709-1784))写道:“ 任何领域的经验只能通过毕生的劳动获得; 没有更低的价格 ”; 乔uc (1340-1400)抱怨:“ 活得那么少,学到了太多东西 。” 希波克拉底 (公元前400年)以其“ 生命短暂,科学广博 ”的说法而闻名,这听起来像是这样:“阿斯·隆加,维塔布·弗里维斯,occasio praeceps,experimentum perculosum,iudicium difficile”,以及俄语翻译“ Life”简而言之,科学是广阔的,动摇的情况下,经验是欺骗性的,判断是困难的。” 当然,没有一个数字是确切的答案:没有理由假设所有技能(编程,下棋,下棋,玩乐器)需要完全相同的时间来掌握它们,以及不同的人需要什么完全相同的时间。 正如K. Anders Ericsson教授所说 :“ 在大多数地区,即使是最有才华的人要花多少时间,也简直令人惊讶。 “ 10,000小时”这个数字可以帮助您了解,我们正在谈论几年的辛勤工作,每周要工作10到20个小时,以达到最高水平,即使对于天生最有天赋的人才来说也是如此

所以你想成为一名程序员


这是我成功编程的秘诀:

  • 编程感兴趣 ,并创建一些有趣的东西。 对您来说应该如此有趣,以至于花上未来10年/ 10,000小时都不是一件可惜的事情。
  • 程序 。 最好的训练是练习 。 用技术术语来说,“一个人在某个领域的最高绩效不能凭经验自动实现,相反,由于有意识地渴望改进,即使是最有经验的人也可以提高生产率”( 第366页 ),“对于最有效的培训,它需要良好的表现。具有针对特定个人的适当复杂程度的任务,对其实施的可理解的评估以及其重复实施和纠正错误的可能性 Ibok”(第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)更简洁地说:“ 每个人都可以学会雕刻雕塑; 米开朗基罗必须学习如何不雕刻它们。 同样,对于优秀的程序员来说 。“ 佩利斯想说,伟人有一些内在特质,而这是通过训练无法获得的。 但是这些品质从何而来? 是先天性的吗? 还是它们是由热情产生的? 正如奥古斯特·古斯托(Aguste Gusto)(漫画《 料理鼠王 》中的人物)所说,“ 任何人都可以做饭,但只有无所畏惧才能变得很棒 。” 我相信在我们的案例中,我们正在谈论一种强烈的愿望,即将我一生的大部分时间都专注于编程方面的自学。 但是可能会有一个无所畏惧的更恰当的词。 或者,正如安东·耶戈(Anton Yego)(对阿古斯特·古斯托(Aguste Gusto)的批评)所说:“ 不是每个人都可以成为一位伟大的艺术家,但是一位伟大的艺术家可以在任何地方出现 。”

因此,继续购买一本有关Java / Ruby / JavaScript / PHP的书; 也许您会从中受益。 但是您将无法改变自己的生活,也无法在24小时或21天之内成为编程专家。 如何花24个月的努力不断地掌握该主题? 现在我们已经进行了认真的交谈...

文学作品


  • 本杰明·布鲁姆(ed。),《年轻人的发展才能》,巴兰廷,1985年。
  • 布鲁克斯,弗雷德,《无银子弹》,IEEE计算机,第1卷。 20号 1987年第4期,第2期 10-19。
  • Bryan,WL&Harter,N.“关于电报语言的研究:习性等级的获得。《心理学评论》,1899年,第8期,第345-375页
  • 海斯(John Hayes),《完成问题解决者》(Lawrence Erlbaum),1989年。
  • 蔡斯,威廉G.&西蒙,赫伯特A.“在国际象棋中的认知”认知心理学,1973,4,55-81。
  • Lave,Jean,《实践中的认知:日常生活中的思维,数学和文化》,剑桥大学出版社,1988年。

答案


在典型的PC上执行各种操作所需的估计时间:
典型指令的执行1 / 1,000,000,000秒= 1纳秒
从L1缓存读取0.5纳秒
预测过渡时出错5纳秒
从二级缓存读取7纳秒
捕获/释放互斥锁25纳秒
从主存储器读取100纳秒
通过1Gbps网络发送2K20,000纳秒
从内存顺序读取1MB250,000纳秒
通过搜索从磁盘读取(搜索)8,000,000纳秒
从磁盘顺序读取1MB20,000,000纳秒
从美国向欧洲发送数据包并返回150毫秒= 150,000,000纳秒


应用:语言选择


一些读者问我应该首先学习哪种编程语言。 这个问题没有单一答案,但请考虑以下几点:

  • 与您的朋友联系 。 当他们问我“应该选择哪种操作系统-Windows,UNIX或Mac?”时,我回答:“请使用您的朋友使用的操作系统。” 您从朋友那里学到的东西将不仅仅涵盖操作系统或编程语言之间的任何内部差异。 还考虑一下您的未来朋友:程序员社区,如果您继续培训,您将成为其中的一部分。 您选择的语言是在一个庞大的社区中发展还是正在逐渐消亡? 是否有许多书籍,网站和论坛可为您提供答案? 您喜欢在这些论坛上闲逛的人吗?
  • 从简单开始 。 C ++和Java编程语言是为大型团队的经验丰富的程序员设计的,这些团队最关心其代码执行的效率。 结果,这些编程语言具有用于解决此类问题的复杂结构。 学习编程非常重要。 您不需要额外的复杂性。 您需要一种专门创建的语言,以使其易于学习和记忆。
  • 您想如何学习弹奏钢琴:以通常的互动方式,当您在按下琴键时立即听到每个音符,或在“批处理模式”中-当您仅在按下琴键上的所有音符之后才听到整个旋律? 当然,交互方式和编程都容易得多。 选择一种具有交互操作模式的语言并进行播放。

考虑到所有这些条件,我建议使用Python或Scheme作为第一种编程语言。 还是JavaScript,但这不是因为它是为初学者理想地设计的,而是因为有很多这种语言的教科书,例如,在Kahn Academy中 。 但是您的特殊情况可能很特殊,因此有许多其他语言可供选择。 如果您不到10岁,您可能会喜欢AliceSqueakBlockly的语言(大学生也可能会喜欢)。 最主要的是做出选择并开始学习。

附录:书籍和其他资源


我被问到最适合学习的书籍和网站。 我将再次重复:“仅读书是不够的,”但我建议以下几点:

Source: https://habr.com/ru/post/zh-CN416167/


All Articles