不要把自己当学生,而是要把自己当开发者
不同的身份认同感,最后会导致不同的行为模式,而这行为模式,会对你的编程学习造成非常大的影响。
区别一:记笔记 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 接受不确定性
学生们总是对“确定性”有一种几乎疯狂的追求,他们总问,“C语言学到什么程度就一定能被大厂录取?”,“掌握XX要几个月?”,“上课认真听讲,认真做笔记,考试是否一定能上80分?”
这种对确定性的追求,直接导致学生有一种下意识的举动:
干什么都等准备好了再去做,但是却“永远在准备”。
因为他们害怕那种不太会还要硬上带来的各种不确定性,他们渴求一种内功的修炼,寄希望于”把基础夯实了,就能顺畅的开发,所以还是先夯实基础吧!”
开发者选择接受这种不确定性,他们愿意”边学变做“,因为他们知道,最初学习敲键盘的时候,他们就是这么做的,边看某个按键在哪,边打字,做和学交叉进行,他们始终抱有疑问,他们又始终试图通过学习的延伸拓展去解决疑问,他们仿佛就像是拿着烛火在迷宫中行走的侠客,在游戏的一开始,对迷宫的结构一无所知,通过不断地摸索和碰壁,逐渐建立起对整个地图的认知.
区别四: 线性学习 VS 递归学习
学生喜欢线性的学习,因为线性的学习(拿本教材从头到尾慢慢看)正是符合了他们对确定性的追求,可惜这违背了学习的本来面目
开发者知道,人脑最不擅长的就是线性枚举,即便我们认识几千个汉字,但是我们无法去线性地去将所有认识的汉字枚举出来,我们的大脑,本就不是用来进行线性思考的,而复杂度上了一定程度的知识,线性的掌握,基本不可能。
有难度的知识,往往是这样的:为了搞懂A,而去学B,为了学会B,而去学C,这叫递归学习,递归虽深,但有回溯,它最终会回溯到我们的起点。
所以开发者的学习更偏向于递归式的学习,而且可能会以一个知识点为起点,去完成树状知识外围的遍历。(有点像搜索引擎去爬虫)
知识是树状结构, 或者网状结构.
当我们试图遍历一个树的时候, 最简单直接的方式就是递归, 如果你非要去"线性"的学, 那就你是把编程学习当成了链表, 还是“单向”的,这种算法怎么可能用来遍历树呢?
区别五:拿会XX定义自己 VS 拿XX项目作者定义自己
linus 从来不说自己精通 c 语言, 与其说他不需要, 不如说他不关心, 因为他是 linux 和 git 的作者.
linus 这个程序员之神就是一个典型的开发者思维的人.
我希望所有计算机专业的同学们, 等你们毕业了之后, 你的github应该是绿油油的, 而不是贫瘠的一片白.
我希望你们用你们的简历里写的是"用c语言实现了一个XX引擎, github链接...
而不是"精通c".
我希望学生们明白, 任何一个像样子的项目, 制作周期至少是按月计, 你的大学有四年时间, 哪怕一个项目做一年, 你也能拿出两三个好项目, 不一定有多少star, 但是要完整, 文档, 测试, 一应俱全.
我希望学生们知道, 做项目和写课后习题不一样, 课后习题一个小时, 而项目是长期不断努力, 不断学习突破的过程, 需要你每天都搞, 善始善终, 最终拿出成果来.
我希望学生们明白, 这个世界衡量一个人的成就, 从来都是"他做了什么", 而不是"他学会了什么", 不要总用修炼内功去感动自己, 必要时, 也请你为开源世界贡献一点自己的力量.
我希望学生们明白, 考上985, 拿奖学金, 这都不叫成就, 因为和别人没关系, 只有真正影响到别人的东西, 让这个世界变得更好的东西, 才是值得去"秀"的.
最后送给学生们一句话:
愿你早日忘记学生的身份, 以开发者的姿态, 面对这个世界。