面经

看到好几个同学说,问别人学习方法都是推荐了一大堆书,哪看的完…其实很多东西只有看书才能看得明白的也能看得更透彻,我几乎都是看书看源码,遇到一些很难的就google或者找视频看…因为如果所有东西都看别人讲(google看博客或者看视频),就可能遇到一个知识点不同的人不同的看法,然后自己就弄弄不明白还会被带歪然后就心情爆炸…所以我还是会推荐大家看书或者看源码,但是会讲重点哪些地方应该看哪些地方简单了解一下,这样对大家的时间还是能省一点的

 

大家一定要有明确的目标,知道自己该学些什么又有哪些东西学了对主线没有帮助的,目的明确一点真的很重要,我明知我是linux后台CPP,以前还花了很长时间去学习windows下的编程,虽然学习了一点东西,但是对我的发展并没有多大帮助而且真的很浪费时间,因为我把它当成主线来认真学习了…就算是这样,以后还是接触linux,windows用得少了也很快就会忘记,所以希望大家能好好权衡…

 

我很强调动手以及发散思维,发散思维比如说学到一个东西能很快联想到之前学过的另一个东西,以及遇到新的东西希望能够从更底层去猜测它的实现,要是等以后再接触到它的实现的时候,可以将具体实现与之前自己的猜测进行比较…动手是真的巨重要,我讨厌伸手党,也讨厌纸上谈兵,遇到问题我会尽量去用代码或者实现源码去解决问题,有时候跟踪程序的具体过程可能还要反汇编,有时候遇到很难很难的调试问题,比如说之前调试linux文件系统,我真的花了巨长巨长的时间,这个时候需要很强的耐心还有明确的目的,因为有时候调试着调试着突然忘记了自己想要干吗…

 

我从很早开始使用linux作为自己的日常工作环境,为了学习《Unix环境高级编程》,我几乎尝试了所有linux发行版还有其他unix系统(这些作为虚拟机部署),部署其实也是一件很有趣的事,也能让你更加深入的了解类unix系统…推荐大家使用linux作为自己的学习环境,而且还能克制自己玩大部分游戏…

 

ok,开始吧…

 

 

书单and重点

 

Cpp

《CPP Primer》重点是STL与类,模板编程与OO几乎都占了CPP的半壁江山。

 

1、CPP面向对象

《CPP Primer》这本书关于类的讲解还有《深度探索CPP对象模型》,然后这部分内容就差不多了。

 

2、拷贝控制

默认构造、值构造、拷贝构造、移动构造、拷贝复制、移动复制、析构)这些需要很熟练很熟练的了解,这其中初值列与隐含的析构列很重要

 

3、对象模型

简单继承、含有虚函数的继承、含有虚基类的继承)它们的内存布局需要很清楚

 

4、命名返回值优化顺便了解一下(见《深度探索CPP对象模型》),然后就能理解为什么有时候类实例的创建没有按照正确流程

 

5、模板编程

首先我推荐一定要把SGI STL库源码阅读一遍,就算源码没有看过,STL还是得会熟练的使用,重点在set/map、string/vector,要是能自己写一写就最好了,很喜欢侯捷先生的两句话:“源码之下,了无秘密”,“天下大事,必作于细”。

内存分配器、几个容器、几个容器适配器、几个范型算法,代码量大约在1~2w行左右,然后可以自己再实现更多的东西,例如可以再实现一些boost库中的东西、四个智能指针any、tuple之类的,然后能真正让你体会到模板元编程的乐趣…

 

6、模板编程

几个重要细节列出来:函数模板--显式实例化、特例化,类模板--显式实例化、全特化、局部特例化

模板容易出现的问题见《Effective CPP》条款43

学习处理模板化基类内的名称以及条款46:需要类型转换时请为模板定义非成员函数,可能会帮到你。

 

7、模板的链接错误了

提示没有找到指定的函数),其实就是没有模板实例化,具体问题去google…

 

8、CPP11还有很多特性,

右值呀、lambda呀、function呀,RTTI呀…

右值可以从汇编角度去看;lambda也可以从汇编角度去看,lambda其实就是个闭包,在CPP中lambda没有一个具体的类型,将一个捕获列表与一个函数捆绑在了一起,所以从汇编去看的话,返回一个lambda其实就是返回捕获列表中捕获的数据;function运用了类型擦除,具体实现可以google,其实boost库中的any也用了类型擦除,RTTI的话其实读完《深度探索CPP对象模型》,从虚函数表中应该已经知道了它的原理

 

9、还有一些高级部分:

类型萃取呀、tuple呀这些…,

类型萃取读完SGI STL源码之后应该已经能够深刻的理解了,tuple的话就是用了模板递归这些嘛,一些模板元编程…

 

书籍推荐:

《CPP Primer》、《深度探索CPP对象模型》、《STL源码剖析》、《CPP标准程序库》(参阅)、《Boost程序库完全开发指南》(简单读一读)、《Effective CPP》(想要更好的学习CPP强烈推荐)、《More Effective Modern CPP》(让你更好的了解CPP11,但是这本书目前还没有中文版,但是感兴趣的同学可以啃一啃…)

 

设计模式

推荐阅读《大话设计模式》,提醒一下,设计模式面试考得不多,但是想要了解的话还是去看一看…其中好几个设计模式可以联系已学过的东西加深印象,学习设计模式最好最快的办法就是理解它的UML图…

 

数据库

快速、基本地学习数据库推荐阅读《Sql必知必会》(很薄的一本书)

 

计算机网络

《Tcp/ip详解》(卷一)了解一下,看上面收录的面试知识点,着重去学习重要的那些。详细介绍tcp可以阅读《计算机网络》(谢希仁)(对也就是大多学校发的那本教材)第7章:运输层,其中的tcp可靠传输相关的一定要认真认真读!!,列出细节吧:滑动窗口、拥塞控制、还有状态图、还有TIME_WAIT(重中之重),socket编程可以阅读《Unix网络编程 套接字联网API》,其中跟SCTP相关的可以忽略掉,其实再省略一点的话只读第一二部分就行了…

 

操作系统

还是上面给的网易云课堂链接,里面有一门操作系统的课,简单学习的话可以去看看。

 

Linux内核

先简单读一遍《Linux内核设计与实现》,偶尔可对照一下linux内核源码。但是呢,这本书其中感觉有很多错误,不是很严谨,所以不推荐作为深入学习linux内核的书籍,只是作为简单的入门。

深入学习linux内核的话,可以认真读linux内核源码然后对照《深入理解linux内核》这本书,当然,重点还是读源码…读了《Linux内核设计与实现》之后已经有了基础了,然后其实已经可以有能力自己读懂源码了…可能会觉得还是有困难

 

讲一下我的linux入门之路吧…

 

我先读了一遍《Linux内核设计与实现》,当时对照着源码读的,当然啦,书上不可能所有东西都讲,只是挑一些特别重要的讲,其他的还是需要自己去看去理解…读完这本书之后,大致的内存管理、进程控制之类的还是了解了,我真正入门是在读多路复用select、poll、epoll源码的时候,这三个函数源码真的很简单,读懂之后能很有效地增强自信心,然后就觉得很有趣,然后就开始了真正的linux学习之路。之后慢慢地linux文件系统、内存管理、IPC之类的都能看懂,不懂google,看博客,然后继续读…

 

linux内核源码其实并没有特别难学习,难的是不知道怎么入门…这里有奥特曼的epoll源码总结:https://www.nowcoder.com/discuss/26226,之后要是有时间我再把我对do_fork、select、poll、epoll、ipc、文件系统、内存管理、大多数系统调用、进程调度呀之类的源码总结贴出来…

 

汇编

对了,走CPP后台这条路,就是需要与底层进行接触,所以了解汇编是必不可少的。尽早学会汇编,对以后学习任何高级语言、操作系统都会很有帮助。推荐阅读《汇编语言》(王爽),《X86汇编语言 从实模式到保护模式》,《汇编语言程序设计》(简单阅读一下,了解AT&T汇编格式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值