Being a Badass Programmer

Is Badass Programmer an oxymoron? I don’t think so. There are badasses in every profession. Sometimes it’s very clear that you’re talking to a blackbelt, a guru – and the whole time, wishing we had those enviable skills. You don’t usually break down what exactly are the badass skills in these situations, but rather form an impression of gestalt badassity. But if we want to emulate a guru, we need to collate and organize these into a sort of “curriculum of badassity.” I’ve tried to do that for programming. What skills define a badass programmer? Each skill below can probably be studied for a lifetime. Of course, you have to pick just a few to specialize in – but they form a web: you can learn unix while programming embedded devices, and develop good user interfaces while contributing to open source. At heart, this is a list of skills that I want to have at least summary knowledge of, before I can consider myself an expert programmer.

  • Able to program embedded devices. This is one of those thing… it looks daunting, but I actually suspect it’s simple to get started (I’m hoping). It opens up new worlds for using programming in the real world – programming beyond the monitor. Skills: loading programs into unconventional devices. Writing C. Processing analog input. Programs outputting to mechanical devices. Writing in resource-constrained environments. Uses: all sorts of lifestyle automation, cool artistic applications, bioinformatics, scientific (eg oceanographic) monitoring, ROBOTS.
  • Comfortable writing programs to render and display 3D. Probably the most intensive from a trig/calculus/linear algebra perspective, but 3-D is required for many types of games. Programming a 3-D engine feels like something every programmer should do. Skills: deep knowledge of trigonometry. Understanding of OpenGL/DirectX. Lots of CS-stuff. Uses: 3-D modeling, modern video games, health (eg MRI) applications.
  • Serious unix knowledge. Unix is the programmer’s operating system (family). You can usually do what you want with a few keystrokes. Any self-respecting programmer should have some unix knowledge. But blackbelt knowledge is badass. Skills: comfortable with most standard unix applications (such as netstat, top, ps). Knows the most useful (and some less useful) arguments and flags for these programs. Knowledge of how to run programs in a pipeline, and how to configure them. Can use more advanced command-line file parsing (sed/awk). Knows either vim or emacs in depth. Knows shell scripting and perl. Uses: general efficiency, street cred.
  • Machine learning/AI. Just cool, also puts a lot of CS-theoretical stuff to use. Can be applied to do virtually any automated task in a smarter way. Skills: good algorithmic/data structure knowledge. Knowledge of: Monte Carlo simulations, evolutionary programming, neural networks. Uses: video games, image processing, data mining, robots, uses in most programs.
  • User-Interface Savvy. To bring a program to a broader audience, it has to have a usable interface, programmers make notoriously bad interfaces. Skills: understanding of good design. The visual display of quantitative information. Presentation. Basic knowledge of arts. Uses: Making each program a pleasure to use.
  • Open-Source Contributor. Giving back to the community is important; it also increases name recognition. Probably the most badass known programmers are the serious open source gurus: Linus Torvalds, Richard Stallman.
  • Multi-paradigm thinking. There are a lot of different ways to program, most notably imperative and functional. Strong knowledge of both is useful, as they each provide benefits. Skills: knowledge of diverse languages (one good set would be C++,Python,Common Lisp,OCaml; I’m shooting for Scala/C++,Python,Clojure,OCaml/Haskell). Uses: write better, more maintainable code. More elegant solutions.
  • Can rapidly prototype. Developing is fun, but developing rapidly is funner! Skills: strong knowledge of a scripting language (Python, Ruby, Javascript). Good math background, ability to visualize shortcuts. Uses: quick fun projects, evaluate many solutions in a short time, rapidly build experience in new problem domain.
  • Builds Enterprise-Scalable. Building a basic Facebook or Wikipedia is extremely simple (Wikipedia in particular has trivial features). But scaling them is hard – in many cases, the entire challenge is making an application capable of handling hundreds of thousands of users. Skills: databases, multithreading, server architecture, load-balancing frameworks, data structures, hot failover. Uses: Employment, ensuring your applications can reach a large number of users.
  • Can deconstruct code. It’s one thing to be able to read code – but then being able to look under the hood and see what happens when that code is compiled – that’s very different. Skills: understanding assembly, java bytecode, hex editing, generating assembly/bytecode, writing assembly. Uses: JVM language design, optimization, analyzing hacks, reverse engineering.
Leave a comment

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: