非科班自学编程能找到工作吗(自学编程能找到工作吗)
2019-2022年,时光飞逝的三年,平静而又理性,一路走来,书本陪伴我,在我孤单的时候给我理性的快乐。
交代一下背景,本人是程序员,准确地说是低学历程序员(成人大专)。高中是不过40分的学渣。自学的起因是这样的,本人在写代码的过程中,发现很多问题解决不了。思路凌乱,编程要掉半条命(逻辑思维不好)代码正确全靠一个个试。于是就想知道是不是自己计算机基础太弱了。
于是我开始自学计算机基础的三年时光,这三年中我获得学习的快乐。总结了一套适合自己的学习方法。高等数学告诉了我,世界可以无限细分下去,也可以无限积分下去。世界是无限的。概率论告诉我用概率去解释周围的世界,许多现象充满了偶然性,但是偶然中一丝必然就是概率。而现象可由多种事件进行组合排列得到,离散数学告诉我逻辑和证明原来也是像加减乘除一样的运算。推理证明就是在一系列规则下的运算。事物中是充满离散结构(图,树,格),而结构是有性质和规律可循的,而性质规律是可以利用的。
数据结构对离散数学的深化,在事物结构基础上产生了一些解法,其中计算机解法是最重要解法。世界是充满问题的,除了数值计算问题还有其他问题(排序问题,查找问题)而这些其他问题更多的是通过数据结构和计算机算法解决。线性代数告诉我如何去抽象,什么是代数思维。怎么做概念与概念进行运算。他告诉我如何利用系统关系推导出未知数。以及用矩阵解方程。操作系统启发我,如何提高自己能做的事情的吞吐量,对于多件事情应该按照什么顺序进行调用。能保证自己多干点事情。
我喜欢这些的知识,他的每一个概念每一个算法都让我感到惊叹,世界上还有如此巧妙的东西,数学家,计算机学家是怎么想出来。同时深深体会到理性之美。同时自己的价值观和世界观被这些知识所重新塑造着。三年前和三年后的世界观价值观思维方式产生了较大的差别。我很难回到过去了,那个没有理性的蛮荒时代。
高等数学,我学习了差不多9个月的时间。是投入精力最大的科目。经历了2次挫折,使我对他有深深的印象,第一次是刚开始看书学的,那时候非常的艰难,3天才能做完一道题。看概念总是很难搞懂他。后来放弃看书学习了。就报了腾讯的班,这回就彻底轻松了。跟着老师学,然后做题。学习得非常快速。做题也不会3天一道题了,当时沾沾自喜,觉得不过如此,直到我参加自学高等数学考试,结果我没有及格。(隔了三个月时间没有看高等数学也是原因)那时我十分灰心丧气。
我总结了一下是因为看视频学习老师讲的都是应试的内容,他不关心你理不理解,以及这个知识有什么用处。碰巧我是一个不适应死记硬背的人,这种死记硬背的东西我过了几个月就忘记了,事实上也真的忘了。然后我反思了一下自己,当初自己看书自学为什么不能坚持下去了。(多门好的学习方法)别人讲的解题技巧和知识是别人的。自己把知识的来龙去脉搞清楚才是自己。哪怕一开始过程慢都可以。于是我开始第二次看书自学过程,这次我没有走捷径,书本上每一句话我都要求理解一遍。体会他的概念和原理。课后的题目我做了不下三遍了。错题做了2遍,直到把它搞懂为止。
准备自学考试,这次我把历年真题8套试卷都做了一遍。每次做题我都会去通过错题反推自己薄弱的知识点,有针对性地复习薄弱知识点。然后熟悉他的题型。这次90分高分过的。我非常的开心。高等数学积分和微分方程的技巧性比较强,需要你开脑洞,同时高中的三角函数,对数,导数,数列的知识都是学习高等数学的基础。如果你这些东西不过关可能永远解不出题目。或者像我之前一样3天一道题(通过网上查资料熟悉相关概念,等复习了这些基础概念,你才能把一道题解出来。)高等数学里面我觉得比较有趣的东西是无穷级数。泰勒级数,傅里叶级数这些。我虽然过了自考但是我还是不能完全理解他的概念,数学家是怎么能发现这些神奇的规律的呢。
离散数学,我差不多学习了6个月。一开始学的是数理逻辑。主要讲了命题逻辑,谓词逻辑。以及推理运算这些。我觉得这个对我的帮助是极大的。因为通过对它的学习我能实现规范的推理。而不会像以前一样,想当然认为,(推理的不规范严谨必然带来逻辑的错误)你会怀疑一切逻辑不通东西,会去举反例推翻你怀疑的事物。对我后面学习数学的帮助极大。
我对于学习数学真正启蒙(上道了)是从学会离散数学开始的。尤其是数理逻辑部分。高等数学里面许多的概念和推导过程我会利用数理逻辑进行理解和推导,寻找他们逻辑的合理性,画推理图去分析高等数学题目中的已知条件,和推导得到隐含条件。可以说高等数学的进步是因为离散数学的基础的帮助,我非常奇怪为什么高中不是从离散数学讲起呢。离散数学推理证明功底好,后面的很多数学知识都会比较容易学了。
因为数学是十分强调推理证明的。还有抽象代数系统,说实话很抽象。但是如果你有代数系统的概念对于理解代数,解代数题的帮助较大(可以站在代数系统高度,像站在山顶上看周围的山一样,)后面学习了函数,格,偏序图。函数揭露了函数的本质是对应关系。格和偏序图很像计算机输入输出理论。而后是树,图。(生活中太多的事物能有树和图来表示了。流程图,状态图)这些为你学习数据结构提供基本知识基础。当然也有一些非常巧妙的东西如一笔画问题,哥尼斯堡七桥问题,欧拉图,哈密顿图。
概率论,这门是我花了最少时间过的,大概2个月就过了自考了。然后他的特点是都是公式。解法固定就是套公式,所以自考容易。但是他的理论却很艰深,虽然过了考试不代表真的理解了。概率论还算好学,无非是组合排列。事件集合。概率的计算等问题。他的计算方法是比较死的。难在后面数理统计,还会估计理论,F方分布,假设性检验,置信区间,真的很抽象不容易联系到实际问题。但是你会对概率这个概念会很认同。有时候在生活中和其他数学学习中。当你不确定需要猜测的时候,你就会不自觉地用概率去表达他们。从而使你猜得更准确,只是你会忘记书本的一些计算公式(只能记得名词,贝叶斯,条件概率,k方分布等)。
数据结构。我觉得离散数学的深入。比离散数学难很多。我大概遇到两次挫折。一次是没有数学基础的时候。看完前面2章节。后面的和坐飞机一样完全不知所云。(因为没有办法组织各个代码之间的关系。梳理不出来)后来有了数学基础(高数,离散数学,概率论过了)在看真心的觉得简单了。他的考试不难的。靠你一些对算法的理解。(不用事先,只需知道算法步骤)我目前没有在电脑上全部实现过所有数据结构。(在电脑上实现数据结构是难点)他的帮助主要可以给你编程带来很大的启发作用。逻辑性极强,巧妙性则一般,不需要你有那么大的脑洞(想高等数学一样)。需要你有代码阅读能力。数据结构需要你大脑有足够的内存来人肉运行代码输出执行结构。
操作系统主要让你对于计算机的层级结构会有更深体会。编程语言到解释运行环境后然后就是操作系统了,你会发现计算机比你想的要博大精深,你能编程不是因为你聪明而是因为前人帮你把高并发的操作系统做出来了。帮你把程序解释器做出来了。你写的程序不过是对别人劳动成果组合拼凑,这道理就像开车没什么牛b的。但是造一辆汽车发明汽车很牛逼一样,设计模式,语言的高级特性,语言级别的线程高并发在他面前弱爆了。操作系统你在深挖就是汇编语言,cpu指令了。再挖可能是cpu等集成电路了。然后这些结构上有个叫可计算理论的东西这东西计算机系统结构讲的比较清楚。(这个和离散数学的代数系统有联系)总之会让你明白计算机的博大精深。
讲完了这些计算机基础科目的感想体会。下面对自己的3年的自学时光做一个总结吧。自学的时光真的很快乐,辛苦却有快乐着,你会为自己学到新知识而感到快乐。你会惊叹于这个世界充满着各种结构关系。你会惊叹于数学家的巧妙的思维和理解世界的角度。自学使我成为了一个喜欢独立思考的人,喜欢自己寻找答案的人,而不是只索要现成答案的人。因为自学你会变得更自律,因为学习数学不自律真的很难体会到他美。(懂得人都懂)
弊端也非常的明显,要知道出了社会,首要任务是生存,我曾一直寻找让知识变现的路径,我曾经天真的以为企业会为我的计算机数学基础功底买单。觉得企业需要一个对计算机有深度理解的人。当我面试时候手舞足蹈的从计算机底层角度阐述编程语言的时候,迎来的面试官的不耐烦,他们需要是一堆英文名词堆砌。把简单的问题复杂化,进而显得高大上。而不是复杂的问题简单化。他们反而觉得你什么也不会。如果你想涨工资,只需要学习语言框架,语言的高级特性,工具熟练就行了。很后悔为什么没有边学计算机基础,边学习框架知识。
总结一下文章,给所有非科班出身的程序员一点忠告,学习技术和计算机基础要了解招聘市场的需求,要做编程语言技术结合计算机功底的路线。而不是完全偏向于计算机功底,否则会比较耽误你涨工资的效率和效果,工作后自学计算机基础性价比很低,你还不如学习面试需要的技术栈。另外要规划好自己的变现路径,就是找工作找那个方面的,而这个工作有要求对那些技术栈熟悉。哪条路径成功概率最大就走哪条。学习任何东西我们都是希望将他变现。自学的过程很享受,但是需要设计一条合适的变现路径。
忠告成功不需要像像成功者索求经验因为有幸存者效验加持。学习所有失败者的经验总结出来。你就能得出闭坑指南,以及有多少坑。