Migrating from Windows to Ubuntu: A Developer's Diary
For the better part of a decade my daily driver was a battered Lenovo running Windows 10, and I had grown used to the rhythm of it: the morning reboot, the slow creep of the Start menu. Then, one Tuesday in late autumn, I copied my projects onto an external SSD, installed Ubuntu 22.04 on a spare partition, and told myself I would keep notes. What follows is a lightly edited version of those notes, recovered from a folder I had forgotten between Melbourne and a small office in Brunswick.
The decision was not sudden. I had been watching the shift toward containerised workflows for a couple of years, and most of the tools I relied on had matured to the point where the operating system felt like a thin layer of habit rather than a load-bearing structure. Git worked the same on either side of the fence. Docker behaved better on Linux. Even my text editor, a plain installation of VS Code, ran identically. The real reason I moved, if I am honest, was the terminal. I had grown tired of fighting PowerShell into behaving like a Unix shell.
I also had a practical reason. My home internet in suburban Melbourne had finally been upgraded to the NBN, and the extra headroom made it cheap to spin up remote build servers. Paying for cloud minutes in Australian dollars is still more expensive than it should be, but it is no longer the deterrent it was in 2018. I could keep a heavy test bench in Sydney and do my writing on a smaller local box.
This is not a how-to. There are plenty of those. It is a record of the small frictions, the quiet wins, and the few moments where I genuinely missed the blue screen of a Tuesday afternoon.
The first boot and the empty desktop
Ubuntu's installer is friendlier than its reputation. I went with the minimal ISO, ticked the box for third-party codecs, and let the installer partition the disk for me. The first boot landed me on a GDM login screen that looked, for a disorienting second, like the Windows lock screen I had just left behind.
The default GNOME desktop is sparse. There is a dock, a small grid of application icons, and a calendar widget at the top. No start menu in the Windows sense, no corner-peeking tiles, no Cortana field. My first instinct was to install things. My second was to do nothing for twenty minutes and just see what was already there.
Files, the new file manager, took some getting used to. It does not show drive letters. It shows volumes, mounted under /media with a long UUID that nobody is meant to read. I had spent years on a D:\ drive for projects. Now my projects lived under /home/me/Projects, which was less poetic but easier to type.
I am writing this section in the small hours of an Australian summer evening, and the time on the clock widget is AEST. I did not have to set it. The installer asked for my city from a list, picked Melbourne, and the rest followed.
Repositories, apt, and the package hunt
The package manager is the single biggest reason most developers stick with Linux once they arrive. apt-get update, apt-get upgrade, apt-get install, and a small terminal session later you have a coherent set of tools. There is no equivalent on Windows, unless you count Chocolatey. The difference is that the Linux package list is curated, signed, and the dependencies rarely collide in the way that MSI installers do on a long-running Windows box.
My first install list looked like a roll call of old colleagues: build-essential, git, curl, vim, zsh, tmux, nodejs, python3-pip, postgresql-client, redis-tools, htop, neofetch. None of these fought for control of the file system. None demanded a reboot. The whole list took less than ten minutes, and I did not once see a "this app wants to make changes to your device" dialog. I had forgotten what that dialog felt like.
There were a few packages I could not find. Some proprietary font collections had to be installed by hand. A small Atlassian plugin I was testing for a client in Sydney needed an extra repository. None of this was hard, but it reminded me that Linux is a world in which you sometimes have to read the README. That felt honest.
Code editors, build chains, and local servers
VS Code is the great equaliser. It runs on Ubuntu, on Windows, on macOS, and on the small Linux distribution I keep on a Raspberry Pi in the kitchen. My settings file, copied across by hand, came with me. The extensions followed. The key bindings came last, because I had to figure out which were tied to Windows-specific shortcuts.
The bigger change was the build chain. I had been writing a small Go service for a payments integration. On Windows the build had relied on MinGW and a hand-rolled makefile. On Ubuntu I dropped MinGW entirely. The system Go compiler was a single apt command away, the C toolchain was already there, and the whole project compiled in roughly a third of the time. I have since stopped being surprised by this, but at the time it felt like a small revelation.
Local servers were the next win. PostgreSQL, Redis, Nginx, even a tiny instance of Keycloak for an identity project, all installed through apt and started through systemd. There is no more double-clicking an icon and hoping the tray icon turns green. There is a unit file, a status command, and a log. It is less magical, but it is harder to break by accident.
I also spent a weekend inspecting a mobile UI writeup that a colleague had passed along. The page rendered cleanly, the fonts fell back correctly, and the screenshots in the article were sharp enough to use as references for a small accessibility audit.
Dual booting woes and the slow lane to Adelaide
I kept my Windows partition for the first month, mostly because I had not yet moved my tax software and a few other Windows-only utilities. Dual booting is a polite way of describing a long argument between GRUB and the Windows Boot Manager. I lost the Windows bootloader twice and fixed it twice with a live USB and a tutorial. I should have just backed up and installed fresh, but I was stubborn.
There is also the timezone problem. A recent trip to Adelaide put me in ACST for a week. Ubuntu adjusted the clock automatically when I connected to the hotel wifi, which was a small but welcome touch. Windows, on the same hardware and the same network, needed a manual trip into the control panel.
The NBN connection at the hotel was patchy in the way that hotel wifi often is, and I ended up tethering through my phone for most of the build work. Ubuntu's network manager handled the hotspot without complaint. I had prepared for a fight. None came.
Hardware quirks on old hardware
I run a 2014 ThinkPad, which Ubuntu supports with casual competence. The fingerprint reader needed a third-party driver. The trackpad's palm rejection took half an hour of dconf tweaking. The battery, which Windows had been reporting as "consider replacing" for two years, suddenly reported a healthy four hours of light use. I suspect Windows was being pessimistic.
Sleep worked. Suspend worked. The screen brightness remembered its setting across reboots. These are the unglamorous features of a working laptop, and they tend not to be discussed in the enthusiastic blog posts about switching to Linux. I am discussing them now because they were the difference between a daily-driver machine and a curiosity on a shelf.
I did have one persistent issue. The microphone on the webcam was treated as a USB audio device by default, and every video call I joined had me sounding like I was broadcasting from the bottom of a well. I fixed it by editing a PulseAudio configuration file, which felt appropriate. The fix is a paragraph long, and I have saved it in a file called mic-fix.md in my home directory, where it will probably outlive the laptop.
Six months later
Six months on, I still boot into Windows once a week, mostly to update a piece of accounting software that has not seen a Linux port and probably never will. The rest of the week I work entirely in Ubuntu. I do not evangelise. I am writing this for the developer who, like me, has been quietly curious and a little tired of the friction.
There is also the matter of small habits that survive the move. I still keep a folder of bookmarks that I drag between browsers regardless of the host operating system. One of them is an archived journal page I had saved years ago, partly because the layout is a useful test of how a site handles odd font stacks and partly because I am mildly sentimental about old web design. It opens in Firefox the same way on both operating systems, which is the kind of small consistency I have started to value.
The most surprising thing has been how little I missed. The pieces of Windows that I thought were part of my identity as a developer, the start menu, the taskbar, the right-click "Open with" menu, turned out to be muscle memory that lasted about two weeks. What I missed instead was the calendar widget in Windows, which I have not yet found a good replacement for. If you are considering the move, keep a plain text file of the small frictions and the quiet wins. I have reread mine while writing this piece, and they are honest, if not very interesting.
A quick comparison for the skeptical
Friends occasionally ask me to summarise the move in a way that fits on a single page. The honest answer is that the comparison depends on what you do all day, but a few areas stand out. Terminal work is simpler on Ubuntu, although WSL has narrowed the gap. Package management is still a clear win for Linux. Driver support is the area where Windows remains ahead for unusual peripherals.
The table below covers the points that came up most often in conversation. It is not exhaustive, and a few of the rows are matters of taste. The cost line, for example, ignores the opportunity cost of the time you spend configuring a Linux box to match your previous setup. That time is real, and it is worth pricing in if you are doing the move on behalf of a team.
| Area | Windows 10/11 | Ubuntu 22.04 LTS |
|---|---|---|
| Package management | MSI installers, Microsoft Store, winget | apt, snap, flatpak |
| Terminal | PowerShell, WSL | Bash, Zsh, fish (user choice) |
| Filesystem | NTFS, drive letters | ext4, btrfs, zfs; paths under / |
| Driver support | Generally immediate | Variable, often excellent for ThinkPad-class hardware |
| Security patching | Monthly Patch Tuesday | Rolling, unattended-upgrades available |
| Container tooling | Docker Desktop, WSL2 | Docker, Podman, LXC, systemd-nspawn |
| Cost | Licence fee (or OEM bundled) | Free, community supported |
| Local time on laptop | Manual change between AEST and ACST | Automatic via geolocation |
A final word on cloud cost, because this comes up a lot in Australian developer circles. The remote build server I keep in Sydney costs me a small monthly fee in AUD, and the move to Ubuntu has not changed that line item in either direction. What has changed is the time I spend setting up new environments. A fresh Ubuntu instance, scripted through cloud-init, is ready for work in minutes. A fresh Windows instance, even with a good golden image, takes longer and tends to fight the developer over default behaviours. The savings, when they come, are in minutes, not in dollars.