一直有一些读者来问我要 学习经验。
我也很想写一个学习路线给大家,希望可以帮助到更多的小伙伴少走弯路。
之前一直没写的原因在于自己觉得自己懂得太少,还没成为一个大佬,还没成为一个精通某个领域的专家,怎么能教别人如何学习呢?
现在思维转变了,可能现在的自己还没办法分享自己成为一个极客大牛的学习经历。
但是可以分享自己从菜鸡到校招拿下几家大公司 Offer 的学习经验呀。
希望能帮助到一些零基础学习计算机,跨专业学计算机,正在找实习,正在校招的同学。
这个学习路线是具有 很强的可复制性 的。
只要大家能每天能抽出几个小时的时间专心学习、按时做笔记、写一定量的代码。
在校招中拿一个不错的 Offer,那是没什么问题滴~
制定一份学习路线(比如这篇文章~)
电脑(编写代码的基础环境搭建)
书(电子书和纸质书按照自己的喜好)
一个 固定自习 的地方(这个很重要)
计算机的学习成本算是很低的了,不像化学物理这些还需要特定的实验室才可以做实验。
学习资源和路线大多是开源和免费的。
所以,做就行了。
K&R 的《 C 程序设计语言》
《 C 和指针》
学习 C 语言的时候不要进入死角,去纠结 i++++、++i,掌握基本的循环、判断、函数后就可以多写一些课后练习题,然后重点学习内存、指针。
这里推荐翁凯老师的 C 语言课程。
发布在在大学 MOOC ,翁恺老师的讲述特别简单易懂,适合初学者。
这里是链接:
C 语言程序入门:
https://www.icourse163.org/course/0809ZJU007-9001
C 语言程序进阶:
https://www.icourse163.org/course/0809ZJU007B-200001
B 站也有翁凯老师的搬运视频 :
https://www.bilibili.com/video/BV19W411B7w1
英语好的同学可以直接看国外这个小哥哥的视频:
https://www.youtube.com/watch?v=Bz4MxDeEM6k
掌握了 C 语言之后,可以进一步学习 C++,现在很少有大厂还在用 C 开发的,基本都是 C++ 或者 Java 之类。
C++ 学习肯定是离不开那几本”四书五经“的:
《 C++ Primer 第5版》
《 Accelerated C++》
《 STL源码剖析(侯捷 著)》
《深度探索 C++ 对象模型(侯捷 译)》
《 Effective C++(侯捷 译)》
《 More Effective C++》
《 Effective Modern C++》
下面来详细的说下每本书。
《C++ Primer 第5版 》
Primer 系列应该是学习 C++ 必看的书了,第五版的 Primer C++ 基于C++11 来讲解。
非常全面地讲解了 C++ 的语法以及 C++11 的各种新特性。
这本书结合 C 语言来讲了很多 C++ 的特性,其中包括:
对象和类
继承,多态
重载
虚函数
异常
动态内存分配
输入输出和文件
...
不管是初学 C++的同学还是有一定基础的同学,都能在这本书中获益匪浅。
《Accelerated C++》
这本书系统的介绍了 C++ 程序设计,是美国斯坦福大学的经典教材。
从使用 C++ 标准库中的高级抽象开始,使我们能很快掌握编程方法。
每一章都有很经典独特的例子以及非常到位的讲解,覆盖了 C++很多领域的内容。
从标准库容器、泛型算法的使用,到类的设计、泛型算法的设计,本书都进行了详细的讲解。
《STL 源码剖析 》
这本书建议在有一定的 C++ 基础和代码实践之后开始阅读,源码之前,了无秘密。
看完之后会有恍然大悟的感觉,我就是在边看这本书的时候搭配着看侯捷老师的视频,当时的我就是
边学边觉得 C++ 好厉害哈哈,而且对这个语言越来越感兴趣。
( PS:B 站上侯捷老师的视频全部被下掉了,实在太可惜了,大家可以在我公众号后台回复「侯捷」获取整套视频。
《深度探索C++对象模型 》
说实话,学 C++ 有时候觉得很困惑的地方,就是在语法背后不知道编译器帮我们做了什么事情。
Object obj = new Object;
// ....
比如创建了一个对象,但是这个对象具有哪些东西?占用了多大的内存空间呢?
多态是怎么实现的呢?
诸如此类的问题。
而这本书就可以解答这些疑惑,我们会看到 C++ 中对象在内存中的布局,看到整个设计的演变过程,对 C++ 对象模型也会有更深的理解。
并且对对象模型的理解还可以推演到 Python、Java 之类的语言,几乎是大同小异。
这也是我为什么推荐学习一下 C++ 的原因啦~
《Effective C++》
推荐这本书的原因有两个:
第一,这本书是在教你如何写好 C++,相当于教你走”捷径“,如果不看这本书,可能需要大量的编码踩坑才会领悟到这本书中的一些 tips。
第二,这本书也有很多高频面试内容,如果不是有多年 C++ 开发经验,不太可能知道如何写出高效和安全的 C++ 代码。
所以这本书有时间一定要看。
《More Effective c++》
这本书和 《Effective C++》都出自梅耶尔大师之手,属于 Effective 三部曲之一。
继 Effective C++之后,Scott Meyers 于 1996 推出这本《More Effective C++(35个改善编程与设计的有效方法)》“续集”。
《Effective Modern C++》
这本书我还没有时间看,这本书的侧重点在于 Modern,也就是如何用好 C++ 11 中的一些新特性。
也是这个作者的经典之作,有时间值得一看~
学习顺序也是建议如下:
【基础】 《 C++ Primer 第5版》——>《 Accelerated C++》
【巩固】 《STL 源码剖析 》——> 《深度探索C++对象模型 》
【进阶】 《Effective C++》 ——> 《More Effective c++》——> 《Effective Modern C++》
建议在 B 站搜 C++ , 然后找个系统的视频跟着看,由于我没看过,所以这块就不推荐了。
排行在前面的视频应该质量都还是可以的。
看完基础的语法,对 C++ 有一定的基础,能够使用容器,做出一些小的代码案例之后,再学习侯捷老师的视频。
Tips:看视频的时候要记得结合实践和看书,不能养成太依赖视频的习惯。
推荐这个 C++ 游戏引擎开发小哥的视频,讲的非常深入浅出又不失趣味,他在 Youtube 上上传了很多的视频。
Youtube 链接:
https://www.youtube.com/watch?v=18c3MTX0PK0
B 站搬运链接:
https://www.bilibili.com/video/BV1VJ411M7WR
光学 C++ 语言肯定是不行的,计算机基础和数据结构也要一并学习。
书籍:
《大话数据结构》、《算法第四版》
这两本书对于小白算是比较友好的,但又不失全面性,所以为了避免劝退大家,就不推荐算法导论之类的书了。
不是很懂的地方多去谷歌搜一些优质博客辅助理解、学习。
看书不要图多,光是把一本书上面的代码全部实现一遍并且理解就已经需要很多的时间。
如果你能把任意一本啃下来,基本的校招面试我觉得都没什么问题,可以直接碾压很多同期竞争者。
学算法一定离不开大量的刷题练习,这里推荐大家结合 LeetCode 上的题目,边学习边刷题,效率还是很高的。
刷的时候可以按 tag 选择,一个一个主题的集中攻克。
比如二叉树、BFS、DFS等。
《剑指offer》
这本书建议必看,因为面试的很多都是上面的原题,所以,你们懂得。
这种感觉就是平时逃了很多的课,学的也不咋地,但是考试前老师给你划了重点,到底要不要重点攻关下这些重点。
图解 TCP/ IP 协议
图解 HTTP协议
TCP/IP 详解 原书第2版(卷1)
很多同学特别是非科班的学生在初学计算机网络的时候都很容易进入一个学习的误区,包括我自己。
就是去试着记住这些协议和模型。从而导致知识点是比较分散的,很难串接起来。
计算机网络的知识需要串联实际应用场景来学习。
举个例子来说,假设小神仙正在和小北在微信上是好友,
小神仙向小北发了一条消息,”你好“。
你能想象出这条”你好“的消息是怎么从小神仙的手机到达小北的手机的么?
你能清楚的明白这条消息是怎么被一层一层封装发送出去,再到对方手机一层一层的拆解的么?
《图解 TCP/ IP 协议》
这本书很适合初学者,比较详细的讲解了TCP/ IP 的基本知识。
介绍了 OSI 七层模型以及各自的作用。
TCP 那个章节建议多读几遍。完美的解答你对以下这些问题的疑惑:
为什么要三次握手?
为什么要四次挥手?
握手和挥手的时候做了什么?
TCP的流量控制是怎么实现的?
TCP的拥塞控制是怎么实现的
快重传和快恢复是什么?
其实以上这些都是一些策略,这些策略也是慢慢演变得完善的。
这些策略的本质就是为了提供高效和可靠的传输服务。
《图解 HTTP 协议》
小白可以通过本书快速了解并掌握
HTTP协议的基础、
什么是REST API、
如何实现自己的HTTP服务器、
当时我就是靠这本书入门了解HTTP的。
如果上面两本书你都能很好的吸收和掌握,并且能很好的和实际的场景联合起来。
其实校招的面试对你来说已经没什么问题了。
绝大部分人都是一个知识点还没掌握透就想要赶紧去学下一个知识点了。
这样的话不仅会很心慌,而且到最后会变成背面试题,靠这样记下来的知识可能过了校招不久之后就会忘记。
如果上面两本书对你来说已经很简单,那你可以系统的读一下《TCP/IP详解》。
鸟哥的 Linux 私房菜 第4版(用于了解 Linux 基本命令)
Linux 的基础命令是肯定需要了解的,这块的学习成本不会很高。
常见的比如
linux 查看端口占用
linux 查看 CPU 和内存使用
Linux 查看系统负载命令
Linux 调试程序
Linux 查看进程
Linux文本处理
Vim 文本编辑器的使用
cMake 和 makefile
Shell 脚本基本语法和使用
Linux 内核设计与实现(LKD)
深入理解 Linux 内核
佐罗老师的博客关于Linux内核讲的都非常的通俗易懂。是我见过写的最好的文章了。
链接在这里 https://zorrozou.github.io/
如果对这块感兴趣的话最好是不要错过这么好的资料了。
我们都知道,程序都是要在一定的环境下才能运行的。
比如,JAVA 程序就是跑在 JVM 上面的,如果你想成为一个优秀的 JAVA 程序员,就避免不了要去了解 JVM。
而 C 程序和 C++ 程序则是直接跑在我们的操作系统上的。
所以我们还必须要去了解操作系统的底层原理和系统编程。
比如:
进程基础
进程和线程
孤儿进程、僵尸进程和守护进程
进程间通信方式 signal、file、pipe、shm、sem、msg、socket
线程同步机制线程:互斥量、锁机制、条件变量、信号量、读写锁
推荐书籍
《UNIX环境高级编程》
《深入理解计算机系统》
为什么要学习网络编程?
互联网是一个趋势,用极低的成本将大家连接起来,大的互联网公司火的产品也
基本都是连接人与人的服务,比如微信,抖音。
而网络编程就是如何在程序中实现两台计算机的通信。
无论是在面试中,还是在工作中,掌握网络编程领域的知识都是一个非常重要的基本功。
网络编程对所有开发语言都是一样的。
GoLang、Python、 Java、C、C++ 都可以实现网络编程。
那为什么基于 C/C++ 语言学习网络编程是比较好的呢?
因为系统内核的 API 也是 C 语言的。
对于大多数从选择 JAVA 作为第一门语言开始学习的同学而言,网络通信这块的细节是被屏蔽的。
特别是使用了 SpringBoot 之后,只需要加几个注解就可以实现一个 Web 服务器,方便快捷么?
确实是的。
但是细节呢?
是被忽略的。
事实上,理论是基石,框架是将这种细节进行了封装并且提供接口给我们调用。
也可以理解为框架的出现是为了让大家更加专注于写业务代码。
学习网络编程就需要去了解以下的这些知识:
什么是 Socket 编程?
五大 IO 模型:阻塞 I/O、非阻塞 I/O、I/O 复用、信号驱动 I/O、异步 I/O
IO 复用机制
epoll 与 select / poll
LT 水平触发和 ET 边缘触发
Reactor 和 Proactor 模式
反向代理、负载均衡
推荐书籍:
《Unix网络编程》
《Linux多线程服务器端编程》
《深入理解Nginx》深入了解基于 C 的 web 服务器实现
学习完网络编程之后可以试着自己搭建一个自己的服务器。
项目:TinyHTTP 服务器
可以分为以下几个步骤来迭代自己的服务器。
搭建C/S:用C++搭建一个最简单的,基于socket网络编程的客户端和服务器
搭建 HTTP 服务器:将最开始搭建的服务器改为HTTP服务器
优化 HTTP 服务器:这块可以将 Select 模型,Poll,Epoll 都用下,顺带学习下各自的优缺点。
项目在 github 或者码云上搜索一下,相关的源代码是很多的。
我搜了一个最高 STAR 的供大家参考:
https://github.com/EZLippi/Tinyhttpd
要学习数据库,首先要学习基本的命令操作。
这个时候我推荐的书是《mysql必知必会》。
看完这本书配合练习之后应该可以解答一些简单的问题。
就是类似以下这种的:
将这个班的学生按平均成绩进行排序,显示总排名和各科排名。
查询这个班级里面喜欢小神仙的男生。 //哈哈
但是这个只是工具的使用,这个代表你学过并且简单了解这个东西。。。
现在的卷是从校招就开始了。。。所以面试官还会问你非常多底层的东西。
比如:
引擎
MySQL 引擎和 MyISAM、InnoDB 的区别
MyISAM 索引与 InnoDB 索引的区别
存储引擎的选择
索引
索引类型
索引的数据结构
创建索引的原则
什么是最左前缀原则 ?什么是最左匹配原则 ?
事务
数据库事务
ACID 原则
什么是脏读?幻读?不可重复读?
锁
隔离级别与锁的关系
MySQL 都有哪些锁呢
什么是死锁?怎么解决?
视图
存储过程与函数
光是了解 crud 的话,只能创建几张学生表玩一玩,所以我们还需要进阶的去学习 MySQL 的底层原理。
MySQL实战45讲
极客时间的这个是我蹭别人的账号看的 (穷 ,讲的真的很不错。
这个专栏讲的时候是结合一个具体实例 ,串一条主线,再开始讲的。
比如
一条 SQL 查询语句是如何执行的?
一条 SQL 更新语句是如何执行的?
下次执行一条 SQL 的时候,
你就很清楚的知道背后发生了什么。
高性能MySQL(第3版)
这本书也是讲底层原理和优化的,只是书本比较厚,涵盖的知识点也比较详细,建议大家按自己感兴趣的章节或者困惑的章节选择性阅读。
《大话设计模式》
这本书用问答的方式结合图文来讲解设计模式,对小白来说是非常友好的。
对于大部分的应届生而言,面试官对设计模式方面的知识不会有太高的预期。
但是大家还是需要了解设计模式是什么,设计模式解决什么问题。
常见的几种设计模式,单例模式,工厂模式,建造者模式要能回答上来,能手写代码那更是加分项了。
不管是找实习还是校招的正式工作,简历 和 面试 都是很重要的一环。
大公司的HR平均看一份简历的时间远远低于10秒,平均下来3秒左右就能宣判一份简历被淘汰。
所以一份好的简历很重要。
一份好的简历总体可以分为以下几个板块:
基本信息
个人简介
技能列表
工作经历
项目经验
教育背景
其他
不要写的太少。
不要出现排版这种低级的错误。
写简历的项目的时候最好是能参考一些原则,比如 STAR原则。
Situation 项目背景
Task 项目目标
Action 行动
说明在团队中做出了怎样的努力,充当了怎样的角色,发挥了什么样的作用,获得了什么成长。
Result 结果
说明最终取得了怎样的工作成果。
我把我当时校招的简历关键信息部分打了马赛克,可以生成PDF放到公众号后台了,回复【简历】可以下载我的简历,供大家参考使用,但是声明下,希望大家不要抄袭我的简历或者造假。
面试其实就是 【自我介绍 + 基础知识 + 项目 + 综合考察】。
电话面试和现场面试差不多,区别就在于电话面试不会叫你现场写代码。
但是可能会借助一些第三方平台来叫你现场写代码,比如牛客网。所以算法题什么的该练习的还是要练习。
刚开始找工作的时候,经常会产生沮丧感和对自己的怀疑。
面试失败
算法题答不出来
现场写代码调试不通过
错过面试电话
很容易就陷入找工作的失望之中,但是其实大家都是从这样一条很艰难的道路走过来的。
作为过来人,想和大家说下 心态 很重要。
每一场面完都要反思总结,看看哪里回答得不好。
如果是知识性不牢固的,就赶快恶补知识。
知道答案但表达得不好的,就重新组织表达方式,试着把这个知识点讲给别人听 (费曼学习法。
都回答上来的,也要反思下下次怎么样更加突出自己的亮点。
持续面试 和 不断反思 会是一个成长很快的过程,面试会倒逼着你去学习和输出。
相信你能坚持下来,就能拿到一个还不错的 offer ~
(上面这些书这些书籍也是在后台回复【书单】即可获取)。
最后啦~ 这篇文章是写给我的读者和观众的。
希望关注我的小伙伴2021年一定要开心哟~
希望大家都能找到不错的工作,能够保护自己爱的人!
如果读完觉得有收获的话,记得 点个赞 和 在看 吧。