1. 前言

  我是herosunly,从985院校硕士毕业 ,现担任算法研究员一职。CSDN博客专家,2020年博客之星TOP 。曾获得阿里云天池比赛第一名等Top名次,拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法行业就业 。

  最近有几个初入编程的同学咨询我如何学好编程。其中和有个同学的对话 ,让我对新手学编程有了新的认识。为了帮助更多的同学,特意分享给大家:

  • 同学: 学编程是不是特别容易呢?
  • 我: 没有觉得呢,为什么会这么想呢?
  • 同学: 网上不是有很多几小时或者几天精通编程的课程吗?
  • 我: 信息不对称真的是可怕 。一时也说不清这个问题 ,等我过几天写篇博客给你看吧。

  之所以不少同学会轻易相信,是不良商家们针对人性的弱点(急于求成)进行巧妙的营销。那么问题来了,学习编程的正确姿势是什么呢?是时候拿出我初学编程读到的经典文章:《十年自学编程成才》 。

2. 十年自学编程成才

2.1 为什么每个人都是匆匆忙忙的?

  不管是在书店里 ,还是在博客网站中 ,总不免会看到几个小时学会某门编程语言(C 、Java、Ruby等)的书籍或者帖子 。如果在亚马逊中搜索标题为teach yourself hours,书籍发表时间在2000以后,就会找到512本书。大家在学习编程时总是想着急于求成 ,似乎编程要比其他事情要更简单。Felleisen等人在《How to Design Programs》一书中表示,他们也深切感受到了这种趋势,并且表明糟糕的编程习惯是很容易形成的 。让我们分析一下 ,在24小时内学会C++到底意味着什么呢?

  1. 在24小时的时间内,是没有充足的时间完成重大的程序,因为调试往往比开发要花更多的时间。没有太多实践的编程学习 ,是学不到太多内容的。所以这本书更多的讨论的是肤浅的内容,所以无法让读者进行深刻的理解 。正如Alexander Pope所说,浅尝辄止往往是一件很危险的事情。
  2. 在24小时内 ,可以学完C++的部分语法,但是无法学到如何去实际应用它。简单地说,如果是一个Basic程序员 ,在24小时学习之后 ,他能够使用Basic风格的C++代码,但是无法体会到C++的优点 。那有什么意义呢?Alan Perlis曾经说过:如果一门编程语言没有影响开发者的思维方式,那么这门语言就不值得学习。另外一种观点是说 ,由于工作需求必须要学习一部分的C++(或者Javascript),只是为了完成既定的工作。那么,这就不是在学习编程 ,而只是完成任务 。

  从个人的经验来说,如果仅仅想用24个小时学好编程,那肯定是从入门到放弃了。

2.2 十年时间学习编程(刻意练习)

  研究人员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个小时的时间 ,仍然需要数年时间才能达到专家级别的水平。”

  如果大家对刻意练习感兴趣 ,可以再深入阅读刻意练习一书:

2.3 程序员成功之路

  以下是走向编程成功之路的一些有效方法(抛砖引玉,希望每个同学都能找到最适合自己的方法):

  • 要对编程感兴趣,就要从中不断地获得快乐 。保证编程足够有趣 ,这样才能让你花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++ 委员会,也可能是缩进的风格是两格缩进或四格缩进。无论如何,你能从中学到其他人对语言的喜好 ,也能了解到他们热爱的程度,甚至也许能知道一点他们为什么他们会这样认为?

  • 知道何时能从标准化语言的工作中脱身,越快越好 。

弗雷德·布鲁克斯在他的书《没有银弹》中给出了三条建议:

  1. 尽早地系统地识别出顶级设计师
  2. 每个人给分配一个职业规划的导师
  3. 让成长中的设计师有机会互相切磋武艺

  有一部分人天生就有成为伟大设计师的潜质 ,然后,能做的最好的事情就是去正确引导他们。艾伦·佩里斯一针见血地说: ”假如每个人都可以学会雕刻,那就得教米开朗基罗哪些事不要去做。对于伟大程序员 ,也是如此 。”Perlis认为,伟大的人有一种内在的特质,这种特质往往比接受训练更重要 。但是 ,这些特质是从哪里来的呢?与生俱来的?还是通过后天勤奋而来的?正如动画片《料理鼠王》里的幻象大厨Auguste Gusteau说的那样:“谁都能做饭,但只有那些无所畏惧的人才能成为大厨!”个人认为可以把练习的态度转变成心甘情愿的奉献,就跟耐心培养自己的孩子一样。这样往往就更容易走向成功之路。

3. 扬帆起航

  说了很多了 ,有没有比较具体的学习方法呢?那必须安排上啊!咱们就以学习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比赛教程。

  大家在学习中还有什么想法或者疑问的话,也欢迎大家留言交流,一起进步。

文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归趣快排SEO www.SeogurUblog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▶61910465