I have spent incalculable amounts of time trying to set up software environments, and if you’ve done any programming, I’d guess that you have had similar experiences. As a way to save everyone time and frustration, I think we should push for hermit crab software—programming environments that carry their “home” around with them.
Sometimes you need a language runtime and a text editor, sometimes an IDE has everything, sometimes you have to grab the language and various tools, or the language ecosystem relies on outside libraries. Then there’s configuration of each of the components; for example, download and set up the Clojure bundle for TextMate, add the language to your PATH, etc.
Some issues I’ve had recently:
- Rails issues like setting up Ruby, Rails, gems, rake, RVM, and fun things like Ruby issues with HTTPS that require you to install SSL then reinstall Ruby
- Persistent Java issues around jar and classpath hell
- Exciting new languages like Scala and Clojure have moved quickly and tutorials have not kept up, so there is confusion.
- Sonar was so easy to install—simply download and unpack—I thought I did it wrong! (There are pitfalls with this type of dead-simple installation, too.)
There are a few promising leads like Vagrant and Juju, which make it easier for everyone to share a development environment. Unfortunately, they probably can’t help at the language level (e.g., are you using Ruby 1.9.2-p180-patched or 1.9.2-p290?). Maven, Bundler, Pip, and other dependency management systems help, but I’d like to see the language make dependencies and versioning a first-class citizen. I envision the ability to download an app from source control and be running with all the right versions of the language, tools, and dependencies in one-click.
So, why not create software environments that carry their environments around on their back?