我为何认为自学一门编程语言需要十年

发表时间: 2024-01-22 11:18

【CSDN 编者按】学习编程真的可以“速成”吗?本文作者认为:想要真正掌握一门编程语言,至少需要 10 年。

原文链接:
https://norvig.com/21-days.html#bh

作者 | Peter Norvig
翻译 | 郑丽媛
出品 | CSDN(ID:CSDNnews)

我不理解,为什么现在每个人看起来都这么着急?

随便走进一家书店,你都能看到“如何在 24 小时内自学 Java”、“教你 X 天/小时学会 C/SQL/Ruby/算法”等内容的各种书籍;打开亚马逊网站,高级搜索“自学、小时、2000 年以后”,发现了 512 本相关书籍,前 10 名中有 9 本是编程书籍,如果把“自学”换成“学习”,或把“小时”换成“天”,得到的还是类似结果。

我得到的结论是:要么人们急于学习编程,要么编程比其他任何东西都要简单。Felleisen 等人在《如何设计程序》一书中对这个说法给予了肯定:“糟糕的编程很好学,傻瓜也能在 21 天内学会。”

让我们来试着分析一下,如果有本书叫做《24 小时内自学 C++》,这可能意味着什么:

  • 自学:在 24 小时内,你没时间编写一些重要程序,更别提从成功和失败中吸取经验教训;你也没时间与经验丰富的程序员一起工作,真正了解在 C++ 开发中的感受……总之,你根本没有时间学到太多东西。因此,这本书只能让你肤浅地熟悉 C++,而不是深刻的理解。可正如 Alexander Pope 所说,只有少量知识是很危险的。

  • C++:如果你已掌握另一门编程语言,那在 24 小时内你也许可以学会一些 C++ 语法,但不可能学会用 C++ 语法编写 Basic 风格的程序,也无法了解 C++ 究竟有什么用。那么,这有什么意义呢?第一届图灵奖得主 Alan Jay Perlis 曾经说过,一个编程语言如果不能影响你的思维方式,就不值得去学习它。有一种可能情况是,因为你需要与现有工具对接来完成特定任务,所以你必须学习一点 C++。但这样你就不是在学习如何编程,而是在学习如何完成这项任务。

  • 24 小时内:不好意思,这个时间根本不够。

耗时十年自学编程

有研究表明,不论是下棋、音乐创作、电报操作、绘画、钢琴演奏、游泳、网球以及神经心理学和拓扑学研究等任一领域,都需要大约十年的时间来发展专业知识。其中的关键,在于深思熟虑的练习:不是一而再、再而三地做,而是用一项超出你现有能力的任务来挑战自己,尝试完成它并在过程中分析自己的表现,从而纠正所有错误——然后重复、再重复,没有任何真正的捷径。即使是 4 岁就成为音乐神童的莫扎特,也是花了 13 年才开始创作出世界级的音乐作品。在另一种音乐流派中,披头士乐队看似在 1964 年凭借一连串排名第一的热门歌曲一举成名,但实际上他们早在 1957 年就开始在小型俱乐部演出,且他们第一首获得巨大成功的专辑 Sgt. Pepper 也是在 1967 年发行的。

提出“10000 个小时成功定律”的美国作家 Malcolm Gladwell 显然也赞同这一观点,只是他认为学习的单位是 10000 小时,而不是 10 年。著名摄影师 Henri Cartier-Bresson 也有类似看法:“你的前 10000 张照片是你最差的作品(只是他没有预料到,有了数码相机后,有些人一周就能达到这个标准)。”英国作家 Samuel Johnson 也说过,“任何领域的杰出成就都需要付出毕生努力才能获得,想以更低代价来获得它是不可能的。”Chaucer 也感叹到:“生命如此短暂,要学的东西却如此多。”此外,医学之父 Hippocrates 也有个经典语录:“生命短暂,艺术苦长,机会稍纵即逝,经验难以信赖,判断更是难上加难。”

当然,没有一个数字可以作为最终答案:假设所有技能(如编程、下棋、跳棋和音乐演奏)都需要完全相同的时间才能掌握,或者假设所有人都需要完全相同的时间,这似乎并不合理。正如 K. Anders Ericsson 教授所说:“在大多数领域,即使是最有天赋的人,要达到最高水平也需要大量时间。10000 小时这个数字只是给你一种感觉,实际上我们说的是每周花费 10-20 个小时的几年时间。有些人认为,那些天生最有才华的人也仍需要这些时间才能达到最高水平。”

你想成为一名程序员

如果你想要成为一名程序员,以下是我的编程成功秘诀:

(1)对编程感兴趣,并试着从兴趣出发去做些什么,来确保它一直充满乐趣,这样你才会愿意投入十年/一万小时的时间。

(2)编程。最好的学习就是在实践中学习,引用《实践中认知:日常生活中的思想、数学与文化》中更专业的说法:“个人在某一领域的最高表现水平并不会随着经验的积累而自动达到,但即使是经验丰富的人,也可以通过有意识的努力来提高表现水平”,“最有效的学习需要一个明确任务,对特定的个人有适当的难度水平,信息反馈,以及重复和纠正错误的机会。”

(3)与其他程序员交流。阅读其他程序,这比任何书籍或培训课程都重要。

(4)如果你愿意,可以在大学(或研究生院)学习四年,这将让你有机会从事一些需要证书的工作,也会让你对该领域有更深入的了解。但如果你不喜欢上学,你也可以靠自己或在工作中获得类似经验。无论如何,光靠书本知识是不够的。正如著名开发者 Eric Raymond 所说,计算机科学教育不能使任何人成为专业程序员,就像研究画笔和颜料不能使人成为专业画家一样。我曾聘用过一位最优秀的程序员,他只有高中学历,但开发了很多优秀的软件,拥有自己的新闻组,甚至在股票期权赚的钱都足够买下一家娱乐会所了。

(5)与其他程序员一起完成项目。在某些项目中,做最好的程序员;在另一些项目中,做最差的程序员。当你是最好的程序员时,你可以检验自己领导项目的能力,并用自己的丰富经验激励他人。当你是最差的程序员时,你可以学习大佬的工作,也可以了解到他们不喜欢做的事情(因为他们会让你帮着做)。

(6)跟着其他程序员一起完成项目。理解别人编写的程序,看看当原来的程序员不在时,如何理解和修复它。由此思考如何设计你的程序,让那些在你之后维护这些程序的人更轻松。

(7)至少学习六种编程语言,包括一种强调类抽象的语言(如 Java 或 C++)、、一种强调函数抽象的语言(如 Lisp 或 ML 或 Haskell)、一种支持语法抽象的语言(如 Lisp)、一种支持声明式规范的语言(如 Prolog 或 C++ 模板),以及一种强调并行性的语言(如 Clojure 或 Go)。

(8)请记住,“计算机科学”中有一个“计算机”。了解计算机执行一条指令、从内存中获取一个字(有缓存缺失和无缓存缺失)、从磁盘中读取连续的字以及在磁盘上查找新位置需要多长时间。

(9)参与一个语言的标准制定工作。这可以是 ANSI C++ 委员会的工作,也可以是仅决定你的代码是用 2 个还是 4 个空格作为缩进。无论哪种方式,你都能了解到其他人喜欢什么语言,他们对这种语言有多喜欢,或许还能知道一点他们为什么会喜欢这门语言。

(10)要有尽快停止语言标准化工作的良好意识。

考虑到这一切,仅靠书本知识能走多远显然是个问题。在我第一个孩子出生前,我读了所有的育儿书籍,但仍然觉得自己是个毫无头绪的新手。等 30 个月后,当我的第二个孩子要出生时,我又翻回以前的书本复习了吗?没有,我依靠的是自己的亲身经历。事实证明,这些经验比专家写的数千页书更有用,也更让我放心。

Fred Brooks 在他的文章《No Silver Bullet》中提出了一个寻找优秀软件设计师的三部分计划:

  • 尽早发现有潜力的顶尖设计师。

  • 指派一名职业导师负责其发展方向,并仔细保存职业档案。

  • 为还在成长中的设计师提供机会,让他们进行互动并相互激励。

这样做的前提是,有些人已经具备了成为一名优秀设计师的必要素质,我们的工作就是适当的督促他们往前走。Alan Perlis 说得更简洁:“每个人都可以学会雕刻,但米开朗基罗必须学会不去雕刻。伟大的程序员也是如此。”这句话的意思是,伟大的程序员具有某种超越训练的内在品质。这种品质从何而来?是与生俱来的,还是他们通过勤奋培养出来的?我认为将自己生命中的大部分时间投入到深思熟虑的实践中,或许是一种方式。

所以,如果你要去买 Java/Ruby/Javascript/PHP 的书,你可能会从中得到一些好处,但你不可能因此在 24 小时或 21 天内改变你的生活,这也不会改变你作为一名程序员的真正全面的专业知识。但如果你计划在 24 个月的时间里都不断努力提高自己,那么从现在开始,你就开始有所收获了......