赞
踩
我是herosunly,从985院校硕士毕业,现担任算法研究员一职。CSDN博客专家,2020年博客之星TOP。曾获得阿里云天池比赛第一名等Top名次,拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法行业就业。
最近有几个初入编程的同学咨询我如何学好编程。其中和有个同学的对话,让我对新手学编程有了新的认识。为了帮助更多的同学,特意分享给大家:
之所以不少同学会轻易相信,是不良商家们针对人性的弱点(急于求成)进行巧妙的营销。那么问题来了,学习编程的正确姿势是什么呢?是时候拿出我初学编程读到的经典文章:《十年自学编程成才》。
不管是在书店里,还是在博客网站中,总不免会看到几个小时学会某门编程语言(C、Java、Ruby等)的书籍或者帖子。如果在亚马逊中搜索标题为teach yourself hours,书籍发表时间在2000以后,就会找到512本书。大家在学习编程时总是想着急于求成,似乎编程要比其他事情要更简单。Felleisen等人在《How to Design Programs》一书中表示,他们也深切感受到了这种趋势,并且表明糟糕的编程习惯是很容易形成的。让我们分析一下,在24小时内学会C++到底意味着什么呢?
从个人的经验来说,如果仅仅想用24个小时学好编程,那肯定是从入门到放弃了。
研究人员Bloom、Bryan和Harter、Hayes、Simmon和Chase表明,要成为任何一个领域的专家,至少需要投入十年的时间,就比如下象棋、编曲、发电报、绘画、弹钢琴、游泳、打乒乓球以及科学研究。成功的关键在于刻意练习,那什么是刻意练习呢?刻意练习不只是重复的进行练习,更重要的是要对超出自己能力范围以外的事物进行练习。具体步骤是:勇于尝试,进行事前和事后分析,并且及时修正错误。然后进行不断地重复。看起来是没有捷径的:即使是莫扎特,在四岁时已经是音乐天才,也花费了13年以上的时间才产生了世界级的音乐。在另外一种音乐类型上,1964年披头士乐队凭借一连串的热门单曲和Ed Sullivan的表演一炮走红。但实际上从1957年开始,他们就在利物浦、汉堡等地的小型俱乐部进行表演。虽然他们很早就表现出了吸引力,但第一个非凡的成功之作Sgt Pepper是在1967年发行的。
Malcolm Gladwell表明要想在一个领域内取得成功,需要在该领域上投入一万个小时,而不是跨越十年。Henri Cartier-Bresson则有另外另外一个衡量标准:前10000张照片是最糟糕的(在他的年代里没有数码相机,现如今人们一周就可能超过标准)。真正的专业知识往往要耗费人的一生:Samuel Johnson说过任何的卓越只能通过一生的努力来实现;少量的努力是绝对无法达到的。And Chaucer则感叹道:“生命如此短促,学习之路却是如此之长。”希波克拉底(西方医学奠基人)的名言是生命短暂,艺术长存。
当然,没有哪个数字是准确的答案。假设所有技能(例如编程、下棋、和演奏音乐)都需要花费相同的时间来掌握是并不合理的,不同人掌握同一门技能花费相同的时间也是不合理的。正如K. Anders Ericsson教授所说,“在大多数领域,即使是最有天赋的人也需要花费大量时间才能达到专家级水平。一万个小时只是给你一个概念,一个天才,如果每周练习10到20个小时的时间,仍然需要数年时间才能达到专家级别的水平。”
如果大家对刻意练习感兴趣,可以再深入阅读刻意练习一书:
以下是走向编程成功之路的一些有效方法(抛砖引玉,希望每个同学都能找到最适合自己的方法):
要对编程感兴趣,就要从中不断地获得快乐。保证编程足够有趣,这样才能让你花10年的时间或者10000个小时在上面也不觉得枯燥无味。
动手编程。最好的学习方法是边学边做。常言道:“人的最高功力并不能通过做一天和尚撞一天钟这样的重复经验获得,但是,最高的功力可以通过有针对性的日复一日年复一年的训练来获得。”并且,“最有效果的学习需要有针对性的任务,这些任务的难度还要因人而异,并且有合理的反馈渠道,并能够根据这些反馈作出相应的改进。”这些观点引用自《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》这本书里。
和其他的程序员交流;阅读别人的代码。这比看书或者参加培训课程要重要。
如果可能的话,建议在大学里系统学习计算机知识(或者再读个研)。这样更容易获得工作机会,从而更容易获得对该领域更加深入的了解。如果有机会,直接去工作也能获得相同的经验。无论是什么情况,死读书肯定是不行的。计算机科学不会让你成为编程专家,就像学习画笔和颜料不可能让你成为画家一样。这是Eric Raymond说的,他是New Hacker’s Dictionary字典的作者。很多程序员大佬的学历并不高,他们依然创造了不少伟大的软件。
和其他的程序员一起参与项目。在项目中努力成为最出色的程序员。在当最出色的程序员的时候,可以尝试领导项目,用自己的视野来启发别人。如果你是项目中最差的那个,要学习牛人们在做什么,如果他们不喜欢做的,你要拿来做。
接手并推进别人的项目。理解其他人写的代码。如果别人有没有考虑到的问题,你能理解并修复这些问题。思考并设计你的软件,让这些软件容易被他人维护。
学习至少6种编程语言。这6种语言中,包括一种支持面向对象的语言(例如Java或者C++),一种支持函数式编程的语言(Lisp, ML或者Haskell),一种支持语义抽象的语言(Lisp),一种支持声明规范的(Prolog或者C++模板),还有一种支持并发的(Clojure或Go)。
记住,在“计算机科学”中在“计算机”这个词语。理解执行一条指令要花多长时间,从内存中取一个字(要考虑缓存有没有命中的情况)要多久,从硬盘中连续读字节要多久,在硬盘中寻址定位要多久?
参加语言的标准化工作。这可能是有关 ANSI C++ 委员会,也可能是缩进的风格是两格缩进或四格缩进。无论如何,你能从中学到其他人对语言的喜好,也能了解到他们热爱的程度,甚至也许能知道一点他们为什么他们会这样认为?
知道何时能从标准化语言的工作中脱身,越快越好。
弗雷德·布鲁克斯在他的书《没有银弹》中给出了三条建议:
有一部分人天生就有成为伟大设计师的潜质,然后,能做的最好的事情就是去正确引导他们。艾伦·佩里斯一针见血地说:”假如每个人都可以学会雕刻,那就得教米开朗基罗哪些事不要去做。对于伟大程序员,也是如此。”Perlis认为,伟大的人有一种内在的特质,这种特质往往比接受训练更重要。但是,这些特质是从哪里来的呢?与生俱来的?还是通过后天勤奋而来的?正如动画片《料理鼠王》里的幻象大厨Auguste Gusteau说的那样:“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”个人认为可以把练习的态度转变成心甘情愿的奉献,就跟耐心培养自己的孩子一样。这样往往就更容易走向成功之路。
说了很多了,有没有比较具体的学习方法呢?那必须安排上啊!咱们就以学习Python为例,首先,我们要正确认识自己的编程水平。先做个简单的分类。把同学分为没有完整学过基础语法以及学过两个类别。
首先说下没有学过基础语法的同学,其中包含正在学习基础语法的同学,请在学习过程中保持“爱玩”的心态,可以尝试将不同的操作进行组合,具体该如何操作呢?,举几个栗子,请大家看到例子后思考并实践验证,例子如下所示:
a = 1
a *+1
b = (a = 1)
x = 10
def foo():
print(x)
x += 1
以上例子皆是抛砖引玉(甚至我们可以在键盘上乱打一通,然后猜一下会不会报错,报错的话会在哪里报错),希望大家能在学习语法中自主构建新的例子,从而加深对原有知识的理解。新手可以订阅系统讲解Python学习方法和语法的专栏:Python新手快速入门。
最后再说下已经学过Python语法的同学。既然已经系统学习过语法了,那就请开始实战吧。在实战过程中请记得也是在玩,也不是在做枯燥乏味的练习题。就像玩游戏一样,学会了基本的操作就开始敞开玩耍吧。那么问题来了,究竟进行什么样的实战呢?
选择非常之多,可以用Python来创建游戏,例如使用pygame来创建植物大战僵尸等小游戏;
可以通过爬虫完成各种自动化操作。例如CSDN自动点赞与评论、自动收取蚂蚁森林能量等。爬虫适合于绝大多数人,在实战和学习过程中会对Python、前端、后端都有更加深刻的理解。下图为每天早上7点15分自动偷取能量的截图,想要学习爬虫的同学可以订阅我的专栏:Python爬虫实战教程
当然,现在如火如荼的机器学习方向也是一个不错的选择。但相对来说,门槛要比之前的方向更高一些。想要学习机器学习的同学也可以订阅我的专栏:机器学习入门之工具篇和AI比赛教程。
要在任何领域成为一等一的高手,构建属于自己的知识架构是至关重要的。那么就有同学会问,那什么是知识架构呢?知识架构描述了知识点之间的联系以及知识学习的成长路线。为了帮助大家入门和进阶,推荐CSDN官方提供的Python全栈知识图谱,希望能帮助大家早日成为Python届的顶级高手。
为了鞭策自己不断的进步学习,我也自己购买了一份,感觉的确很有用,无图无真相:
祝大家早日成为编程大神,一起加油~~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。