0. Managing Complexity
1. Mastery of multiple programming paradigms: know a systems language like C, a statically typed object oriented language like C++, Java or C#, a dynamically typed object oriented language like Python, Ruby, Smalltalk or Perl, a Lisp (Scheme is best for learning functional programming) and a statically typed functional language with type inference (OCaml, SML or Haskell)
2. Great understanding of algorithms and data structures. Ability to look at a problem and see a clean algorithmic solution or data structures based solution where others see spaghetti and brute force. In addition to the obvious (algorithms classes, CLRS, Algorithm Design Manual) books, Jon Bentley's Programming Pearls contains many demonstrations of exactly that: use of data structures and algorithms as a way to write exponentially more performant, cleaner and more correct code.
3. Understand systems: TCP/IP networking, I/O, parallelism and concurrency (know how to write multi-threaded code, how to perform asynchronous I/O), operating system and database internals, basics of hardware (pipelining/branch prediction, memory hierarchy, NUMA)