最近不少读者咨询洋哥如何进大厂,回答的多了就想着要不整理出一个系列文章出来。说干就干,第一期先写写应届毕业和刚工作不久的计算机专业的童鞋如何进大厂。
先说说必须要做到的几件事:
第一,学校内的课程,计算机基础知识,如C语言,数据结构,计算机组成原理,计算机网络,计算机操作系统等这些基础专业知识一定要理解掌握,在校招中,这些内容必考。
第二,提升自己写代码的能力。不会配置环境,不会框架,就去找资料自学,B站,慕课很多免费视频课程。
第三,做项目。这里不是指学校做的项目,而是真正可以部署上线的项目。你可以去GitHub上找,也可以从学长学姐或者老师看是否有合适的项目,或者找一些大厂实习岗位。
第四,疯狂刷算法题。leetcode上的题目很多都可能在校招中被拿来当面试题,《剑指Offer》也挺不错,leetcode最起码刷个200,300道,然后把《剑指Offer》背一遍,基本没大问题了。
以上基础,如果读书期间没有打牢固,工作后也必须想办法拼命学习。
再说说我应届毕业加入腾讯的学习路线吧:
首先攻克C语言,这个没什么,谭浩强的《C语言程序设计》反复看,然后一行行在电脑上敲出来。
当时对计算机缺乏系统认识,最难理解的就是指针,书上说它是个变量地址,那么问题来了,什么是地址?一不小心,指针就让程序Crash了。直到读研的时候,看了大学教材:《计算机组成原理》这本书,我才明白指针背后的含义。
攻克完C语言之后,听师兄师姐说数据结构也是自学编程需要攻克的重难点。从数组到链表再到堆栈、二叉树、平衡二叉树、红黑树、B+/B-树,简直就像看天书。还记得二叉树的先序,中序,后序遍历就把我弄晕乎了。更别提后面的AVL树的删除以及B-树。
我应付看不懂的方式也很粗暴:做笔记,勾选出没看懂的部分,反复看。一遍不行看两遍三遍四遍,直到所有内容看懂为止,看懂后就上机,上到天昏地暗上到头晕脑胀。数据结构这本书,记得来来回回看了10多遍,上机100小时以上。
这之后开始系统的学习网络、C++、VC,还记得有一本非常厚的书:《C++ Primer》,可以说上面的每一个例子,都上机造过轮子。
随后开始啃《Effective C++》、《More Effective C++》、《C++程序设计原理》、《深度探索C++对象模型》、《STL源码剖析》、《计算机网络系统方法》、《TCP/IP详解》。
除了疯狂自学,毕业的压力也很重,但掌握的东西越多,你对未来就越笃定。
因为我的目标是毕业后做游戏开发,所以,主攻的三大方向很明确:Window C++开发、算法、网络编程,这些都是游戏编程所需要掌握的硬核技能。除了这些,大学期间我还开始疯狂刷题,当时我是在PKU ACM网站上刷的:
刷题和疯狂学习的过程是枯燥且伴随痛苦的,编译报各种不通过的时候让人无比抓狂,知识点学不会的时候会让你怀疑自己的智商。曾经看过的一部分书籍:
成长的过程,润物细无声,极难察觉。但那段枯燥痛苦的学习和刷题岁月让我未来的道路受益匪浅。毕业后,我也如愿拿到腾讯游戏的Offer,开启了职场生涯。
在我那个时代,线上资源并不丰富甚至是匮乏!今天各种论坛、公开课、学习资料非常丰富。最近指导师弟师妹应对秋招,我找了一些资料,这里也顺便读者们推荐下:
核心就是通过刻意练习的方法学习计算机基础课,主要要攻克三个方向(攻克了会让你如虎添翼):
一、操作系统
操作系统真的可以说是一个奇迹,它为我们做了非常厉害的事情,以至于我们根本感觉不到,只有通过学习它,我们才能深刻体会到它的美妙绝伦,甚至会被计算机大佬们的设计思想所震撼,有些设计思想实际上也是可以应用于我们工作开发中。
操作系统有四大模块,分别是内存管理 (opens new window)、进程管理 (opens new window)、文件系统管理 (opens new window)、输入输出设备管理 (opens new window)。推荐大家按照这个顺序去学习操作系统。
尤其要首先学习内存管理,因为它不仅是最重要最难的模块,同时他和其他模块的关联性也最多。搞定内存管理,就是把操作系统攻克了一大半。
另外美国有很多优秀的操作系统公开课,比如mit6.828、哈弗OS/161,这些都可以系统学习下。
这类课程都会给你提供一个mini os壳程序,相当于一个核心组件,剩下的你可以自由发挥。比如你可以设计线程管理、文件系统等等。
相比只是看操作系统的书籍,这种学习方法的效率简直高100倍!
下面是课程官网:
https://pdos.csail.mit.edu/6.828/2018/schedule.html
国内也有一些顶尖高校也是采取类似的方式,比如清华ucore基于 Linux 0.11魔改版本:
https://github.com/hoverwinter/HIT-OSLab
二、数据库
国内说数据库就是mysql,这点要相信我!
首先概览下mysql的知识体系:
基础:
- sql语句
- 表结构设计
调优:
- 索引、慢查询优化
- 配置参数调优
核心原理:
- InnoDb存储引擎 (包括隔离级别、事务、锁、缓存池、回滚日志等等)
- Mysqld (包括连接管理、进程管理、查询缓存、查询优化、日志等等)
架构与运维:
- 用户与权限、安全
- 备份与恢复
- 日志
- 分布式与高可用
对于零基础的同学:
首先,学习基本的SQL语法。完成这个后,你就可以编写SQL语句了。这一步推荐:W3Schools的 SQL 教程。
其次,学习数据库的主要功能和使用方法,比如用户相关或者权限相关等等。
推荐两本书:
1.《MySQL必知必会》这本书讲的非常全,从基本概念,到查询到插入新建表,用户的管理,都有具体的例子,非常适合没有任何基础的同学来学习Mysql。
这本书学习的方法是:1、十分钟了解下数据库的基本概念 2、找到练手的数据库 3、对照着上面的内容去敲。本书里也有大量的内容是讲sql的,可以结合w3c的sql教程一起,有取舍地看。
2.《数据库系统概念》这本书是很多数据库运维必看的,非常赞,看完这些并且实践+思考之后,可以算入门了。
接下来对于希望成长为数据库大拿的童鞋:
推荐四本书:《高性能MySQL(第3版)》、 《MySQL技术内幕(第4版)》,《MySQL技术内幕 InnoDB存储引擎》,《深入理解MySQL》。
三、计算机网络
网络知识在工作中非常非常重要!
我分三个阶段来介绍:
- 入门
第一本书 建议看谢希仁的《计算机网络基础》
2.进阶
然后第二本要看 《TCP/IP详解1:协议》,这个阶段需要多思考和动手网络在LINUX系统上发挥的最淋漓尽致,所以在学习的时候最好学习LINUX配合使用,学习LINUX,推荐《鸟哥的LINUX私房菜:基础篇》。
学习网络过程中,要不断抓包分析等,自己能写些简单的应用来发包更是完美。抓包工具推荐:LINUX环境下用TCPDUMP,windows环境下用 wireshark。这个阶段写习完后,已经是个小高手了。
主要技能应该是 :对TCP,IP,DNS,icmp等协议应该都蛮熟了得了,dhcp/tftp/ftp等协议也应该都懂些,重点是要学会如何分析一个协议及LINUX系统的基本操作也差不多了。
3.高手阶段
这个阶段需要有一点的编程能力,指C/C++编程。主要学习的方向是协议的实现和协议的架构原理。
协议的实现方面, 主要学习底层协议(指传输层及以下)的实现, 这些协议都是在操作系统层面实现的,最好的教材是《TCP/IP详解:实现》。至于网络架构这块,可以学习《计算机网络》这本书。
另外,计算机专业多刷算法题好处多多,算法厉害的人进大厂非常容易,这里推荐一本BAT大佬的算法笔记:尼玛!BAT大佬的刷题笔记太经典!(文末送书) (opens new window)。
今天就写这么多,下一篇谈谈社招如何进大厂,敬请期待~