1、Languages: Deep working knowledge of C and familiarity with object-oriented concepts and work with some object-oriented language such as Java or C++. 2、Data structures and mathematics: Understanding and working knowledge of pointers, lists, stacks, queues, trees, arrays and recursion; induction, order of magnitude growth, probability and elementary combinatorics, set notation. 3、Working familiarity with windows and Unix. 4、Knowledge of assembly language (e.g. Intel or Motorola) sufficient to understand self-modifying code.