开云体育 开云官网开云体育 开云官网开云体育 开云官网开云 开云体育开云 开云体育开云 开云体育我之前里的文章,写的大部分都是与计算机基础知识相关的,这些基础知识,就像我们的内功,如果在未来想要走的更远,这些内功是必须要修炼的。框架千变万化,而这些通用的底层知识,却是几乎不变的,了解了这些知识,可以帮助我们更快着学习一门知识,更加懂得计算机的运行机制。当然,在面试中也经常会被问到,特别是对于应届生,对于春秋招,也可以看看我前阵子写过的文章历经两个月,我的秋招之路结束了!。也有读者经常问的计算机基础知识究竟是指啥?学习顺序?推荐书籍?
当然,以下是我个人的一些经验,并且学过的一些知识,仅供参考,也欢迎大家进行补充
在我们用的程序中,99% 都离不开网络,作为一个程序员,我觉得了解计算机网络是必须的,在大学的课程中,一般也都会开设这一门课。
在我学习这门课之前,我就特别好奇,一台电脑是怎么把消息发给另外一台电脑的呢?例如:
2、世界上的电脑那么多,咋就能找到那台特点的电脑呢?有人说我们可以 MAC 或者 IP 来唯一标识啊,可是,我就有点疑惑了,世界那么大,电脑那么多,有了这个标识,我们该怎么找到他呢?遍历所有电脑?
3、多个程序同时发消息给一台电脑,电脑是如何准确把这些消息拿给这些不同程序的呢?
总之,一大堆疑问,看了计算机网络之后,才豁然开朗。自己也写了一篇评价不错的文章:一文读懂一台计算机是如何把数据发送给另一台计算机的
所以这里,我是强烈建议大家学一下的,在面试中,计算机网络也是高频考点,这里我大致总结一下一些必学协议以及面试高频考点:
1、http协议,包括:封装格式,常见响应码,不同版本的区别,常见请求方法,存在哪些安全隐患,啥是无状态协议等。
2、https协议:http 是明文传输,https 是加密安全的,需要知道 https 是如何加密的、数字证书如何形成,啥的对称加密、非对称加密。
3、TCP协议:三次握手、四次挥手、如何保证可靠传输、流量控制、拥塞控制。
操作系统也是一门非常重要的知识,在面试中也是问的非常多(当然,看公司,有些公司技术栈是 Java 的,可能问的比较少)。对于操作系统,要学的也挺多,例如:
啥是进程,啥是线程,他们的本质区别?我们运行一个程序时,数据放在哪里?代码放在哪里?咋就还要分堆和栈?线程切换时是上下文是啥意思?
虚拟地址是什么鬼东西?线程需要那么多种状态干啥子?什么是乐观锁、悲观锁?死锁是怎么造成的?解决死锁的策略有哪些?等等
有人说学操作系统太他妈枯燥了,确实挺枯燥,不过说实话,我还是学的挺有意思的,感觉可以学到很多种策略,一种比一种好,每次看完都是:我去,咋我就想不到呢。我觉得,对于前期,我们需要多参考别人的策略,看多了,有了一定的基础,慢慢形成自己的策略,总之,看这些书,不单要掌握这些知识点,更重要的是一种思维逻辑的提升
1、进程的通信方式(我写过一篇很不错的文章:记一次面试:进程之间究竟有哪些通信方式? ---- 告别死记硬背)
3、内存管理,包括:虚拟内存(重点)、分页、分段、分页系统地址映射、内存置换算法(重点)。
上面说的这些,我认为是比较重要的,如果你没学过,我相信学了之后,你可以学到很多东西,知识点只是其中之一。
推荐书籍:我看过的书籍是《操作系统—精髓与设计原理(第八版)》,不过我推荐《现代操作系统)》,我看过目录,感觉还不错,这里也推荐这一本。不过对于零基础的,我建议可以先看一本专门给小白看的书:《程序是如何跑起来的》。
在大学的课程里,一般都会开设一门数据库的课程,不过这门数据库是没有针对某一种数据库语言的(例如 MySQL、Oracle)。不过我这里只讲 MySQL的学习,别问为什么,问就是我逃了二十分之十九的课。
把MySQL学好,还是特别重要的,千万不能停留在会用的层面上,而是应该要了解一下原理,特别是对于要面试的同学,会问挺多原理,我每次被问到 MySQL 我都会信心大增,因为我虽然不大好写 SQL,但是,知道挺多原理,记得腾讯、shopee面试时,面完 MySQL,面试官好像对我刮目相看了。好了,不吹了,说这些也是强大 MySQL 的重要性。下面就说我学过的一些知识以及推荐的学习资料吧。
2、索引是如何实现的?多种引擎的实现区别?聚族索引,非聚族索引,二级索引,唯一索引、最左匹配原则等等(非常重要)
3、事务相关:例如事务的隔离是如何实现的?事务是如何保证原子性?不同的事务看到的数据怎么就不一样了?难道每个事务都拷贝一份视图?MVCC 的实现原理(重要)等等。
4、各种锁相关,例如表锁,行锁,间隙锁,共享锁,排他锁。这些锁的出现主要是用来解决哪些问题?(重要)
5、日志相关:redolog,binlog,undolog,这些日志的实现原理,为了解决怎么问题?日志也是非常重要的吧,面试也问的挺多。
我觉得,只要你了解了以上的原理,那么对数据库调优的帮助是非常大的,上面除了第六点,其他五点,在应届生的面试中,极其高频。
推荐书籍:连 sql 都不会写的,推荐《SQL必知必会》,接着推荐《MySQL技术内幕:InnoDB存储引擎》。
特别是优先队列,再刷题的时候,还是经常用到的,队列与栈,是最基本的数据结构,必学。
书籍推荐:《数据结构与算法分析:c语言描述版》、《算法第四版》、《啊哈算法》。
我觉得,如何有时间,学习下汇编是必须的,学习了汇编,能够更好着帮助我们知道计算机是如何处理程序代码的,例如寄存器和内存是如何使用的?循环、函数调用、数组是如何实现的?地址是怎么一回事?等等。
很多二进制代码是可以反编译成汇编的,如何你会汇编,那么可以帮助我们更好着去理解一些东西。所以这里建议大家学习下汇编,并且要动手写一些程序。
对于汇编的资料,我可能没啥好推荐的,自己看的不多。看过两本书,对于入门的,我建议看 王爽的那本书《汇编语言(第三版)》,不过这本只适合入门,如果想继续,可以看《汇编程序设计》。
说实话,编译原理还挺难,反正我觉得很难,不过有时间我觉得可以学学,学了这个你可以知道我们的编译器如何分析我们的代码的,例如词法分析,语法分析,语义分析等等。当然,你未来可能会自己写个特定分析代码的编译器也不一定,这个时候,就更加需要学了。
对于学习的资料,我觉得可以看视频 + 书。视频的话中国 mooc 大学搜索即可,书的话,说时候,我也看的不多,只看过学校指定的教材,所以这里给不了多少建议,自己当当自行搜索,哪本热门卖哪本勒。
暂时先介绍这么多吧,说实话,学了这些,不单单是多学了一门知识,更重要的是可以提升你的罗辑思维,给你带来更多的 idea。在之后我的公众号里,我也是主要写计算机基础 + 算法。而这些,是值得每一个程序员去学习的,无论你是什么岗位。而且知识知识学了之后,你去学习其他知识,我相信可以上手的更快滴。
数据结构与算法(如字符串、数组、链表、树、图、查找、排序、归并、动态规划等)
数学基础(微积分、线性代数、概率论、离散数学,高阶一点还有数值计算、优化等)
数据库(主要是关系型数据库比如MySQL、SQLServer、Oracle及其原理)
计算机网络(OSI七层协议、TCP/UDP、路由选择、各种应用层协议等)
GitHub上找了中科大和浙大的计算机课程体系,有书籍、课件、答案什么的,如果时间够得话可以跟着这个慢慢啃:
首先学一门自己感兴趣的编程语言,建议从Python入手,最适合入门。可以看书,或者找一找在线的视频教程,但是习题一定要独立完成,敲一行代码胜过读十本书!(PS: 国外大学一般选择Python作为第一门编程语言,而国内很多学校会选择C语言,各有利弊);
学习基本的数据结构和算法,可以看书也可以看视频教程,不过这门课比较难,所以看视频教程结合书来看会更容易理解;多练习算法题,可以是书后面的习题,也可以是LeetCode这种在线题库;
看操作系统和计算机网络,基础知识要比较扎实,因为走上工业界开发尤其是互联网开发或者中间件系统开发这些知识很重要;
如果对底层的东西不感兴趣的话计算机组成原理、汇编语言、编译原理可选跳过,但是建议有时间的话也看一看;
学习数据库,建议从MySQL入手,其他的数据库可以跳过,将来用到再学不迟;关键是要搞懂SQL的方方面面;
学习软件工程、设计模式,尝试做一些规模稍大一点的项目,最好融入一个大规模系统的常用组件比如(网络通信、数据库、分布式中间件等);
恭喜,你入门了!剩下的就自己摸索吧,找个不错的工作,在工业界一边工作积攒经验一边继续学习~
这是七个大的方向,这七个大方向下包罗万象,无论是深度学习计算机知识还是毕业后找工作,都非常重要。
作为一个CS专业毕业,应届拿到腾讯Offer的师兄再多说几句:这七个方向,至关重要,学好了真的是互联网横着走。尤其是数据结构和算法,先不说对工作中的帮助,就拿找工作来说大厂无论是应届面试还是社招(P7及以下)都是必考题,甚至不少面试官会要求你手写算法。
另外,程序员要想进大厂先从刷算法做起是个好方法,算法厉害的人进大厂非常容易,这里送一本阿里P8撰写的算法刷题笔记,身边不少朋友通过它加入大厂:
C语言最难懂的是指针,希望你在这个暑假彻底征服它。书上说它是个变量地址,那么问题来了,什么是地址?一不小心,指针就让程序Crash了。
其实C语言入门教程非常多,各种各样的都有,还是那句老话,新手入门学习,系统性学习最为重要,因此总结网络上的一些免费的、系统的、我认为比较好的C语言入门课程,希望对于新手入门有所帮助。
教程+在线开发环境的方式,教程文档详细的讲解C语言基础知识,在线开发环境和本地一样,可以随时动手跟着教程操作,动手学习的方式非常适合入门初学者。
纯在线文字教程,讲解的不是那么详细,不过简单易懂,适合入门初学者学习,看完后可对C语言有个大概的认知。
教程+环境,讲解的比较细致,也很简单易懂,跟着教程可傻瓜式操作学习,适合入门新手。
再说说这个“环境”和实验楼环境的区别吧:这个“环境”和实验楼的环境还真不一样,实验楼是一个操作系统,而这个是一个在线的编辑器,差别的话自己去看吧,只说一点:实验楼可干的事情,慕课网的“环境”不一定可以。
另外我把大学和工作中用的经典电子书库(包含数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关)、面试找工作的资料汇总都打包放在这了,这套资源是伴随我从学生一路成长为腾讯高级开发工程师,360技术经理、360技术总监的打包全套,非常宝贵!点击下方链接直达获取:
另外,程序员要想进大厂先从刷算法做起是个好方法,算法厉害的人进大厂非常容易,这里送一本阿里P8撰写的算法刷题笔记,身边不少朋友通过它加入大厂:
数据结构的重要性相信不需要强调了,不仅是工作后必备的技能,如果未来要参加研究生考试也是必考科目和拉分项。
这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。虽然这本书有400多页,但是花两天时间读完,应该是没问题的。如果你之前完全不懂数据结构和算法,可以先从这本书看起。
这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。
他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。
操作系统是计算机的基础,复杂的计算机操作因为它而变得简单。作为计算机专业的学生,不深入了解它怎么行呢?
美国有很多优秀的操作系统公开课,比如mit6.828、哈弗OS/161。这类课程都会给你提供一个mini os壳程序,相当于一个核心组件,剩下的你可以自由发挥。比如你可以设计线程管理、文件系统等等。
国内也有一些顶尖高校也是采取类似的方式,比如清华ucore基于 Linux 0.11魔改版本
另外我把大学和工作中用的经典电子书库(包含数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了,这套资源是伴随我从学生一路成长为腾讯高级开发工程师,360技术经理、360技术总监、中小公司CTO的打包全套,非常宝贵!点击下方链接直达获取:
如果你要入门 HTTP,首先最好书籍就是《图解 HTTP》了,作者真的做到完完全全的「图解」,书籍不厚,相信优秀的你,几天就可以看完了。
如果要入门 TCP/IP 网络模型,强烈推荐的是《图解 TCP/IP》,这本书也是以大量的图文来介绍了 TCP/IP 网络模式的每一层,但是这个书籍的顺序不是从「应用层 — 物理层」,而是从「物理层 - 应用层」顺序开始讲的,这一点我觉得不太好,这样一上来就把最枯燥的部分讲了,很容易就被劝退了,所以我建议先跳过前面几个章节,先看网络层和传输层的章节,然后再回头看前面的这几个章节。
另外,你想了解网络是怎么传输,那我推荐《网络是怎样连接的》,这本书相对比较全面的把访问一个网页的发生的过程讲解了一遍,其中关于电信等运营商是怎么传输的,这部分你可以跳过,当然你感兴趣也可以看,只是我觉得没必要看。
如果你觉得书籍过于枯燥,你可以结合 B 站《计算机网络微课堂》视频一起学习,这个视频是湖南科技大学老师制作的,PPT 的动图是我见过做的最用心的了,一看就懂的佳作。
这本书讲的非常全,从基本概念,到查询到插入新建表,用户的管理,都有具体的例子,非常适合没有任何基础的同学来学习Mysql,总之这本书学习的方法就是:
3、对照着上面的内容去敲。本书里也有大量的内容是讲sql的,可以结合w3c的sql教程一起,有取舍地看。
我推荐几本书(很多大神都这么推荐),《高性能MySQL(第3版)》、 《MySQL技术内幕(第4版)》,《MySQL技术内幕 InnoDB存储引擎》,《深入理解MySQL》还有Mysql的官网。读完这些东西,再加些丰富的经验,理论上来讲就具备DBA的水平了。
一是从程序设计者的角度所见的系统结构,它是研究计算机体系的概念性结构和功能特性,关系到软件设计的特性;
二是从硬件设计者的角度所见的系统结构,实际上是计算机体系的组成或实现(参见计算机组织),主要着眼于性能价格比的合理性。
亚当(Adam)等人为了说明和研究从程序设计角度所看到的计算机的属性(外特性),在1964年最先提出计算机系统结构的概念。
这本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。
全书共 12 章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级 I/O、网络编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。本书适合那些想要写出更快、更可靠程序的程序员阅读。
《哈工大的计算机系统结构视频教程54课》计算机系统结构01(优酷上面非常全);
这本BAT大佬的算法笔记,是一位阿里技术专家刷leetcode整理出来的,再次推荐:
基础知识是指不管从事任何方向的软件工程师都应该掌握的,比如数据结构、算法、操作系统。
特定领域知识就是你从事某个细分方向时需要掌握的知识,比如做游戏引擎的需要掌握图形学;做前端的需要掌握浏览器渲染原理、前端三大件;算法工程师需要更多的数学知识。
毕竟计算机各种门类挺多的,需要选个细分方向专研下去,什么都学只会什么都不精(大佬除外啦。
现在大环境比较浮躁,很少有人愿意花心思在基础上,喜欢直接学 Python 搞机器学习、写秒、做商城。
但是作为优秀的计算机系学生的你怎么能流于各种编程框架(造框架除外),纠结学 SpringBoot 还是 SSH 呢?
况且在计算机领域,很多基础的理论并不十分高深,我们努努力就可以掌握其中的核心知识。
在这顺便送大家一份自己整理的电子书库,绝不是在网上那种打包下载的,而是自己需要学到某个方向知识的时候,需要看了,去网上挨个找的,最后汇总而成。
我整理的这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统:
多看国外CS名校的一些开放课程,毕竟现在MOOC、Udemy、B站上学习的资源都是很丰富的。
唯一要做的就是筛选一些比较好的课程进行学习,在这里我主要推荐一些国外的计算机课程,他们很明显的一个特征就是注重实践。
一门课,除了理论以外,还会有配套的Lab、assignment,而且这些老师设计lab都很用心的,看视频/书 + 做lab,这应该算计算机科班同学一个比较好的学习方式了,有理论也有实践。
C语言程序设计CAP-大学先修课虽然叫先修课,但是覆盖了C语言的主要知识点,也适合大一新生~
学了之后可以去 leetcode刷题 练习。和CS61B当然也非常好,还有Coursera上的Princeton的课程。Stanford和UIUC也都有很好的进阶算法课程。操作系统推荐:
计算机网络:Stanford的CS144,lab 很有意思当然推荐一波书籍自学的入门到进阶书籍:
因为他们老师很多真的是在用心设计实验,比如我做过一个计算机网络的实验,就是老师通过tcp socket 模拟一个物理层链路,然后每个同学只需要用socket连接上那个端口,就可以自己设计可靠传输协议了,因为数据包通过那个链路的时候,你是可以通过web控制台,动态调整丢包率的,总之就是很好玩,也很有意思。列举几个我做过的Lab吧:一、模拟实现 TCP 可靠传输的这个就更硬核了,人家老外老师就是给力,直接做了一个网站,这个网站你可以通过 TCP 连接上去,然后你需要运行几个节点,互相发消息,他们之间的消息都会经过老师的网站,所以通过网站上是可以控制丢包率的,也能控制节点的拓扑结构,要求就是让你基于这种不可靠的信道,做出可靠数据传输!这简直就是翻版 TCP 嘛,超时重传、ACK、滑动窗口啥的都给我上!就是像下面图中一样,圆圈就表示你可达的范围,不同节点形成各种网络拓扑,可以调节网络 丢包率 Loss chance。
二、简单文件系统这个玩意挺有意思的,就是要让你自己去设计一个文件系统,比如文件、数据块、目录等等,而且你要提供创建、读写、删除、随机读、随机写等等接口,然后通过 Linux 的 VFS(虚拟文件系统) 机制挂载到 Linux 内核中,然后就可以用系统调用 open、read、write 这些来在你的文件系统上进行读写。VFS 是Linux一个机制,它规定了 IO 接口,然后你去实现这些接口,你就可以挂载在上面。通过这个东西我深入的学习和了解了文件系统,报酬也是非常值的。
三、简单SVC就是版本管理系统,类似 SVN 和 GIT的,但是相对 GIT 做了很多简化,核心的就是创建分支、分支合并、回滚、commit 这些,通过这个我又去详细了解了 GIT 的实现原理,并且自己写了一个简单版本的 GIT,受益匪浅,也赚到了几千大洋。
四、操作系统的锁实现这个就是让你基于硬件的原子指令 xchg、cmpxchg 这些实现一个锁,这个需要内联汇编、汇编等知识,简直是硬核!!!做完这个也解开了我对锁实现的一些疑惑。
五、Web Proxy这个就更有意思了,要求用 C++ 写一个代理服务器,类似 Nginx 的代理功能,当然,相比 Nginx 弱鸡很多,但是麻雀虽小,五张俱全,而且老外最有意思的是要求代理服务器对一些图片和 HTML 恶作剧,就是代理服务器随机的在原始服务器,返回的响应里 插入一些图片和文字,因为那天是愚人节。。。 不得不说老外还是很有趣的。
学海无涯,前路漫漫,希望能帮到正在看这个回答的你~ 记得帮我@编程指北点个赞哟
来同学,你要是想知道计算机基础学什么,你来先看一下字节跳动面试考了什么?
其实对于计算机专业同学互联网校园招聘其实考察的基础内容并没有高深到太多深不可测,但是我今年才从知乎上知道无数计算机专业的同学,都大三下学期了,研二了,都不知道互联网校园招聘的事情。
这是非常经典的大学操作系统教材了。如果你是刚刚学计算机的小白,还不知道操作系统是什么,可以先用一些国内的大学教材先来阅读一下,入一个门,先对操作系统有一个概念。
这本书从使用的角度更加深入的讲解了unix系统的若干特性,其中第7章到第13章都是要重点掌握学习的。
计算机网络相关知识的在互联网校园招聘技术岗位的考察中可以说是重中之重。像ip, tcp/udp,http相关协议的都是高频考点。
同时无论你想要求职任何技术岗位,web前端、后端、客户端、游戏相关技术岗位。。。在你日后的工作中网络都是日常天天与之打交道的,其重要程度可想而知。
嘿嘿想必很多同学对这本书非常熟悉,就是许多学校的大学计算机网络课程的教材。国内的教材内容深度不够,但是比较适合小白同学入门学习了解。
由于网络涉及到的很多协议学习起来非常的枯燥,这两本图解的书籍简直对想要学习的同学们来说简直是太棒啦!以图解漫画的方式,详解的tcp/ip、http网络协议,非常生动有趣。
这本书机械工业出版社的也可谓是计算机网络的经典书籍了,要比国内的教材更深,更全面一些,里面充实着大量的场景案例,但同时内容也过于深与杂,适合作为进阶学习书籍,不适合小白上来直接看。
在过去的二十年里,互联网已经从一种研究好奇心发展成为我们每天都依赖的东西。 它已经能够承受快速增长并适应许多不可预见的应用。这个全球基础设施如何运作? 什么设计原则使它能够很好地扩展? 哪些设置使这些原则不充分,为什么? 我们如何才能让它在未来更好地运作? 这些是我们将在本课程中解决的一些问题。 这个是麻省大名鼎鼎的计算机网络课程:
这本书可以说是讲解redis的圣经了,个人认为所有的章节都需要阅读了解一下。当然对于应届生的面试,还是考察第一部分,第二部分基础的问题居多。
本课程依托数据库社区的主要阅读资料,向研究生介绍数据库系统的基础,重点介绍关系代数和数据模型、架构规范化、查询优化和事务。
计算机底层很多的基础知识,会帮助同学们对计算机整个体系结构有一个整体基础的认识。如果你是大一大二有很多空闲时间的同学,一定要去多阅读了解一些计算机底层相关知识。
如果你是大三快要找工作了的同学,如果你目标求职的岗位不是c++/Linux、基础架构等偏底层的岗位,可以这部分暂时放一下。如果你目标求职的岗位是前端,是java马上就要面试了,你还在看CSAPP就是有问题了。
项目课程,互联网校招面试题目,其中有很多某课上的优质课程是我曾经花了很多钱购买的,现如今猪学长也已经毕业啦,都分享出来直接分享给有需要的同学们。>
互联网大厂求职,技术方向等等问题,都可以在评论区给猪学长留言,或者关注我猪学长哈,猪学长不向同学们开通付费咨询!同时对字节跳动