Putting your inner software architect on mute

Stop me if you’ve heard this one before.

You just came up with an awesome new app idea. It’s tied to a problem you ran into in your daily life, or a hobby that you want to do more with. A spreadsheet that just doesn’t do enough, existing apps that just don’t scratch your itch the right way, new technology you want to dive into.

Excitedly, you already come up with a fun name for the project (or generate it with ChatGPT — no judgment here, naming things is like the hardest thing to do). You might even register a domain name (before someone else suddenly has the same idea and takes it!) You probably also made a private repository on GitHub (or public, if unlike me, you don’t want to hide your embarrassing list of barely-started projects from your peers).

You crack your knuckles, you’ve set some time apart to work on it.

(an image of a fair-skinned feminine-appearing person with red hair and make-up on, a sleeveless black top, with blue and orange light effects overlaying their appearance along with code, lines and binary numbers.)

Oh — you should probably set up a dev stack first. Dockerize that stuff. If you’re lucky, you have a ready-to-go setup. But otherwise, of course, you first have to write a docker-compose.ymland some Dockerfiles— oh, and then you should add some CI/CD tooling, and you probably need a Makefile to execute all those console commands a little easier, and…

You’re already tired just thinking about it. You tried to make it work, but a few hours in you’re still getting some error when trying to run your most basic test on GitHub Actions. You bash your head against the keyboard.

Several months later, you delete the registered domain.

Let’s say you manage to put Docker aside for a second. You can just use symfony server:start right? It doesn’t have to be production ready right away (even though you really want it to be — that’s the proper way to do it after all).

You fire up a fresh install of symfony new —webapp my-awesome-new-idea and gaze at the dozens and dozens of files and folders that just appeared out of thin air. (Don’t look at what’s in /vendor/.) Okay. Okay. You know how to do this. Let’s start with a full relational database model. Or adapt the standard Symfony folder structure to fit a fully domain-driven-design CQRS event-sourcing hexagonal architecture instead of Controller/ Entity/ Repository/. Let’s make sure to create abstractions for the most common services first, like your storage layer, caching layer, mailer client… actually, in your vision, you’re building the next great app so you’ll need proper user management. People need to be able to log in, and reset their password, and get a single-use login link… oh, maybe you should use OAuth instead?

You’re halfway through designing your e-mail templates and testing them on different clients when you realize you’ve forgotten what your cool idea was, and actually, you just want to plop down on the couch and play a videogame or watch YouTube or something.

A year later you quietly remove the repositories (frontend and api and docs) that you set up.

Sound familiar?

If so, you’re just like me!

Over the past years I’ve had so many ideas, each with their own domain name and GitHub repository that invariably ended up gathering dust as I ran head-first into wanting to set up an entire production-ready full-stack web application from day one.

So when I had another cool idea recently, I was like… how do I not do that and just get to the fun part right away?

I have 15 years of software development under my belt, and I know exactly how to build the perfect app from the get-go! … Except, the perfect app doesn’t exist. As experienced developers, we see the green fields where no code yet lives, no foundation is built, no tech debt exists, and we imagine doing everything exactly right, exactly the way it should be according to all the standards in our industry, and especially it should be nothing like all the legacy we’ve had to deal with in our career. Ha, we’ve learned from those mistakes! We’re going to implement this our way, and not the way of the (dozens?) of developers who came before us whose questionable decisions we had to wrestle with on a daily basis. This is OUR time to shine!

But after wrestling with yet another Docker setup for the tenth time, I had a good look in the mirror. “Daniëlle, what are you doing? Weren’t you going to make this thing you’re excited about? What the heck is this?”

So I threw it all out and started from scratch (with a symfony new —webapp that is). What if I could pare it down to the basics? A controller, and the most simple of outputs. No Entities, no Domain, just put all the logic in the controller. Not a single extra class to encapsulate anything. No database design. Just use a JSON file. No UX, no CSS, nothing. Not even one unit test.

And it worked. I looked at the tiny ugly page I made that did one simple thing (read a JSON file and update it from a POST request) and I felt so accomplished.

And I’m a PHP dev, so technically I could have made it in a single file with no Composer, no autoload, no framework, no nothing. I could’ve made an index.php with some $_POST-processing (ha!) in an if-statement, throw a file_put/get_contents in there, a file_exists just to be sure, and just put all the HTML in the same file. Done.

As software architects, we have the skill to envision how all the pieces of a big puzzle can fit together. What a system of a certain scale would require, what the best way to set it up is, what the best approach is when dealing with a big web application with thousands of users. But along the way, maybe we forgot how to just put a single simple idea out there, with none of the frameworks and tooling we’ve gotten so used to.

And how did I come to this insight? Well, a meme has been going around:

Just make it exist first, you can make it good later.

I think I’ll print that one out and hang it up above my monitor.

What about you? Have you stumbled over your inner professional perfectionism too? Perhaps it’s time for all of us to put that voice on mute, and just make what we want to make, as simple as possible. Bring your ideas to life. Everything else can wait.