原文链接:Teach Yourself Programming in Ten Years
为什么大家都这么着急/h3>
走进任何一家书店,您都会看到如何在 24 小时内自学 Java,以及在几天或几小时内教授 C、SQL、Ruby、算法等的无穷无尽的变化。 亚马逊高级搜索 (title:自学,数小时,since:2000 年),找到了 512 本书。 在前十名中,有九本是编程书籍(另一本是关于簿记的)。 类似的结果来自将“自学”替换为“学习”或“小时”替换为“天”。
结论是,要么人们急于学习编程,要么编程比其他任何东西都更容易学习。 Felleisen等人 在他们的《如何设计程序》一书中对这一趋势表示赞同,当时他们说“糟糕的编程很容易。白痴可以在 21 天内学会它,即使他们是傻瓜。” Abtruse Goose 漫画也有他们的看法。
让我们分析一下像在 24 小时内自学 C++ 这样的标题可能意味着什么:
- 自学:在 24 小时内,您将没有时间编写几个重要的程序,并从您的成功和失败中学习。 您将没有时间与经验丰富的程序员一起工作并了解生活在 C++ 环境中的感觉。 简而言之,您将没有时间学习太多。 所以这本书只能说是表面的熟悉,而不是深入的了解。 正如亚历山大·波普所说,一点点学习是一件危险的事情。
- 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 演出中露面而崭露头角。但自 1957 年以来,他们一直在利物浦和汉堡的小俱乐部演出,虽然他们具有大众吸引力早期,他们的第一个巨大的关键成功,Sgt. Peppers,于 1967 年发行。
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”的一部分,英文翻译为“生命”短,工艺长,机会稍纵即逝,实验险恶,判断难。”当然,没有一个数字可以作为最终答案:假设所有技能(例如,编程、下棋、跳棋和演奏音乐)都需要完全相同的时间来掌握似乎是不合理的,也不是所有人都会花费完全相同的时间。正如 K. Anders Ericsson 教授所说,“在大多数领域,即使是最有才华的人也需要多少时间才能达到最高水平的表现。10,000 小时的数字让您感觉我们正在谈论几年每周 10 到 20 个小时,一些人认为是最有天赋的人仍然需要达到最高水平。”
所以你想成为一名程序员
这是我编程成功的秘诀:
- 对编程感兴趣,做一些因为它很有趣。 确保它保持足够的乐趣,以便您愿意投入十年/一万小时。
- 动手编程。 最好的学习方式是边做边学。 更专业地说,“在给定领域中,个人的最高绩效水平不会随着经验的扩展而自动获得,但即使是经验丰富的个人,由于刻意努力改进,绩效水平也可以提高。 。” (p. 366) 和“最有效的学习需要一个明确的任务,为特定的个人提供适当的难度级别,信息反馈,以及重复和纠正错误的机会。” (第 20-21 页) 《实践中的认知:日常生活中的思维、数学和文化》一书是这一观点的有趣参考。
- 与其他程序员交谈; 阅读其他程序。 这比任何书籍或培训课程都重要。
- 与其他程序员一起处理项目。 在某些项目中成为最好的程序员; 对其他一些人来说是最糟糕的。 当你是最好的时候,你可以测试你领导一个项目的能力,并用你的远见激励他人。 当你最糟糕的时候,你学习大师们做什么,你学习他们不喜欢做什么(因为他们让你为他们做)。
- 在其他程序员之后接手项目。 理解别人写的程序。 看看当原始程序员不在时如何理解和修复它。 想想如何设计你的程序,让那些在你之后维护它们的人更容易。
- 学习至少六种编程语言。 包括一种强调类抽象的语言(如 Java 或 C++),一种强调功能抽象的语言(如 Lisp 或 ML 或 Haskell),一种支持语法抽象的语言(如 Lisp),一种支持声明式规范(如 Prolog 或 C++ 模板) ,以及强调并行性的一种(如 Clojure 或 Go)。
- 请记住,“计算机科学”中有“计算机”。 了解您的计算机执行一条指令、从内存中获取一个字(有和没有缓存未命中)、从磁盘读取连续字以及寻找磁盘上的新位置需要多长时间。 (答案在这里。)
- 参与语言标准化工作。 它可能是 ANSI C++ 委员会,或者它可能决定您的本地编码风格是否有 2 或 4 个空格缩进级别。 无论哪种方式,您都可以了解其他人喜欢一种语言,他们的感受有多深,甚至可能了解他们为什么会这样。
- 有意识地尽快完成语言标准化工作。
考虑到所有这些,仅通过书本学习可以走多远值得怀疑。 在我的第一个孩子出生之前,我阅读了所有的 How To 书籍,但仍然觉得自己像个无知的新手。 30 个月后,当我的第二个孩子到期时,我是否回到书本复习不。相反,我依靠的是我的个人经验,结果证明这比专家写的数千页更有用,更让我放心。
Fred Brooks 在他的文章 No Silver Bullet 中确定了寻找优秀软件设计师的三部分计划:
- 尽早系统地确定顶级设计师。
- 指派职业导师负责发展前景,并认真保存职业档案。
- 为成长中的设计师提供互动和相互激励的机会。
这假设有些人已经具备成为伟大设计师所必需的素质;工作是适当地哄他们。 Alan Perlis 说得更简洁:“每个人都可以学习雕刻:米开朗基罗必须学习如何不雕刻。伟大的程序员也是如此”。玻璃市是说伟人有一些超越他们训练的内在品质。但质量从何而来天生的吗是他们通过勤奋来发展它如奥古斯特·古斯托(《料理鼠王》中的虚构厨师)所说,“任何人都可以做饭,但只有无所畏惧的人才会伟大。”我认为这更像是愿意将一个人一生的大部分时间投入到深思熟虑的实践中。但也许无所畏惧是总结这一点的一种方式。或者,正如古斯托的评论家安东·伊戈所说:“不是每个人都能成为伟大的艺术家,但伟大的艺术家可以来自任何地方。”
所以去买本 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.
附录:语言选择
有几个人问他们应该首先学习什么编程语言。 没有一个答案,但请考虑以下几点:
- 使用你的朋友。当被问及“我应该使用什么操作系统,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:计算机编程的概念、技术和模型(Van Roy 和 Haridi)被一些人视为 Abelson 和 Sussman 的现代继任者。它是对编程大思想的一次探索,涵盖的范围比 Abelson & Sussman 更广泛,同时可能更易于阅读和理解。它使用一种语言 Oz,这种语言并不广为人知,但可以作为学习其他语言的基础。
笔记
T. Capey 指出,亚马逊上的 Complete Problem Solver 页面现在在“Customers who shopped for this item also shopped for these items”部分下有“Teach Yourself Bengali in 21 days”和“Teach Yourself Grammar and Style”书籍。 我猜想看那本书的大部分人都来自这个页面。 感谢Ross Cohen对Hippocrates的帮助。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!