18/03/2017

standard repertoire in computer science


Don Knuth at his home organ


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.)

MINDSET
  • 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.




LANGUAGES

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 type abstraction (Python or Javascript)
  • 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
  • Theory of computation. (Why are Turing, Shannon, von Neumann among the greatest thinkers of the past hundred years?)
  • Theory of computational complexity.


DATA STRUCTURES
  • hash table
  • linked lists
  • trees
  • directed and undirected graphs
  • binary search trees


SYSTEMS PROGRAMMING
  • compiler, linker, interpreter: use and theory of
  • virtual memory and paging.
  • kernel mode vs. user mode
  • threading
  • 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




FORMALISMS
  • number theory for crypto
  • automata
  • formal grammars


TOUCHSTONES
  • The Nature of Computation
  • Code Complete 2
  • Don't Make me Think
  • Design Patterns
  • Peopleware,
  • Programming Pearls,
  • The Pragmatic Programmer,
  • Mythical Man month
  • Structure and Interpretation of Computer Programs,
  • Art of Computer Programming
  • Hacker's Delight

No comments:

Post a Comment