“自学一门编程语言,我认为需要 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 个月的时间里都不断努力提高自己,那么从现在开始,你就开始有所收获了......
20岁学生编程月赚1万+!揭秘自学之旅
在当前社会,大学生群体面临着巨大的就业压力和生活挑战。
然而,一位20岁的年轻人通过自学编程,利用空余时间开发小程序成功实现月入过万,这一故事无疑为许多在校大学生及对编程感兴趣的群体提供了宝贵的经验和启示。
这位年轻人原本是一个机械专业的专科生,毕业后在工厂的工作经历让他深感技能的局限和未来职业发展的瓶颈。
一次偶然的机会,他接触到了编程,并对之产生了浓厚的兴趣。
尽管没有相关的教育背景和系统的训练,他还是决定投身于自学之路。
通过免费在线平台,他从最基础的语言学习开始,一步一个脚印地积累知识和技能。
在学习的过程中,他遇到了不少困难。
从零基础起步,到能够独立编写小程序,每一步都充满了挑战。
特别是对于一个完全自学的人来说,缺乏系统的指导和实践机会常常使他感到迷茫和挫败。
然而,他没有放弃,而是更加努力地寻找各种资源,包括在线教程、社区论坛和开源项目。
他的坚持最终带来了回报,不仅技术有了显著的提升,也增强了解决问题的能力。
成功并非一蹴而就。
他在学习过程中发现市场上对小程序的需求日益增长,这为他提供了一个施展才华的舞台。
他开始尝试自己开发小程序,起初只是为了解决身边人的小需求,但渐渐地,这些小程序受到了更多人的关注和使用,甚至开始有了一些收入。
随着经验的累积和技术的提高,他开发的小程序功能越来越丰富,用户基数也在不断增长。
推广是关键步骤之一。
他通过网络社交平台分享自己的作品,积极响应用户反馈,不断优化产品体验。
同时,他还通过校园活动和个人网络扩大了影响力,使得更多的人开始关注并使用他开发的小程序。
有效的市场定位和精准的推广策略使他的小程序迅速获得了市场的认可。
这位20岁大学生的故事不仅是关于技术的学习和应用,更是关于如何将知识转化为实际收益的案例。
对于广大在校大学生而言,这不仅是一份激励,更是一种可能的职业路径。
通过持续学习和不断实践,每个人都可以在自己选择的领域内获得成功。
而对于希望兼职增加收入的朋友们,编程无疑是一个值得考虑的方向。
相关问答
编程自学难不难?
自学编程难不难?肯定难。原因是基础薄弱,缺少完整的软件知识体系,但是根据我多年的招聘结果来看,至少有接近一半数量的应聘者都是培训班+自学成才的,真正科...自...
计算机编程难学吗?
最近看到许多人都在问计算机编程入门难吗?作为一个0基础开始的程序员,我想说,其实计算机编程入门真不难,如果你是真心想学计算机,不是那种三天打鱼两天晒网...
自学编程能学会吗?
自学编程是能学会的。自学编程的过程虽然比较困难,但是只要愿意吃苦,能花时间去学习,持之以恒,坚持不懈,就可以学会。自学编程是能学会的。自学编程的过程...
学计算机编程容易吗?
学计算机编程并不是一件容易的事情。虽然工具和学习资源越来越丰富,但编程本质上是一门需要逻辑思维、耐心和较高抽象能力的学科。学习编程需要逐步掌握各种...
做编程现在容易吗?
人人都想自学编程,为什么坚持下来的没几个?近年来,许多人对学习编程产生了兴趣。他们要么通过在线课程开启了学习,要么通过面对面授课,当然还有一些人浅尝...
一个普通人没有学历,自学编程,找到一份月入过万的程序员工作真的有可能吗?
一句话:一份汗水一分收获。不论你做什么,想拿高薪就要有拿高薪的本事与能力。程序员也一样!身边有初中没毕业,工地上做过泥工,电工,厂里做过钳工,跑过长...
学习编程对于学历的要求高吗?
很高兴能回答您的问题,结合自身经验认为学习编程与学历关系不是很大,列出以下三点学习编程的关键要素供您参考,希望对您有帮助。1.兴趣是学好编程的第一关键...
自学计算机的可能性大吗?该怎么做,有何建议?
师傅领进门,修行靠个人!掌握好方向:编程为生产工厂,设计为工程师,硬件维修就是个打杂的!!如果说仅仅是自学的话,难度较大,如果能遍寻名师,会走好多弯...刚开始...
ncn编程难学吗?
ncn编程难度较大,通常学员需要学习1到2年左右的系统学习才能掌握。ncn编程的学习特点是采用简单、习惯的语言对加工对象的几何形状、加工工艺、切削参数及辅助...
几年级学习编程好,你见过最小的会编程的孩子有多大?
任何教育的问题都没有标准答案。关键在于1.孩子的兴趣2.父母的适时引导3.课堂是否有趣英国的孩子5-6岁必修编程。大部分欧盟国家和美国中小学也开始编...