Building web services and smartphone apps, which is most of what I’ve been doing professionally at HappyFunCorp1 for the last decade or so, used to be pretty straightforward. Not easy, but straightforward, especially when the client was a consumer startup, which so many of them were.

The more we did the better we got at it. Design and write two native apps, usually iOS first and Android second. Don’t skimp on the design. Connect them to a JSON API, usually written in Ruby on Rails, which also powered the web site. There’s always a web site; consumers might only see the side which is a minimal billboard for the app, but there’s essentially always also an admin site, to control features and aspects of the app.

Design isn’t as important for the admin site, so you can build that in something crude but effective like ActiveAdmin; why roll your own? Similarly, authentication is tricky and easy to get wrong, so use something like Devise, which comes with built-in hooks to Facebook and Twitter login. Design your database carefully. Use jQuery for dynamic in-browser manipulation since raw Javascript is such a nightmare. Argue about whether to use Rspec or Minitest for your server tests.

All there? OK, roll it out to your Heroku scaling environment, so you can simply “git push” to push to staging and production, with various levels of Postgres support, autoscaling, pipelines, Redis caching, Resque worker jobs, and so forth. If it’s a startup, keep them on Heroku to see if they catch on, if they find the fabled product-market fit, not least because it helps you iterate faster. If so, at some point you have to graduate them to AWS, because Heroku only scales so far and it does so very expensively. If not, well, “fail fast,” right?

Those were the days, my friends, those halcyon, long-gone days of (checks notes) five years ago. The days of a lot of grief, sure, but very little decision complexity. The smartphone boom was on, and the web boom was settling down, and everyone was still surfing those two tidal waves.

Today? Well, today we still are, neither of those waves have broken, per se, software is still eating the world, but things are … different. More of the world is being eaten, but it’s also happening more slowly, like growing 50% a year from a $1 billion base rather than 500% from $1 million. There are fewer starry-eyed founders with an app idea that they’re sure will change the world and funding enough to give it a shot. Those are still out there, sure, and more power to them, but the landscape is more complex, now.

Instead we see more big businesses, media and industrial and retail alike, realizing they must adapt and be devoured, experimenting with new tech projects with a combination of excitement and trepidation. Or requisitioning custom apps for very specific — but very useful — purposes, and requiring them to interface with their awkward pre-existing custom middleware just so. Or tech companies, even big household-name ones, outsourcing ancillary tools and projects in order to focus their in-house teams purely on their core competencies and business models. Our mix of clients has definitely shifted more towards enterprise in the last few years.

Which is not to say that startups don’t still come through our doors with bright ideas and inspiring PowerPoints on a fairly regular basis. As do super starry-eyed blockchain founders (granted, I’m sometimes a bit starry-eyed about blockchains myself) replacing the consumer-app founders of yore. I doubt we’re alone in having had a spate of blockchain startup projects late last year and early this, which has diminished to only a couple active at the moment. (Not least because the tooling is still so crude it reminds me of 90s command-line hacking.) But I strongly doubt that sphere is going away.

We haven’t dealt with as many AI projects as I would have expected by now, probably partly because AI talent is still so scarce and highly valued, and partly because it turns out a lot of seeming “AI” work can be done with simple linear regressions rather than by building and training and tuning deep-learning neural networks… although if you do those linear regressions with TensorFlow, it’s still “AI” buzzword-compliant, right? Right?

Most of all, though, the tools we use have changed. Nowadays when you want to build an app, you have to ask yourself: really native? (Java or Kotlin? Objective-C or Swift?) Or React Native? Or Xamarin? Or Google’s new Flutter thing? When you want to build a web site, you have to think: traditional? Or single-page, with React or Angular or Vue? As for the server — Go is a lot faster than Rails, you know, and oh, that elegant concurrency handling, but, oh, where is my map/filter/reduce? Javascript is still a clumsy language, but there are certain advantages to having one language across the stack, and Node is powerful and package-rich these days. And of course you’ll want it all containerized, because while Docker definitely adds another layer or two of configuration complexity, it’s usually worth it.

Unless you want to go fully “serverless,” at least for aspects, with Amazon Lambda or Google Firebase? Even if you don’t use Firebase for a datastore, how about for authentication, huh? And if you’re all containerized, and Kubernetized if/as appropriate, though maybe let’s not go the many-microservices route until you’re sure your product-market fit justifies it, then where do you want to roll it out, AWS or Azure or Google Cloud or Digital Ocean? Or do you want to use one of their PaaS services, like App Engine or Beanstalk, which, like Heroku, sorta kinda live between “serverless” and “bare metal virtual machines”?

I oversimplify, but you get my point. We’ve never had more options, as developers, more tools available to us … and we’ve never had to struggle more with analysis paralysis, because it’s awfully hard to determine which of the possible toolsets is the best one for any particular situation. Sometimes — often — we have to be happy with just selecting a good one. And that selection problem doesn’t look like it’s going to get easier anytime soon, I’m afraid. It’s a strange time to be a coder. We live and work all tangled up in an embarrassment of riches.