博客文章头图

计算机学习真题和仓库

6249 字
13 分钟
GitHub

零、开始

如果是对计算机一无所知或者不确定自己是否能走编程这条道路,那么我推荐你花 10 个小时看看《计算机科学速成课》,这套课程是 Crash Course 旗下的计算机科学相关的视频,早期发布在 Youtube 上,整个系列课程高达 12 亿的播放量,令人开心的是,你可以在 B 站上免费观看,有汉化!

Crash Course 的这套计算机科学视频一共 40 集,基本上每集控制在 10 分钟左右,所以,只要不到 10 小时就可以粗略了解计算机科学这门学科,如果你是一个门外汉,相信我,通过这个短短的 10 个小时足以帮你打开计算机的大门。

你可能会不禁疑惑,十几分钟能学到啥?而事实上,Crash Course 的视频信息量很大,每一秒的时间都是精华,视频里面不仅有图像、视频资料、图表等,更有老师面授,老师的语速也是很快的,如果跟不上,建议 0.75 的速度进行观看。

如果你是小白,想了解一门学科,不妨通过该系列视频作为切入点;如果你是某学科学生,可以用该视频梳理总结课程的框架结构;如果你想拓宽知识,这个系列视频作为下饭菜也是十分合适的。

计算机考研的仓库推荐这两个:

1、csseky/cskaoyan

这个仓库总结了相当多计算机和软件工程专业的各个学校的考研初试真题,再也不用花高价从二道贩子那里购买资源。

2、CodePanda66/CSPostgraduate-408

这个仓库比较纯粹,记录了 CS 考研 408 专业课的一些真题资料、笔记、思维导图以及算法源码。

同时,考研前得认识到。计算机专业越来越卷。就拿算法来说,早几年,可以在面试的时候写出归并排序那算法面试环节就过了,现如今,不刷个几百道 LeetCode 都没底气踏进大厂的办公室。

所以,如果是在校大学生的话,强烈建议在校期间好好学习计算机基础知识。目前互联网公司技术岗招聘的时候主要考察两方面:

1、计算机基础,即计算机原理、网络、算法、数据结构等 2、专业技能知识

在校招和社招中,这两者的比例会有所调整,大致上可以这么说,校招寻找的是那些基础好的同学,他们具备更强的可塑性,方便培养成为公司的骨干中坚力量,所以关于计算机基础的考察是重点;而社招寻找的是那些能快速干活的同学,他们能尽快的熟悉项目,能给公司带来收益,所以关于专业技能知识的考察是重点。简单来说:

  • 校招:计算机基础(90%)+专业知识(10%)
  • 社招:计算机基础(20%)+专业知识(80%)

可以看出,无论是校招还是社招,计算机基础都是必考的内容,因为对于程序员来说,计算机基础就相当于是内功心法,而专业知识相当于外功,如果内功修炼的不扎实,那么很可能走火入魔,也就是基础不牢,地动山摇

所以互联网公司在招聘的时候,往往在一轮二轮面试中重点考察计算机基础,比如笔试考察算法、计算机网络,面试问一下操作系统的知识点,如果说计算机基础掌握的不够扎实,那么基本上就一轮游,除非你的简历和专业知识能力十分的出众,让面试官觉得你很优秀,否则后面的面试环节和你无缘,也就拿不到 Offer。

并且,计算机基础这个能力是伴随着程序员的整个职业生涯的,它并非像高考时学的化学、物理、地理知识,高考结束后迅速忘掉,在程序员的工作中,计算机基础内容时刻出现。

比如设计一个简单的用户接口,需要实现以下的功能:

1)获取用户基本信息接口 2)获取用户列表接口 3)用户分组管理接口……

如果让你设计数据库,应该怎么设计信息存储权限?

如何你熟练掌握了各种数据结构的特点的话,那自然而然想到使用 bitmap 来存储权限,相反,如果你计算机基础知识不扎实,可能需要花一周时间却写十几个糟糕的接口。

我们把权限划分成最小粒度之后,每一个 bit 都它的含义, 例如我们把权限划分为以下几种:

  • 获取你的头像、性别、昵称等基本用户信息
  • 以你的身份发布微博
  • 获取你的好友列表
  • 获取你的朋友圈信息

每勾选一个选项,就代表着这个权限被授权,为了保证可扩展性,我们使用一个 uint64 来保存这些 bit ,也就是说,我们一共可以划分 64 种细分权限,然后对这些权限进行组合。

例如,第一个 bit 如果设置了,那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息, 第二个 bit 如果设置了,就可以用你的身份发状态。

再者很多互联网大厂不喜欢培训出来的程序员,除了因为一些培训出身的程序员喜欢简历造假(一年工作经验伪造成三年工作经验),还有一个重要的原因就是他们的计算机基础几乎为零,只具备简单的 CURD 干活的能力,那么一旦业务中出现一些问题,他们很难站在更高的维度去发现问题、思考问题。

如果科班出身的计算机专业的大学生计算机基础都不扎实的话,那么是远远不如培训出身的程序员,最起码他们还具备干活的能力。

所以,在大学期间把绝大部分时间花在打好计算机基础上是很明确的一个选择。但计算机基础的确比较难学,如何学习呢?

我这里强烈推荐一种学习方式:视频课程 + 看书。

初学者可以先通过视频入门,知道你学的那些东西是什么、怎么用,细节和进阶通过书籍、源码、文章、项目去完成,并且第一遍视频快速过完,后面的视频边看边思考,不要抄代码,作业可以隔天再写;同时多去尝试,减少路径依赖,时不时和视频里面的正确方案对着干,看看会发生什么,以及怎么处理。

一、计算机组成原理

计算机组成原理介绍了计算机的基础知识,包括计算机的各子系统(运算器、存储器、控制器、外部设备和输入输出子系统等)的基本组成原理、设计方法、相互关系以及各子系统互相连接构成整机系统的技术。

书籍推荐

  • 《计算机是怎样跑起来的》
  • 《程序是怎样跑起来的》
  • 《网络是怎样连接的》

这三本书是一套书,把构成当前社会基本组成单元的计算机、程序和网络,用最通俗易懂的语言,讲的清清楚楚。

对于编程来说,兴趣最重要,没兴趣,给你推荐再多的经典书都是白搭,所以学习计算机组成原理最好从这套书入门。

然后就是下面这些经典书了。

  • 《Computer Organization》
  • 《计算机组成与设计:硬件 / 软件接口》
  • 《深入理解计算机系统》
  • 《计算机组成:结构化方法》
  • 《计算机体系结构:量化研究方法》

我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。

视频推荐

国外视频

国内视频

  • 清华大学刘卫东老师的 课程

  • 哈工大刘宏伟老师的课程

二、计算机操作系统

无论你学习什么编程语言,和都避免不了和操作系统打交道,比如你学习 Java,用到多线程技术,实际上操作系统才是负责管理进程和线程的;比如你学习到内存分配的知识,c++里可以直接分配一段内存,此时实际上是调用操作系统提供的API进行内存分配。

如果不懂操作系统,你在未来学习编程语言的高级特效,涉及到线程进程调度,内存分配,或者是学习Linux相关的知识时,都会一头雾水,所以,只有学会了操作系统,那么才能够更好地学习其他语言和技术。

基于此,计算机操作系统的知识点频繁出现在笔试环节。

书籍推荐

  • 《现代操作系统》

  • 《操作系统导论》

  • 《深入理解计算机系统》

  • 《自己动手写操作系统》

  • 《操作系统真象还原》

我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。

对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。

视频推荐

国外视频

国内视频

三、计算机编译原理

首先正视一个问题:编译原理并非随随便便就能入门的

换言之,需要准备一些基础知识在学习。

编译原理的学习和实践通常基于对计算机编译过程、计算机基本工作原理、甚至一定的数学知识有一定积累,这些知识分别分布并应用在了编译原理的不同阶段。没有这些基本知识的积累,很快就会在某个阶段由于功底不够而无法再继续后面的学习。

编译原理非常难,而且非常枯燥,需要要很强的功底才可以入门学习,所以,先认认真真的积累上述的一和二在入门学习吧。

书籍推荐

  • 《编译器设计-第二版》

  • 《编译原理》

视频推荐

国外视频

国内视频

四、计算机网络

计算机网络的相关知识在工作时使用的频率还是挺多的,毕竟,所谓的CURD工程师总是在处理 API 相关的业务。

学习计算机网络,你需要懂得Socket编程,知道TCP/IP网络模型,了解OSI七层网络架构,知道一个数据包是如何层层包装,再层层拆包,从客户端发送到服务端。

计算机网络应该是除操作系统与算法之外,另一个面试常考的方向。

书籍推荐

  • 《网络是怎么连接的》
  • 《计算机网络-自顶向下方法》
  • 《图解HTTP》

视频推荐

国外视频

国内视频

五、数据结构与算法

相信无论是已经毕业的同学还是正在学校学习的同学,都或多或少地被数据结构与算法这门课给折磨过。数据结构与算法这门课开篇就讲了一个非常重要的概念:程序 = 数据结构 + 算法,对于初学者可能还不能完全地理解这句话,不过对于已经工作两三年的同学相信对这句话是深信不疑的。

对于数据结构与算法的学习,我个人认为应该分层三个步骤:

  1. 首先先大致了解什么是算法,可以通过一些科普读物来入门,这个过程我称之为入门阶段
  2. 接着可以尝试实现一些比较容易的数据结构和算法,这样可以更加深对数据结构和算法的了解,这个过程我称之为实践阶段
  3. 最后去了解数据结构与算法背后的相关数学原理等,这个过程我称之为原理阶段。

具体的学习过程可以阅读我之前的一篇收藏破 8w 的回答:

程序员必须掌握哪些算法?2.7 万赞同 · 375 评论回答

书籍推荐

入门系列

所以,入门的同学,我建议你找一些比较容易看的书来看,比如**《大话数据结构》《算法图解》**。

《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。如果你之前完全不懂数据结构和算法,可以先从这本书看起。

《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。

作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。

基础系列

我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。

而且,这个作者也很用心。他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。

实战系列

大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。

《剑指 offer》这本书的目的非常明确,就是为了面试。这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。

《编程珠玑》这本书的豆瓣评分非常高,有 9 分。这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。

《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。

视频推荐

国外视频

  • Stanford: Algorithms,这门课由斯坦福大学计算机科学系教授Tim Roughgarden授课,适合至少掌握一种编程语言的编程学习者。斯坦福的课强调理论和概念上的理解。学完这门课后,对你今后面对技术面试时将会非常有利。

  • UCSD:数据结构与算法,Daniel M Kane、Pavel Pevzner等五位老师共同授课,这门课程的最大特点是理论和实践的结合,你将学习到解决各种计算问题的算法技巧,并实现大约100个算法编码问题。

  • Prin:Algorithms, Part I,Kevin Wayne和Robert Sedgewick共同授课,涵盖了有关算法和数据结构的基本信息,重点是Java实现的应用程序和科学性能分析。第一部分包括基本数据结构、排序和搜索算法。第二部分重点讨论了图形和字符串处理算法。

国内视频

如果你还是感觉学习算法很吃力,可以借助这几个网站来辅助学习。

六、附录

1、怎么学好数据结构,看下面这个回答,已经获得了 21000+ 的赞和 50000+的收藏。

怎么学好数据结构?2.3 万赞同 · 361 评论回答

2、如何系统地学习算法,看下面这个回答,已经获得了 11000+ 的赞和 26000+的收藏。

如何系统地学习算法?1.1 万赞同 · 97 评论回答

3、新手该如何使用 GitHub,看下面这个回答,如果在大学期间就知道使用 GitHub ,那么能力远超同龄人。

新手该如何使用 GitHub?8128 赞同 · 89 评论回答

4、想成为一名优秀的程序员,那么这些程序员平时都喜欢逛的论坛怎么说你也得收藏一些吧。

程序员们平时都喜欢逛什么论坛呢?4471 赞同 · 121 评论回答

5、无论别人怎么说,我都是坚定不移的选择计算机专业。

为什么有人劝别选计算机专业?4089 赞同 · 407 评论回答

6、如何系统地学习 C++ ,这个回答能帮你找到路线。

如何系统地学习 C++ 语言?3142 赞同 · 28 评论回答)

7、想要准备 Java 面试,那么这些面试题必须掌握。

Java 面试都只是背答案吗?969 赞同 · 14 评论回答)

作者:吴师兄学算法 链接:https://www.zhihu.com/question/379215729/answer/1962667941 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本站内容采用 CC BY-NC-SA 4.0 许可,请注明出处;商业转载请联系作者授权。