Post

Trading Network Tunneling For Virtualization

As someone who spends a lot of time with Ruby on Rails and system administration, it’s clear that Linux has to be my main development environment. At the same time, as someone who enjoys gaming and still finds Microsoft Office a better tool than Google Workspace, Windows is not something I can easily skip. The need to balance between Linux and Windows is, therefore, unavoidable.

Yes, I know what most developers are going to say next: “That’s why macOS is such a great OS.” And to be honest, as a former Mac user, yes, you’re right. Still, macOS isn’t 100% Linux for me, and it doesn’t offer 100% of what Windows does either, especially on the gaming side. That said, it comes pretty close to bringing the best of both worlds together. Since I’m not planning on getting a Mac, though, let’s drop that option for now, even if I’ll admit I’m still an Apple user with my iPad Air, which I still find to be the best portable computing option out there.

Getting back to Windows versus Linux, the first obvious option is dual boot. Dual boot works, but it quickly becomes tiring when you’re jumping between both systems multiple times a day. The next natural move is virtual machines. Running Ubuntu on demand while keeping it in the background is appealing for its practicality, but after a while, performance starts to nag you, especially once you’re used to a full, standalone OS. I even tried running exclusively on Ubuntu for two years and got fairly creative playing video games with Lutris and Proton. In the end, though, you still miss Windows performance in that area, and of course the still irreplaceable MS Office, although I’ll admit I managed to survive on Google Workspace alone.

And for sanity reasons, let’s pretend WSL isn’t a real thing, and don’t tell me it’s getting better.

Eventually, I moved to a different style of VM usage. Instead of running a full Ubuntu desktop with a GUI, I switched to Ubuntu Server and used VS Code on Windows over SSH. That clicked as the best version of what I could have: Windows for practicality and performance, with a Linux shell on top. For a while, this was my main setup. I would boot a VM, let it run in the background, and jump into VS Code. I could open as many terminals as needed in VS Code, SSH in with PowerShell when necessary, and let the magic happen.

Nowadays, I run a slightly improved version of that setup. Instead of Ubuntu Server on a VM, I’m running it headless on an old laptop I got from my previous job at Unlocked. It’s an i7 with 16 GB of RAM and a 500 GB SSD. Connected to my desktop over the same 1 Gbps LAN, performance is spectacular. Coding and system administration now live entirely on Linux, while Windows is reserved for Office, gaming, and the occasional streaming tools.

Combined with my WireGuard admin access on that laptop, and SOCKS configured in Firefox, I can even access Web GUIs as if I were using the laptop directly. This gives me a total separation of concerns and minimal clutter on both systems, with an extra advantage. When I’m on the move, I no longer need to bring a laptop to code or work. Thanks to Tailscale, I can bring the full Linux environment to my very portable iPad, including VS Code Web on demand. All of this runs with minimal energy consumption at home, on a machine that is wake-on-LAN capable and effectively has its own native UPS system: its battery.

I still make use of VMs on Windows, though. When I want to spin up a lab with multiple clients and different operating systems, nothing beats that level of practicality. The same applies when I need a specific tool that requires a different Linux distribution. Overall, however, this setup truly feels like the best of both worlds for me, offering an ideal environment for coding and system administration with excellent performance. It does assume you’re comfortable living in the shell, though, since there’s no GNOME or KDE to fall back on.

This setup may look like overengineering for many developers. In my case, it fits my work style and I already had the hardware available, so it was a no-brainer. I also imagine there aren’t many developers or sysadmins who need to jump from terminals to OBS, or from a Rails console straight into PowerPoint.

Still, if you find yourself constantly switching between these operating systems, I’d suggest giving something like this a try, even if you start with the VM option.