2021: State of the Software
- 1732 words
- Estimated Reading Time: 9 minutes
In my last post, I documented the physical things that I use in my office. Most importantly, the various devices I use to get things done. This post is its sister in which I share the collection of software that I use most often on those devices.
On the Laptops and Desktops#
Operating Systems#
My strategy for computers is that for work I use whatever my employer provides. Preferably a macOS or Linux. For my personal computers I keep upgrading my macs until the hardware is no longer supported. Then I switch them over to a Linux distro. I’ll using the old macs running Linux until they physically break. My experience has been that they break before they’re too slow to perform the work I need.
The only drawback I’ve encountered with this approach is in the realm of gaming. Macs in general aren’t great for gaming and old macs especially have issues. I’ve been disappointed several times by outdated OpenGL drivers. I keep flirting with building a gaming PC but given the current chip shortage, graphic cards are priced higher than the entertainment value they provide.
OS Specs
Machine | OS |
---|---|
Work Laptop | macOS BigSur |
Personal Laptop | macOS Catalina |
Personal Desktop | Ubuntu 20.10 |
Terminal Emulators#
Computer terminals are divisive. People love them or are repulsed by them. I’m definitely in the first camp.
In the macOS environments I use iTerm2 for my terminal emulator. I haven’t found one on Linux yet that I like as much as iTerm2. Right now I’m using Kitty on Ubuntu, but I keep searching for a better one.
It really comes down to I just want to be able to split the terminal into nested panels with a right click rather than having to use something like tmux. I used tmux for years but for my workflow, I prefer to manipulate the window with right click context windows. I know that will make some people cringe, but eh…
Shells#
Last year I switched my shell of choice from Bash to Zsh. I’m really glad I did. Zsh combined with a theme can supercharge the terminal. I use the powerlevel10k theme to configure my prompt.
Programming Languages#
I love writing software. It’s just that simple.
Life however, isn’t simple and as such I don’t get to spend the majority of my day writing software at the moment. Because of that I tend to use high level languages that enable rapid delivery. For functional tasks like building web services or small sites I use Node.js. Anything involving data transformation, analysis, or prototyping I use Python. Put another way, if I need to deploy something I use Node.js. If I’m building something that is just going to run on my machine I use Python.
Diving a little deeper into my programming preferences, I use nvm to manage installing multiple version of Node.js. For package management I’m using npm. For Python, I use poetry to manage Python projects. I can’t recommend poetry enough. It removes most of the complaints I had about working in Python before I discovered it.
Programming Environments#
I just can’t get excited about programming environments. They all suck in some aspect. At the moment I’m use VSCode for the place where I read and write code. I’ll drop it like a hot rock though as soon as something new catches my eye. No disrespect to the folks that build VSCode. It’s the best IDE I’ve used and its free. But… I want more.
Browsers#
I use Chrome all day long across all my machines for two simple reasons.
- It’s a supported browser for most of the stuff I access for work.
- It enables grouping tabs.
That’s it. Firefox I love you. I love what you represent, but please. I’ve got too many tabs. I need to group them.
Terminal Apps#
It’s silly how much joy a good terminal app gives me. Ideally, they do one thing, have good documentation, not too many options, and work well with STDIN, STDOUT, and STDERR.
My Favorites
My top three favorite apps are tldr, git, and brew Most applications have man pages or help messages. Sometimes these can be a bit excessive. The tldr app is brilliant in that it provides community sourced minimized help pages for the most popular apps. I use this at least once a day.
Git is a distributed source control management system. I use it for all of my development and writing efforts.
All of these apps have to be installed and kept up to date somehow. For that I use Homebrew which is brew on the command line.
Most Useful
All day, every day, I have a terminal open that is split horizontally. In the top panel I run glances and in the bottom panel I run task.
Glances is a powerful system monitoring program. Before finding glances I used htop. This is great for answering the question: “why are my MacBook fans running all of a sudden”?
The task command is from the application Task Warrior. It’s a todo list manager for getting things done. I alternate between using this religiously and not at all.
The Workhorses
To get actual work done, I typically have to pull data down from a web site or REST Service. This then needs to be parsed, chopped, transformed, or generally munged. For this I use jq for working with JSON and xsv for working with CSV files.
Bonus Pick
The app jc can be used to transform the output (STDOUT) of some of the most popular tools into JSON. This can then be further processed using a tool like jq.
Insights
When I need to understand a metric about a file or a shape of some data these are the tools I reach for.
App | Purpose |
---|---|
cloc | Count the lines of code in a complex code base. |
graphviz | Visualize graphs and diagrams. |
tree | Display a directory structure as a tree. |
wc | Count the number of characters, words, or lines in a file or stream. |
Shell Helpers#
I’ve collected a lot of helper aliases and functions over the years. Here are some of my favorites.
Friction Reducers
I do a lot of writing. Sometimes I want to lookup the definition of a word without having to switch over to a browser. In those moments, this little function helps out.
function define(){
if [ "$#" = "1" ]; then
curl -s dict://dict.org/d:$1
else
echo 'Usage: define <word>'
fi
}
Sometimes I need to just host a directory as a web page. This alias is a handy way to do so. By having an alias, I don’t have to make a decision about which way to serve the directory.
alias serve="python -m http.server 8000"
Drop In Replacements
I replace the ls command with exa. I find that I’m often running ls multiple times trying to answer questions. This alias helps me find the answers related to file rights, ownership, git status, and size all with one command.
alias ls="exa -l -h -s size -r --git -F"
Traditionally, I use du when trying to figure out where all my hard drive space went to. However, I think ncdu is a bit more usable than the traditional du so I’ve swapped out the system default du with ncdu.
alias du="ncdu"
Same with htop. Top is great, but htop is greater.
alias top="htop"
Git Helpers
Git logs are a boy’s best friend when doing team based development. I like this git log alias because it helps me make sense of multi-branch merge history.
alias glog='git log --graph --pretty=format:"%H - (%an on %ad) | %s" --date=short';
I do branch based development. After I merge branches I delete the old ones, except when I don’t. They build up and after a while I have a bunch of old crusty branches. This function deletes all local branches that have been merged to master. Use with care.
function delete_merged_branches(){
git branch --merged | grep -v "master" | grep -v "*" | xargs git branch -d
}
Desktop Apps#
Currently I don’t use very many desktop apps. Other than the ones mentioned already, I find that I use rectangle for windows management, 1Password for keeping secrets, and Slack for talking to co-workers.
Web Apps#
It seems that most activities that don’t occur in the terminal happen in the browser. In that regard, I use Google’s productivity suite of tools, LucidChart for diagraming, and GitHub for all things code related.
Most Joy Inducing Features#
Everything list on this page makes me happy in its own way. These features however, are unique in that they felt life changing when I discovered them.
- Tab Groups in Chrome.
- Spaces on MacOs
- iTerm2 pane splitting.
- I use the kanban style project boards for all kinds of stuff on GitHub.
On the Phones#
So that is a long list of stuff I use on the laptops and desktop. I find that I produce stuff and collaborate on the computers while phones are reserved for reading. According to my iPhone’s Screen Time metrics, for a given week, I use – in descending order – Safari, Castro (podcasts), NYTimes, Messages, FlipBoard, and Reddit.
FlipBoard is a news aggregation app. I like the UI and have been using it since it first launched. However, I’ve found it less useful over the years. Now I only use it to read Hacker News. Over time, my usage has transitioned from FlipBoard to Reddit.
In addition to the apps listed above I also use Bear for taking notes, Spotify for streaming music, and 1Password for keeping secrets.
Dark Sky is my go to weather app, however they were assimilated by the borg Apple so I need to find a new one.
In a Nutshell#
So that’s all the stuff I use on my various devices. A result of writing this article is it has made me aware of just how much I do either in a VSCode, a terminal, or a browser. That’s a big shift from just a few years ago. I’d like to do a similar exercise a year from now and see how things evolve.
My prediction is that even more of my activities will shift to a cloud hosted service and the need for a high end laptop will go away. A lot of the terminal stuff and programming related activities could be done using something like CodeSpaces. I guess time will tell. Until next time.
- Sam