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

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

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

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

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

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

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

下面的邓宁-克鲁格心理效应图,能很形象地反应我的心理状态:
在这里插入图片描述
愚昧山峰绝望之谷,日益严重的学习焦虑感,日益下降的信心,我发现此时我必须停下来思考一些东西,才能再次找到前进的动力。

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

没有什么新技术是凭空产生的,它们都是建立在曾经的旧技术之上,迎合新的时代需求,适应新的土壤环境,只要我们能从源头一步一步梳理,可以发现很多技术名词吹的很响亮,但本质也就在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领域的菜鸟新人,在自己技术学习路上产生的一些感悟罢了,真的上升不到布道的层次! 大家有收获是最好的,有意见也可以提出来一起探讨,要是觉得没有营养也可一笑置之。千人千面,世界正因此而美丽迷人。

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


2019-10-17 更新:

很多同学在技术学习过程中其实都会遇到我所描述的这种情况,如果无法突破的话,将在技术这条路上越走越累。并且经济下行、互联网寒冬、中年危机的焦虑风愈刮愈烈,我们如何选择未来的道路真的要早做打算。

如果不想深入研究技术,你可以选择转行、转管理、转产品、创业等,也可以混着。这些选择很多,没有绝对的好坏,看你的背景能力,也看你的个人追求。

我之前听说阿里看好技术转产品这条路,我自己也对产品经理这个岗位有一定兴趣(甚至觉得自己有产品经理的天赋:),所以我作出了三年之内转产品的计划。然后,我就放松了,觉得反正要转产品了,那还费那么大劲研究技术底层干嘛!开心,我仿佛找到了救赎自我的灵丹妙药!

人类真的很奇怪,有时会陷入自我怀疑的抑郁绝望之谷,有时又会激发强大的精神自愈能力各种找借口理由自我安慰。

我们冷静下来思考。如果你好不容易转行,抛弃了讨厌沉重的历史包袱,走上计算机技术之路,仿佛迎来新生(至少我曾经是这样觉得)。然后围城效应慢慢体现,你渐渐觉得这行也没想象的那么棒,困境与坑也样样不缺,中年危机的焦虑、技术的瓶颈袭来,你这时候觉得扛不太住,想转移阵地,溜了。

如果你真的选择放弃,那你想想自己到底是怎样的人?之前的行业觉得太坑,自己不喜欢没前途,好,我溜了转行去;现在在新的行业岗位,遇到困难瓶颈,你又觉得坑,又想找借口放弃,美其名曰转移阵地追寻真正的新生。

请问,你自始至终做成过什么事?工作几年了取得过什么成就?退一步,你不需要做出别人公认的成就,你只需要做出让自己认可骄傲的事情就行了,有么?如果有,你再确认下,这是真的自我认可,还是自我安慰?

说了这么多,我想表达的只有一点:人生这么长,我们不能总是选择逃避,然后给自己以新生的幻觉,我们总要强硬地坚持一些东西,撕开自己给自己贴上的固定标签,突破自己给自己设置的无形上限,真正努力做一件能让自己骄傲的事情好吗?

阻碍我们的最大敌人,不是那些客观存在的困难险阻,而是我们内心深处的恐惧与懦弱

请给自己一点勇气吧!


2021-05-14 更新:

时间过得太快,不知不觉入行已经快四年了,这时再回看这个一年半前发布的博客,有了新的理解和感悟,在这里分享给大家。

当初写这篇博客的时候,我正在处于一个技术焦虑且拥有充分学习时间的阶段(朝九晚六、双休、无工作压力),所以我花费了比较大段的时间来学习了一下底层知识(汇编、网络、Linux源码等),确实有顿悟的感觉,但当时学习的细节到现在几乎都忘记了…并且这些对后面的工作帮助很小,也就是性价比非常低。

所以当我重新审视这段底层学习之路后,对这句IT界流传已久的谆谆教诲("做技术,基础很重要,一定要打好基础 !")有了新的理解,也许我们很多人真的被误导了。

所谓的基础并不一定指:

  1. 底层。比如操作系统内核(管控程序的运行),编译原理(所有编程语言的基础),CPU 的指令和内存(程序运行的基础)…

  2. 源码。比如觉得只有源码才是最基础的东西,源码面前没秘密,要学基础就一定要去看源码,要自己能写出来才算真正掌握了“基础能力”…

  3. 不变。比如数学、算法和数据结构、计算机组成原理、汇编语言、甚至包括离散数学和逻辑电路等,把这些学好了,以后无论做什么都用得上…

有很多人抱着这样的想法去提升基础,结果却没什么效果。

有人花了大量的时间来看 Linux 内核源码,看完好像知道了一些源码,但线上出了问题之后,连 Linux 定位工具都不会用。

有人花了大量的时间来背算法和数据结构的源码,但在实际工作中,要么不知道什么时候用什么算法,要么就滥用算法,明明一个很简单的逻辑也要硬套一个算法。


那什么才是真正核心、重要的基础能力呢?

引用李运华老师的观点:

基础能力是指工作任务相关的基础能力,不是整个计算机技术的基础能力。

在这里插入图片描述

所以,如果无脑学习所谓的底层基础技术,最终大部分收获可能都是 自我感动

那么,如果真正提高自己的基础能力呢?答案就是结合工作、深挖工作、有目的地逐步深入学习。

如果这时针对某个问题,遇到了某个底层瓶颈,需要学习Linux原理、Netty源码等,那就是水到渠成,不再是空中楼阁。

当然,很多人都会面临自己所做的工作项目架构比较简单,也没有啥用户量、并发量,那么如何去学习相关的高并发技术呢?

答案是:

1.自己通过压测去模拟高并发场景,关注压测过程中的网络、CPU、内存、JVM等全链路数据,也许你会发现新的天地。

2.通过学习理论、模拟压测、针对问题继续学习观察总结,循环往复积累日深,跳槽到真正拥有庞大业务、复杂架构、超高并发的公司吧!


参考资料:

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

  • 108
    点赞
  • 220
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值