Peter Norvig
为什么每个人都这么浮躁呢/h2>
走进任何一家书店,你会看到大量的速成书籍,像《如何在24小时内自学Java》,以及许多教你在很短的时间内去学C,SQL,Ruby,算法之类的快速学习的书。在亚马逊 站上输入[title: teach, yourself, hours, since: 2000 ],会找到512本相关的书籍。排在最前面的十本书,有九本书是关于编程的书籍,还有一本是推荐类型的书。用”learn” or “hours” with “days.”关键字去搜索,也会得出同样的结果。
结论就是人们要么急于学习编程知识,要么就是觉得编程很容易,Felleisen等人 在他们的《如何设计程序》一书中对这种趋势表示赞同,他们认为“糟糕的编程很容易,白痴可以在 21 天内学会它,即使他们是傻瓜。” Abtruse Goose 也赞成这种看法。
让我们分析一下 Teach Yourself C++ in 24 Hours 类似的标题到底意味着什么:
- 自学: 在 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 年的时间才开始创作出世界级的音乐。 在另一种类型中,披头士乐队似乎在 1964 年凭借一连串排名第一的热门歌曲并在 Ed Sullivan 节目中露面而迅速走Malcolm Gladwell 已经普及了这个想法,尽管他专注于 10,000 小时,而不是 10 年。 Henri Cartier-Bresson (1908-2004) 有另一个衡量标准:“你的前 10,000 张照片是最糟糕的。” (他没想到有了数码相机,有些人可以在一周内达到那个水平。)真正的专业知识可能需要一生:塞缪尔·约翰逊(Samuel Johnson,1709-1784)说:“任何部门的卓越都只能通过一生;它不能以较低的价格购买。”乔叟(1340-1400)抱怨“生命如此短暂,手艺如此漫长以待学习”。希波克拉底(约公元前 400 年)以摘录“ars longa, vita brevis”而闻名,它是较长引文“Ars longa, vita brevis, occasio praeceps,experimentum periculosum, iudicium difficile”的一部分,在英文中译为“Life时间短,[the] 工艺长,机会稍纵即逝,实验危险,判断困难。”当然,没有一个数字可以成为最终答案:假设所有技能(例如,编程、下棋、下棋和演奏音乐)都需要完全相同的时间来掌握似乎并不合理,也不是所有人都会花费完全相同的时间。正如 K. Anders Ericsson 教授所说:“在大多数领域,即使是最有才华的人也需要多少时间才能达到最高水平的表现。10,000 小时的数字只是让你觉得我们在谈论几年每周 10 到 20 个小时的时间,有些人认为是最有天赋的人仍然需要达到最高水平。”
所以你该考虑怎样去做一个程序员
这是我编程成功的秘诀:
- 对编程感兴趣 并做一些因为它很有趣。 确保它保持足够的乐趣,这样你就愿意投入你的十年/10,000 小时。
- 去编程 最好的学习方式是边做边学。 更专业地说,“在给定领域中个人的最高绩效水平不是作为扩展经验的函数自动达到的,但即使是经验丰富的个人也可以通过刻意努力提高绩效水平来提高绩效水平。 .” (p. 366) 和“最有效的学习需要明确定义的任务,具有适合特定个人的适当难度级别、信息反馈以及重复和纠正错误的机会。” (第 20-21 页)《实践中的认知:日常生活中的思维、数学和文化》一书是这一观点的有趣参考。
- 和其他程序员交流; 阅读其他程序。 这比任何书籍或培训课程都重要。
- 和其他程序员合作进行编程。在某些项目上成为最好的程序员; 在其他人身上做最坏的事。 当您是最优秀的时,您就可以测试自己领导项目的能力,并用您的愿景激励他人。 当你最糟糕的时候,你会学习大师们所做的事情,而你会学习他们不喜欢做的事情(因为他们让你为他们做这件事)。
- 学习其他程序员的优秀的开源项目。理解别人写的程序。 看看当原始程序员不在时如何理解和修复它。 想想如何设计你的程序,让那些在你之后维护它们的人更容易。
- 学习至少六种编程语言。包括一种强调类抽象的语言(如 Java 或 C++),一种强调功能抽象的语言(如 Lisp 或 ML 或 Haskell),一种支持句法抽象的语言(如 Lisp),一种支持声明式规范(如 Prolog 或 C++ 模板) ,以及一个强调并行性的(如 Clojure 或 Go)。
- 请记住学习计算机技术离不开计算机。现在你的计算机执行一条指令、从内存中获取一个字(有和没有缓存未命中)、从磁盘读取连续的字以及寻找磁盘上的新位置需要多长时间。 (答案在这里。)
- 参与语言标准化工作。 它可能是 ANSI C++ 委员会,也可能是决定您的本地编码风格是否具有 2 或 4 个空格缩进级别。 无论哪种方式,你都会了解其他人喜欢一种语言的什么,他们的感受有多深,甚至可能了解他们为什么这么想。
- 有意识地尽快完成语言标准化工作。考虑到所有这些,仅靠书本学习能走多远值得怀疑。 在我的第一个孩子出生之前,我阅读了所有的 How To 书籍,但仍然觉得自己是一个毫无头绪的新手。 30 个月后,当我的第二个孩子到期时,我有没有回到书本复习不是。相反,我依赖于我的个人经验,结果证明,这比专家写的数千页书对我有用得多,也让我放心。
- 尽早系统地定义顶级设计师。
- 指派一名职业导师负责潜在客户的发展,并仔细保存职业档案。
- 为成长中的设计师提供相互交流和激励的机会。
这假设有些人已经具备成为伟大设计师所需的素质:工作就是适当地哄他们。 Alan Perlis 更简洁地说:“每个人都可以学会雕刻:必须教米开朗基罗如何不雕刻。伟大的程序员也是如此”。 玻璃市说,伟人有一些超越他们训练的内在品质。 但质量从何而来是天生的吗还是他们通过勤奋来开发它正如奥古斯特·古斯托(Ratatouille 中的虚构厨师)所说,“任何人都可以做饭,但只有无所畏惧的人才是伟大的。” 我认为它更像是愿意将一个人的一生中的很大一部分用于深思熟虑的实践。 但也许无所畏惧是总结这一点的一种方式。 或者,正如 Gusteau 的评论家 Anton Ego 所说:“不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自任何地方。”
所以去买那本 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.
Answers
典型个人计算机上各种操作的大致时序:
执行典型指令 | 1/1,000,000,000 秒 = 1 纳秒 |
从 L1 缓存中读取数据 | 0.5 纳秒 |
分支中断 | 5 纳秒 |
从 L2 缓存中读取数据 | 7 纳秒 |
mutex加锁/解锁 | 25 纳秒 |
从内存中读取数据 | 100 纳秒 |
通过 1Gbps 络发送 2KB数据 | 20,000 纳秒 |
从内存中顺序读取 1MB数据 | 250,000 纳秒 |
从新磁盘位置获取(寻道) | 8,000,000 纳秒 |
从磁盘顺序读取 1MB数据 | 20,000,000 纳秒 |
将美国数据包发送到欧洲并返回 | 150 微秒 = 150,000,000 纳秒 |
附录: 语言选择
有几个人问他们应该首先学习什么编程语言。 没有一个答案,但请考虑以下几点:
- 请教你的朋友。 当被问到“我应该使用什么操作系统,Windows、Unix 还是 Mac时,我的回答通常是:“使用你朋友使用的任何操作系统。” 您从朋友那里学习的优势将抵消操作系统之间或编程语言之间的任何内在差异。 还要考虑你未来的朋友:如果你继续下去,你将成为其中一员的程序员 区。 你选择的语言有一个庞大的成长 区还是一个正在消亡的小 区是否有书籍、 站和在线论坛可以获取答案你喜欢那些论坛上的人吗/li>
- 把事情简单化。 C++ 和 Java 等编程语言专为由关心代码运行时效率的经验丰富的程序员组成的大型团队的专业开发而设计。 因此,这些语言具有为这些情况设计的复杂部分。 你关心的是学习编程。 你不需要那种复杂性。 您需要一种设计为易于单个新程序员学习和记忆的语言。
- 玩。 您更愿意以哪种方式学习弹钢琴:正常的交互式方式,即您在敲击琴键后立即听到每个音符,或“批处理”模式,在这种方式中,您只在完成一首歌曲后才听到音符 显然,交互模式使钢琴学习和编程更容易。 坚持一种具有交互模式的语言并使用它。
鉴于这些标准,我对第一种编程语言的建议是 Python 或Scheme。 另一个选择是 JavaScript,不是因为它非常适合初学者,而是因为它有很多在线教程,例如可汗学院的教程。 但是您的情况可能会有所不同,还有其他不错的选择。 如果您的年龄是个位数,您可能更喜欢 Alice 或 Squeak 或 Blockly(年龄较大的学习者也可能喜欢这些)。 重要的是你选择并开始。
附录:书籍和其他资源
有几个人问他们应该从哪些书籍和 页中学习。 我重申“仅靠书本学习是不够的”,但我可以推荐以下内容:
-
Scheme:计算机程序的结构和解释 (Abelson & Sussman) 可能是对计算机科学最好的介绍,它确实将编程作为理解计算机科学的一种方式来教授。 您可以在线查看本书讲座的在线视频,以及在线完整文本。 这本书很有挑战性,会淘汰一些可能通过另一种方法取得成功的人。
- Scheme: How to Design Programs(Felleisen 等人)是关于如何以优雅和实用的方式实际设计程序的最好的书籍之一。
- Python:Python Programming: An Intro to CS (Zelle) 是使用 Python 的很好的介绍。
- Python: Python.org 上提供了多个在线教程。
- Oz:计算机编程的概念、技术和模型 (Van Roy & Haridi) 被一些人视为 Abelson & Sussman 的现代继承者。 这是一个关于编程的重要思想之旅,涵盖的范围比 Abelson & Sussman 更广,同时可能更容易阅读和遵循。 它使用一种并不广为人知但作为学习其他语言的基础的语言 Oz。
后记
T. Capey 指出,亚马逊的 Complete Problem Solver 页面现在在“购买此商品的客户也购买了这些商品”部分下有“21 天自学孟加拉语”和“自学语法和风格”书籍。 我猜看那本书的大部分人都来自这个页面。 感谢罗斯科恩对希波克拉底的帮助。
原文链接:http://www.norvig.com/21-days.html
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!