计算机非科班工作后如何爬出技术的绝望之谷,走向开悟之路

emm,几个月没写博客了,究其原因,还是觉得自己太菜了吧。

我从17年底开始写博客,最初只是为了记录一下自己技术生涯的一些学习细节,将某些知识,以文章的形式记录下来,内容比较随意,主要是方便以后自己回顾,查漏补缺。但两年过去了,越来越多的读者看到了我的博客,这也许能对他们产生一些帮助,我很开心,但也很惶恐,我很怕因为自己水平不足、认识有限而误导了某些读者。

我是作为非科班转行计算机后端开发,因为大学里我们学过C程序语言设计、数据库概论等基础课程,做过上机编程实验,自己也考过计算机二级C语言、计算机三级网络技术证书,所以当时转行计算机开发工作并不困难,初生牛犊不怕虎,我甚至觉得搞技术很轻松。

但是随着工作这两年多不断地学习,对计算机技术领域的认知不断加深,新技术也层出不穷,我越来越感觉到技术海洋的广袤与深沉。而我很贪心,总想着把这些新技术都一网打尽,越过最初的激情学习后,疲惫和无力向我袭来。

可笑我曾经还企图脚踏Java后端开发、大数据开发两条船,虽然这两者有共通之处,但其技术栈实在太大,而人的精力是有限的。公司也就这么点业务和用户,你如何能把高并发、分布式、大数据研究好?自学一些先进技术的基础应用,看起来有声有色,却让我越来越焦虑。

阅读过一些书籍,但是很多东西却仍然云里雾里,或者懂了又忘了,比如《深入理解Java虚拟机》,可谓Java开发必看书籍之一,很多前辈极力推崇,但是我看到第二遍的时候,脑海中仍然无法建立清晰完整的认识,总觉得懂了,但又没懂,仿佛始终隔着一层膜,很难受。

下面的邓宁-克鲁格心理效应图,能很形象地反应我的心理状态:
计算机非科班工作后如何爬出技术的绝望之谷,走向开悟之路_第1张图片
愚昧山峰绝望之谷,日益严重的学习焦虑感,日益下降的信心,我发现此时我必须停下来思考一些东西,才能再次找到前进的动力。

我开始意识到我的时间和精力是有限的,你什么都想要,什么新东西都想去追,最后的结果只能是什么都得不到,或者看似得到的也只是镜花水月,一触即破。

没有什么新技术是凭空产生的,它们都是建立在曾经的旧技术之上,迎合新的时代需求,适应新的土壤环境,只要我们能从源头一步一步梳理,可以发现很多技术名词吹的很响亮,但本质也就在xx基础上进行了xx改进,也就那回事。

所以我们必须开始从底层去建立自己的技术体系,梳理出属于自己的技术栈

谈到底层,我越来越意识到非科班科班的差距,对此很多转行者都有点认命的感觉,觉得自己就是不如他们,而没有去思考:差距到底在哪

我从清华大学官网上找到了计算机科学与技术专业的本科主要专业课如下:

高级语言程序设计
离散数学
数据结构
信号处理原理
系统分析与控制
数字逻辑
人工智能导论
微计算机技术
操作系统
汇编语言程序设计
计算机原理
计算机系统结构
编译原理
计算机网络
专业英语阅读

看到这里,如果你是非科班,是不是明白了什么呢?

是的!差距就是存在于这些课程上!

这里转载下知乎大神对这些科班课程的总结:

离散数学、数字逻辑(包括高数、线代、概率论) 等基础学科,打下了工作中需要使用到复杂的数学运算时的数学基础。使人更加易于理解和分析如何把现实问题转化为程序逻辑并实现。

模电主要让人明白信号传递的原理同时又作为数字电路的基础,而数电主要让人明白计算机内部数据到底是如何存储,如何运算,如何传输的。

计算机原理,微机原理,体系结构等,主要是来解释计算机是如何组成的,早期是什么样子的,发展历程是什么,为什么会有这样的发展,现在的计算机的复杂结构下的简单核心是什么?

操作系统,真正讲述了,一个应用程序是如何层层传递,调用了最终硬件的。操作系统,驱动,应用程序,分别都是什么关系。cpu的运算方式是什么样子的,为什么要有多线程?为什么会有死锁,在多线程的模型下,硬件到底在做什么。

网络基础,让人明白在计算机的基础之上,到底是如何传输数据的。分别有哪些层,每一层在做什么,为什么RFC的各种协议里会有那么多奇奇怪怪的头和尾。各种不同的协议是怎么产生和怎么发展的,分别有什么特色。我们为什么在某一种场景下使用某一种网络协议。假如我们需要一个自己的协议,该如何构建。

数据结构,让人明白数据是如何存储的,目前常见的存储的模型有那些?这些模型在内存里以什么样的方式存储?这些存储方式都有什么优劣?在那些场景中最为适用?

编译原理,让人明白高级语言到底是怎么被解释编译成机器语言的。

汇编语言,让人明白在接近硬件的层面上,程序到底是怎么运作的。去理解去思考,我们的操作和编写的程序,对硬件到底做了什么。不同的操作系统,不同的编译器,不同的写法,不同的逻辑,在硬件层面上,会有什么样的不同?

算法和高级语言,一般来讲,到这个层面往上,非科班和科班的差距开始变小。因为大部分人在实用性的学习过程中。必须来学习和接触到高级语言和算法。所以科班和非科班,不是你会什么C Cpp C# Java python PHP Object-c这样的语言。不是你学了多少linux,Win32,IOS,Android,MFC,.net,Apache,Struts,Spring,Spark、Flink这样的框架。或者你会Oracle,MySQL,SQL server数据库的使用。

而是你是否明白,从最基础的电路和电讯号传递开始,到今天的计算机体系的大厦,是如何一步步构建出来的,每一步的取舍都是为了什么。

这才是科班花了四年应该学到的东西。大部分的非科班生,固然可以做到知其然,熟练的编程,设计生产出非常优秀的应用。但是如果可以知其所以然,那么是不是可以做得更好?在出现新东西的时候,能够更快的去理解这些新东西的缘由,发展和价值?

当然我这里不是在无限抬高科班。而是说,不管是科班还是非科班的同学,不要学了一点皮毛就沾沾自喜。也有很多科班的同学,本科期间学习这些底层课程时,并不能理解其中的道理,只是带着不情愿被老师强行灌下这些知识,应付下考试争取不挂科罢了,毕业后参加工作能不能唤醒这些沉睡的知识也是未知数。

今天我们之所以不用去了解那么多基础,就可以从事这个行业。但是这是在无数前人构建的基础上,我们才可以轻松的去学习,去操作。但我们的梦想就仅此而已了吗?我们该如何往前进一步的去推进呢?

看到这里,你是不是豁然开朗了呢?

如果我们真的想在技术这条道路上走下去,走得稳、走得快、走得放心、不再焦虑,那么,从这些底层课程开始努力吧!先选择你觉得重要的几门课程,比如组成原理、汇编、网络、操作系统、编译原理、算法与数据结构等,攻克它们!

我相信,我们带着实际应用开发的经验,从上至下深入到底层,从知其然到知其所以然,从懵懂到顿悟,这不是一条痛苦的路,而是一条救赎自我,进化自我,超越自我的开悟之路

花开彼岸天的幸福终将会到来。

东隅已逝,桑榆非晚。

一起加油吧!共勉 ~


2019-10-06 更新:

这几天有很多小伙伴看到了这篇博客,我也不知道大家是从哪看到的。。看来CSDN的推荐算法还可以啊。。

我根据读者反馈在这里强调几个事情:

1.这篇文章所谓的技术的绝望之谷,并不是指人生的绝望之谷!而是技术学习生涯的一个大的瓶颈期而已。大多数非科班搞技术的可能都会遇到这个瓶颈,这并不是坏事!只要我们有改变自己的勇气,我相信这将是一次很大的突破。

2.有读者质疑某些底层课程的作用,觉得如今开发根本用不到这些东西,比如汇编!我的下篇博客《为什么要学习汇编语言?》正好写了关于我学习汇编的原因,大家可以去瞅瞅,希望能有所收获 ~

3.有读者评论表示: 没有成功的经验,千万不要布道,会误人误己 ,如开头所说,这真的是我写博客最担忧的事情了。因为如果你的文章只是自己看,那怎么写都无所谓,随心所欲,但是一旦越来越多的人读到它,一千个读者就有一千个哈姆雷特,每个人因其过去经历、思想性格、生活环境等因素的不同,对同一事物都会有不同的认知,这是作者无法控制的。

在此,我想真诚地表示:以上的内容,只是我个人作为一个IT领域的菜鸟新人,在自己技术学习路上产生的一些感悟罢了,真的上升不到布道的层次! 大家有收获是最好的,有意见也可以提出来一起探讨,要是觉得没有营养也可一笑置之。千人千面,世界正因此而美丽迷人。

我写了这篇文章,当然希望有更多的人看到,能帮助更多的人,所以本文的标题可能稍显浮夸,引起一些读者的反感。。我在此抱歉,希望大家能理解下哈 ~


参考资料:

计算机科班出身的优势是什么?
(https://www.zhihu.com/question/57746751/answer/155797102)

你可能感兴趣的:(技术,非科班,感悟,技术生涯感悟)