如果耐心读完本文,对您学习编程大有帮助

明白学习编程的思维,可以少走很多弯路

对于所有编程学习者,尤其是零基础的同学们,在学习的初期,一定要给自己做一个思想上的转变。

在我的编程学习理论中,这个思想的转变至关重要,什么时候你把这个思维转换过来了,你就是真正上道的那一天。

这个思维转换就是:

不要把自己当学生,而是要把自己当开发者。

不同的身份认同感,最后会导致不同的行为模式,而这行为模式,会对你的编程学习造成非常大的影响。

区别一:记笔记 VS 写技术文章

学生有一个特点,就是他们喜欢记笔记,但是开发者不怎么记笔记,而是会把自己学会的东西写成技术文章、教程的形式发表在技术博客或者知乎等网站上。

一个很有名的学习法叫做费曼学习法,这个学习方法简单地说,就是在学完一个东西之后,去给别人讲明白,注意,是讲给别人听,当你写成文章发表在网上的时候,你自然会去用更通俗的语言,更清晰的逻辑去讲述这个事物背后的逻辑,这个过程,是对自己学习的一个检验,也是加深映像,整理思路的重要过程。

那么如果你是去记笔记的话,很有可能,你不会去试图讲清楚这个东西,而是倾向于去照抄,或是不完全照抄,以“提纲”或是“知识点”的形式抄在本子上,说句实话,照抄的笔记,真的没用,因为现在搜索引擎的能力已经可以让你把大多数东西快速找到,你为什么还要照抄到笔记本上呢?

从功利的角度考虑,技术文章的写作,别人可以直接访问,也可以逐渐累积你的影响力,一个好的个人技术博客,会给你的简历加分很多,而一个厚厚的笔记本,没有人会管你记了什么。

区别二:以学会XX为目标 VS 以做出XX为目标

你会发现,学生思维里面有一个重要的特点,就是他们总是特别关注自己“学会了什么”,不仅如此,他给自己定的目标,定的计划,永远都是”学会XX书第XX章内容“。

学生永远在准备, 而开发者早已动手。

如果你还在上学,学生思维是“这个学期我要学会XX课程”,而开发者思维是“这个学期我要做出XX”。

如果学Python,学生思维会拿起一本教材,开始从头到尾看,我不知道你们发现没有,几乎所有那种编程语言教材,长得都差不多,上来先是基本的语法,基本的整型变量,浮点型变量之类的,然后伴随着几个小的教学例子。

开发者学Python,他第一步绝对不是去书店买教材,而是先去了解,Python适合做什么,然后他了解到,Python适合做爬虫,数据分析,AI,还能很轻松地搭建Web后端,之后他逛了一下午Github,看了看那些Python高星项目都是做啥的,于是他给自己定下了这个目标:

半年时间内,我要用Python和Python周边的库搭建出一个网站,这个网站服务端运用爬虫技术爬取一些数据,可以提供知乎粉丝性别比例分析功能。

学生继续看书,一个个的知识点去记忆,拿着他的小本本去总结知识点,而开发者上官网简单的看了下Reference Doc的简单交互式语法教程后,便马上开始了边做边学的过程,有了一个实际的项目目标,朝着这个目标走,不断地发现自己不会这,不会那,然后有目的性的去补足知识,他了解到了beatuiful soup作为爬虫主库,flask作为后端web服务主库,然后会去看一些简单的教程,在这个过程中,基础语法得到了熟练,也训练了工程能力。

学生的成就感来源于学会了什么,开发者的成就感来源于做出来什么

开发者很功利,他们深知他们学会的所有东西都是为了开发出伟大的产品而服务的,所以他们绝对不会出现“在学一个东西,但是也不知道学这个用来干嘛”的窘境。

区别四: 线性学习 VS 递归学习

学生喜欢线性的学习,因为线性的学习(拿本教材从头到尾慢慢看)正是符合了他们对确定性的追求,可惜这违背了学习的本来面目

开发者知道,人脑最不擅长的就是线性枚举,即便我们认识几千个汉字,但是我们无法去线性地去将所有认识的汉字枚举出来,我们的大脑,本就不是用来进行线性思考的,而复杂度上了一定程度的知识,线性的掌握,基本不可能。

有难度的知识,往往是这样的:为了搞懂A,而去学B,为了学会B,而去学C,这叫递归学习,递归虽深,但有回溯,它最终会回溯到我们的起点。

所以开发者的学习更偏向于递归式的学习,而且可能会以一个知识点为起点,去完成树状知识外围的遍历。(有点像搜索引擎的爬虫)

知识是树状结构, 或者网状结构

当我们试图遍历一个树的时候, 最简单直接的方式就是递归, 如果你非要去"线性"的学, 那就你是把编程学习当成了链表, 还是“单向”的,这种算法怎么可能用来遍历树呢?

区别五:拿会XX定义自己 VS 拿XX项目作者定义自己

linus 从来不说自己精通 c 语言, 与其说他不需要, 不如说他不关心, 因为他是 linux 和 git 的作者.

linus 这个程序员之神就是一个典型的开发者思维的人.

我希望所有计算机专业的同学们, 等你们毕业了之后, 你的github应该是绿油油的, 而不是贫瘠的一片白.

我希望你们用你们的简历里写的是"用c语言实现了一个XX引擎, github链接http://github.com/xxxxxx"

而不是"精通c语言".

我希望学生们明白, 任何一个像样子的项目, 制作周期至少是按月计, 你的大学有四年时间, 哪怕一个项目做一年, 你也能拿出两三个好项目, 不一定有多少star, 但是要完整, 文档, 测试, 一应俱全.

我希望学生们知道, 做项目和写课后习题不一样, 课后习题一个小时, 而项目是长期不断努力, 不断学习突破的过程, 需要你每天都搞, 善始善终, 最终拿出成果来.

我希望学生们明白, 这个世界衡量一个人的成就, 从来都是"他做了什么", 而不是"他学会了什么", 不要总用修炼内功去感动自己, 必要时, 也请你为开源世界贡献一点自己的力量.

我希望学生们明白, 考上985, 拿奖学金, 这都不叫成就, 因为和别人没关系, 只有真正影响到别人的东西, 让这个世界变得更好的东西, 才是值得去"秀"的.

最后送给学生们一句话:

愿你早日忘记学生的身份, 以开发者的姿态, 面对这个世界。

作者:牛岱 链接:https://www.zhihu.com/question/39431192/answer/784240694 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

精简总结

上面有一些东西是零基础的朋友从来没有听过的名词,比如linux,github,递归式学习。我试图用更加小白的方式简单总结一下。

  1. 记住:是因为想做什么而学知识,而不是学会知识再看能做什么,不然就会导致学会了很多东西,但是啥也不会做。
  2. 不是为了学会某个知识,学习只是为了做出某个产品而服务。
  3. 关注自己做出了什么东西,而不只是关注学会了什么,不然就会感觉好像什么都会,但是什么都做不了。
  4. 不要害怕遇到困难和错误,解决了所有错误,剩下的就是成功。就像迷宫中寻找出口一样,没可能一下子就能找到正确出口的。
  5. 定好目标之后,了解一下需要学习哪些知识,就搜索相关的知识来学习,学习过程中遇到不会的,继续搜索,如此往复,边做边学,做完产品,知识也自然学会了。这就是递归式学习法
  6. 把你做产品过程中学到的知识,写成文章教程,或视频教程,分享给别人,让别人能根据你的教程学会知识。一方面巩固了知识,另一方面别人看到可以帮你指出错误,最后,你没遇到的坑,别人遇到了请教你,也是等于帮你学习。

整个文章就到这里结束了,希望对您有所帮助。也欢迎帮忙分享给更多的朋友,帮助到更多的朋友。