十年学会编程 (1998)

十年学会编程 (1998)

Hacker News 摘要

原标题:Teach yourself programming in ten years (1998)

彼得·诺维格(Peter Norvig)在文中探讨了为何现在的编程学习充斥着急功近利的气息。书店里到处是“24小时学通 Java”或在短短几天、几小时内掌握各种编程语言及算法的书籍。通过亚马逊的搜索发现,这类主打“速成”的书籍中,绝大多数都与编程有关。这表明人们要么急于学习编程,要么认为编程比其他任何技能都容易掌握。

作者引用了其他学者的观点,讽刺地指出:糟糕的编程是容易的,甚至傻瓜也能在21天内学会。他进一步分析了“24小时学通 C++”这类标题的荒谬之处。在24小时内,你根本没有时间编写大型程序并从失败中总结经验,也无法了解资深程序员的真实工作环境。你最多只能掌握一些语法表面,而无法真正理解这门语言的优劣。正如艾伦·佩利(Alan Perlis)所说,如果一门语言不能改变你的编程思维,那它就不值得学习。

十年磨一剑

多项研究表明,要在国际象棋、音乐创作、绘画、游泳或神经心理学等领域成为专家,通常需要大约十年的时间。关键在于刻意练习。这不仅仅是简单的重复,而是不断挑战超出当前能力的技能,在练习中分析表现并纠正错误。即使是莫扎特这样的天才,在创作出世界级作品前也练习了13年。披头士乐队虽然在1964年一举成名,但他们自1957年起就在小俱乐部里长期演出。

虽然马尔科姆·格拉德威尔(Malcolm Gladwell)普及了“一万小时定律”,但真正的卓越可能需要毕生的努力。正如希波克拉底所言:生命短暂,艺术长久(Ars longa, vita brevis)。虽然不同技能所需的时间各异,但即便最有天赋的人,也需要投入大量时间才能达到顶峰。

成为程序员的建议

作者给出了成功的配方:

培养兴趣: 确保编程对你来说足够有趣,这样你才愿意投入一万小时。

在做中学: 即使是经验丰富的专家,也需要通过刻意的努力来提升水平。最有效的学习需要定义明确的任务、适当的难度、及时的反馈以及重复纠错的机会。

交流与阅读: 与其他程序员交流,阅读别人的程序,这比任何书籍或培训班都重要。

大学教育: 虽然大学能让你接触深层次的理论并获得就业门槛,但书本知识远远不够。正如研究画刷和颜料不能让你成为画家,计算机科学教育也不会直接让你成为专家。

参与项目: 参与团队合作。在某些项目中尝试当最优秀的那个,练习领导力;在另一些项目中当最差的那个,向大师学习他们的技巧和偏好。

维护旧代码: 尝试理解并修复别人编写的程序。思考如何设计程序才能让后来的维护者更轻松。

学习多种语言: 至少学习六种不同范式的语言。包括强调类抽象的(如 Java 或 C++)、函数式抽象的(如 Lisp、ML 或 Haskell)、语法抽象的(如 Lisp)、声明式规范的(如 Prolog 或 C++ 模板)以及强调并发的(如 Clojure 或 Go)。

了解底层: 记住计算机科学中包含“计算机”一词。你需要知道计算机执行指令、从内存读取数据、从磁盘寻道以及在网络传输数据所需的近似时间。

参与标准化: 参与语言标准化工作或制定团队的代码规范,这能让你了解他人对语言的看法。

作者认为,单纯靠书本学习是有限的。正如他在孩子出生前读了很多育儿书籍,但实际经验远比那些书更有用。弗雷德·布鲁克斯(Fred Brooks)曾提出培养优秀软件设计师的三个计划:尽早识别顶尖人才、指派导师、提供互相交流的机会。

语言选择建议

对于初学者首选哪种语言,作者给出了几个参考标准:

参考周围的人: 朋友们用什么,你就用什么。社区的支持和答案比语言本身的差异更重要。

保持简单: C++ 和 Java 是为大型团队设计的,结构复杂。初学者应该选择易于学习和记忆的语言。

互动性: 像学钢琴一样,你应该选择有互动模式(如 REPL)的语言,能即时看到结果,而不是像“批处理”那样等写完全部代码才能运行。

基于这些标准,作者推荐将 Python 或 Scheme 作为入门语言。JavaScript 也是一个选择,因为它的在线教程非常丰富。

推荐资源

作者重申书本学习是不够的,但他推荐了以下经典:

Scheme:《计算机程序的构造和解释》(SICP)是计算机科学的最佳入门教材,虽然具有挑战性。另一本是《如何设计程序》(HTDP),它教授了优雅的函数式设计。

Python:《Python 编程:计算机科学入门》是一本不错的入门书。

Oz:《计算机编程的概念、技术和模型》被视为 SICP 的现代继任者,涵盖了更广阔的编程思想。

最后,作者给出的关键数据是典型的个人电脑操作耗时,例如执行指令约 1 纳秒,从主内存读取约 100 纳秒,磁盘寻道约 8,000,000 纳秒,而往返大西洋的网络传输约 150 毫秒。掌握这些常识能帮助程序员更好地理解系统性能。


原文:https://www.norvig.com/21-days.html

评论:https://news.ycombinator.com/item?id=49055816

Report Page