Build Side Projects Efficiently
Around 2 weeks ago I talked about HTMX the first time I played with it. I wanted to understand the buzz around it and find out if it would make me productive, while also exploring renewed ideas. I've been working on a personal budgeting app, mostly driven by privacy concerns. I really don't like the idea that my personal financial data should be stored anywhere but on my local machine. I'm not looking for anything complex as long as I can analyze quickly my spending trends over time and where the money is going. This is the third time I'm doing it and definitely the most productive one. I took the chance to look back at my previous attempts, some of which made it actually quite far.
Some of the mistakes I made:
- Not clarifying the bare minimum functionalities: what is the set of features that would allow me to use this app as soon as possible? I envisioned an ideal final state and didn't bring it down to its bare bones. This often led to building features too future-proof when I didn't even know what the future was holding. Early abstractions, trying to cover too many "nice-to-haves" earlier than necessary, ... . On my third attempt I wrote down the absolute minimum the app needs to do well. I got there really fast and I can already use it today.
- Trying too many new tools/frameworks at the same time: this slowed me down in the beginning and made things frustrating more often than not. Some frameworks are worth exploring but I realized that combining too many new things together can be discouraging given how it affects your pace. If you don't start using them regularly, by the time you get back to it, the muscle memory is partially gone so it continues to be an intermittent frustration. This time I realized that HTMX made me productive right off the bat, a lot of concepts clicked right away. I tried to stick to Go adding a library or framework only when I was hitting a barrier, no earlier.
- Trying to serve imaginary users: focusing too much on making one user flow perfect before moving to the next one. This makes it incredibly slow and you are rewarding the short term goal sacrificing looking at the project as a whole. I was worried about not addressing these issues earlier but since I'm not creating a 100k loc project it is pretty easy to go back and refactor. In the end I am the user. I don't need to tackle edge cases or specific error handling or even loading states. I can handle it later, right now I know how to make a flow work. If that flow doesn't work then I fix it and move on. This brought me to a comprehensive view of the project much sooner.
Thoughts
This was definitely not a complete list, I was thinking about it as I reviewed the project progress after using HTMX. I was surprised at how quickly I got as far as my last attempt in a much shorter amount of time. It's just Go, HTML and CSS. Tailwind in this case was helpful, since I have good familiarity with CSS I can just use classes intuitively. Even today I spent a few hours on the project and was able to tackle way more than I anticipated. Not having to deal with an additional layer of configurations for the front-end is refreshing and generally maintaining a type system all in one place makes it so nice to work with. Today I moved from go templates to using Templ and my productivity got another boost, refactoring to use it was very quick and being able to use Go directly with your HTML without having to worry about the templating syntax makes it a smooth experience.
I think it's important to find a balance between opportunities to learn something new and feeling productive. I'd recommend building things as layers e2e. On my next layer I will most likely handle validation, loading states and error handling. Right now I can already use the app and I know I shouldn't use an empty vendor name for a transaction, I know that I can only handle csv uploads from one bank only but that's actually good enough. If this turns out to be something that others could find useful then I'll add an auth layer and the concept of accounts, but I really don't need it now. I remember spending quite some time on it on my previous iterations and while also not being the most exciting thing to work on, it was (in the end) a waste of time.
That said go out and build things, it's fun! I'm hoping to close the loop on this project by the end of the month and move to something new in March, stay tuned!