Shipping fast, then iterating
Table of Contents
I have been a pretty avid reader of the Indie Hackers website for a long time, as far as 2019 as I remember. And recently my interest has peaked back.
I really like that more and more I read about the idea of shipping fast, iterating, the ideas that you can find in the book the lean startup. This should be a cure to the paralysis we have when instead of working on something and launching it, we keep on postponing the launch or even working, with the excuse of “it is not perfect yet” or “there is too much complexity”. Ideas should be trimmed to be as lean as possible.
In order to test myself, I want to see if I am capable to design, code and ship a very basic web app in 3 days, working ~2 hours each day after my day job.
Last week I worked on the idea of a simple service that would get the jobs from the “Ask HN: Who is hiring?” threads, but I then imagined that I could use OpenAI’s API to parse the jobs, I kept on adding features then I got bored, and deleted the repository from my GitHub…
Let’s see how far I can do in 3 days, starting from scratch:
13 November - 1:58:57 worked #
- Created the mockup
- Listed the features & the first tasks
- Initialized the repo
- Created the models and ran the database migrations
- Coded both management commands to get the threads and the jobs
- Served a base template
14 November - 1:58:19 worked #
- Displayed threads
- Displayed jobs
- Added month select in form
- Lost a lot of time because of imperfections, confusion, lack of frontend knowledge…
15 November - 2:12:43 worked #
- Redefined the management commands in order to not spam hn’s API, to avoid being blocked
- Got myself the cheapest Digital Ocean VPS available
- I got the app running on the server through gunicorn, 1h28 into the deployment thanks to the DO tutorial
- I got the app running through gunicorn & nginx at the end of the session. Funnily enought, I was misunderstanding that the app was actually running on the default 80 port… it is available here
Remaining tasks #
- Use domain/subdomain
- Apply an SSL certificate
- Run cron jobs so the jobs & threads are automatically fetched
Learnings #
Parkinson’s law hits hard, the bulk of the tasks were usually done in exactly the time I gave myself for it. I expected to work 3 days, 2h a day, planned to work on the setup, design & backend on the first day, to work on the frontend and search on the second day, and deploy on the third day. It is EXACTLY what happened. I didn’t go into the details, but those details are what 10x the time of a project.
So many times I do things that are not perfect. As a professional SWE, I strive for perfection when writing software, try to follow the best practices, constantly am on the lookout for a better code structure or optimizations. But it should be the least of my concern when I aim to ship a product. I am not writing on a software that is used by millions of people like I do in my day job. I am working on something that will probably will never be used by anyone if I lose focus.
Often, I referred myself a lot to previous projects on my GitHub, it is a great speed-up to have references to your own work so you know exactly where to search for what.
I should accept that I may realize that some idea will be too costly, in terms of effort, time, or whatever resource, during its development. So I have to be good at making tradeoffs on the go.
Things won’t probably look good, or will have little glitches, but who cares ? Launching the product is thousands times more important, because, otherwise, I’ll be the only one to ever see the product.
Remaining bytes of learnings #
Context switching is extremely dangerous, especially when time constrained.
Having a plan, and stick to it.
Use the simplest technologies, the ones you know.
Any additional features should be avoided as much as possible.
GitHub copilot is the best ally to write code quickly.
More information #
Aftermath #
- I added the SSL certificate easily with this DO tutorial
- I redirected a subdomain of this blog’s domain to the app: hnjobsexplorer.clemsau.com
- Modifying the deployed app is as simple as pulling the latest changes and restarting gunicorn
sudo systemctl restart gunicorn