Skip to content

Tools and Processes

I was recently lucky enough to get a new work laptop. A System76 Pangolin to be precise.

OS

Linux 100%

I've use both Windows and macOS professionally for development in the past. Linux is the only one that just got out my way. Yes, we had a few bumps along the way, a bit of a learning curve at times. On aggregate Linux has just worked for me. I have use Ubuntu since it first launched, way back in the Warty Warthog days.

Windows was just to pop-uppy and only recently got a decent shell environment. macOS does have a great shell environment thanks to it's BSD heritage - but their my way or the highway approach has always felt at odds with my own sensibilities. I will admit they are making some pretty nice hardware again recently.

At the end of the day, I am not targetting my work to run on Windows servers or macOS (sometimes we are targetting iOS to be fair). So why not develop on the platform which we are actually targetting - Linux. It will help avoid a whole class of possible issues.

In the Ubuntu space, I moved to a plain gnome sessions back when Ubuntu-Gnome was a thing and haven't looked back, it just stays out the way. I really don't like snap packages though - they are just so slow to start.

I have however, on this laptop, given the oddly named Pop!_OS a go as the laptop was built hand in hand by the same folks as are building the distribution. So far I am only a few days in but I'm liking it. Basically it is Ubuntu with a differently polished Window Manager (and no snap packages!). Relearning my shortcuts is going to be painful but hopefully won't take too long to adjust to, and the built in tiling manager option is pretty neat given the way I tend to use Workspaces.

Shell

I am a fairly firm believer that no mater how fancy you get with the tooling, the IDEs and the GUIs, and CI the shell should always be considered the lowest common denominator. It is just safer, it helps avoid tying yourself to a specific tool or service. It allows those consuming your project to more easily use their own favourite tools. Yes, I know there are also benefits to standardisation - but to me at least, portability and easy of maintenance beats up front convenience every time.

  • Fish Shell with the slight cheeky tagline of "Finally, a command line shell for the 90s", fish is a modern, consistent, shell which has in the last couple of years also really improved it backward compatibility with the likes of (ba)sh. It's built in autocomplete tooling alone makes it worth while for me
  • Guake you never known when you are going to need a shell. So I use guake as my default terminal emulator. It is inspired by the terminal that was built into the game Quake. On the press of a key combo (F12 by default) it drops down from the top of the screen regardless of what screen or workspace you are currently in.

Miscillenous Shell Tools

  • Starship A super fancy prompt manager for your shell. Built in support for showing you things like the current git branch, Python version and virtualenv. Super configurable but I generally leave it pretty vanilla unless a particular integration is causing any drama
  • uuidgen, part of the uuid-runtime package on my machine, is a commandline tool to generate UUIDs. Something that I need to do more often than I thought I would.

Python Development

  • Pyenv for managing multiple version of Python
  • Pyenv-virtualenv for creating and managing straight virtualenvs with pyenv
  • Poetry for a more modern approach to dependency and virtual environment management. I have this installed globally, and it is my prefered approach for new projects
  • Invoke for task automation within projects. I tend to install this directly into the pyenv controlled python environments as I build them. That way project bootstrap tasks can be run without any need to create a project specific virtualenv and manually installing the dependencies first. This works nicely with poetry, set the local Python to be whatever version I need and then write tasks that calls poetry install and poetry run ...

Code Editor/IDE

  • VSCode is fast and easy to get up and running. Excellent Python support (as well as pretty much every thing). For me it strikes a good balance between functionality and complexity/weight. It may not have quite all the bells and whistles of a true IDE like PyCharm but it also generally tends to use a lot less memory and CPU.
  • vim is my default terminal editor, and as such I set the environmental variable EDITOR to vim. I am by no mean a vim Wizard, I know just enough to be dangerous.

VS Code Plugins

I use the following extensions day to day:

  • Python for Python language support
  • Project Manager for super easy switching between projects and workspaces
  • Pylance for fast, live type checking within VSCode
  • Live Share for live pairing sessions
  • Rainbow CSV because visualise CSVs should be more colourful and we all need more rainbows in our lives
  • Remote Bundle support for remote development inside Docker containers or over SSH
  • Docker although I general control docker containers via the terminal, it can be handy to have tooling built into vscode too
  • Markdownlint because linting is almost always a good idea, even in documentation
  • DotENV so that run task in vscode can automatically load their environmental variables from the .env file I invariably already have in my projects

To be fair to those people who like big integrated IDEs, you can save yourself a lot of time by just installing Pycharm and is have pretty much all of the above built in and more.

Communications

  • Slack because that is what we use for internal realtime(ish) communication. Slack channels tend to... proliferate. Ao I have my channels set to hide when there are not new message and make extensive use of groups to highlight important channels

For email I just use the regular GSuite stuff from Work but I do try to exercise an Inbox Zero approach. If an email cannot be dealt with immediately, it is moved to a task on the backlog. Email, like slack messages should really be treated as ephemeral, todo lists are forever!

Workspaces

Use them! At least on Linux. macOS workspaces make no sense to me and are super slow. I am not sure if Windows even has the concept. I use them to compartmentalise groups of things. In general this means:

  1. Communication - relegate Slack to it's own workspace in order to avoid distraction
  2. Code - Just a single VSCode window, plenty of real estate, minimal distractions
  3. Web - All the browsers, I generally have a separate profile for personal, Internal work, and per long term client. I tile these so there are 3 quarters covered by 3 separate browsers and then a 4 quarter just under my webcam for making calls
  4. Music/Misc - mostly to just keep it away from work stuff

Learn the shortcuts to switch between the workspaces, and move windows between them and suddenly your life will be a lot smoother. No window juggling, no Alt+Tab on repeat. Just up and down between workspaces and you are immediately presented with what you need.

Screen Recording

  • OBS aka Open Broadcast Software is an exceptional piece of software for all manner of broadcast needs. I use it for screen recordings and to record presentations but it is also great for streaming if that's your thing.