When you talk about the “user experience” of the thing you’re building, remember that developers who use your APIs are users too. And you need to think about their experience.
We seem to have created a world centred on github where everyone has to manage dependencies by hand, like we had to in 1997. This problem was completely solved by
apt twenty years ago, but the new cool github world is, it seems, too cool to care about that. Go off to get some new project by
git cloneing it and it’s quite likely to say “oh, and it depends on $SOME_OTHER_PROJECT (here’s a link to that project’s github repo)”. And then you have to go fetch both and set them up yourself. Which is really annoying.
Now, there are good reasons why to not care about existing dependency package management systems such as
apt. Getting stuff into Ubuntu is hard, laborious work and most projects don’t want to do it. PPAs make it easier, but not much easier; if you’re building a thing and not specifically targeting Ubuntu with it, you don’t want to have to learn about Launchpad and PPAs and build recipes and whatnot. This sort of problem is also solves neatly for packages in a specific language by that language’s own packaging system; Python stuff is installable with
pip install whatever and a virtualenv; Node stuff is installable with
npm install whatever; all these take care of fetching any dependent stuff. But this rush for each language to have its own “app store” for its apps and libraries means that combining things from different languages is still the same 20th century nightmare. Take, for example, Mozilla’s new Firefox Tools Adaptor. I’m not picking on Mozilla here; the FTA is new, and it’s pretty cool, and it’s not finished yet. This is just the latest in a long line of things which exhibit the problem. The FTA allows you to use the Firefox devtools to debug web things running in other browsers. Including, excitingly, debugging things running in iOS Safari on the iPhone. Now, doing that’s a pain in the ringpiece at the moment; you have to install Google’s
ios-webkit-debug-proxy, which needs to be compiled, and Apple break compatibility with it all the time and so you have to fetch and build new versions of
libimobiledevice or something. I was eager to see that the new Firefox Tools Adaptor promises to allow debugging on iOS Safari just by installing a Firefox extension.
And then I read about it, and it says, “The Adapter’s iOS support uses Google’s ios-webkit-debug-proxy. Until that support is built directly into the add-on, you’ll need to install and run the
ios-webkit-debug-proxy binary yourself”. Sigh. That’s the hard part. And it’s not any easier here.
Again, I’m not blaming Mozilla here — they plan to fix this, but they’ll have to fix it by essentially bundling
ios-webkit-debug-proxy with the FTA. That’ll work, and that’s an important thing for them to do in order to provide a slick user experience for developers using this tool (because “download and compile this other thing first” is not ever ever a nice user experience).
It is made worse by people using a language packaging system (designed for people developing libraries for a given language) to do app distribution. See, for example, tmuxme, which is an app for sharing a terminal session with many people (think of it like screen sharing, but for a terminal). And how do you install it?
gem install tmuxme. No. Ruby’s
gem command is for developers to download a Ruby library that their Ruby package needs. I, as someone who wants to use this tool, should not have to care that it’s written in Ruby. I should not have to have a Ruby development environment set up in order to use an app. See the birmingham.io forum thread for much much more about this, and why it doesn’t even work. New rather cool app
pup is the same — it’s a little app, inspired by the excellent
jq, into which I can pipe HTML and give it a CSS selector, and
pup will then print just the elements which match the selector. But how do I install it?
go get github.com/ericchiang/pup. No. I don’t have go. I don’t have a go environment set up. I don’t have
$GOPATH set. I shouldn’t even have to care that this little util is even written in Go. It’s a utility. What’s worse about this is that, unlike Ruby or Python, Go creates actual executables; I don’t even need the Go system around to run it! Why should I need to install all of Go just to get your app? Don’t use a language-specific library packaging system for distribution of applications. Don’t make me identify and download dependencies myself just because you already have them.
This is sorta kinda solved by
brew for Mac users, but there’s a lot of stuff not in
brew either. Still, there is willingness to solve it that way by having a packaging system. But it’s annoying that Ubuntu already has one and people are loath to use it. Using it makes for a better developer user experience. That’s important.