Dev Setup

My always on, resumable and good enough dev environment:

Machines

I have two work computers.

  1. A macbook air M1. Very lightweight with a good battery life. Instant resume from sleep. This is my entrypoint to my other systems.
  2. A cloud computer. Powerful, always up. I run most of my services and apps there.

I have the best of both worlds. A lightweight computer with a powerful backend.

A Terminal with never ending sessions

The next step is to be able to quickly resume work. For that I use tmux as a terminal multiplexer, mosh to handle connections to remote servers and autossh to handle port fowarding to access my tools running on my remote server.

Tmux remembers all my terminal sessions. How I have split my screen, what I am running, how many open sessions I have. Mosh remembers which server I am connected to. It automatically resumes connections. It handles latency and intermittent connections. Autossh as I said forward my ports between my computer and my cloud server. It auto re-forwards when needed.

Thanks to Tmux and Mosh I can close my terminal, close my laptop, open both back and resume work in 5 seconds with all sessions and services still alive.

File Sync

I prefer to avoid synchronization between computers. It introduces a hard point of failure and can cause debugging problems. For example I had instances when all files except one would sync. I would spend hours—making wrong assumptions—debugging while It was just the file synchronization being broken.

This being said, when I have to I use mutagen to sync my code across computers. It is pretty resilient. Just be careful with the number of files you sync. I have a ~/.mutagen.yml where I specify folders to ignore. For example .git, node_modules etc. Once I have setup the sync I can forget about it, even through reboots.

The commands are pretty simple and self explanatory

  • mutagen sync list to list syncs
  • mutagen sync create to create a sync
  • mutagen sync terminate to stop a sync

That’s all I ever use 99% of the time.

Code Editor

I am a code editor addict. I have working advanced configurations for emacs, vim, intellij, sublime text. None is perfect and I miss features from the other ones. Because of that I have been switching too much between editors.

I found an interesting concept in The Paradox of Choice1. It introduces the concept of satisficers vs optimizers. An optimizer has trouble choosing what to use. A satisficer looks for a solution until he finds one that is good enough.

I have been looking for the perfect code editor like an optimizier. This is an endless quest. I am now satisfied to use an editor good enough for my workflows. I have seen awesome programmers effective with all sorts of editors. What’s important is to focus on what is good enough for you.

I have a list of things I absolutely need in a code editor:

  • quick jump anywhere
    • between related files. For example between source and test.
    • Jump to symbol in File
    • Jump to symbol in Project
    • Jump to file
    • Jump to library
  • easy to customize
    • colors
    • snippets
    • keybindings
    • third party plugins
    • makes it easy enough to write my own plugins
  • works on remote servers. Through ssh or with a server/client setup.
  • help system
    • for commands
    • for keybindings
    • for settings

Thankfully a lot of code editors support this those days. So it is more a matter of personal choice regarding the UI, integration with other tools and your workflow.

  1. Schwartz, Barry. The Paradox of Choice: Why More Is Less. 1st ed. New York: Ecco, 2004.