计算机网络:
从OSI 七层模型,到各个层的各种协议。
主要讲述:传输控制协议 TCP/IP 协议,以及用户数据报 UDP 协议(区别)
最重要的还是 TCP 的建立和终止 (理解建立和终止过程)。加分点:三次握手弄成两次握手行不?为什么?四次挥手,弄成三次挥手行不?为什么?为了解决什么问题,才不能增加一步或减少一步?
针对流量控制提出滑动窗口机制 :解决一方发的太快另一方来不及接收的问题。
针对网络上拥塞的问题提出 TCP 拥塞控制机制:其中包括慢启动、拥塞避免、快速重传和快速恢复。
C++基础:
最重要的是继承,以及多态(相同的命令执行不同的动作)的实现机制。在这里边有虚函数表的知识。
虚函数表:如果类里边有虚函数,虚函数表示属于类的,那么这个类的对象会有一个指针的成员变量,这个指针指向的是一个虚函数表,虚函数表里放的是虚函数的函数指针,如果一个类继承另一个类,其替换的知识虚函数表里的函数指针(重写的那个虚函数的函数指针)。
为什么在有继承的情况下,父类的析构函数一定要设置成虚函数,如果不是虚函数会出现什么问题?这个问题是关于实现多态时,析构指针所指内存时的内存泄露问题。
malloc/free 和 new/delete 的相似之处以及不同之处。前者是 C 语言里的库函数,后者是 C++ 的运算符()这是本质的区别,如果理解的到位,告诉面试官如果交叉使用会出现什么情况。从这个基础上提及 C++ 的内存分配:栈、堆、全局(静态)存储区、常量存储区。着重注意在堆存储区动态申请指针的时候,记住不用的时候析构掉(给面试官一种有严谨编程习惯的感觉)。
针对数据结构的各种排序算法,分析其最好的时间复杂度,最坏的时间复杂度。有没有额外空间复杂度(最好的时候是多少,最坏的时候是多少),拿快速排序为例:由于快速排序是递归的,所以一定要借助一个递归栈来保存每一步递归调用的信息(这就是额外的空间复杂度)。快排最坏的情况就是进入下次递归的两部分一部分太大,而另一部分太小,如果这种不对称性发生在每一步的递归调用上,那么快排的时间复杂度为 O(n^2)。最好的情况是每次递归的两部分为上一次的一半,这是时间复杂度最小 O(nlogn) 。如果理解比较透彻的话,可以告诉面试官怎么找到快排的的枢轴元素,来让进入下次递归调用的两部分长度相似。在这种基础上再分析一下其他排序算法的时间复杂度(最坏,最好的情况)。面试官就觉得你数据结构的功底会很强。
针对的简单的排序算法要求会写代码,查找算法比较简单,最需要注意的是二分查找,这可以联系到树形结构,也就是二分查找树,在此基础上想到 AVL树(平衡二叉排序树)。因为 AVL树的的高度越低,查找的效率就越高。
数据结构的链表操作好好看看,引用与指针的区别等。
针对STL里的容器,自己如果看的话,看看其怎么实现就行了。比如 vector 的内存是怎么分配的,拿 inset()操作来说,如果 vector 里边元素不满,那么直接插入,如果满了,就另申请一段空间(往往是以前的两倍),之后把之前内存的元素拷贝到新申请的内存空间里边,之后执行插入操作,最后把原来的内存空间析构掉。针对 deque 是怎样利用中央控制器 map 来实现一个内存连续的一个假象? stack 和 queue 是在 deque 的基础上实现的,只是调用了其底层的函数,关于关联式容器,如果投测试稍微看看就行,但如果找开发的职位,关联式容器是必须要看的,并且知道其实现底层红黑树,它是怎样的一种数据结构,怎么完成查找、插入、删除的操作。注意一下 hash-table , 因为在理想的情况下能做到在O(1)的时间内,实现查找、插入、删除操作,但需要注意的是怎么注意碰撞(也就是有冲突的情况),几种方法自己看一下——线性探测、二次探测、什么链式法。hash-set和hashmap,最少会使用。
操作系统:
知道一点进程通信的方式有哪些、进程与线程的区别、线程优先级调用策略、页面置换策略就行了。
开放性问题(HR)
您是如何考虑解决在以往工作中遇到的具有挑战性的难题的?请列举一项难题,说明当时的背景、您的具体行动和最后的结果?
准备一到两个合适的问题问面试官(往往是技术面)。最好是问关注技术层面的东西。
这篇文章只是写给实验室找测试开发职位的几个小伙伴儿,但我本身是后台开发职位,针对于后台开发职位需要掌握的知识要比以上多的多,对于一些细节的把握以及只是线条的理解要深刻,并且自己要会运用。
技巧就是自己准备几条知识线,一旦问到这个知识线上的任何一个地方,都可以和面试官扯好久的那种,这样面试官问的问题就少了,自己暴露的问题就少了。