转自:https://www.zhihu.com/question/39431192

对于所有编程学习者,尤其是零基础的同学们,在学习的初期,一定要给自己做一个思想上的转变。在我的编程学习理论中,这个思想的转变至关重要,什么时候你把这个思维转换过来了,你就是真正上道的那一天。

这个思维转换就是:不要把自己当学生,而是要把自己当开发者。

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

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

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

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

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

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

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

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

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

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

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

开发者学Python,他第一步绝对不是去书店买教材,而是先去了解,Python适合做什么,然后他了解到,Python适合做爬虫,数据分析,AI,还能很轻松地搭建Web后端,之后他逛了一下午Github,看了看那些Python高星项目都是做啥的,于是他给自己定下了这个目标:半年时间内,我要用PythonPython周边的库搭建出一个网站,这个网站服务端运用爬虫技术爬取一些数据,可以提供知乎粉丝性别比例分析功能。

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

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

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

区别三:厌恶不确定性 VS 接受不确定性

学生们总是对确定性有一种几乎疯狂的追求,他们总问,“C语言学到什么程度就一定能被大厂录取?掌握XX要几个月?上课认真听讲,认真做笔记,考试是否一定能上80分?

这种对确定性的追求,直接导致学生有一种下意识的举动:

干什么都等准备好了再去做,但是却永远在准备

因为他们害怕那种不太会还要硬上带来的各种不确定性,他们渴求一种内功的修炼,寄希望于把基础夯实了,就能顺畅的开发,所以还是先夯实基础吧!

开发者选择接受这种不确定性,他们愿意边学变做,因为他们知道,最初学习敲键盘的时候,他们就是这么做的,边看某个按键在哪,边打字,做和学交叉进行,他们始终抱有疑问,他们又始终试图通过学习的延伸拓展去解决疑问,他们仿佛就像是拿着烛火在迷宫中行走的侠客,在游戏的一开始,对迷宫的结构一无所知,通过不断地摸索和碰壁,逐渐建立起对整个地图的认知.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最后送给学生们一句话: 愿你早日忘记学生的身份, 以开发者的姿态, 面对这个世界。