Teach Yourself Programming in Ten Years 译文

简介

Teach Yourself Programming in Ten Years(用十年学习编程) 译文

原文链接:http://www.norvig.com/21-days.html

译文:

为什么每个人都那么着急/h2>

当走进任何一家书店,你都会看到《如何在24小时内自学Java》以及类似于几天甚至几小时内教你学 C, SQL, Ruby,和算法的各种书籍。通过亚马逊对【教学,自己,小时】这几个标题进行高级搜索,2000年以后的相关书籍共有512本。在前十名中,有九本是关于编程的书籍(另一本是关于簿记的)。如果将关键词“自学”替换为“学习”或将‘小时’替换为‘天’,搜索出的结果也是相似的。

我们可以看出,要么是人们急于学习编程,要么是编程比其他任何东西都更容易学。费莱森等人在他们的《如何设计程序》一书中提到“糟糕的编程很容易。白痴可以在 21 天内学会它,即使他们是傻瓜。” 以此来对这一趋势表示赞同。Abtruse Goose 漫画对此也表达了相同的看法。

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

  • 自学:在这24 小时中你将没有足够的时间去编写一些重要的程序,并从你的成功和失败中学到什么。同时,你也没有足够的时间与一个经验丰富的程序员一起工作,并置身于C++的工作环境之中。简而言之,你没有时间学习足够多的东西。所以这本书只能让你熟悉表面知识,而不能进行深刻的理解。正如亚历山大·蒲柏所说,一知半解是件危险的事情。
  • C++: 在 这24 小时内,你可能能够学习 C++ 的一些语法(如果你了解另一种类似语言),但你无法了解如何使用该语言。简而言之,如果你是一名 Basic 程序员,你可以学习使用 C++ 的语法并以 Basic 语言的风格编写程序,但您无法了解使用 C++ 进行编程到底有什么好处(和坏处),那么这么做又有什么意义呢lan Perlis 曾经说过:“你不值得去了解一种不会影响你对编程的看法的语言”。但是可能存在的现实问题是你必须学习一点 C++(或者更可能是 JavaScript 或 Processing 之类的东西),因为你需要与现有的工具进行交互以完成特定任务。但若如此,你并不是在学习如何编程,而是在学习如何完成这项任务。
  • 24小时: 不幸的是,对于学习一门语言来说这是不够的,如下一节所示。

在十年中学会编程

Bloom(1985)、Bryan & Harter(1899)、Hayes(1989)、Simmon & Chase(1973)等研究人员的研究表明,在各个领域培养专业技能都需要大约10年的时间,包括下棋、作曲、电 操作、绘画、弹钢琴、游泳、 球以及神经心理学和拓拓学的研究。学习的关键是不断反思地练习:不仅仅是一次又一次地做,而是尝试用一项超出你当前能力的任务来挑战自己,在做的时候和做完之后分析你的表现,并纠正其中的错误。学习的过程就是对这种行为的重复再重复。

似乎没有真正的捷径:即使是 4 岁就成为音乐神童的莫扎特,也花了 13 年的时间才开始创作世界级的音乐。在另一种音乐类型中,披头士似乎以一连串的热门歌曲和1964年在埃德·沙利文的节目中亮相而崭露头角。但自1957年以来,他们一直在利物浦和汉堡的小俱乐部演出,虽然他们很早就吸引了大众的目光,但他们的第一次获得重大成功的专辑——《胡椒中士》(Sgt. Peppers)——是在1967年发行的。

马尔科姆·格拉德威尔(Malcolm Gladwell)推广了这个想法,尽管他追求的是1万个小时,而不是10年。亨利·卡蒂埃-布列松(henry Cartier-Bresson, 1908-2004)有另一个衡量标准:“你的前一万张照片是最差的。”(他没有预料到,有了数码相机,有些人可以在一周内达到这个目标。)

真正的专长通常贯穿一生: 塞缪尔·约翰逊(Samuel Johnson, 1709-1784)说过:“任何领域的卓越都只能通过一生的努力来获得,不能比这更容易。” 乔叟(1340-1400)抱怨道:“生命如此之短,相对于学习技艺来说远远不够”。”希波克拉底(公元前400年左右)以摘录“ars longa, vita brevis”而闻名,这是更长的引语“ars longa, vita brevis, casio praeceps, experimentum periulosum, iudicium difficile”的一部分,可以译成“生命短暂,工艺漫长,机会转瞬即逝,实验险恶,难以判断。” 当然,没有一个具体的数字可以成为最终答案:假设所有技能(例如,编程、下棋、跳棋和演奏音乐)都需要完全相同的时间来掌握似乎是不合理的,也不是所有人都会花费完全相同的时间。正如K.安德斯·埃里克森教授所说:“在大多数领域,即使是最有才华的人,为了达到最高水平的表现所需要的时间也是惊人的。1万小时这个数字让你觉得,我们在谈论每周10到20个小时的工作,但有些人会说,那些最具天赋的人仍然需要为达到最高水平而努力。

所以你想成为一名程序员

这是我对于编程成功的秘诀:

  • 对编程感兴趣,因为感到有趣而去做一些项目。确保它足够有趣,这样你才愿意投入10年或1万个小时的时间。
  • 程序。最好的学习方式是在实践中学习。更专业地说,“在特定领域中,个人的最高绩效水平不会随着经验的增加而自动获得。而经验丰富的人,通过刻意努力改进,绩效水平也可以提高。”(p. 366) 或者说“最有效的学习需要一个明确定义的任务,为特定的个人提供适当的难度级别,信息反馈,以及重复和纠正错误的机会。”(p. 20-21)《实践中的认知:日常生活中的思维、数学和文化》一书是这一观点有趣的参考。
  • 与其他程序员交谈;阅读其他程序。这比任何书籍或培训课程都重要。
  • 与其他程序员一起处理项目。在某些项目中成为最好的程序员,在其他的项目中差一些。当你是最好的时候,你可以测试你领导一个项目的能力,并用你的远见激励他人。当你是最糟糕的时候,你学习大师们做什么,你学习他们不喜欢做什么(因为他们让你为他们做)。
  • 在其他程序员之后接手项目。理解别人写的程序。看看当编写源码的程序员不在时你如何理解和修复它。想想如何设计你的程序,可以让那些在你之后的程序员更容易维护它们。
  • 学习至少六种编程语言。包括一种强调类抽象的语言(如 Java 或 C++),一种强调功能抽象的语言(如 Lisp 或 ML 或 Haskell),一种支持语法抽象的语言(如 Lisp),一种支持声明式规范(如 Prolog 或 C++ 模板) ,以及强调并行性的一种(如 Clojure 或 Go)。
  • 请记住,“计算机科学”中有“计算机”。了解您的计算机执行一条指令、从内存中获取一个字(有和没有缓存未命中)、从磁盘读取连续字以及寻找磁盘上的新位置需要多长时间。(答案在文章下方) 
  • 参与语言标准化的工作。它可能是 ANSI C++ 委员会的工作,或者它可能用于决定你的本地编码风格是 2个 或 4 个空格缩进级别。无论哪种方式,你都可以了解到别人喜欢一门语言的哪些方面,他们的感受有多深,甚至了解到他们为什么会有这种感觉。
  • 有意地尽快完成语言标准化工作。

考虑到所有这些,仅通过书本的学习能走多远值得我们怀疑。在我的第一个孩子出生之前,我阅读了所有关于“如何去做”的书籍,但仍然觉得自己像个无知的新手。30个月后,当我的第二个孩子出生时,我又回去看那些书了吗。相反,我依靠的是我的个人经验,事实证明这比专家写的数千页书籍更有用,更让我放心。

Fred Brooks 在他的文章 No Silver Bullet 中确定了寻找优秀软件设计师的三部分计划:

  1. 尽早系统地识别顶级设计师。
  2. 指派职业导师负责前景的发展,并认真保存职业档案。
  3. 为成长中的设计师提供互动和相互激励的机会。

假设有些人已经具备成为伟大设计师的必要素质,而我们要做的就是好好地哄他们。艾伦·佩利斯(Alan Perlis)说得更简洁:“每个人都可以学会雕刻,而米开朗基罗(Michelangelo)则必须学会如何不去雕刻。”伟大的程序员也是如此。佩利斯说的是,伟大的运动员有一些在训练之上的内在品质。但是这种素质从何而来呢天生的吗是通过勤奋来培养如《料理鼠王》中虚构的厨师奥古斯特·古斯特(Auguste Gusteau)所说:“任何人都能做饭,但只有无畏的人才能做得很棒。”我认为这更像是愿意将一个人一生的大部分时间投入到深思熟虑的实践中。但也许无畏可以概括这一点。或者,正如古斯托的评论家安东·伊戈所说:“不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自任何地方。”

所以去买那本 Java/Ruby/Javascript/PHP 的书吧;你可能会从中受益。但是不会在 24 小时或 21 天内改变你的生活,亦或教会你作为程序员需要的整体专业知识。考虑一下努力工作以在 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., 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 上各种操作的大致时间:

执行典型指令 1/1,000,000,000 sec = 1 nanosec
从 L1 高速缓存中获取 0.5 nanosec
分支错误预测 5 nanosec
从 L2 高速缓存中获取 7 nanosec
互斥锁/解锁 25 nanosec
从主内存获取 100 nanosec
通过 1Gbps 络发送 2K 字节 20,000 nanosec
从内存中有序读取 1MB 250,000 nanosec
从新磁盘位置获取(搜索) 8,000,000 nanosec
从磁盘有序读取 1MB 20,000,000 nanosec
将数据包从美国发送到欧洲并返回 150 milliseconds = 150,000,000 nanosec

附录:语言选择

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

  • 依靠你的朋友:当被问及“我应该使用哪种操作系统,Windows, Unix,还是Mac时,我的回答通常是:“使用你朋友使用的任何操作系统。”从朋友那里学习的优势将抵消操作系统之间或编程语言之间的任何内在差异。还要考虑你未来的朋友: 如果你继续学习,你将成为程序员 区中的一员。你所选择的语言有一个大的发展良好的 区还是一个小的没有前景的 区是否有书籍、 站和在线论坛可以获得你想要的答案你喜欢那些论坛里的人吗/li>
  • 把事情简化。 C++ 和 Java 等编程语言是为专业开发而设计的,这些开发团队都是有经验的程序员组成的,他们关心代码的运行时效率。因此,这些语言具有针对这些情况设计的复杂部分。你关注的的只是学习编程,你不需要接触那么复杂的功能。你需要的是一种设计为易于由单个新程序员学习和记住的语言。
  • 玩。你更愿意以哪种方式学习弹钢琴:正常的交互式方式,即您在按下键后立即听到每个音符,或“批处理”模式,在这种方式中你愿意仅在完成一首歌曲后才能听到音符显然,交互模式使钢琴和编程的学习更容易。坚持使用具有交互模式的语言并使用它。

鉴于这些标准,我对第一种接触的编程语言的建议是 Python 或 Scheme。另一个选择是 Javascript,不是因为它对初学者很友好,而是因为它的在线教程太多了,比如可汗学院的教程。但是你的情况可能会有所不同,而且也有其他不错的选择。如果您的年龄是个位数,您可能更喜欢 Alice、Squeak 或 Blockly(年长的学习者也可能喜欢这些)。重要的是你做出选择并开始。

附录:书籍和其他资源

一些人问他们应该从哪些书籍和 页中学习。我重申“光靠书本学习是不够的”,但我可以推荐以下几本:

  • Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) 可能是最好的计算机科学入门书,它确实把编程作为理解计算机科学的一种方式来教。你可以在 上看到这本书的讲座视频,以及完整的在线文本。这本书很有挑战性,它将淘汰掉一些适合其他方法的人。
  • Scheme: How to Design Programs(Felleisen 等人)是关于如何以优雅和实用的方式设计程序的最好的书籍之一。
  • Python: Python Programming: An Intro to CS (Zelle)对使用Python进行了很好的介绍。
  • Python:可以在Python.org上找到一些在线教程。
  • Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi)被一些人视为Abelson & Sussman的现代继承者。这是一场关于编程的伟大思想之旅,比Abelson & Sussman涵盖的范围更广,但可能更容易阅读和理解。它使用一种名为Oz的语言,这种语言并不广为人知,但可以作为学习其他语言的基础。

笔记

T. Capey指出,亚马逊上的“完整问题解决程序”页面现在在“购买过该商品的顾客也购买过这些商品”一栏下有“在21天内自学孟加拉语”和“自学语法和风格”书籍。我猜大部分看这本书的人都来自这一页。感谢罗斯·科恩对希波克拉底的帮助。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月18日
下一篇 2022年5月18日

相关推荐