一个程序员的心路历程

2024-02-06 02:18
文章标签 程序员 心路历程

本文主要是介绍一个程序员的心路历程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大多数人在入门之后,都会遇到一个比较大的“瓶颈期”:这个阶段,你已经了解了编程语言的基本语法,可以看懂入门书上的所有例子,但是合上教程却又无法写出一个完整的代码,对于接下来的学习又缺少方向。以至于对编程这件事情感到迷茫,甚至自我怀疑。

 

这是种很普遍的感受,也是很正常的现象,而且不仅是在学编程上,大家都是一样的 ,这就是猿粪。

 

有种现象在心理学上被称为“达克效应”,指的是:人在对一件事认知不足的时候往往会高估自己的水平;在经过适当的学习和训练之后,就会认识到事情的复杂度和自己的不足,转而对自己产生否定;继续坚持,走出这一阶段,就会客观看待,进入稳定的成长期

 

 

所以,如果开始感到迷茫,至少说明你已走上正确的道路,比起很多刚刚接触甚至还未接触编程就觉得自己可以三个月成为软件工程师的人,你已经超越了一个阶段。

 

可以说,几乎所有的程序员都是这么过来的,包括我自己。你们看到教程前几课里的那个猜数字游戏,我刚开始学编程时,做了一个多星期;大一的暑假折腾了近两个月,才完成一个很蹩脚的黑白棋。以我的经验来看,这个过程甚至不只是一个达克效应的曲线这么简单,而是无数个小的达克效应:你总是会不停地面对自信和自我怀疑

 

 

无论你的心态(纵轴)如何变化,你对于编程的认知(横轴)一定是增长的

 

 

 

那么问题来了,我们该如何面对这种起伏

 

在软件工程领域有个概念叫做“迭代式开发”。最传统的“瀑布式开发”是遵循 需求->设计->开发->测试 这一开发流程,每一步都完善之后进入下一个阶段,直到最后交付成品,一步到位。这看起来是个很有效的模型,但实际中有太多不可预知的因素,造成了大量软件的开发失败。“迭代式开发”则在其基础上做了改变,虽然同样是从需求到测试这一流程,但并不再是一步到位,而是把产品拆分成很多小版本,每次迭代只需要实现一部分功能,之后再根据实际情况调整下一版本。如今的互联网产品几乎都是基于类似的迭代开发方式。

 

 

迭代开发的好处显而易见,但到了学习这件事上,很多人就还没想通这一点,潜意识里还是觉得应该一步到位。你可能觉得编程学习是这样的过程:

 

 

但其实,它更类似于这样:

 

 

除了一开始很基本的一些语法外,后续的进阶内容很少是线性发展的,通常都是多个知识点的结合。所以你必然会在第一次遇到某个概念时茫然。对此,你要做的并不是寻找一个按部就班的教程(这基本不存在),而是坦然接受这种未知,不求甚解,硬着头皮往下看在第一次学习的迭代时,去构建整体的认知,勿钻牛角尖;在后续的迭代中,这些曾经孤立的知识点就会在你脑中逐渐产生化学反应,形成连接这是个不断迭代的过程,也是个量变到质变的过程。所以让程序员去给新手讲一个概念,往往很难讲明白,因为这本身就不是通过“讲解”获得的认知,你没有相关的概念,没有前9次的迭代,不可能直接领悟第10次迭代的结论

 

所以你以为的学习曲线可能是这样:

 

 

但实际上,它更可能是这样:

 

 

你需要不断经历反复的学习。大多数瓶颈期的问题,只是因为学习的时长还没到位,写的代码还太少。饭要一口一口吃,编程也是要一个坑一个坑地踩。但好的一方面是:你每次的迭代学习,都会得到新的认知

 

举个实际例子:我在爬虫教程里写,Chrome 开发者工具 Elements 里看到的源代码,是渲染后的结果,跟你用代码抓下来的不一样。这个话但凡我在爬虫相关的文章和教程中,基本都会提,但对于没有操作过人来说,这话毫无意义,你听了也不会增加任何认知。但反过来,只要你满足 1.踩过这个坑 2.看到过这句话,这个知识点的连接就形成了,并且几乎不可能再忘,因为本身并没有难理解的逻辑,只是你不知道而已。

 

所以说进阶靠项目,目的就是通过实践开发,把你曾经看过的点都连接起来。就像乔布斯说的:

Conneting the dots

 

你在向前展望的时候不可能将这些片段串连起来;你只能在回顾的时候将点点滴滴串连起来。所以你必须相信这些片段会在你未来的某一天串连起来。

you can't connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. 

Steve Jobs

 

虽然这话说的是人生大道理,但放在编程这件小事上,同样适用。

 

 

 

我们总是容易高估自己短期内能做到的事情,而又低估自己长期能达到的高度。

 

如果心态不好,急于求成,一时学不会就很容易自暴自弃。你想想看,专业的大学生再怎么不努力,好歹也学了四年呢,凭什么你觉得自己三个月就能跟别人竞争?要是抱着这样的心态,最后难免是21天从入门到放弃。

 

但说难很难,说简单也简单。难在并不是每个人都相信时间的力量,都能在尚未看到成果的阶段坚持下来,跨过绝望之谷。简单在于,只要你做得够久,就已经胜过了许多人,跟什么天赋、出身都没多大关系。

 

这篇关于一个程序员的心路历程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/682873

相关文章

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

程序员必备心理学——心流

心理学之心流 前言一、“心流”是什么?二、心流的好处二、如何进入心流心流状态的四个阶段第一个阶段:挣扎第二个阶段:放松第三个阶段:心流第四个阶段:巩固 进入心流的技巧 总结题外话 前言 你是否常常感觉自己明明学习了一整天,但是就是感觉没有太多的收获。这个时候除了你的学习方向等问题之外,也可能是你的学习方法太低效了。作者本人就经常有这种情况,好在偶然间在b站刷到一个大佬的这个心

程序员都在使用的画图工具

大家好,我是袁庭新。 程序员都在使用的画图工具,你一定没用过这款画图工具吧!我教程中的架构图都是用它来画的。 比如我编写的RDB工作原理图就是用draw.io绘制的,如下图所示: 再例如Redis集群故障恢复原理图我也是通过draw.io工具绘制的,如下图所示: 是不是觉得draw.io绘制的图形特别简洁、美观。它的官网是: https://www.drawio.com dra

GitHub:代码是程序员沟通最直接的手段

如果不是 Andreessen horowitz 的投资,估计 GitHub 很难被福布斯、CNN、纽约时报等传统媒体注意到。普通大众之前不了解这个工具,是因为它距离记者的世界太远了——GitHub 是一个程序员所使用的托管项目的服务。 但在一些程序员眼里,它不仅是托管项目的地方,还是“开源”项目的大本营,而且是提高程序员“技术水平”和“技术品味”的地方,更是一个程序员社交的地方。

黑马程序员---银行业务调度系统

模拟实现银行业务调度系统逻辑 需求分析: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口。 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费、电话费之类业务的客户)。 异步随机生成各种类型的客户,生成各类型用户的概率比例为:         VIP客户 :普通客户 :快速客户 =  1:6:3。 客户办理业务所

黑马程序员---空中网面试题

空中网4k/5k月薪挑选大四实习生的线程题     两年前,我们一个大四的学员去应聘空中网的实习生职位,空中网只给他出了三道线程题,拿回家做两天后再去给经理讲解,如果前两题做好了给4k月薪,第三道题也做出来的话就给5k的月薪。这样的实习薪水和招聘要求,不需要有工作经验的限制,纯粹是技术功底的比拼和考核,而不像许多其他公司非要招两年工作经验的人,逼得那些刚毕业和未毕业的大学生不得不去撒谎,不得不去做

黑马程序员---线程并发库

软件包 java.util.concurrent 在并发编程中很常用的实用工具类。 请参见:            描述 接口摘要BlockingDeque<E>支持两个附加操作的 Queue,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。BlockingQueue<E>支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及

黑马程序员---多线程

TraditionalTread 传统线程技术回顾 创建线程的两种方式: thread3中,同时创建了Thread的子类和Runnable,那么会优先执行Thread的子类,因为Runnable的代码被当做参数传到了Thread类里,Thread子类的run方法又覆盖了父类的方法,所以会执行Thread子类的代码。 package cn.itcast.heima;public class T

黑马程序员---代理

分析代理类的作用与原理及AOP的概念 代理的概念与作用  1.已经写好一个类,现在要为这个类增加一些功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做? 现在我们写一个代理类: 保持了原来那个类的功能,又增加了你现在需要的功能。 主函数调用的时候,直接调用代理类就行了。 这就是代理类的功能。   2.编写一个与目标类具有相同接口的代理类,代理

黑马程序员---类加载器

------- android培训、java培训、期待与您交流! ----------   简要介绍什么是类加载器和类加载器的作用 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader   类加载器也是Java类,因为其他是java类的类加载器本身也要被