如何自学编程?如何少走弯路?

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

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

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

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

这个思维转换就是:

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

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

区别一:记笔记 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 项目作者定义自己

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

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

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

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

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

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

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

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

最后送给学生们一句话:

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

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

---------------------分割线----------------------

自学编程容易失败的原因
让你单独设计某个任务却无从下手,这是什么原因?
很多同学自学编程就是找一本书从头看到尾,或者是找一个比较长的视频全部看完,花了很长时间,发现还是不会,很多东西看完就忘,这时就比较崩溃,觉得自己天赋不行,其实这就是学习方法出了问题,我自己初学也是这样。
首先不要一上来就把所有的语法特性全部学完,已c++为例,只要掌握了变量,数组,定义,vector,逻辑判断if,循环for,函数,类基础就够了,都不用管指针和多态,就可以来开发项目了,那这些语法能开发什么样的项目呢?
那你就是要先确定你准备要做什么功能,比如你做一个日志生成工具,那你就研究下文件的读写,做网络工具就研究下socket,在这样的功能完后,肯定是不是完善的,再带着问题去研究语法特性,来提升代码扩展性,比如说你发现代码重复性特别高,或者没办法扩展新功能,或者性能特别低。
这时你就带着你的这些需求去研究继承,组合,智能指针,线程,这个时候你才能真正学会这个语言,坚持今早动手,前期也可以先跟着视频或书把代码写出来,跑通后再根据自己的理解去重构修改,来验证自己的学习情况,代码出bug千万不要轻易放弃,记得坚持。

---------------------分割线----------------------

设计师有作品可以体现能力,而码农却没有,不如参与开源项目,任何八股文在一句“我是xxx项目贡献者”都显得无力

posted @ 2024-02-03 19:52  H_one  阅读(50)  评论(0编辑  收藏  举报