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?

其它

剩下的基本就是看脸了。。。

puzzles

总结

好好热身。实际工作只会让你反应迟钝!


Comments

comments powered by Disqus