当前位置 博文首页 > 沉默王二:大学最应该学习的 5 门课, 毕业后大厂 Offer 直接拿

    沉默王二:大学最应该学习的 5 门课, 毕业后大厂 Offer 直接拿

    作者:[db:作者] 时间:2021-06-22 12:46

    时间如白驹过隙,我竟然已经是一名拥有 13 年编程经验的老油条了!

    有些自豪,因为自己从大一就开始学习的 Java 语言依然坚挺,几乎是编程语言中的霸主了;但也有些遗憾,大学的时候没有把这些计算机基础课程学好,有些甚至没有学,导致工作后有很长一段时间蛮吃力的,全靠近些年“废寝忘食”的补课,才有所好转。

    希望学弟学妹们,能从我这些经验中获得一些启发,少走一些弯路。

    1)计算机编程的基石——数据结构与算法

    2)计算机编程语言的母胎——C语言

    3)计算机组成原理

    4)计算机操作系统

    5)计算机网络

    一、数据结构与算法

    无论什么时候,程序=数据结构+算法这种说法都是成立的。

    常用的数据结构有:

    • 栈:栈是一种非常有用的数据结构,它就像一摞盘子,第一个放在最下面,第二个放在第一个上面,第三个放在第二个上面,最后一个放在最上面。栈遵循后进先出的原则,也就是“Last In First Out”(简称 LIFO)——最后的一个进的,最先出去。
    • 队列:只允许在队尾添加数据,队首移除数据。队列在 Java 中的出现频率非常高,有各种不同的类来满足不同的场景需求。像优先级队列 PriorityQueue、延时队列 DelayQueue 等等。队列遵循的是First In First Out,缩写为FIFO,也就是先进先出,第一个进入队列的第一个先出来。
    • 数组:数组这种数据结构最大的好处,就是可以根据下标(或者叫索引)进行操作,插入的时候可以根据下标直接插入到具体的位置,但与此同时,后面的元素就需要全部向后移动,需要移动的数据越多,就越累。
    • 链表:链表在物理存储空间是不连续的,但每个节点要么知道它的下一个节点是谁,要么知道它的上一个节点是谁,仿佛就像我们之间隔着千山万水,却心有灵犀一点链。像 LinkedList 就是最典型的链表结构,通过引用相互链接。
    • 树:树是一种典型的非线性结构,它是由 n(n>0)个有限节点组成的一个具有层次关系的集合。之所以叫“树”,是因为这种数据结构看起来就像是一个倒挂的树,只不过根在上,叶在下。
    • 哈希表:也叫散列表,是一种可以通过关键码值(key-value)直接访问的数据结构,它最大的特点就是可以快速实现查找、插入和删除。
    • 图:图是一种复杂的非线性结构,由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。

    常用的算法有:

    • 查找
    • 插入
    • 删除
    • 更新
    • 排序

    算法研究的目的是为了更有效的处理数据,提高数据运算的效率,数据运算是定义在数据结构上的,各大公司的笔试基本都考这个,《剑指 Offer》上的所有题目如果能背下来,LeetCode 上的题如果能刷个一百到三百道,ACM 竞赛如果能拿到一些奖项。在找工作的时候会非常有优势,基本上大厂小厂的 offer 可能会拿到手软。

    刷完 300 道 LeetCode 题后,我强到可以和面试官硬刚!纯正 Java 版
    ?

    二、C语言

    C语言是一门古老而常青的编程语言,具备现代程序设计的基础要求,它的语法是很多编程语言的基础,比如说 Java。C语言和 Java 常年霸占编程语言的前两名,都非常强。C语言学得好,对后续操作系统、编译原理,以及 Java 的学习都是很好的基石。

    这里给大家推荐一下浙大教授翁恺教授的 C语言程序设计,可以到 B 站上看,有弹幕,学起来很愉快。

    https://www.bilibili.com/video/BV19W411B7w1

    初学编程语言的阶段,强烈建议大家把视频上的代码都敲一遍。由于不像工作后,有大量的项目可以实践,所以不能得到及时的反馈,刻意练习就显得特别的重要。另外,一定要分门别类保存好自己的 demo,以便以后可以快速得找得到,尤其是一些小套路,会很有用,积累得多了,可能就变成了自己的工具库。

    三、计算机组成原理

    我前段时间看了一本书,名叫《计算机是如何跑起来的》,虽然在豆瓣上的评分不是特别高,但很适合作为一本了解计算机组成原理的入门书。

    它让我明白,计算机的组成是很“简单”的:

    • 输入、运算、输出是硬件的基础
    • 软件是数据和指令的集合
    • 计算机和人的思考方式不同,对计算机来说,什么都是数字

    抽象到底层,确实是这么回事。计算机是由 CPU、内存、显示器这些设备组成的硬件,但我们大学毕业后,往往从事的是软件方面的开发工作。那怎样才能在硬件和软件之间自由穿梭呢?答案就是学好计算机组成原理。弄明白了计算机的组成原理,也就对整个软件开发有了一个系统的认知,不论是计算机的硬件原理,还是软件架构,都能很好的驾驭,随之而来的,我们的职业发展机会也就更多了。计算机组成原理这门课完全可以用一个词来概括,就是“抽象”。在我看来这也是整个计算机设计中所蕴含的的灵魂。

    四、计算机操作系统

    为什么要学习操作系统呢?

    第一,面试要考;

    第二,无论学习哪门子编程语言,比如说 Java、C/C++,都需要和操作系统打交道,像 Java 中的多线程技术,其实是由操作系统来负责进程和线程管理的;

    第三,学习操作系统,还能学到内存分配方面的知识。

    既然说到计算机操作系统,这里很有必要给大家推荐一门计算机科学速成课,在 B 站上也有,它讲的内容非常适合所有计算机专业的学生过一遍,如果学弟学妹们还没有看过这门课,记得一定要刷一遍!我先把目录列一下:

    • 计算机早期历史
    • 电子计算机
    • 布尔逻辑
    • 二进制
    • 算术逻辑单元
    • 寄存器 & 内存
    • 中央处理器
    • 指令和程序
    • 高级 CPU 设计
    • 早期的编程方式
    • 编程语言发展史
    • 编程原理
    • 算法入门
    • 数据结构
    • 阿兰图灵(我最喜欢的一集)
    • 软件工程
    • 集成电路 & 摩尔定律
    • 操作系统
    • 内存 & 储存介质
    • 文件系统
    • 压缩
    • 命令行界面
    • 屏幕 & 2D 图形显示
    • 个人计算机革命
    • 图形用户界面
    • 3D 图形
    • 计算机网络
    • 互联网
    • 万维网
    • 计算机安全
    • 黑客 & 攻击
    • 加密
    • 机器学习 & 人工智能
    • 计算机视觉
    • 自然语言处理
    • 机器人
    • 计算机心理学
    • 天网 & 计算机的未来

    全部都是计算机专业需要掌握的基础知识,至少是应该了解的知识点。视频的制作非常精良,我相信大家看完后一定会大有所获。

    英文中字版的,观看起来毫无压力。我自己每天会刷一集。像二进制这一集,以前经常被二进制搞得晕头转向,刷了这集视频后,明显感觉对二进制没那么生疏了,仿佛一个陌生人坐在对面,喝了一杯酒后,就成了老熟人。

    https://www.bilibili.com/video/av21376839
    ?

    我看弹幕有人说,“第一次用 B 站看这么正经的东西。”好他喵的真实呀!我也是。

    然后是两本书,《深入理解计算机系统》和《鸟哥的Linux私房菜 基础学习》。

    在这里插入图片描述
    在这里插入图片描述

    《深入理解计算机系统》,按理说,这本书的名字应该叫《计算机系统导论》,有 C语言、数据结构的知识就可以学这本书了,想在毕业后去大厂的学弟学妹值得花时间去三刷一下这本书,注意是三刷,第一刷大致了解,第二刷精度,第三刷温习。可以说得上是程序员了解计算机系统的最佳书籍了,可以去 CSAPP 课程官网找 Lab 配合刷起来。

    《鸟哥的Linux私房菜 基础学习》,这是一本 Linux 方面的畅销书了,全面详细地介绍了 Linux 操作系统,如果要学习 Linux 的话,首选。生产环境下,几乎所有的服务都是在 Linux 环境或者类 Linux 环境下运行的,像 Linux 的基本命令:top、cp、mv、rm 等等命令都是必须得熟练到记忆到手指上的。

    五、计算机网络

    当今这个时代,没有网络简直无法生存,哪怕是在电梯里的一分钟,我都受不了那种手机没有网络的状态。我们所学的编程知识,如果脱离了网络,将变得毫无意义,因为没有哪个编程语言是要在单机环境下运行的。

    计算机网络课怎么学习,给大家推荐四本书,一门公开课。

    《网络是怎样连接的》,这本书从在浏览器中输入网址开始,一路追踪到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了网络设备和软件是如何工作的。
    在这里插入图片描述

    《TCP/IP 详解》,这是一本完整而详细的 TCP/IP 协议指南,基本上做通信的是人手一本。对于大多数程序员来说,了解这个 TCP/IP 对面试和编程也有很大的帮助。

    在这里插入图片描述

    《图解 HTTP》,HTTP协议是互联网的基石,学完后可以尝试实现一个属于自己的 HTTP 服务器了。
    在这里插入图片描述

    《计算机网络-自顶向下方法》,算是一本经典的大学教材了,
    在这里插入图片描述

    关于计算机网络这块,可以配合 B 站上的《计算机网络微课堂》一起来学习。

    https://www.bilibili.com/video/BV1c4411d7jb

    记住一点,我们学的是计算机科学,不是编程语言,不管你的主力编程语言是 Java、C++、Python,还是 Go,一定不能只停留在编程语言本身,像数据结构与算法、操作系统、计算机组成原理、计算机网络等方面的基础一定要打好!

    参加工作后,编程语言是会根据公司的需求进行切换的, 所以只有把我推荐的这五门课程的基础打牢,切换到任何一门编程语言你都是可以胜任的。

    最后,多 BB 几句,希望能给学弟学妹们一些参考。

    无论什么时候,一定要找到学习的目标,以及学习的套路。找不到的话,就只能事倍功半,付出了很多努力,却迟迟得不到最好的回报。学习的时候一定要把自己当成一台计算机,既有输入,也要有输出。只输入不输出会堵塞,只输入不输出会枯竭。

    这五门课程有些大学应该都会讲到,那么恭喜你,在这样的学校,你很幸运;如果哪一门没有,记得一定要在课余的时间补上。

    多看信息密度大、质量高的学习资料,像大学图书馆那些《21 天学会 XXX》的书就不要去浪费时间了,可以把精力花费到我推荐的这些课程上。

    多交流,多思考,刻意练习。像算法,基本上面试是必考的项目,不要产生厌恶的情绪,该刷还是要刷!你不刷,岗位可能就给别人了。推荐大家到 LeetCode 上刷题,如果觉得自己没有解题思路的话,可以看看下面这份刷题攻略。

    刷完 300 道 LeetCode 题后,我强到可以和面试官硬刚!纯正 Java 版

    最后,我再强调一下,一定要动手敲代码,做笔记,把自己没有理解的知识点总结下来,哪怕是画一些思维导图。有一句话很糙,伟大的牛逼之前总是傻逼式的坚持,但理是这么一个理的,学习计算机的过程中,你可能会遇到各种各样的困惑,重要的是,一定要坚持。

    我是二哥呀,如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。如果你有什么学习问题,可以在评论区留言,我看到的话会第一时间回复,学习路上一起手拉手,小步快跑~