“自学一门编程语言,我认为需要 10 年”
【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 个月的时间里都不断努力提高自己,那么从现在开始,你就开始有所收获了......
想从小白成长为高级程序员,要把编程学习到什么程度?
很多编程初学者容易陷入一个误区,认为只要掌握一门编程语言就能成为优秀的程序员。
然而,编程只是软件开发的冰山一角,程序员的成长之路远不止于此。
程序员的成长之路可以概括为以下几个阶段。
掌握一门编程语言
是入门的第一步,也是最基础的阶段。
学习数据结构和算法
掌握了编程语言后,你需要学习如何组织和处理数据,以及设计高效的算法来解决问题。
精通软件开发
这个阶段你需要学习软件开发的整个流程,包括代码管理、版本控制、团队协作、测试、自动化集成测试、自动化部署、监控和日志等。
理解系统设计
你需要了解一个成熟业务软件的各个模块,包括功能性和非功能性需求、设计、第三方软件/服务的整合、运维等等。
独立完成系统设计
你需要熟练掌握第四阶段的知识,并能够根据需求快速设计出完整的系统,包括功能性、非功能性需求以及责任界定。
每个阶段的跨越都需要付出努力和时间。
从第一阶段到第二阶段
掌握数据结构和算法,意味着你真正学会了“编程”。这时,学习任何一门新语言的基础知识都将变得轻而易举。
从第二阶段到第三阶段
你需要了解软件开发的整个流程,学会如何与团队协作,以及如何保证软件的质量和效率。
从第三阶段到第四阶段
你需要学习大量的知识,了解一个成熟业务软件的各个方面,并能够理解他人的系统设计。
从第四阶段到第五阶段
你需要将第四阶段的知识融会贯通,并能够独立完成系统设计,同时清晰地界定责任范围。
一些重要的经验和建议
不要执着于精通每一门编程语言 ,不同的项目、不同的模块需要使用不同的语言,更重要的是学会选择合适的工具。
软件开发不仅仅是写代码,更重要的是设计和架构 。优秀的设计可以事半功倍,而糟糕的设计即使代码再好也无济于事。
作为一名程序员,你需要不断学习和进步 ,才能跟上技术的发展。
对于不同级别的程序员,对他们的期望也不同。
初级程序员
至少要达到第三阶段的水平,能够理解软件开发的整个流程。
中级/高级程序员
需要达到第四阶段的水平,能够理解系统设计,并能够独立完成部分模块的设计。
总而言之,程序员的成长之路是一个不断学习和进步的过程。不要被眼前的困难吓倒,只要坚持不懈,你就能成为一名优秀的程序员。
相关问答
编程 能 自学 吗?很难吗?是不是要学习英语?首先先谢谢您的对我的信任,邀请我来解答这个问题!对于你提出的问题就让我逐个为你解答吧!编程能自学吗?答案是肯定,这世界上没有啥是不可以自学完成的!...首先...
编程 难吗?可以 自学 吗?我的经历到这里就告一段落了,五年里跳了五次槽,不知道和大家比算不算多J,没有什么太多起伏,但我想很多朋友可能会和我有类似的经历,不知道能不能引起你们的...
自学编程 能学好吗?可以学好,即便是上课老师也只是讲一些课本上的重点而已,关键还是靠自己,因此自学当然可以学好啊。先看基础、原理类的书籍,再看实例操作,自己按照书上的要...一...
低学历者逆袭 成功 的概率是多少?低学历成功逆袭有很大概率,好多的私企小老板,好多是学历不高得,在这个年代,只要肯吃苦,肯放下心的干,还是有好多人会成功的其实真正决定给我们开多少工资的不...
编程 真的有现在网上传的那么简单吗?不感兴趣看十遍也记不住。有兴趣失败十次仍然兴趣盎然,没兴趣失两次就放弃了。编程是一个没兴趣学不会的技术。想学的要先问问自己。你的兴趣所在的东西去学,看...
计算机 编程 很难学吗?计算机编程对于不少人来说可能存在一定的难度,但并不是不可克服的。学习计算机编程需要付出艰苦的努力和坚持不懈的精神,同时也需要一定的数学知识和逻辑思维...
比起参加Java培训,Java 自学 难吗?作为一名IT行业的从业者,也出版过Java编程书籍,所以我来回答一下这个问题。首先,自学Java具有一定的难度,但是如果有一个系统的学习计划,大部分人是能够掌...作...
编程 这么难吗,我想学大数据,没基础,如果报培训班有效果没,求指点?步了解...如果初步了解,是感兴趣的,那再考虑下一步,加深学习不迟,这样有计划的去学习,即能省事省时,又能少走弯路。而且,难不难不是别人能帮你考虑到的问题,...
自学 计算机的可能性大吗?该怎么做,有何建议?师傅领进门,修行靠个人!掌握好方向:编程为生产工厂,设计为工程师,硬件维修就是个打杂的!!如果说仅仅是自学的话,难度较大,如果能遍寻名师,会走好多弯...刚开始...
上大学后,初、高中时期 自学 的 编程 会变得简单吗?都得到一个阶次的提升,所以我认为兴趣是最好的...基础知识很重要,因为你在初高中时期就接触过这类的知识,那么就会比一般人接收的知识来的快,接收能力和理解...