cs找工作准备篇

人太懒,一转眼距离上一篇写完过去两周了,还是趁着现在有点热情把后续的东西写下来
,再拖一个月估计我就全忘了

书接上回。

看下面的文字之前,建议大家先看看两篇相关的文字(对应着看):

1. 刘未鹏大牛的《怎么样花两年的时间去面试一个人》 http://mindhacks.cn/2011/11
/04/how-to-interview-a-person-for-two-years/

2. 原载自北邮人论坛 的《怎样花两月时间去应聘互联网公司》   http://www.cnblogs
.com/wangjianzhou/archive/2011/11/24/2261506.html

虽然说it领域找工作这个过程很多东西不可控,但是扎实的基础知识、专业领域的深度以
及相关必要的练习能解决掉80%的事情。

在我看来,所谓的找工作之前的准备,其实就像考试一样,有人喜欢从学期一开始就好好
学习,每节课听讲,课后复习;也有人考前突击,临阵磨枪,不快也光。 所谓一分耕耘
一分收获,这两种态度带来的结果显然是前者成功的概率更高;但是不可否认后者有时候
如果没有突击到话会很惨,但是性价比也很高。

在讨论该如何做准备之前,我觉得先要弄明白的事情是,你自己的兴趣点是什么? 以后
希望从事什么工作? 随着国内互联网公司的逐渐成熟,稍微有点规模的公司里,工作职
责都进行了细分, 前端(美工,设计,css&js), 后端(只关注业务后台, 存储、中
间件、大规模数据处理等基础架构), 算法策略, 运维,PM等都是专人专责, 不同方
向对人的技能要求差别较大,不可能你什么都能hold住。

在确定自己职业方向之后,可以针对特定岗位有的放矢。比如后台SDE的话,需要对Linu
x编程,网络编程之类的而熟悉; 算法工程师对数据挖掘和机器学习的经典算法要有个大
概了解吧, 前端工程师要对css和js了然于胸。

互联网技术工作的知识准备,我觉得应该分为 基础知识+专业知识两部分来看, 前者是
获取offer的必要条件,后者是获取special offer的钥匙。由于后者每个人方向不同,所
以只介绍该如何准备前者。

cs的基础知识,主要是本科四大基础课程(数据结构与算法,OS, 网络,体系结构)所
包含的,下面就分别列举:

① 数据结构与算法部分:

每个数据结构都应该知道:为什么要有这个数据结构,能做什么不能做什么,空间复杂度
和每种操作的时间复杂度。简单的数据结构要很熟练的写出代码或伪代码。

重点户考察得有:

链表(单向,双向,环形),考得非常多,指针操作不能错

二叉树   会考各种题,包括用 递归和非递归实现

二分搜索(一定要会!别小看了,代码不是很好写,各种变种情况的边界条件控制)


各种排序:冒泡,插入,选择,快排,希尔,归并,堆排 的时空复杂度,都要了熟于心
,并且能够证明出来。堆排序还涉及到堆得数据结构,要能独立手写堆(虽然stl有)

哈希表  拉链法与二次探测的实现

一些小扩展(事实证明现在的互联网公司出题,已经或多或少涉及到下面一些):

Bloom Filter(经常被人忽略的一个重要的东西)

并查集 (Union Find Set)

字典树(Trie/Prefix Tree)

AVL Tree

Red Black Tree(了解概念,知道和AVL Tree的区别就好)

B-Tree B+-Tree (最好知道两者的区别,知道为什么B-Tree会比AVL/RBTree快, 估计没
有哪家公司会要求手写吧)

Skip List (单链表加速利器,leveldb里有用到)


算法部分:

经典的分治/递归,以及经典问题

搜索(深度优先,广度优先。要求熟练,代表就是八皇后问题)

动态规划的经典题型,比如最长上升子序列,最长公共子序列,数组的最长字段和(拓展
到二维情况), edit diastance等

Dijkstra/Floyd/Bellman-Ford最短路径算法, Prim算法好像考察的不多


② OS部分:

这个一把会以小题的形式出现,比如在笔试题的选择题中,或者面试时面试官会问你。 
对于像 进程与线程的区别, 经典的线程同步方法, 信号量操作等,要烂熟于心。  此
外,很有可能和Linux系统结合,问你xxx在linux中如何实现之类。

要知道什么是时间片,什么叫分时调度。几种常见的调度。 要了解文件系统如何实现(
FAT, ext2/3/4. zfs, NTFS) 、OS内存管理的常见方法

OS是一个大宝库,汇集了computer system领域几十年积累下来的精华,很多东西可以借
用Linux中的实现,比如面试中让你设计一个cache之类的题目。


③ 网络部分:

也多是以小题的形式来考,OSI的七层结构,主要是应用层考的比较多。

需要了解HTTP。现知道什么是GET/POST,知道有session, cookie这个东西。(不管是不是
前端都需要了解)

写过网络程序……知道什么bind()/listen()/accept()/connect(),这些要会用。

知道常见的协议及端口,比如dns, ftp, ssh ,dns, smtp, pop3等,

知道TCP和UDP的区别

简单知道TCP的怎么保证数据完整性的。知道TCP怎么握手的(SYN/SYN_ACK/ACK),知道怎
么断开的(FIN/FIN_ACK),知道主动断开会出现TCP_TIME_WAIT这个状态。(TCP的状态机
图)

知道TCP的几种拥塞控制


④ 体系结构:

不太好单独考,所以一般借助于c/c++语言,通过编译出来的对象在内存的布局,来考你
对体系结构的认识,比如如何判断大端/小端机器,栈往哪个方向增长这种题目

当然你需要了解 比如CPU是多周期的,流水线作业的。

知道现代CPU的 instruction cache和data cache, L1/L2/L3 cache的访问速度的数量级

知道CPU有寄存器  知道有特殊寄存器和通用寄存器

知道CPU有 RISC / CISC之分


volatile的语义。可变的,所以每次读写都会直接写入内存(或者cache),编译器不允
许做任何优化到寄存器的优化。

知道乱序执行,知道CPU有多线程技术来回切换/多套原件。知道CPU有多核,知道SIMD是
什么概念。

知道CPU里面内存访问是有Cache的,这也是为什么BTree会比rbtree/avltree快!同理,
很多数据结构都要尽量”成块”,这样减少了CPU的cache miss。

知道有branch prediction就行。


⑤ 编程语言:


编程语言就像武士手里的武器。 尽管各大公司宣称对编程语言无要求,但是在笔试面试
过程中,主流的还是 c/c++, java。

有人问过, c++对什么领域来说不可或缺;答案是出面试题。。。。

对于c语言来说,语法结构较简单,一本 K&R 半天就能看完,但是c的难点在于各种编码
trick

你至少要知道:

#ifndef #define #endif 作用

static语义。

内存:stack和heap。mallc / free

extern语义:C的symbol table不会做像C++一样做Name Mangling 。可以直接根据函数名
称来用里面的函数(dlopen/LoadLibaray)

C++的一些知识:

c++太庞杂:procedure-oriented, object-based, object-oriented, generic type. 四
种子类型目前估计咱们能懂的也就前三种

千万别告诉面试官你精通C++, 否则必挂。

知道啥是virtual function,知道有virtual table的存在。以及在内存里的布局 + 函数
执行过程是的调用顺序

Constructor的时候不要virtual function(要知道为什么)

Destructor的时候不要throw(见 Effective C++)

Destructor要virtual,如果你打算别人继承你的话。

New/free就是malloc加constructor和destructor

public继承,还有private继承。virtual继承,为了解决多继承对象冗余的。太恶心,一
般人不会用。


实现Singleton模式(还有各种升级版,比如多线程, lazy  initialization)

--------------------------------------------------------------------------

上面这些知识,我个人建议在研二的那个暑假里都搞定,否则拖到九月份你会很被动。 
九月份你需要干的活,是搜集往年各个公司的面试笔试题,来实战模拟。


我建议的各个领域看的书:

数据结构与算法: 推荐我老板张铭老师的教材 + 讲义 + 书后习题, 网上的精品课网站
,资料很全

OS: Andrew S. Tanenbaum 的现代操作系统一本足以

网络: Tanenbaum的网络书远远不如他的OS书写得好,所以网络部分我推荐 谢希仁 写的
《计算机网络(第五版)》, 写的条理很清晰

体系:算了,别看书了,不适合抱佛脚

c:  圣经 K&R + c指针 + c陷阱与缺陷      千万别看谭浩强的书

C++: 语法方面,我觉得 《Thinking in c++(第一卷)》 比 CPP Primer要好懂得多!
 加一本Effective C++可以搞定大部分问题,如果真想钻研的话,去看看 Lippman的 In
side C++ Object Model, 以及 侯捷的 STL源码剖析(很好读的一本书,配合sgi的stl
源码)
算法: 有时间的话,算法导论的相应章节以及对应习题都看一看, 否则就把屈婉玲老师
的课件以及作业都温习一遍吧,很有用

临阵磨枪: xx之美, 剑指offer都是应急的书,当然编程珠玑也不错。

你可能感兴趣的:(面试,求职,找工作)