I had today off too, so I spent the day eating burritos and making some updates to my personal website. I launched my fits stream the other day and started sharing it publicly while making some usability and performance improvements that this new project exposed. Few improvements included adding a permalink + a quick way to copy that link to clipboard since people were referencing their favorites by the #. On the performance side, I added lazy loading for the images and added some responsive image handling so that the content wasn’t reflowing every time a new image loaded. I tried to do the same for the preview images for my posts, and that’s when I ended up in a hell of trying to do a super simple thing in theory which was impossible to execute on in reality.
I was growing increasingly frustrated with Hugo (the static site generator I use for my website) because there was something I knew was possible and had found many examples of doing so, but I wasn’t able to reproduce it properly. It’s the most frustrating feeling when you see it working in another place but not when applied to your scenario, and the piece that made me feel powerless was that the feedback loop was pretty broken.
They have hot-reloading of the site on changes, which in theory, is meant to provide an instant feedback loop. This means that every time you change something in your code, it tries to rebuild the site and reflect it live. Unfortunately, the hinge that sabotages this loop is that any small programming error will block the entire page from compiling with an often unparseable error message. The result is a chaotic trial-and-error, shotgun deubgging, print-every-variable-and-assumption free-for-all. Also because Hugo interpolates things inside HTML, there’s no good way to comment out offending blocks as you’re debugging. What I end up having to do is deleting the entire line and CMD+Z-ing my way back to the original thing I tried. Eventually, after several increasingly infuriating encounters with blocks of red, I’m able to find and correct the incorrect assumption I was making and make progress, but by that point, all my creative energy and motivation has been sapped out of me. The issue is that the process is not fun, and the journey is 85% of the creative process of executing on an idea.
The added piece of the frustration is that operating Hugo is a bit like operating a black box. There’s a lot of things that feel like magic, and there’s no good way to peek under the covers because it’s all written in Go, a language that is very far from the ones you are operating in for working in the browser. Like magic, when things don’t go the way you expect them to, it feels out of your control to fix. I’m not a magician, you think to yourself. Better call in the expert. Except—when it’s your code, there’s no external expert to rely on. The last time I experienced something like this was with Ruby on Rails, which loves to preach this philosophy of convention over configuration. Essentially, it means that things should just work as you expect them to, and only when you want them to work differently from the norm, do you need to specify the deviation. For starting up a complex app, it makes things easy when you work off of templates because so much works from so little, but when you want to customize it to your own use case, regardless how small of a change it feels like it should be, it becomes an impossible task because of all the layers of assumptions that are hidden from you in the name of convention. I’m a strong believer in personal, malleable software, software that feels like you can hold it in your hands and change it to fit your needs in this very moment, rather than a dinosaur that needs to account for the test of time.
This is the 67th installment in my experiment of publishing raw, lightly edited mini-essays every day towards achieving 100 public pieces. Check out the rationale and the full list here.