Blog

“That some of us should venture to embark on a synthesis of facts and theories, albeit with second-hand and incomplete knowledge of some of them – and at the risk of making fools of ourselves” (Erwin Schrödinger)

Good Software Tools

As a programmer, I spend a significant amount of time writing and using software. I'd like to list a few of my favorite tools.

Philosophy

I prefer to use open source, cross platform, local software. Old and boring is a good signal. Community driven over VC funded projects.

I don't hop from fad editor to fad editor as popularity rises and falls. I don't worry about vendor lock-in. I don't worry about Embrace-Extend-Extinguish.

I aim to keep my tooling simple, to choose software that gets out of my way, so that I can focus on getting my work done.

Emacs

I've been using Emacs for more than a decade. That said, I'm not an elisp hacker - I use Doom to provide an excellent out-of-the-box experience, without requiring too much manual setup.

My favorite aspect of Emacs is the keyboard-focus: I rarely have to use the mouse. It's an editor that gets out of my way.

Within Emacs, a few of my favorite tools are magit, projectile, LSP mode and avy.

I love magit - for my day to day git operations, committing, branching, pushing and pulling - it's an absolute breeze.

Projectile makes working within projects, typically git repositories, so easy. My frequent project related commands are memorized - find file in project, search in project.

LSP mode - support for IDE-agnostic language servers - has been a godsend. No longer do I have to learn the specific nuances for each programming language mode, it's all standardized under LSP. Since language servers are developed independently, they also tend to be more feature complete than standalone programming modes.

Lastly, special shoutout to Avy and avy-goto-word-1. At first I didn't understand it, but when I understood the zen, that is, "look at where you want to go when you invoke the command," it all fell into place. I use this frequently (bound to M-s) to navigate.

AI Tools

Special shoutout to copilot.el for providing seamless integration with Github copilot. I am also starting to use gptel, early results are positive but I've yet to really get in the groove.

Tmux + Tmuxinator

This may be controversial, but I don't put everything inside Emacs. I know it's possible to turn Emacs into a Trapper Keeper, absorbing all use cases, but I don't think it's always the right move.

As a primarily desktop user, I turn off/on my computer every day. I quickly felt the pain of having to set up my terminal windows every morning, and found the solution in tmuxinator. With tmuxinator, I create templates for my projects, which stand up to prepare my environment. For example, at work, my tmuxinator config includes: jupyter lab server, django runserver, celery worker, webpack, and docker compose up.

I also think these templates are great for sharing with new team members: even if they don't want to use tmux, it's easily translatable to their preferred environment.

Docker Compose

Just like with tmuxinator, docker compose is a templated tool for running project dependencies. I use it for local project dependencies on linux, and my personal project deployments on my Raspberry Pi.

It's a fantastic tool that solves a tough problem: how do I maintain different versions of dependencies (postgres, redis, elastic search, etc.) when working on different projects? With docker compose, I simply don't worry about spending time installing and configuring stack dependencies. Just run docker compose up and start working.

Pelican

I can't end this post without mentioning the software that powers this blog - Pelican. It's another example of software that gets out of my way. I write my blog posts in Markdown, keep the blog backed up on Github, and upload via rsync to my Raspberry Pi. It meets all of my requirements for good software I can trust.

Conclusion

This is just a taste of the software I use on a daily basis, for work and personal projects. I am documenting it primarily for future retrospective: in a decade, I wonder what software I'll be using - perhaps I'll just be providing quality assurance for AI generated code on some locked down corporate system. Hopefully not!