本文作者:侯爵,麻瓜编程创始人、课程设计师
看到不少答主都是计算机科班出身的,但对于我来说,设计系毕业、二十几岁才下决心从零开始学编程,我的 Python 学习经历注定是曲折的。
想学 Python 的时候,
科班出身的人只要花点时间,就能顺顺当当学会了,C 都学会了 Python 有什么难的?
非科班出身的人总是会引发各种对抗力量,这个库怎么安不上?这段程序是怎么运行的?
写程序遇到 bug 的时候,
科班出身的人先想到的是怎么排查 bug。
非科班出身的人先想到的是怀疑人生,怎么会有这种问题?我是不是不适合学编程?
学新东西的时候,
科班出身的人是在一个稳固的地基上添砖加瓦,底子稳、塌不了。
非科班出身的人是在拿着拼图的一角寻找关联的碎片,只有拼的足够多,最后才能连接成完整的知识网络。
很遗憾我没有在学校接受过系统的编程训练,自学编程的过程中碰了很多壁、走了很多弯路。但是回过头来看,正是这段折腾的经历让我一生受益。
我以前也试图提升过自己的学习能力,但真不像鸡汤文里说的学习某种模式能改变你的思维、加入一个读书会能让你成为终生学习者,不是这样的。只有学一个自己不擅长的东西、把自己推出舒适区、反复碰壁,这个过程才让我学会了如何学习。
从循规蹈矩到自寻出路
几年前,当我决心从零开始学编程的时候,我制定了一个「每天编程一小时」的计划。
和大多数人一样,我想系统的、有体系的去学习,跟着教程从基础学起。那时候还在印象笔记建了一个笔记本叫《每天编程一小时》,收集一些好的教程,根据知识点试着去列一套成体系的学习路径。
但是开始跟着教程学的时候,问题来了。看了几章之后,突然就会出现看不懂的概念,知识就断层了,就跟上数学课捡了根笔之后发现后面的就听不懂了,但我也没错过什么啊。我又试着跟着示例代码敲,敲完也不知道这段代码是怎么运作的,自己只要一拓展就会出错,后来敲烦了就直接复制粘贴,感觉学的特别迷茫。
实在学不下去的时候,就换一本教程,基本都是从第一章开始觉得会了,但实际上又不知道学的这个要怎么去使,这种感觉就一直在我的脑子里嗡嗡的转。到后来那一个概念我都看了六遍了,谁讲都那样,但还是不会使。
这时候开始对系统学习的方法有点怀疑了,大家都说要从底层学起、看大量书单,但会不会这种系统学习的方式不适合我这个非科班出身的新手?毕竟,我已经没有4年时间来学编程了啊,我每天只有1小时能用来学习,再这样继续看各种琐碎的语法细节,我就要失去耐心了。
我想,不如先写点小项目练练手。于是我开始从一些简单的程序写起,写一个汇率转换的公式、写一个随机生成姓名的小脚本、写一个把桌面文件自动归类的小脚本、写一个煎蛋的小爬虫,可能这些程序在专业人士眼里都算不上是项目,几行代码和简单语法就能搞定了,但对于我来说,这些程序就是一个个使用情景,我从这些使用情景中理解了概念的真正意义。
比如说,之前看教程总是不明白作用域和缩进的关系,自己写代码的时候就发现了,不缩进就会报错啊,经历过几次就再也不会写错了。
其实很多概念都是基于无数个场景的抽象,抽象了之后就会少了很多细节,给人一种太笼统、太晦涩的感觉。而让人印象最深刻的是场景,就像提到「烫」的时候,第一时间想到的是被烫的场景和感觉,而不是烫的定义。
所以说,开始动手写练手项目,是我自学编程的一个重大转折点,让我开始把编程用起来了。
当然,也会遇到各种状况。写文件归类脚本的时候,不小心把桌面上的文件都删了。写煎蛋爬虫的时候,第一次能正常运行,第二次运行的时候我的 ip 就被封了、爬不了了。如果是复制粘贴别人写的程序,这样的状况会让我大骂坑爹。但自己写的程序,每一个都是我的宝贝,我会有很强的动力去解决她们的问题、完善她们。
从报错恐惧症到巧解难题
迈过第一个坎之后,我开始尝试一些更大的项目,试着用 Django 框架搭建一个网站,结果很受挫。敲了代码之后,不光没运行,结果还特么报错,这么来回几次之后,真的有种想要砸电脑的感觉。 />
有一次一个报错卡了好几天都没解决,我觉得这样下去不行了,于是找了一个国外的 Code Mentor 去有偿请教他,我们 Skype 讨论了一个小时,最后虽然解决了,但那是用他的思路去实现的,而我期望的是沿着我的思路去解决这个问题。
发现别人没办法帮自己走出困境是有点沮丧的,但是可能挣扎的过程也是我学习的一部分。发现无路可走了,就只能靠提升自己的解决问题能力来突破困境。
经历过这次求助之后,我发现,如果我不能清楚准确的描述问题,我就没办法解决这个问题。而问题一旦被清楚准确的描述了,也就变得很容易解决了。探索了一段时间之后,我甚至形成了一个自己的解决问题方法论:
▍第一步:提出假设
假设阶段是最重要的,如果你对一个事情没有假设,说明你没有思考。有时候之所以会痛苦,就是因为发现事实和你认为最正确的假设是不一样的。在阿加莎的小说里,平庸的侦探会为自己的推断找各种牵强的证据,而波洛会勇于根据事实不断推翻自己的推断。
在假设阶段,我会从我的角度对这个问题做几个推断。报了一个错之后,我脑子里会有若干个假设,是环境错误导致的,还是语法错误导致的,还是网站的什么问题导致的?
▍第二步:搜索与修正
在这个阶段,我把所有假设转换成不同的形式进行搜索。拆分假设,重组语言,领域分类,转换形态…用这些方法挨着个搜索一圈,会排除掉一些东西,但如果还是不行,我会往回退一步,搜一下我做的这个事情有没有人在做,或者找一个相关视频跟着敲。这样下来,几乎没有什么问题是解决不了的。
通过这样大量信息的检索与对比之后,往往我会认识到自己思路上的一些根本性错误,有一些假设是不成立的。就比如说我可能会费力去想如何用石膏去做一个音色好听的吉他,石膏就不应该拿来做吉他。在初学时会犯很多这种假设上的错误,我通过几轮会修正自己的常识,等到稳固了之后,再在常识上进行一些创新,当我知道了大家会找最好的桃花芯木做吉他的时候,我再去思考,是否存在比桃花芯木声学共振还好的材料。
▍第三步:回归问题
在经历了前两个阶段之后这时候问题本身就已经变得清晰了很多,这时候只需要做的就是,将你认为最有信心的解决方案大胆的实践。如果成功那么问题就迎刃而解,如果不幸失败,那就洗把脸振作一下,重新回到第一步。
在反复经历这些阶段之后,我发现在解决新问题的时候,可以进行一个准确的假设了,因为我已经积累了足够多的编程常识。后来读到《解决问题心理学》这本书,发现里面提出的方法和我自己总结的还挺像的,有一种欣慰的感觉,知道了自己解决问题的方法是经过科学理论验证的。
成长的唯一办法就是写更多代码
虽然能做的事情比以前多了,但有些时候总会有一种不安、甚至是自卑感。就像是拼好了几大块拼图,却没有把这些都连起来拼成一个完整的知识网络。于是就想,是不是还是应该系统学习、从底层老老实实的学起?
于是报名了一个美国的 Code Camp 线下培训,没想到最后签证没过,后来才知道应该选旅游签证,而不是商务签证。
参加培训受阻之后,我打算自己构建一个知识体系,拆分了几百个知识点、构建了一条全面系统的学习路径。但这些知识点都列出来之后,我又有了一种迷茫的感觉,面对着这么浩大的任务不知道该怎么进行下去。那段时间感觉很无助、失去了方向,每天胡乱找些视频来看。
无意中看到了 GNU 大神、Emacs 的作者 Richard Stallman 的一个演讲视频,他鼓励大家从做中去学,他说,Programming is not a science. Programming is a craft. 编程不是一门科学,编程是一门手艺。 />
听到这句话之后我大受触动,我觉得这种级别的大神都这么确凿的认为,除了动手做没其他办法学编程,那我已经没啥好辩驳的了。于是我又回到了最初的项目驱动的学习方式,任由自己去折腾一些感兴趣的项目,写点自己工作用得上的插件,尝试用最近流行的库做点东西。
有一次试用 micro-django 那个库,怎么弄都运行不成功,我就急了,就去看看他的源码是怎么调用 Django 那个接口的,发现丫还有一组参数没传进去,我改了下他的源码,然后就成功了。这是我第一次看源码,实际上他的源码也就200多行,读起来挺轻松的,我能理解他的思路,也能找到问题所在,还挺有成就感的。
从那时候起,我就有了看源码的习惯。会经常去 Github 的 Python 那栏搜索 micro,tiny,prove of concept 的小框架,行数不会很多,二百行是极限了,在路上的碎片化时间就可以看一看。之所以要看小框架而不是小脚本,是因为小脚本不成体系,而小框架是代码很少,但有一个非常好的思维性的设计,这个就很完美了。
在阅读别人代码的过程中,我看到了更多的可能性。书里或者教程里教的知识,我并不清楚怎么在实际项目中运用。但在源码中能看到不同人以不同形式去解决同一个问题,有的简单有的复杂、有的长有的短,这让我大开眼界。
后来有一次,麻瓜编程的网站上需要基于一个开源框架去实现一个课程中的交互效果,当时的程序员说这个事情做不了只能采用别的方案,但是当时我感觉不太对,就去看了下这个框架的源码和接口文档,发现接口很全啊,这个是能实现的,于是真的就避免了一起技术上的「事故」。
我觉得对于技术上的学习让我知道了技术的可能性并抱有警惕之心,在最关键的时刻派上用场。尤其是创业的时候,更需要在无路可走的情况下,找到解决方案。
刚开始学编程的时候,以为看完大佬给开的书单就是技术圈的人生赢家了。但后来发现,选择了学习编程,就是选择了持续自学。隔段时间就会出现一些新技术、新框架刷新我的眼界。
一幅小漫画,与大家共勉。 />
最后,祝大家都能写更多代码,做更多事情。
学 Python ≠ 100G 视频资料
学 Python ≠ 傻瓜式的在线填空题
只有多写实操项目,才能学的高效。只有建立自己的知识体系,才能学的踏实。
这是我们一直在强调的学习方法,试过的人都学成了,没听进去的人都吃亏了。于是这一次,我们把学习方法做进了课程体系里。
学习顺序按照「学习-测评-实操」进行,强制你多写代码多练习,让你学的高效。
课程按照「建立知识模型-用法必知必会-上手项目案例-系统学习脑图」的知识体系,逐个模块系统递进,既有完整实操项目从零到上线,又有系统脑图的体系化,让你学的踏实。
这是只在「Python 后端工程师培养计划」才有的学习体验。
查看课程目录、免费试听:Python 后端工程师培养计划www.mugglecode.com