自我身份的认同/不同的行为方式
仅以此篇,献给仍是学生的我们
废话不多说,直接进入正片——学生与开发者的恩怨情仇0.0
学生:书生百无一用…
开发者:伯符,且看我这一手!
First 资源
军具精巧,方保吾宇
学生
- 买教材,记忆知识点
- 笔记本记笔记
开发者
- 理解知识框架,在实战中填补细节
- 写技术文章,发表在CSDN、微信公众号、知乎等平台
我一直觉得,学编程,最需要摒弃的一个东西就是学生气。你在学习编程的整个过程中,你千万不要总把自己当成学生。你若是把自己当成学生,你的思维方式、行为方式就是学生的那种状态。
举一个典型的例子,就拿我和身边的一些学习编程的同学进行对比——我学习一个东西的时候,假如说我现在要学习Java的一个Spring Framework
框架,那么我可能是这样的:
-
先上谷歌,查一个东西:
How to learn Spring Framework
,怎么学习Spring Framework
,或者是The best way to learn Spring Framework
。你先看看那些老手他们推荐你的学习资源,第一步显示找资源,而不是把老师推荐的教材或者是学校发的教材拿过来就开始看,第一步千万不是这样。 -
然后的话,诶,我找到资源了。好,那么没有问题,我们就可以开始入门了,开始看教程去。
-
但是,我看那些专栏、资料或视频学的过程中,我绝对不是那种学生式从头到尾读一本书,然后记笔记。
我不记笔记,是不是很amazed~你可能会好奇:你为什么不记笔记呢?是这样的,汝等看好了——我学会一个东西之后,我的下意识的反应是写成技术文章发表在网上,而不是拿一个笔记本记。
为什么?因为你写成技术文章或教程的形式发表在网上,有一个好处就是你必须逼着自己给别人讲清楚,这个就是我们所说的feina学习法。也就是你检验自己有没有真的理解一个东西的时候,你一定要去给别人讲。如果你记笔记的话,那么你很有可能会陷入一种照抄的状态,就是那种把老师的笔记照抄,然后哄骗自己学会了。(我在大一下\大二上学习编程途中也是如此,天赐良机改变了学习方法)
但是你如果给别人讲,你没有把这个思路真正地理清了,你肯定不行的。我刚开始学后台管理系统开发可能还不到一个星期的时候,我就写了一篇很长的魔改lenosp脚手架的教程并在CSDN、微信公众号发表了。有网友就在CSDN博客上私聊我说:“大佬,这个xxx是怎么回事?”。我不过是一个初学者,我是个新手啊,我才刚开始学习搭建后台管理系统,怎么称得上是大佬?实际上我与大佬有着天壤之别,但是我没有把自己当成学生,我只是把自己当成一个开发者而已。
用输入法输入
sbgb
,最靠前的两个选择是事半功倍、事倍功半。同样的拼音缩写,却是不同的办事效率,精通事理的诸君应当明吾之意了吧?
Second 准备
万事俱备只欠东风
学生
- 永远在"准备",永远在"夯实基础"
- 遇到问题问老师、问同学
开发者
- 在开发中,遇到问题,扩展延伸学习,针对性强
- 遇到问题,
Google
、Stackoverflow
、ReferenceDoc
学生的思维逻辑很奇怪,他永远在准备,他永远在夯实所谓的基础。他们的思维方式里边总是觉得,做一个事情,有一个固若金汤的定性思维——我要把基础知识全学会,然后开始做开发,我就做得特别流畅特别顺畅。
实际上真实情况完全不是这样的。如果你把自己当成开发者,那么在开发中,我绝对不是先把所有基础知识学会了再来开发。而是先学最基本的知识,然后就马上开始开发。在开发的过程中不断地遇到问题。遇到问题之后以这个问题为中心去进行拓展延伸的学习,针对性强。
因为我经常在知乎上看到一些问题,已经学会了C语言的一些基础知识,接下来该如何进阶学习?你看,他这个思维方式就是这样的。但是按照我现在的思维方式,我绝对不会问这个问题。我会问的问题就是说,我有个目标嘛,假如用C语言去实现一个图形化界面的小东西。那么我的问题就是一个很实际的问题,就是说如何用C语言实现图形界面?我这个问题问出来之后,我的学习目的性特别强。我最后一旦学会了如何用图形界面去做东西,我就可以马上去做我想要实现的作品,成就感满满,就有学习反馈。当你有了成就感和反馈之后,你就对这个知识有兴趣了,然后就可以一直学。但是你一直去夯实所谓的基础,一直去学那些东西记那些东西,首先这个过程没有反馈没有成就感,学习一个东西一旦没有成就感没有反馈了之后,谁都坚持不下来。不要说谁谁谁就是这样的,我坚持不下来,你们也坚持不下来(就是这么狂)然而很多人的学习方式就是这样的。
还比如说一个典型的例子,很多人学习编程的时候遇到什么问题,他第一反应就是问老师,问同学。但事实上,我们现在生活在互联网时代、信息时代,为什么你遇到问题要问人呢?一个人你能知道多少?你有互联网知道得多吗?
所以我们遇到问题一般是这个思路——我们去Google
搜、我们去StackOverflow
问、我们去找ReferenceDoc
。什么是ReferenceDoc
呢?ReferenceDoc
就是文档说明书、产品说明书;就比如说我做出来一个框架,一个产品,我身为作品的开发者,我肯定希望更多人用之对不对?那么我们肯定要写一个很详细很好懂的一个文档。如果这个文档写得特别难懂,谁也看不懂,那么谁也无法使用这个框架。
所以你会发现一个事情,你去学习这种比较高层次的东西,就比如说框架这个层次(框架是一个比较高的层次)。你去看文档比你去那些视频教程的效果要好。因为文档首先它是最新的,它不可能说是过时的。但如果你去买书的话,有一个问题就是书中所讲解的知识可能已经过时了,被弃用了。
刚开始我学Python的时候,我也是那种特别想学,兴冲冲地去图书馆借了一本书,实际上这本书是挺好的一本书。但是有一个很恶心的问题,这本书它是好几年前出版的书,那么这本书的示例代码是用py2.0+的版本去讲解的。但是问题是我学的时候,Python已经出到了3+版本了,而且Python2和Python3不兼容啊。那不兼容你说我是学Python2还是学Python3。学Python2,我为什么要学过时的东西;学Python3,那么这个教材又没用了。所以说我是不买教材的,你会发现:我懂很多东西,我也学会了很多东西,但是我一本教材都没有,我都在网上找官方文档学习。
Third 茫然
这,这…可如何是好啊!
学生
- 学了这么多知识,忘了怎么办
开发者
- 知识本来就是用进废退的,忘了就忘了呗
还比如说,学习经常问的一个问题——**学了这么多知识,忘了怎么办?**你看,学生他们的思维就是这样,他总是以一种修炼内功的方式去学习,把自己的人生活成那种升级打怪的样子,不断增长经验,然后成为等级最高的人,秒杀所有人——学生很多有这种想法。
但是开发者不是这样的想法。**开发者永远关注自己开发出来什么东西,**他不关注自己到底学会了什么语言。一个典型的例子,Linux操作系统的作者Linus,我们去评价这个人的时候一般都说Linux操作系统的作者,可能他C语言也写得很好。但是我们不会称其为C语言大师,没有这个说法,他就是Linux操作系统的作者。那么我相信Linus这个人,他21岁的时候做出这个Linux操作系统的第一个版本。那么你想,他在这个过程中,他肯定是一种开发者思维。他每天脑中想的就是我一定要开发出一个特别好的操作系统。他想的绝对不会是说:我要夯实基础,我要把所有知识全部学会,我要记住所有东西,然后开发的时候就没有任何问题,绝对不会是这样一种情况。
4th 基础
基础不牢,地动山摇
学生
- 我一定要把Java的基础打牢,在考试中取得高分,为以后的学习提供坚实基础
开发者
- 我要在半年内通过学习
Java
,运用Java
做出一个中小型的、基于Web的企业管理后台
还比如说,同样是学习Java
语言,那么把自己当成学生的人呢,他的一个思维方式就是——我一定要把Java
的基础打牢,在考试中取得高分,为以后的学习提供坚实的基础,他一定这样想。
我就不说这个了,我说说我是怎么想的——我第一步绝对不会把学校发的那本教材拿过来去读,我甚至不会去和老师聊。第一步我会这样,我先上Google
查,Java
语言适合用来做什么。**你学习一门语言之前,必须要去认识这门语言能用来干嘛。**干这个事,是不是你想干的事。首先Java
适合做Web开发,什么是Web开发,你可以简单粗暴地理解:淘宝就是web、github就是web、这些大型网站就是web。那么第一步我上网查到了,Java
适合用来做网站,适合用来做web,那么我马上给自己定一个目标。这个目标就是说,我学Java
半年内,要用我所学的知识开发出一个中小型的基于Web的管理后台(我已经做到啦),这是我给自己定的目标。我定的目标绝对不是我要掌握Java
。大家要记住,这个思维方式特别重要。
5th 学习
虚争空言,不如思而试之
学生
- 学习就是要坚持,要做冷板凳,坚持是福,吃苦是福
开发者
- 一切不谈成就感,不谈反馈的学习,都是在耍流氓
还有很多学生把编程搞得跟修行一样,学习就是要坚持,要做冷板凳,坚持是福,吃苦是福。他总是把学习搞成一个很痛苦的事情。那么我现在跟大家说吧,就编程这个东西他有一个特点,就是实践性很强。一个实践性特别强的东西,你是一定有办法把它变得很有趣的。什么东西特别难,这个世界上最难的东西绝对不是学编程,这个世界上最难的东西就是做科研。毕竟做科研有不确定性,你可能两三年内都没有结果。但编程这东西,你时间那么长,你完成完全可以一些小东西,给自己一个成就感。你发现没有,兴趣这个东西实际上是一个很空旷的概念,只有成就感和反馈才是实实在在的。一般我们认为我对一个东西感兴趣,往往是因为我做这个事情的时候
- 我比别人是更擅长做这个事情的,我得到了夸奖
- 我在这个过程中能得到一个反馈,一个满足
这就是为什么大家为什么喜欢玩游戏,玩游戏正好带有反馈。你做一个东西没有反馈,你大概率是坚持不下来的。那么编程完全可以给你一个很实在的正反馈。所以千万不要把学习编程当成:拿一本教材就是在那闷头看,然后一个一个跟着跑教学视频,不要搞成这样。学习的过程中,你一定是先给自己定一个目标,学完基础之后,开始做,边做边学。遇到问题再反过来看知识点,看了之后再反过来用,这样一个快速交替的过程中,你的进步程度特别快,而且成就感很足。
6th 简历
巧则巧矣,小尽善也
学生
- 熟练使用xxx
- 精通xxx
开发者简历
- Github\Gitee账号
- xx项目作者
- CSDN博客链接、微信公众号二维码、个人博客链接
把自己当成学生的人,他们的简历若是有机会看到——我熟练使用xxx、我会Java
、我会Python
,什么都会。但是你会发现一个神奇的现象,这种简历是最差的简历。因为简历不可能比这个还差了,因为所有人写简历,不能有人会在简历上写我不会什么什么,所以最差简历不过如此。
那么最好的简历是什么?最好的简历就是这样——我是xx项目的作者,我用xxx语言实现了一个xxx功能,我的Github/Gitee账号是xxx,我有一个500Stars的项目,然后一个链接附上,然后面试官一看,这个人Github/Gitee账号是这个,点进去看看:诶,这个人还挺厉害,有一个几百星的项目,这个人应该很不错。博客同理。
但是反过来,你的简历实质性内容什么都没有,就是我会,什么都会,这种简历反而最差。所以我想把这句话送给大家
现实世界中的人,处理现实世界中的问题,往往不是一口气完成所有的知识准备,然后一口气顺畅地进行开发,进行实践。
现实世界是先进行最基础的知识准备,然后马上开始实践。实践的过程中不断地遇到问题,那么这个过程中充满了不确定性,你不知道你会遇到什么问题,这个过程是一个比较曲折的过程,它不是一个很舒适很平滑的过程,那学习就是该这样。
不断解决新问题,以问题为中心延伸扩展,完成细节知识的补充。
这是学习编程的最主要方法。
Last
在最后我还想说一个事情——为什么我就懂了,为什么我就知道Github
、我也会用Gitee
、我也会写技术文章、会写博客。我也知道很多工具,为什么我就知道?是因为我在不断地进行链式反应。
什么意思呢?且随我一同前看——我学习的过程中是以实例去驱动的,就比如说假如(假如、假如、假如)我现在在学C语言,当我在初学的时候,发现C语言运行起来是一个小黑框,这是为什么?我见到别人的程序都不是这样的呀,都是有那种图形化界面的。他们的程序效果绚丽,功能丰富。那么你自然会产生一个问题,如何用C语言实现图形界面。那么我就去查啊,查的过程中发现有一个网站,诶,这个网站它是英文的,叫Stackoverflow
。在之后的学习过程中,你会发现:诶,我怎么总是见到这个网站呀,好像什么问题都能在这个网站上找到解答。
然后还有比如说,在Stackoverflow
评论下有一个回答,“我有一个贪吃蛇项目,你可以去看一看”,然后附上了一个链接,诶,整挺好,我就点开链接去看一看。其实这个链接就是Github
。但是我点开之后我不知道这是Github
,我不知道怎么用,没有关系,我去看网站的教程,有大佬会教我怎么用。那么在这个过程中,我也学会了如何使用Github
。
学会Github
之后你又会发现,诶,有一个叫Git
的工具,来帮助你进行项目代码的版本控制、历史记录。那么是不是我又该去了解Git
了
那么你看,在这个过程中,我又学会了用C语言去做图形化界面,又知道了Github
、Stackoverflow
,也学会了使用Git
。
但如果你把自己当作学生的话,你会陷入这样一种状态——你正在学习C语言,然后你看那个答案,有一个Github
链接,然后发现自己要学Git
,身为学生的你会想:不对啊,我现在的主要目标、重心是学C语言啊,我为啥要去学Git
,这是不是有点分散我的注意力了,我现在应该把C语言的基础打牢才对。
你看,你这样一想,最后你什么都不懂。
You can never understand everything. But,you should push yourself to understand the system.
—— Ryan Dahi (Creator of Node JS)
以上内容部分摘抄自知乎盐选专栏Live