一、选择题
      主要的知识点:
1、临界变量critical section的概念(还有semaphore,thread类似的这些)。
2、存储器cache写穿透和写返回的概念(复习一下高体的cache)。
3、数据库技术里的几种隔离级别,一般是可重复的读、读稳定性等。可重复的读最高。
4、Java的内存管理机制,包括沙箱和garbage collector。
5、C++的内存管理机制,注意和上面的区别,new操作和delete操作的作用方式,以及和alloc与free的区别,内存不足时怎么办。
6、计算机网络IP地址和子网掩码的知识,怎样判断两个ip地址和对应子网掩码是否能通信。
7、C++里虚函数的概念,非常重要。另外,const的用法,虚继承和内联函数各自的好处和不好,等等这些基础的知识要掌握。
8、一个对象在内存里是怎样存储的,注意虚继承和有虚函数的情况。
9、对字符串的操作,应该注意哪些问题,包括拷贝,访问,等等。
10、基本的数据结构,如堆(注意最大值堆和最小值堆的操作和建堆的过程)、栈、连表、队列、二叉树(注意二叉检索树的相关操作)、图,这些知识和相关的算法要掌握。

二、逻辑部分
      不用复习了,没啥必要,一般是推理题,总会做出来的,只是时间问题。但说实话,我觉得在这里浪费时间来求准确性是非常重要的,因为后面的大题很难拿分,与其后面的题目写了一堆,不如在这里多花些时间求准确性,以为答对一个就是1.5分。

三、程序设计
      第二次笔试是两个题目,一个是求一个数组的最大公约数,知道展转相除的话很简单,但要把自己主要的思想用一句话哪怕是中文写在题目旁边,这样看的人就知道你会做这个题目了。程序都是很乱的,而且一个人不容易读懂另一个人的程序,所以这点我觉得有用。
      第二个,是让你对一个英文字典建立一个抽象数据类型(就是一个C++类),然后对给定的前缀打印出所有的单词。trie树是一个数据结构,简单地,它可以有任意多个子结点。那么对字典建立trie树即可。对于给定的前缀,只要顺序搜索子结点,然后递归打印出所有的叶结点就OK了。知道了想法也就简单。
      总结一下,就是这部分的题目其实都不难,但纸张的空间有限,而且基本都要求写完程序之后写测试用例,所以其实挑主要的写就可以了。注意尽可能的精简就成。

四、设计
      一般这个题目,是给你一个场景,如M$的MSN或者outlook或者office等,问你有哪些不足,需要增加哪些功能你觉得,然后举一个你最想增加的功能,并说明给你3个月你怎么实现。随便bla吧,但如果你应聘的是PM,那么这个题目相当重要。

五、测试
      两个题目,都是写测试用例和第三大题不同,虽然第三大题也让你写完算法程序后写测试用例,但这个要详细一些。一般是先挑bug,再写测试用例。所谓的测试用例,就是给定的输入参数和期望的输出结果。一般让你挑bug的,都是对字符串进行操作的,所以一定要仔细检查,是否有操作空指针、是否检查了输入参数、是否有指针越界。
      上次笔试是给定的两个题目是一个检查函数中操作字符串的bug并写测试用例,一个是给一个函数int system(char* command),让你写测试用例。黑箱测试了。

      不知道为什么第二次的时间变短了,改成了2个半小时,不知道这次是多少小时,时间方面可能要抓紧一下,否则写不完。感觉还是要把前面的题目尽量做对,否则如果某个题目没达到他们最低的要求,人家就不向下看了。