Hey man, I don't know that stuff
Stevey's talking aboooooout
If my boss thinks it's important
I'm gonna get fiiiiiiiiiired
Oooh yeah baaaby baaaay-beeeeee....
非技术部分
热身
好好读一本讲数据结构和算法的书
熟悉一些“术语”,可以强化分辨问题的能力。
Yegge推荐了 Steven S. Skiena 的《算法设计手册》,而我推荐的是 Udi Manber 的《算法引论》。
每一本书都有它的长处短处。找一本评价不错的书,认真读完,肯定会有收获。
找个朋友来面试你,尝试白板编程
在白纸/白板上编程的体验和在计算机上大有不同。没有条件的情况下,试试Leetcode的“Pick one”,然后在白纸上练习吧!
在面试前保持警醒,充分热身
- 读读书记
- 喝点咖啡,这可以让你的思路快一些
心理准备
保持谦逊、开明、专注的态度
不要质疑面试官的水平,但是也不要害怕问问题。问一个蠢问题总比沉默僵持半小时要好的多。况且,一个好问题也许还是一个加分项。
并且,不要尝试去转移话题,把注意力放在问题本身。
了解面试官对代码的要求
有的面试官不会要求你写代码,但是他们希望你在回答问题时写一点代码。如果你不能确定,不妨直接问一下。
不同的面试官对于面试代码风格的要求是不一致的,对于苛刻的面试官,最好提高对代码的要求。并且仔细检查。
问问题的艺术
在面试中的有不清楚的地方是可以问的(并且问问题是被鼓励的),有时候还可以去和面试官确认自己是不是在正确的方向上。
什么都不问,直接冲到白板前开始写代码有可能会留下“设计无用”的坏印象。所以,即使你确定自己怎么做,也要先说说自己是怎么样的。但是,也不要说的太多。
自带高级装备
- 细头可擦马克笔
- 铅笔和橡皮
在面试中要使用一切可以使用的资源,例如白板上的空间管理。
技术部分
算法
- 大O
- 排序算法 —— 快速排序和归并排序
- 哈希表
- 树 —— 构造和遍历
- 至少熟悉一种平衡二叉树 —— 必须掌握实现细节
- 图 —— 存储与遍历,Dijkstra和A*
每次遇到问题,首先应当考虑的就是图算法。它们是任何关系最基本、最灵活的表示方法,任何有点意思的设计问题可以说有一半的机会涉及图算法。只有在你百分之百确定没办法用图算法来解的时候,才能去考虑其它方案。这条建议一定要牢记在心!
- NP问题 —— 应该知道NP完全问题是什么意思
- 好好读数据结构书,能记多少记多少
- 离散数学 —— 计数问题、概率问题
计算机基础知识
操作系统
- 进程、线程、并发
- 锁、互斥锁、信号量,管程机制
- 死锁和活锁
- 进程和线程各需要什么资源、上下文切换、调度
作者推荐了 Doug Lea 的《Java并发编程》,做为一个Java hater,我决定还是勉为其难的看一下吧。:)
语言
至少要熟练掌握一种编程语言,最好是C++或者Java。并且一定要对那门语言的细节有相当程度的了解。
其它的基础知识
在作者的文章中没有提到的,但是也许比较重要的知识。
- CS专业第二重要的知识 —— 编译原理
- 计算机网络 —— TCP/IP协议也许是个重点
- 数据库的一些知识
- MapReduce?
其它
剩下的基本就是看脸了。。。
总结
好好热身。实际工作只会让你反应迟钝!
Comments
comments powered by Disqus