Preface
For the maiden voyage of https://zackery.dev I decided to write about the tools I use for everyday development.
I’ve been developing now for four years and in that time I’ve had quite the journey to where I am now. Over the years I’ve got quite a few questions about what I use for productivity. I thought I would highlight some of those tools here.
As a prelude, I develop primarily on macOS and Linux (via ChromeOS). However I have spent a lot of time developing on Windows through Windows Subsystem for Linux, and though I haven’t spent time there lately I find it a suitable UNIX-like replacement.
When dealing with developer tooling three things are important to me:
Customization: When dealing with developer tooling that I’m going to spend most of my waking hours using I need the ability to customize it to my workflows. Being able to develop custom workflows and dotfiles helps me save time, and be able to focus on the more important parts of development.
Stability: Developer tooling should be stable. I don’t want to sit down for the day and have my editor be unusable due to updates or due to misconfigurations. Customization can be at odds with stability, but it should be stable when it’s not my fault.
Aesthetic: Tooling being pleasing to look at is important to me. I’m staring at a screen all day, I want the tools and applications on that screen to be pleasing to the eye. Symmetry, alignment and even emoji support are all things that can make tools more fun to use.
Finally, these are the tools that work for me. And because they work for me that does not mean they will work for you. It’s important to tailor your development environment in a way that is going to make you successful.
Tools
Kitty Terminal
I spend most of my time in the terminal. Kitty terminal has all the features I need. Ligatures, Emoji support and a healthy environment of community themes are all important aspects to me. However the most important part is that Kitty is stable and doesn’t get in the way. I do not use Kitty for any of its tabs or multi-pane features. For that I use:
tmux
If you’ve never been exposed to tmux
or any other terminal multiplexer there is quite a learning curve. Essentially it works like this: You define a leader hotkey (in my case its CTRL+A) and when you press that leader key and then a specific key-bind after tmux
will create panes or windows in your terminal that you can easily cycle through.
If you’ve ever been using something like VSCode with an integrated terminal it works similar to that. With Kitty and tmux
I can customize my terminal screen to different workflows, resulting in something like this:
tmux
also lets me store the common config in sessions, that I can jump between. Being able to save where I was working and switch between different tmux
views for different projects and layouts helps me manage context switching.
I’m still working on my theming skills as I recently switched to writing my own theme, so the “aesthetic” of these screenshots is currently a work in progress.
Neovim
As you may have seen in the screenshot above Neovim is my editor of choice. I also frequently use VSCode (via GitHub’s CodeSpaces) but my primary day to day is spent in NeoVim.
I started learning vim
itself in 2019, it was a colossal mountain to climb, but after learning the keys (very slowly) the paradigm of a modal editor is something I can’t live without. I had read somewhere that most of the time you spend in your editor is spent reading code, not writing it. As such having an editor that provides a great experience for both is crucial to my workflow.
I quickly pivoted my Vim journey to Neovim due to extensibility with Lia and the work on the LSP, since then I haven’t looked back. If you want to know more about my Vim configuration checkout my dotfiles
Neovim along with tmux
does have a huge learning curve. I only recommend it if its something you are interested in and want to learn.
tig
+ gh
I try to get most of my work done in my terminal. Swapping between multiple applications for me causes distractions and adds complexity to what has to be running on my machine. It sounds laconian but keeping things as simple as possible helps direct my focus. That being said git
is a huge part of software development, and to help me with various git
workflows I use tig
and the GitHub CLI gh
.
tig
is the visual part of git
it helps me track changes, what changed in which commits, and what I’m currently going to be committing. On the other hand gh
helps me interact with GitHub when I need to make Pull Requests, check the status of actions and more.
k9s
The final terminal app I use on a daily basis in k9s
. I deal with kubernetes frequently in my day to day. k9s
is a nice visual way to represent your pods, deployments and clusters. I feel right at home with the vim
-like keybindings and while performance can suffer when dealing with large clusters its still immensely useful.
Conclusion
Nothing has been a larger productivity booster for me than learning to use the terminal. Getting familiar with the common UNIX commands and how you can chain them together is not only powerful but rewarding.
As I mentioned above, the more I can do in the terminal the less I’m switching around to different apps, moving windows around, and partitioning my screen. Using terminal applications with vim
-like bindings is something that reduces my overhead of learning how to use various applications efficiently.
Using the terminal for as much as possible not for everyone I will admit, and the learning curve is steep. But in software development you seem to find yourself in the terminal quite a bit and learning “just enough to be dangerous” pays dividends.