你当然可以自学,不只是计算机,任何你想学的东西,只要有书,有教程,有课程,有实验条件,你都可以自学,没有问题。
但是,这有一个前提,那就是你是个会学习的人,善于学习,能够自己设计出正确的学习道路。或者悟性极高,能够自己悟出正确的学习道路,这是你可以自学的前提。没有这个前提,你就需要老师指导,不然自己探索,可能就是在胡搞乱搞,专走弯路。
为什么这么说呢?
因为你想想,是你一个初学者对一个学科理解的深,还是老师这个积累了很多学习经验的人对一个学科理解的深?
所谓“闻道有先后,术业有专攻”。
老师不过就是比学生早闻道一点,仅此而已。
想比学生,老师其实也是科学路上的探索者,不是什么标准答案,不是什么绝对正确的权威,只是一个探索者。
有什么是学生知道的,而老师不知道的呢?
很多,比如游戏这个第九艺术,学生就比老师懂得多。比如动漫、二次元这些新生的东西,学生就比老师懂得多。比如cosplay这个时髦的新潮的东西,学生就比老师懂得多。比如修电脑,重装操作系统,学生就比一些老师懂得多。比如互动视频,学生就比老师懂得多。
老师跟学生的关系应该是并肩前行,互帮互助的同伴。老师入门早,知道正确的学习路线,可以帮扶学生一把,让学生不要误入歧途,浪费时间和精力,这是老师所能做到的不多的事情。
你别看同样是计算机,坑并不少。
因为这是一门偏应用的学科,学生就有很大可能产生“技术崇拜”,高估技术的作用,轻视基础科学的作用,别看这点小小的差异,会让学生多走好多弯路的。什么叫“蝴蝶效应”?这就是,刚开始路就没选对,后面只会越走越难,最后可能直接劝退都是有可能。
因为“技术崇拜”心态,学生可能会鄙视、瞧不起老师教的那些基础知识,如《编译原理》、《算机组成原理》、《算法与数据结构》、《操作系统》、《计算机网络》、《数据库原理》这些东西,觉得老师教的 这些东西“没用”,不肯扎下心来,踏实学习这些基础知识。
而是热衷于所谓流行技术,把时间都浪费这个框架哪个框架上面,尤其是偏应用层的程序员,无论是前端还是后端。
比如学java的热衷于SSM框架,热衷MySQL、PostgreSQL之类的关系数据库产品,热衷于redis、zookeeper等具体产品,而忽略基础知识,如框架需要的设计模式,算法和数据基础知识,如redis中对应的数据结构,zookeeper等分布式方案所需要的基础如CAP不可能三角,如缓存一致性问题,如异步通信,如高并发场景所需要知道的并发基础知识,“银行家算法”,“哲学家就餐问题”等非常重要的基础算法问题。
还有更重要的安全策略,如接口防刷所需要掌握的一些基础知识,如滑动窗口,这个但凡是认真学习过《计算机网络》的人不会陌生,因为TCP滑动窗口是一个非常重要的知识点,这个是必须会的,马虎不得。还有漏桶算法,这个是如何解决接口防刷的。
安全策略,比如对称加密和非对称加密,对称加密有什么风险?需不需要知道。非对称加密,RSA这个算法,那三个科学家因为这个东西获得了图灵奖,要不要好好钻研一下这个东西?然后你加密账号,MD5哈希要不要学习?为什么不能直接用MD5加密,有什么安全隐患?有什么惨痛的血的教训你要不要知道?比如CSDN当年那个重大安全事故要不要了解?了解之后,怎么防止类似的事故再次发生?要不要考虑salt+MD5方案,或者其他的可行的解决这个问题的方案?
还有,窃听、假冒、篡改、事后否认(抵赖)这几大安全问题,你是怎么解决的?怎么想的?为什么http还不行,非要再整一个https才行,他加了哪些东西?在那一层加的?要不要弄清楚,学明白?这不是什么高深的东西,《计算机网络》课本上就专门有讲这块的知识点,老师在课上也不可能不给学生不讲。
除非你老师就是个大混子,上课只会念PPT的那种。否则,你要是在我手底下学习,研究生连这么基础的本科知识都学不好,学的一塌糊涂,你觉得你能顺利毕业?不是故意要压你,而是你这种不端正的学习态度,就很难给你及格分。
算法要不要学好?要不要把算法思想想明白,想透彻,要不要多练习。还是你觉得这玩意就是“屠龙术”,除了打比赛和所谓的“进大厂”,没有任何卵用?如果你是这种心态,把基础知识,非常重要的基础知识,当成一次性的开门钥匙,你能学好这个?
当然,先说好,算法这个东西最重要的就是算法思想,稍微找些题目练练就好,一定不要沉迷,把时间都浪费在这个上面,你拿个国内第几世界第几很值得骄傲吗?不要热衷于炫技,没意义,解决不了实际问题的炫技就是浪费时间。你能创造一种更高效解决问题的新算法出来,然后顺手拿个图灵奖吗?不能吧。
所以,要珍惜自己宝贵的时间,知道什么是最重要的,哪些东西纯粹就是在浪费你的时间,把这个想明白,你就能比别人进步快。
然后,前端,沉下心来,多看一下红宝书和犀牛书,也就是《JavaScript高级教程》和《JavaScript权威指南》这两本,多看两边,扎扎实实看,不要觉得浪费时间,这就是基础,实实在在的基础,这个能看明白,然后再做几个项目,前端问题不大。
千万不要本末倒置,把时间都浪费在沉迷学习流行的前端框架如vue、react之类的,这些东西要学,但是不要占用主要精力,无非就是个手熟的事,把时间都浪费在这个上面,不值得,也没必要。这个你稍微读一下官方文档,然后去做项目,去做练习,通过项目来加固你的知识就可以,就是边学边练,学以致用,这样你学到的知识才稳固。
前端要更精进,有做大型项目需求的,好好学一下TypeScript,虽然啰嗦,但是更规范了,项目一大,排查问题也比较容易,不至于说把改bug给整成玄学问题,量子bug,观察的时候就存在,不观察的时候就消失了,这就是底子不扎实,本事没学到家。工程问题如果在你眼中成了玄学问题了,你得好好反省下你自己,而不是无端抱怨。
以上说的,无非就是一点经验之谈,不一定都对,因为纯手敲的,没查任何书本和文献,不保证100%正确性,但是大致意思是差不多的。就是学习的顺序一定要正确,先科学后技术,把基础功夫打牢了,学扎实了,你再去学技术,就会非常快,基本没啥障碍,这是正确的学习思路。
反之,如果你一味急功近利,贪多求快,热衷于背诵记忆八股文之类的鬼东西,那你肯定是越学越回来,硕士的学历,出去上个五六年班,结果本科就应该掌握的知识还没搞明白,这样的人大有人在,就光我见过的就好一些。这就是基础不扎实,轻视科学,热衷于个人单薄不靠谱的经验所造成的恶果。