如何学好 Linux、C++,并搞定 BAT 面试 作者/分享人:天千

学好Linux运维需要做到以下几点



1、多做实验

 

实验环境完全可以通过VMware来模拟,模拟私有网络,模拟多台机器,要搞懂VMware提供的集中网络模式的工作原理(桥接网络、宿主机网络、NAT等),这对整个Linux后续的学习帮助都非常之大,还可以通过虚拟机模拟Grub损坏并进行修复、模拟忘记密码并通过单用户模式修改密码等等。

 

2、LNMP、DHCP、DNS、MySQL等等这些网络服务需要完全基于源码来编译

这样更加有体感,对于编译的参数要理解,因为通过yum安装的软件包都是上一个稳定版本,并不是最新稳定版本,还有另外一点就是编译安装可以通过编译参数对软件进行一定的优化。
 

3、Linux基础要扎实

底层原理要理解,典型的文件系统的组成inode和数据存放的位置Linux进程是如何调度的调度算法有哪些磁盘调度算法有哪些TCP/IP的三次握手和四次挥手的过程是如何的,网络中的数据是如何流向的(参考《构建高性能web站点》),iptables的三表五链Nginx的网络IO模型(这个很重要,你要能讲清楚为什么Nginx要比Apache好),马哥Linux对于这个部分的内容讲解是我最喜欢的,我强力推荐大家都去听一听马哥的视频。

 

4、英文文档的阅读能力

阅读各类开源软件的官方文档是必经之路,这个也是了解一个开源软件最快的捷径,如果你没有一定的英文阅读能力,那么你只能等到有人把这些文章翻译成中文后你才能学习到。

 

5、写博客

很多时候,看了视频和书后,如果你不能讲这些知识用你的语言表达出来,那么很大可能,你并没有真正的理解这些知识,通过写博客的方式会逼迫你回忆知识,然后总结出来,博客被大量人访问也会在一定程度上激励你,让你有一定的成就感,促使你把博客写的更好。

 

6、Shell脚本的要熟悉

运维这条路上脚本会帮我们省掉不少体力活,此外必须要学习一门编程语言Python、Golang等

 

 

 

C语言要学好必须理解三个概念


1、什么是指针?

指针和数组的关系。

 

2、程序分为哪几个段

能说清楚全局变量,局部变量,静态变量等分别属于哪个段,各个段的特点是什么?

 

3、C语言的编译和链的接过程

 

真心不推荐在Windows上来学习C语言,因为它屏蔽了太多的细节,而这些细节却又是C程序员不可或缺的一部分。C语言这个阶段过去后,我开始学习Linux C系统编程这个部分,最开始接触的一本书就是Unix/Linux编程实践教程强力推荐给大家,这本书会给你介绍如何通过man手册来帮助编程,如何去实现who、cat、ls、ps等系统命令。通过这本书的学习会让你对Linux上很多的原理有一个深刻的认识。

这本书学完后我就开始看UNP和APUE,其中APUE我并不推荐给大家,我推荐给大家的是《Linux/UNIX系统编程手册》这本书的内容更全面,更新。建议大家在看这些书的时候可以做详细的笔记和代码练习,在我的博客上就有我总结的文章。系统编程ok后,就要重点看UNP了,看这本书的时候要找重点看,里面有的章节已经过时了,还有一些章节对于我们目前来说用途并不大,比如STCP的部分。

 

 

对于这本书《Linux/UNIX系统编程手册》,重点有三个部分



1、各个socket API的对应到OS,做了哪些事情

比如connect后,做了哪些事情?,accept呢?,什么是RST报文?,什么是SIGPIPE,如何触发的?

2、网络IO模型,同步和异步,阻塞和非阻塞的概念

Linux上各种网络IO模型的优缺点对比,epoll、select、信号驱动IO等

3、服务器的网络编程模型,多线程、多进程、线程池等,各自优缺点

在我的博客上也有一篇文章介绍了相关的内容,学完这个后,剩下的就靠多实践和多读一些开源的项目来积累自己的经验了,这里推荐cjson、webbench、Tinyhttpd等,代码量都不大,很容易读懂,在读懂的基础上可以进行适当的改造和重写。

C语言和Linux系统编程这个部分结束后,就要开始踏入C++的世界了,自从C++11出来后,我觉得C++易学了,但是苦于现存的老的C++代码还是有很多,所以我们不得不去学习C++98相关的知识,这里我推荐《C++ primer》一书,注意是C++ primer,不是《C++ primer plus》

我看书的方法都比较老套,第一遍力求看懂,第二遍开始抄代码,练习,第三遍开始总结写博客所以这本书我前前后后看了大半年, 后面又看了C++编程思想上册,Effective C++、深度理解C++对象模型、Exceptional C++、深入理解C++11等经典书籍,看书的模式基本上都是二到三遍,通过抄书上的代码和写博客来加深记忆。看完这些书说真的,我觉得我的C++还只是一个小白,我真正蜕变要从读《Linux C++服务端编程》陈硕的这本书开始,通过这本书我觉得我的C++水平有了一个质的飞跃。

 

 

C++有以下几个要点(只是部分):

 

1、RAII

这个很重要,是C++的核心,很多学习了C++的人都不知道RAII

 

2、值语义和对象语义

这个决定了你如何写好一个C++类
 

3、对象的生命周期,类的生命周期要清晰
 

4、智能指针

现代C++编程几乎不太可能出现delete语句,内存泄漏的问题真的很少会出现



5、各种STL和C++的一些坑

比如迭代器遍历过程中如何删除元素、std::list的size接口的复杂度居然是O(N)(C++11已经修正)等等
 

6、善用std::bind和std::function
 

7、基于对象编程和面向对象编程的区别
 

8、移动语义很重要
 

9、Lambda的捕获表达式
 

10、搞清楚C++的三五法则
 

11、std::string的实现方式,是否是线程安全的
 

12、std::map和std::set的底层数据结构等
 

 

Effective Modern C++》,这本书我重点推荐给大家,在我的博客上也有全部的总结,这本书讲了很多C++11种的一些实现细节、坑以及建议。最后推荐一些linux内核相关的书籍和学习方法

深入理解Linux内核架构》《Linux环境编程 从应用到内核

重点找自己感兴趣的模块来看,比如我就对文件系统,通过内核模块来探索,不能只看代码不练习
网络上有很多从头开始编写一个内存文件系统的文章,在我的博客上也有一个系列讲解Linux内核模块编程入门的文章,通过编写Linux内核模块可以做很多有趣的事情,比如系统调用拦截、网络拦截、做安全审计等等,通过编写内核模块可以提高对Linux内核学习的兴趣。

 

 

 

在整个求职过程中,我做了以下几件事


1、刷leetcode的题目
从牛客网和google上搜集面试题,分门别类的进行整理,每天都回顾一下

 

2、拓宽自己的知识面,学习一些新的知识

比如当时流行的docker,更侧重学习其原理

 

3、加深自己对一些底层的OS知识的理解

比如epoll的原理、docker的cgroup机制和namespace机制的实现、文件系统VFS的实现、Linux信号、管道等的实现。

整理面试题和学习一些底层的OS知识对我整个面试过程中帮助很大,正常情况下如果你只学习Java或者C++是很难拿到阿里巴巴的Offer,阿里巴巴对应届生的知识面、知识的理解程度要求还是比较高的,在我的整个C++面试过程中,问的最多的就是IO复用、智能指针、内存泄漏的问题如何解决、如何排查Load高的问题、Linux内核相关的知识等,而这些问题对我来说早已得心应手,在搜集面试题的时候很多问题都是反复被提及到的,我只需要好好总结即可。

另外一点就是大家在准备面试题的时候不能只记一个结论,多问问为什么,举个例子,TCP/IP的三次握手和四次挥手的过程是什么样的,我们不光光要知道这个问题的结论,还要知道为什么是三次握手,四次挥手,为什么不是二次?当被问及到epoll、select的区别时,你应该从使用方法、可移植性、性能、优缺点、内核实现等多个方面分析和总结。而不是简简单单的就提及一个优缺点就完事了。 你擅长的地方你应该多多引导你的面试官去问。
 

 


 

工作心得



在公司实习了大约1年,今年七月份正式入职,在这整个过程中我也零散的做了很多小需求,对C++的理解更加深刻,尤其是对软件工程有了一个新的理解,在此我想分享给大家。

1、要有造*的能力,但是不要轻易的去造*

2、单元测试的重要性

通过单元测试也可以提高程序员的信心,为了更好的写单测,会逼迫我们将模块之间的耦合降到最低,这样可以方便单测。

3、写易读的、可维护的代码

4、Google的C++编程规范,每一条都值得细细品味

5、Chromium开源项目有很多值得我们借鉴的地方

6、画UML图是程序员的基本素质,要有好的设计,设计要做评审

7、CodeReview一定要有的

8、类名和变量名的易读性

可能对于很多人来说编码规范、CodeReview、UML、单测好像都是说说而已,我起初也是这么认为,感触并不是很深刻,直到我的同事开始带我的时候,我自己亲身去体验的时候才发现这其中奥妙无穷, 我们团队使用Chromium的base库作为自己的基础库,编码规范、全都follow Chromium,至于为什么不用boost,我的理由则是,boost是一个我无法驾驭的怪兽,而chromium的base库是我可以驾驭的,可以打组合拳,代码的稳定性已经经过上亿人的考验,值得我们信赖。推荐大家看看chromium的base库,源代码很易读。通过阅读它的代码可以学习到很多知识。推荐一本书给大家《C++ API设计》,讲解了很多软件工程、设计层面的知识。

 

 

 

总结



上面说了很多,更侧重分享了我的学习经历,和一些感悟,可能我说的比较简单,实际上理解上面这些东西,是存在一个过程的,是一个从量变到质变的过程,在整个过程中我理解到,学习要坚持,不是一蹴而就的,要经历量变到质变的过程。

 

 

上一篇:全闪存储进入NVMe时代,性能和弹性须并驾齐驱


下一篇:《大话数据结构》总结