A trained musician knows hundreds of pieces, many of them from "standard repertoire", a list of classics. I'm getting by in a statistical / computer scientific career, despite not being trained per se in either. What's in the computer science / IT / hacker repertory?
Here is a list of things you should be able to use or define by the end of a good computer science undergraduate degree. (Starred are ones which will enhance your life most, whether with hundreds of thousands of pounds, or hundreds of hours, or a larger practical-ethical expansion. Career improving ones are pretty obvious, but in computing the divide between the fascinating or improving, and the employable, is narrower than elsewhere.)
- Get into DIY, in its grand philosophical sense: create, not just consume.** Portfolio, not resume!
- Demystification of tech.**
- ...and thus participation in the defining activity and mindset of the age.*
- ...and thus scepticism about the many expensive and ludicrous parts of it.**
- The imaginative leap of non-WYSIWYG working. Real mental modelling.
- Appreciation of the uniqueness of programming as tool in any inquiry.
SYSTEMS AND NETWORKS
- Hardware assembly and maintenance.*
- Overcoming your fear of the command line (*nix preferably).
- Thus scripting to automate dumb (and smart) stuff.*
- Install, configure, compile Linux.
- Compile and configure a web server.
- Compile and configure a DNS daemon.
- network protocols and socket level programming.
- monitoring, reporting, fail overs etc.
A fraught topic, for some reason. No particular language is indispensable, but there are at least 10 important axes to understand.
- For development speed: Python or Ruby
- For execution speed: C or Rust or Go
- For portability: Java or C or bash
- For nostalgia or ritual: C
- For elegance: Haskell
- For puzzles: Prolog or uKanren
- An Algol ("C-like"): Java or C#
- A Lisp: Racket or Scheme
- An ML: F# or Haskell
- For data abstraction (Assembly or anything)
- For class abstraction (C# or Java)
- For functional abstraction (Haskell)
- For syntactic abstraction (Scheme)
- For implementation abstraction (SQL or Prolog)
- For processor abstraction (Erlang or Go)
- Standard web markup: HTML/CSS/XML/JSON
- Markdown for rapid writing.
- Regex for fast text manipulation.*
- LaTeX for beautiful technical writing.
- A version control system.
- Theory of computation. (Why are Turing, Shannon, von Neumann among the greatest thinkers of the past hundred years?)
- Theory of computational complexity.
- hash table
- linked lists
- directed and undirected graphs
- binary search trees
- compiler, linker, interpreter: use and theory of
- virtual memory and paging.
- kernel mode vs. user mode
- synchronization primitives
- platform internals: disassemblers, decompilers, debuggers...
- The entire programming stack:
- hardware (CPU + Memory + Cache + Interrupts + microcode)
- binary code, assembly
- static and dynamic linking
- JIT compilation
- garbage collection, heap, stack, memory addressing
- number theory for crypto
- formal grammars
- The Nature of Computation
- Code Complete 2
- Don't Make me Think
- Design Patterns
- Programming Pearls,
- The Pragmatic Programmer,
- Mythical Man month
- Structure and Interpretation of Computer Programs,
- Art of Computer Programming
- Hacker's Delight