写在前面
本人已通过秋招成功拿到字节跳动后端开发 offer,在此写一些我自己学习过程中用到的资料,不局限于计算机。鉴于我只是双非本科学历,因此该博客应该还是挺有实用价值的,希望对你有所帮助。
非计算机课程
这类课程通常是用来更高效应付考试,从而给你的计算机自学留出时间。当然如果你学有余力,那把数学课程学好也没有坏处。数学相关课程如果只追求应付考试,那统一推荐使用宋浩老师的课程。
高等数学
这里强烈推荐 高等数学-上海交通大学-乐经良(高清版)。课程质量很高,讲得很细致,课程题目很有难度。学完之后我轻松高数满绩,并且可以尝试解决考研题目。
线性代数
你可以使用 《线性代数》高清教学视频-宋浩老师。虽然我没使用这门网课,但周围同学反馈很好,适合入门。
如果你本身数学思维不错,那我更推荐你使用 麻省理工学院 - MIT - 线性代数。这门课深刻体现了线性代数具体-抽象-再具体的回旋过程,让你理解线性代数的本质。当然课程具有一定学习难度,如果感觉学习受到阻碍,可以换成宋浩老师的网课。使用这门课同样让我轻松满绩。
概率论
这门课我其实没有找到什么很深入的网课,不过也不太需要,更多的只需要学会计算方法就行。你可以使用 【公开课】概率论与数理统计(浙江大学)。
计算机基础
包含经典的数据结构与算法、计算机网络、操作系统课程,由于我本人是后端开发方向,因此没有计算机组成原理。
数据结构与算法
推荐使用 浙江大学数据结构 陈越。使用该课程进行入门。
但是你如果目标是大厂或者其他知名企业,会要求一定算法能力,此时光学完该课程是远远不够的,这里推荐使用 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 进行算法训练,刚入门时推荐寻找合适的入门题单进行每日一两道题的训练 学习计划 ,后续你可以选择充值会员开始使用进阶的学习计划。会员有一年的时间,这段时间够你轻松刷到500题以上,当你遇到中等题没太大问题时,面试的算法就不是麻烦了。
算法这块重要的就是养成习惯,每天刷个几道维持算法能力,本人即便在秋招之后依旧保留了该习惯,目前已经刷了1000+的题目,这对于维持自己的代码能力和大脑活跃度也是挺有帮助的。
计算机网络
你可以使用任何教材为自顶向下的课程,例如 中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程。同时我也推荐你直接阅读 计算机网络:自顶向下方法 这本书,很适合入门计算机网络。
如果你对于网络有兴趣,想要进一步了解高级应用,可以使用 中科大郑烇全套《高级计算机网络》。如果你希望能具备直接开发网络协议栈的能力,可以学习 Stanford CS144: Computer Network。
这里我也推荐使用知名的 图解网络介绍 | 小林coding (xiaolincoding.com),学完计算机网络基础后可以使用该网站进一步了解协议细节,对于面试很有帮助。
操作系统
操作系统是一门很博大精深的课程,整个系统蕴含着巨大的知识财富,也让后续很多研究领域受益,此处我没法给你提供单一课程参考,因为我本人使用了多门课程进行学习。
你可以使用 【哈工大】操作系统 李治军 进行入门,可以选择跳过汇编代码的部分。
这之后我还使用了 操作系统概述 (为什么要学操作系统) [南京大学2022操作系统-蒋炎岩-P1]。这是一门持续更新的优质课程,课程涉及很多有趣的对操作系统的学习思路,并且拥有不错的知识广度,强烈推荐学习。
以及大名鼎鼎的 MIT 6.S081: Operating System Engineering,整体围绕 XV6 进行教学。你可以使用视频课程或者直接使用文字资料 Lec01 Introduction and Examples (Robert) - MIT6.S081 (gitbook.io)。
当你将 Java 的热门框架学得差不多后,还可以看看 【尚硅谷】计算机操作系统原理+代码开发实战,该课程会涉及到操作系统与一些知名框架设计间的关联,需要一定的 Java 流行框架基础,可以对知识进行一次梳理。
你还可以使用 图解系统介绍 | 小林coding (xiaolincoding.com)。在入门后使用该网站了解一些操作系统细节,对于面试很有帮助。
语言基础
此处仅仅为语言入门资料,语言的进一步掌握需要个人平时的大量使用。推荐第一门语言学习 C 语言,学完 C 后再去学习后续语言就轻松多了。C 语言强烈推荐 浙江大学翁恺教你C语言程序设计。Java 和 Python 可以使用 首页 - 廖雪峰的官方网站 (liaoxuefeng.com) 进行学习。
语言入门除了第一门以外基本没有什么难度,因此用什么资料都是可以的,而想要进一步熟练掌握就需要大量的练习。
八股
八股指那些面试中高频出现的问题,其实也就是各个领域的入门知识。此处强烈推荐 | Java 全栈知识体系 (pdai.tech)。该网站囊括了几乎所有你所需要的八股知识,即便你不是 Java 选手,也可以用以学习数据库、架构、分布式等方面的知识。当然该网站部分资料不够细致,还在持续更新,会需要你自行查找进阶资料,因此适合作为一个引导性质的网站,用以了解你需要学习哪些知识。
如果你想要学习一些进阶知识,可以使用上面也提到过的 小林coding (xiaolincoding.com) ,包含计算机网络、操作系统、Redis、Mysql 方面的知识,部分资料极其细致,很适合深入。也可以使用 bin的技术小屋 的个人主页,该博主也拥有一些特别优质的博客可以参考。
Mysql 数据库方面你还可以使用 MySQL数据库入门到大牛,mysql安装到优化 来进行学习,该网课包含基础、实战、进阶、原理等方面的知识,非常全面,对于面试很有帮助。当然也不要忘了使用 题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 进行 SQL 的刷题,面试代码题有可能会进行考察。
项目
我本人其实没有花时间寻找过项目,因为我个人更关注基础和底层原理,实习时我凭借自己设计的简陋项目成功入职,实习后我也天然拥有了大量生产环境项目实战经验,秋招时也都是问我的实习项目而不是我的个人项目。
根据我周围大佬的学习反馈,这里推荐使用 b 站上尚硅谷和黑马的项目,你可以使用这些项目进行框架实践,这也有助于对框架的熟悉和进一步了解。当然我不推荐你在此之上花太多时间,只要能学到框架实践和架构设计就可以了,没有必要把项目从零开始完整开发出来,毕竟这类业务项目大部分都是 CRUD。
当然除了业务项目我还强烈推荐你尝试框架的开发,包括开发一个消息队列、网关、数据库等。这类项目即便在你面业务岗位时也是有用的,因为可以体现你自己的代码能力和工程能力。这里你可以参考 小傅哥 bugstack 虫洞栈,里面有一些偏框架的实战项目。
领域进阶
其实如果你能把上述部分都学好,那找到一份好工作就问题不大了,但如果你希望能稳稳进入大厂,就需要一些区别于其他人的亮点。毕竟八股、计算机基础、项目这些资料网上满天飞,现在又是一个内卷的时代,和你竞争的这批人,可能人人都掌握了这些知识,而你作为一个学历没优势的双非学生想要脱颖而出,就需要某一个领域的深入。由于我本人深入的是分布式领域,所以我只能给你这方面的参考。
这里推荐 CS自学指南 (csdiy.wiki),这个网站总结了一些国内外的优质课程,非常适合深入,并且通常国外优质课程会涉及到论文阅读,而进阶的关键就在于对于论文的学习。
就分布式领域而言,强烈推荐学习鼎鼎大名的 MIT-6.824。一定要充分学习该课程,做完所有的四个Lab,并且仔细学习课程表 6.824 Schedule: Spring 2021 (mit.edu) 上提到的论文。这里的关键在于,以这些论文为基础,进一步阅读你所感兴趣的参考文献。例如你想深入分布式缓存,那就仔细学习课程提到的那篇 Facebook 的论文,并且搜索一些较新的知名论文例如 DistCache,并根据他们的参考文献进行学习。
学习规划
如果你想要进入大厂,规划是必不可少的,上述的资料如果你从大三才开始学,那么除非你有过人的履历(高学历)或者过人的自律能力,否则希望不大。
我推荐你尽早规划,并且不需要进行细致的规划,例如今天学什么明天学什么,而是规划你每个学期希望学完的知识。例如我大一规划学好基础,大二规划学好语言和实践,大三规划实习与进阶。当然规划因人而异,你可以在参考上述资料的基础上根据个人时间进行安排。
你需要知道的是,进大厂需要亮点,这个亮点可以是学历、竞赛、开源、科研、大厂实习中的任意一个,当然能兼顾多个更稳。而如若你是个双非学生,学历除了读研是很难扭转了,竞赛基本是看 ACM 的成绩,相比开源和科研,大厂实习会更简单一点。因此我推荐你在大三的时候尝试进大厂实习,并且一定不要错过秋招,秋招在大四前的那个暑假就开始了,这是你能进大厂的最好机会。
写在最后
希望这些资料对你有帮助,当然这些仅仅是我个人学习过程中使用的部分资料,还有很多资料都是通过搜索引擎搜到的博客,就没有办法一一提及了。因此熟用搜索引擎,对于你的自学之路也是很必要的,我平时都使用的 必应 (bing.com),如果实在搜不到一些英文资料了,会去使用 Google 搜索。如果你有什么推荐的优质资料或者对于该文章的建议,欢迎评论😋。