My Tools and Processes
I’ve been programming professionally for over a decade. My career started with Microsoft ASP 2.0, hacking on VBScript and ActiveX Data Objects. From there I discovered PHP and open source software. This lead me to Python through Django and eventually to Ruby through Rails.
During this time I attempted to get into design school three times. Twice at (YSDN), and once with the School of Image Arts at Ryerson. I could never make it past the interview process, too little applicable education, and a brutally weak portfolio. I kept persisting though, developing my design eye and related skills in tandem with web development. Reading as much literature on the subject that I could get my hands on, online, at the library, and buying as many books as I could afford.
I guess you’d say I’m a Full Stack Developer. To be honest, I’m not entirely comfortable with the concept, it’s impossible to be truly “all knowing” about the “full stack” because it means so many different things depending on the context you are operating in.
Anyways, now that you know a little bit about how I got to where I am, I’m going to share with you the tools that I use to perform my various roles as a software developer.
These preferences I have developed over time, based on my experiences and requirements, also my privilege. Some of these things are expensive! I’m fortunate enough to be able to afford them or be provided them by my workplace. This is not intended to convince you that my preferences are the best or that they should be your preferences too. You may have different needs based on your own requirements, experience, and budget, that’s a good thing!
My tools and processes are also constantly changing and evolving. If you have any feedback for me on any of this stuff, feel free to hit me up on Twitter or send me an email: firstname.lastname@example.org
MacBook Pro 15’’ (1st gen TouchBar)
This is my company issued laptop (thanks Crowdmark), it is also my choice of laptop. I would own this exact computer regardless of my workplace or not. I like Apple hardware, I like how well they support their products, I like that they take privacy, security, reliability, and ease of use seriously. My experience with Apple products since 2006 has been overwhelmingly positive.
In the fall of 2018 I had an issue with the keyboard sticking, I took it in and they replaced the entire keyboard, battery, and TouchBar, no questions asked. Since then I have had zero issues, and the keyboard feels even better.
When I was first diagnosed with lymphoma, my friend Jamie Gilgen rallied the cycling community and gathered enough money to buy me a much needed new phone! Amazing. I’m still in awe of all of the generosity I have received. This made me realize just how important my phone has become in my life. It is a vital communications and productivity tool and an intergral part of my modern life.
My previous phone (an iPhone 5) was fine, it functioned. But when I upgraded to a modern, fast phone it was stunning how much smoother it made everything. With a good phone I can do so much! Whenever I see a way to remove friction by changing tools or processes and I am able to act on it, I do. I didn't realize that my outdated phone was adding so much friction to my day.
I have always thought of tablets as sort of a frivolous thing, useful, but also not really necessary. I don’t think that anymore. During my time sitting in chairs hooked up to IV pumps, I pulled the trigger and got an iPad. It was great! I could watch YouTube, do emails, play games, Facebook, all that good stuff so easily, without toting a 15’’ laptop everywhere. I also find the tablet incredibly useful as a writing tool, some of my fave apps:
- iA Writer: Awesome writing tool with Markdown support
- Working Copy: Great app for interacting with Git repos
- GoCoEdit: Great text editor for code and can SSH too
- Terminus: Wicked SSH/Mosh client for accessing servers remotely from iOS
All those apps work on the iPhone as well and I've used them all on there too. I also really enjoy fronted dev on the iPad with Safari using the remote inspector / dev tools. It works really well and makes interactively developing UIs on an actual touch device a lot nicer. (Try simulating a stylus on your XCode simulator 😩)
I’ve also used VMware Fusion for many years. It’s good–it works well, but it’s not free and I just don’t think it’s worth the cost given how good VirtualBox is now. In the past I had all of my development environments in VMs managed with Vagrant. These days I’m using Docker for that mostly. I find myself using Virtual Box mostly for testing things in Windows using Microsoft's free VM images.
Docker and Docker Compose make creating and running development environments a breeze. You also gain the advantage of being able to apply a lot of these learnings directly to production environments, and CI too! Now days with Docker Desktop the performance and stability of Docker is satisfactory or beyond satisfactory for my needs.
Shout-out to my lad Aanand, good friend and co-creator of Docker Compose!
Visual Studio Code
Oh, text editors. I have used a number of editors over the years, you name it, if it’s somewhat popular, I’ve probably tried it. Notepad+ back in my Windows days, TextMate 1 and 2, Coda, Sublime Text 2 and 3, Atom, vim, MacVim, NeoVim, Spacemacs, and over the past couple years Visual Studio Code.
I do about 80% of my coding and writing in Visual Studio Code, it works fantastically! The ecosystem of extensions is incredibly rich and diverse, and often very high quality too. It works great for any project I am working on, and Live Share is a godsend! Collaboration and learning through pairing is becoming very important to me. It's exciting because I now have an editing and programming environment that's very powerful and is also incredibly accessible to newcomers. Tmate is excellent, and I have used tmate for years and will continue to. But terminal-based sharing can be daunting for someone new to programming or pairing in general.
I really like the Material Dark theme, I’ve always preferred dark themes, I find them less visually fatiguing. I set a visible gutter to 80 columns and keep my code within that boundary. I use spaces for indentation, defaulting to 2 spaces. I’ll change that depending on the project, but that’s my default. I also enable show trailing white spaces. I use the Source Code Pro font set in the Regular typeface at 15pt.
Git / GitHub
However you decide to store your source repositories, I feel it’s super important to use some form of version control. When I started my career Subversion was the standard, around 2007-2008 I learned about Git and was sold on it immediately. I also really like GitHub, I have been using it since it launched and continue to be a satisfied customer.
For about 5 years now I have been using Z shell (zsh) as my shell, with the help of Oh My ZSH. I still really like it a lot! As far as macOS terminal apps go, I had a brief time with Hyper a year or so ago and I liked it, but it just wasn’t quite for me at the time. I look forward to seeing how it has progressed since then. I think there is a lot of room for improvement in CLI interfaces, shells, and terminals!
Chrome / Safari
I tend to use Chrome on my desktop environment (macOS) and Safari on my touch devices (iOS). Firefox is also really great on macOS, but I just don't find myself using it very often. Developer Tools in Chrome are still my preference, but Safari is rapidly becoming a close second for me these days.
Installing command-line software on your host computer (directly on your laptop) can be a messy thing. Package managers like Homebrew attempt to solve this problem, and Homebrew does a pretty good job! I have also used MacPorts but never went back after switching to Homebrew a number of years ago.
At a time I was just happy to get a server running my code! Over time, I saw shortcomings in my processes. Manually building servers, became manually provisioning VPSes on Linode and AWS EC2. That then became a step-by-step guide. Which then became a shell script (bash), that then became a CLI tool for building and deploying shell scripts. That became a series of Ansible Playbooks (no longer maintained) for provisioning and configuring servers.
These days I still use Ansible, but not as often for configuring server dependencies and software or for provisioning development environments, I use Docker for that now. I still use Ansible for automating systems administration tasks, and even for orchestrating AWS infrastructure changes, it’s a great tool!
pyenv / rbenv / nvm
For running and installing Python, Ruby, and Node directly on my host machine, I use their respective version managers so that I can easily toggle between versions for different projects. I can also easily "implode" an environment and bring it back up if I need to. I prefer this method over installing specific versions of programming tools directly on my machine.
SSH / Mosh
I use public key authentication exclusively for accessing remote systems. I rotate my private key usually every few years, I should maybe get on that more often 🤔
Affinity Designer / Pixelmator Pro
Probably like most designy folk out there, I started with Adobe Photoshop and Illustrator. Years ago I decided to give Pixelmator a try instead of Photoshop, I’m still using it today. Affinity Designer followed as a replacement for Illustrator, it also has a companion iPad app.
Even if you don’t "create" with these apps, you might find if you do any sort of frontend development that touches HTML / CSS they come in handy. Resizing images, resampling images, rasterizing SVG files, converting Illustrator files to SVG for use on the web, etc.
I’ve been using Things for years, it’s essentially a to-do list and reminders app. It fits in seamlessly to my workflow, I use it on my iPad, iPhone, and on my desktop. I can also share tasks with Erin via Apple Reminders. It’s my preference for managing all of the little things that come at me, that I can’t get to immediately.
There are numerous password managers these days, iCloud has a built-in one even, but I love 1Password. It integrates on all of my devices, I can store other info in my vaults, not just login information. I also have a family plan so Erin and I can share logins for various shared stuff, along with our own personal vaults. 1Password integrates well virtually everywhere, and makes it dead easy to have a unique strong password for every account.
Before I started using a password manager I was the doing the "one password" thing the wrong way, as in I had one password I used for everything! 😂 Not a good idea. I'm lucky, to my knowledge nothing important was ever breached, but I don't do that anymore!
I do not have an external monitor at the moment, I plan to get one in the future when I am able.