“I hate almost all software. It’s unnecessary and complicated at almost every layer … you don’t understand how fucked the whole thing is,” rants Ryan Dahl, the much- (and rightly-) lauded creator of Node.js. “It really, truly, is all crap. And it’s so much worse than anybody realizes,” agrees Zack Morris, who goes on to add, “The industry has backed itself into a corner and can’t even see that the way forward requires thinking outside the box.”
Investors and managers may not realize it, but the coders who do their work are in a collective state of angry ferment. Complaints about the state of modern software engineering multiply everywhere I look. Scrum, the state-of-the-art project-management methodology, is under attack: “I can only hope that when Scrum goes down it doesn’t take the whole Agile movement with it,” says Robert Martin, complaining about elitism and the rise of meaningless ‘Scrum Master’ certifications. Pawel Brodzinski disparages software certifications from a different angle: “It seems certification evaluates people independently and is objective. Unfortunately it’s also pretty much useless.”
Even test-driven development — the notion that a development team’s automated tests are even more important than the actual software they write, and should be written first — is being criticized. Once this belief seemed almost sacrosanct (although in my experience most of the industry paid it only lip service.) Now, though, Pieter Hintjens argues, “The more you test software, the worse it will be.” Peter Sargeant agrees: “The whole concept of Test-Driven Development is hocus, and embracing it as your philosophy, criminal.”
None of the above are wrong. Morris’s exegesis of the problematic process of iOS app development is spot on: beneath the slick exterior of Apple’s XCode environment and Objective-C language lie squirming Lovecraftian horrors from the 1980s like preprocessor macros, forests of cryptic compile/link flags and paths, scheme/project/target confusion, etc etc etc. Android development is better in some ways, but its recommended Eclipse environment is ugly, clunky and sometimes only barely comprehensible. Certifications seem to me (with some exceptions) mostly to be red flags that warn: “This person thinks that merely learning a new toolset is a significant feat that deserves recognition.” Test strategies need to be customized for the problem, not the other way around.
But I’m struck by how the anger and frustration cited above is so out-of-sync with my own experience. I’ve been writing code for money for twenty years, with a six-year interregnum from 2003 to 2009, because I got a book deal and spent that time writing novels full-time. When I got back into programming two years ago, I was struck by how much better things had gotten. Ham-handed languages like Perl and C++ have been largely replaced by elegant Ruby and Python, at least among startups. StackOverflow solves many problems before they even begin to grate. Instead of futzing around with server configurations and dealing with trainwrecks like J2EE, anyone can easily deploy and run code on the App Engine or Heroku clouds — for free!
Take Java. (Please.) People have been criticizing it since its birth; witness Jamie Zawinski’s fourteen-year-old takedown of the language. But also note that he praises it for being much better than its predecessors, and that Heroku this week announced support for its most likely successor, Scala. The rants above aren’t wrong; the state of the art isn’t great; but it’s important to recognize that it’s a lot better than it used to be. Some improvements, like test-driven development and agile methodologies, need further iteration. Others simply aren’t cost-effective to deploy right now.
Consider wind and solar power. They’re the future of energy generation, everyone knows that, but because we’ve already sunk trillions into fossil-fuel infrastructure, we can’t switch over to them immediately. Instead we’ll have to suffer through a bumpy, painful, decades-long transition — but at least we’re on a path to get there eventually. Similarly, functional programming, NoSQL databases, and other innovations may be the future of software, but it’s delusional to think that we can or should move to their wholesale adoption tomorrow. Today’s software is generally a mess, yes, but the important thing is that we’re moving in the right direction. Let’s remember that — and remember that until we get there, the best will remain the enemy of the good.
Image credit: Dana Robinson, Flickr (slightly repurposed)