1. Teach Yourself Programming in Ten Years (1998) (norvig.com)
《十年学编程》核心内容摘要
本文批判了市场上宣称能在极短时间内(如24小时或21天)教会编程的流行书籍,并基于研究论证,认为真正的专业技能需要长达十年或一万小时的刻意练习才能掌握。
对速成学习的质疑
作者指出,书店中充斥着大量《24小时自学Java》之类的书籍,这暗示编程要么是人们急于求成,要么是编程本身异常容易学习。然而,这类书名具有误导性:
- “自学”:在24小时内无法通过编写足够多的程序来积累经验,无法深入理解。
- “C++”:在24小时内可能仅能学习语法,无法理解语言的适用场景和哲学。
- “在24小时内”:这个时间根本不足够。
结论是,这种学习只能带来肤浅的熟悉,而非深刻的理解。
精通需要十年或一万小时
引用多项研究(如Bloom、Bryan & Harter、Hayes、Simon & Chase等),作者表明在象棋、音乐、绘画、网球等多个领域,发展出专业技能通常需要大约十年时间。关键在于刻意练习:不仅是重复,而是挑战超出当前能力的任务,分析表现并纠正错误,然后不断重复。即使是莫扎特和披头士这样的天才或成功团体,也经历了漫长的成长期。
马尔科姆·格拉德威尔普及了“一万小时定律”,而其他名人如塞缪尔·约翰逊和乔叟也强调精通需要一生努力。虽然具体时间因技能和人而异,但核心是需要年复一年、每周投入大量时间的刻苦努力。
成功编程的实践建议
作者提出了一个成功编程的“秘方”:
- 保持兴趣:出于乐趣而编程,并确保它足够有趣,以支撑你投入十年/一万小时。
- 实践编程:最佳学习方式是“做中学”。刻意练习要求有定义明确、难度适中的任务,以及反馈和纠正的机会。
- 交流与阅读:与其他程序员交谈,阅读其他人的程序,这比任何书本或课程都重要。
- 考虑深造:大学或研究生院能提供一些需要文凭的工作和更深层次的理解,但并非唯一途径。书本学习本身是不够的。
- 参与协作项目:在一些项目中做最好的程序员(学习领导),在另一些项目中做最差的(学习大师的做法)。也要练习维护和理解他人编写的程序。
- 学习多种语言:至少学习六种编程语言,涵盖面向对象(如Java/C++)、函数式(如Lisp/Haskell)、支持语法抽象(如Lisp)、声明式(如Prolog)和强调并发性(如Go)等不同范式。
- 理解计算机:了解计算机执行指令、读取内存、磁盘操作等基本时间开销。
- 参与标准制定:参与语言标准化工作或本地编码规范制定,以理解他人的偏好。
关于天赋与教育
作者引用Fred Brooks的观点,指出培养优秀软件设计师需要:尽早发现有潜力的设计师、为其配备导师、并提供交流机会。同时,像Michelangelo这样的大师可能有一种超越训练本身的内在品质,但这种品质往往源于甘愿为刻意练习奉献大量人生的意愿。
附录:选择第一门编程语言
作者建议选择编程语言时考虑:
- 朋友用什么:向朋友学习的便利性超越了语言本身的差异。
- 保持简单:避免为专业团队设计的复杂语言(如C++/Java)。
- 交互式学习:选择支持交互模式(即时反馈)的语言。 基于这些,他推荐Python或Scheme作为首选,JavaScript因教程众多也是一个选择,儿童则可从Alice、Squeak或Blockly开始。
附录:推荐资源
作者强调“仅靠书本学习是不够的”,但仍推荐了一些经典教材,如《计算机程序的构造和解释》(SICP)、《如何设计程序》(HtDP)、《Python编程:计算机科学导论》以及《计算机编程的概念、技术和模型》等。