Picking A Tech Stack
So many tools, frameworks and service providers to choose from. They all seem alike and their landing pages appear to be interchangable. Being an idealist I put in more effort into making these choices than I should have.
Save some time and have a look at the theory behind my technical decisions. You’ll find a list of services that I use at the bottom.
Don’t run your own server
I always feel a tingle of anxiety when someone mentions they host their hardware over at Hetzner. I’ve been running servers half of my life and if there is one thing that I’m certain of is that they will break.
Disks crumble, filesystems run out of space, memory sticks get corrupted, CPUs fail, power supplies burn down and network cards start dropping frames.
It’s fun to run a physical server, if you’re into that sort of thing, but when you’re building a product you should be focused on building, not fun.
Use a virtual machine from AWS or GCP. You can even get a few thousand bucks of free credits to get you started. Sure, it’s more expensive, but think of it as your first employee - a virtual system administrator.
There is no need to take care of your own hardware.
Don’t run your own OS
Scaling? OS and software upgrades? What a headache. Some applications (disk heavy for example) need to run on a “real” server, but most don’t. Avoid a whole other class of problems by going serverless.
I use Google AppEngine. Again, it is more expensive, but the time and effort saved is well worth it. Your app made it to the front page of Hacker News and you need to scale up? You won’t even notice, that’s done automatically and by default.
Serverless applications are a brand new thing. You might object and say “surely it’s better to use technology that I already know?” The first web browser was released in 1991, and Amazon AWS launched in 2006. The computer world is in a constant state of turmoil. Unless you plan to retire soon get used to learning new things quickly.
I spent my career as a UNIX sysadmin and I loved it. The job got automated away, it’s gone. Better to accept it sooner than later.
Here’s a nickel, kid. Get yourself a better programming language
I’m one of those condescending Golang users, and I’m here to tell you: don’t use Python or Ruby. Those languages are easy to learn but tough to maintain. Because they use dynamic typing your compiler won’t help you catch bugs, you can only see them with testing (or in production). This means you have to write tests that check function arguments and return values. More code makes your codebase more rigid and makes it harder to refactor.
Did you notice how certain startups create an initial version of their product fast and then development grinds to a halt? Bugs are no longer fixed, features are on the waiting list for a year or more. I’m willing to bet every product exhibiting that symptom was written in a dynamically typed language.
Go is simple (as opposed to complex), but it’s also difficult (as opposed to easy) to learn. But the languages that are the easiest to learn are also the ones that are the most difficult to use in the long run.
For some dated but still valid thoughts see these essays by Paul Graham:
My stack
Here’s what I use for my products.
Hardware
- Apps and websites run on GCP AppEngine. I deploy with a single
make deploy
. - Compute heavy software runs on AWS EC2.
All my servers run almost for free.
Software
Code Repository
It just serves as a backup, really.
Payments
You can read more about why I picked Paddle.
Mailing lists
I use EmailOctopus. Support is great, pricing is great, the UI is simple.
Email notifications
My apps sometimes need to send an email to the user. That’s different from a mailing list. I picked MailGun for their pay-as-you-scale payment system.
User authentication
I don’t want to handle password resets on my own. They seem to be the number one choice.
Blogs
Hugo.
Hugo takes some getting used to, but in the end everything seems nicely designed. It balances control vs premade well. I can write my articles in markdown, which means I can easily repost or migrate them later.
Social monitoring
Of course I’d use my own tool for that.
Programming language
I use Go for everything.
Frontend
I don’t host my landing pages separately (I know that a lot of SaaS products do that). Go has built-in html template functionality.
Other than Bootstrap I don’t use any frontend frameworks.
General Tips
- Save lots of time by integrating with other SaaS and Cloud tools, but have a plan for migrating away from them.
- You can get started with nearly everything for free.
- Use a compiled language with static typing, so your code can be easily maintained.
- “Use a stack that you know” - unless of course what you know is outdated or you can learn something better.
- React, Node, Vue - these are nice to have, but there is no need to start with that.