时间如白驹过隙,我竟然已经是一名拥有 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 版
最后,我再强调一下,一定要动手敲代码,做笔记,把自己没有理解的知识点总结下来,哪怕是画一些思维导图。有一句话很糙,伟大的牛逼之前总是傻逼式的坚持,但理是这么一个理的,学习计算机的过程中,你可能会遇到各种各样的困惑,重要的是,一定要坚持。
我是二哥呀,如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。如果你有什么学习问题,可以在评论区留言,我看到的话会第一时间回复,学习路上一起手拉手,小步快跑~