Thursday, July 21, 2011

New Experiment Language Choices

(edit: I'm still tinkering with the ideas and have started learning Go, but will probably end up doing this project in either python or bash)

My evolving side project is a configuration management suite that:
1.) uses as much of git as possible and sensible
2.) lightweight
3.) simple things must be very fast turnaround to/from thought<->production
4.) all configs (and binaries if you like) versioned bit-for-bit for all time


I'll write more about the overall system design later; I've written a bit of an intro and will post it when I have code to present (here's what I have in mind for fs permissions: gist) I'm implementing some tools now that I've got the branching & config strategy worked out. I could whip out a lot of it in Perl pretty handily, but I suspect it'll be a one-man show forever if I go that route. At work, almost everything is done in Ruby, which I still don't really like much. Plus two of the leading CFM tools are already in Ruby, so I feel like it's time for something different. So, here's what I'm considering and why:
1) Go
  +) generates regular binaries, no VM to maintain on nodes
  +) good C compatibility, already has libgit2 bindings
  +) garbage collected, first-class strings
  +) (yes, +) DNA from C, Erlang, Plan9, and Inferno/Limbo
     e.g.) lightweight processes, channels, goroutines
  -) I'd have to learn from scratch
  -) AFAIK nobody on my team knows/uses it (obscure)
2) C
  +) compiled, works literally everywhere, knows your mom intimately
  +) good match with git, openssl/gnutls, and libgit2
  +) igraph looks neat for smart path & network
  -) manual memory, thread, and process management :(
  -) I'm rusty as the Titanic
3) Perl >=5.8
  +) installed everywhere
  +) I'm good/fast at it, prototype in a couple weeks
  +) many git utilities are written in perl, good match
  -) declining popularity, fractured community
  -) modern libs require too much baggage (e.g. Moose)
  -) XS is the devil, no usable libgit2 bindings
4) Python
  +) installed everywhere I care about
  +) thriving community
  +) I have some experience (though still much slower than perl)
  +) libgit2 bindings exist
  +) some of the git tools are already python
  -) difficult to bundle with zero dependencies outside the git branch
  -) v2.5 -> v3.x transition is in progress, which to choose? (prob 2.7)
5) Java
  +) just kidding!
6) Javascript/NodeJS
  -) I'm not kidding
  +) garbage collected, closures, functional style available, naturally async
  +) growing popularity, modules I'd need are fairly mature (relative to node.js)
  -) rapidly changing ecosystem/interfaces

To be honest, I'm really leaning towards Go right now but it'd add a month or so before I have something useful.

Comments, suggestions? Don't hold back, you know I wouldn't ;)