十年自学编程成才(编程小白必看)

文章目录

  • 1. 前言
  • 2. 十年自学编程成才
    • 2.1 为什么每个人都是匆匆忙忙的?
    • 2.2 十年时间学习编程(刻意练习)
    • 2.3 程序员成功之路
  • 3. 扬帆起航

1. 前言

  我是herosunly,从985院校硕士毕业,现担任算法研究员一职。CSDN博客专家,2020年博客之星TOP。曾获得阿里云天池比赛第一名等Top名次,拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法行业就业。
十年自学编程成才(编程小白必看)_第1张图片
  最近有几个初入编程的同学咨询我如何学好编程。其中和有个同学的对话,让我对新手学编程有了新的认识。为了帮助更多的同学,特意分享给大家:

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

十年自学编程成才(编程小白必看)_第2张图片

十年自学编程成才(编程小白必看)_第3张图片

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

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比赛教程。

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

你可能感兴趣的:(编程思维,python)