首页生活资讯正文

“自学一门编程语言,我认为需要10年”

2024-10-05 次浏览


【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 个月的光阴里都赓续尽力进步本身,那么从如今开端,你就开端有所劳绩了......

法式C++进修
编写一门新的语言,你可以学到什么。 不论你写什么类型的故事,斯蒂芬-金的小说都会对你有所裨益
相关内容