Let’s start off with a promise from me. I promise I won’t become one of “those people” who uses the words “superior” or “objectively” when describing my OS preferences. Windows and Linux each have their own strengths and weaknesses, so this post is just about my experiences switching from Windows to Linux (specifically Ubuntu) and what I’ve learned in the process. I still use Windows at home, but only for a few applications that aren’t available on Linux.
A Hard Habit to Break
I’ve used Windows almost daily for 25 years. I’m very familiar with its various iterations starting with Windows 95 and all the way up through Windows 11. Microsoft and their software stack have been my bread and butter for 20 years, and in a professional setting, I’m damn near a wizard with it. Most of my work tasks have been automated with PowerShell, and I can set up Active Directory and Group Policy in my sleep. Azure is great because it lets me set up entire solutions using PowerShell, and it’s acted as my gateway into the arms of Tux, the Linux mascot. Azure embraces the concepts of automation and not needing more resources than are necessary for things to work, and with a bit of effort, I’m becoming a wizard with Azure as well.
The most important thing I’ve learned about Windows on my path to leaving it is just how much of the computer it obscures from you and protects from you, the user. It’s certainly possible to render a Windows system unusable by making a mistake with what you’re playing around with (specifically the registry and system directories) but it does a great job of keeping anything dangerous out of reach by obscuring it entirely or limiting your choices to things that won’t create problems. For most people, this is a huge positive for the Windows ecosystem. One of the reasons I’ve learned as much as I have about working with computer systems is thanks to the safety measures in Windows that created a fearless spirit in me to flip switches and change options and just see what they did.
The Learning Curve
A double edged sword in setting up Linux is the overwhelming amount of options available, which are often presented to you as if you’re someone who already understands them. This was the primary reason I chose Ubuntu as my distribution. It’s an easier option that, like Windows, will choose a lot of safe and easy defaults in its installation so you don’t have to worry about them. Other distros present options like which kernel to use and the desktop environment you want to include (if any) and sometimes require higher levels of Linux experience just to get to the point where you can install the OS.
Ubuntu was a pretty simple installation. Partitioning the hard drive is presented in a GUI format, driver installation is automatic, and you have similar choices to Windows relating to what your username should be, time zone, and keyboard layout. You click “Next” a few times and the install is on its way. You can even boot into an Ubuntu instance without installing, giving you the option to test drive and make sure things are working the way you expect before committing any storage space to it. I chose to dual boot with Windows, but installed a dedicated drive just for Ubuntu so I wouldn’t have to worry about a mistake in one environment affecting the other. For a “Windows guy” like me, it was a very familiar process.
That said, my first few attempts to use Ubuntu resulted in failure to boot after changing things I didn’t understand. The repair option in the Ubuntu installer failed completely because of my hardware setup (it couldn’t comprehend that Windows was on an NVMe drive and Ubuntu was on an SSD) and I had to do a fresh install a few times before I learned to slow down and understand the changes I was making before committing to them.
You know how I mentioned Windows protects itself from you? Linux does not do this. It will let you remove the desktop environment (the GUI part of the OS) without question, leaving you at a terminal window on boot. If you know how to reinstall the desktop environment from the command line (which is easy) it’s not an issue. I didn’t know how, so it was back to a fresh install since the repair option on the boot image wouldn’t work unless I took my NVMe drive out of my system to reinstall later. I had also potentially introduced other problems in my previous steps to get to that point, so wiping the install and starting fresh wasn’t a tough or undesirable call.
Probably the biggest change in workflow I noticed over Windows is in the installation of applications. Ubuntu includes “Ubuntu Software” which is similar to the Microsoft Store for installing and managing different applications. These are built on Snap, a software manager that keeps your applications isolated to their own little worlds without interfering with each others’ dependencies or configurations. This is not always desirable, and I quickly found myself using the apt package manager. The Snap versions of applications would crash when trying to do something like attach a file from the file system. In Linux, the idea of downloading and running an installer still exists, but it’s done through calling your package manager via the command line. The command you need to run is almost always provided by the provider of the application you want to install, but I’ve seen a few instances where no instructions were provided. While I initially didn’t like having to type “sudo apt install <packagename>” to get applications, it’s a much faster and easier process. Another double edged sword with using a package manager is that it only searches for packages in specific repositories. It’s easy enough to add the repo you need for a new application, but that often includes extra steps with copying and pasting commands to connect to the repo and add a certificate to validate that what you’re downloading is what you intended to download. While not flawless, it’s become my preferred method of installing applications over having to search for a download page, click to download the installer, and then run the installer with a process of Next > Next > Next > Finish. Package managers are MUCH faster than the Windows Installer process.
Time is Invested Up Front
Like learning to use a package manager, other tasks on Linux are faster and easier only once you’ve dedicated the time to learn how to perform them. My view of Windows is that it’s more user friendly because you can blindly trial and error your way through things you don’t understand. Linux expects you to read the instructions before you jump in. A great example in the user friendliness of each OS is how commands are named. In PowerShell, commands follow a verb-noun structure. Get-Service, Set-NetAdapter, etc. You can probably guess what those do. In Linux, you want to search for text? That’s called grep. Want to view the contents of a file? That’s tee. There are probably good reasons those commands are named the way they are (I know grep is shorthand for Get Regular Expression) but the naming conventions are more technical in Linux.
A concept I knew but didn’t quite understand was how much extra bloat a GUI can provide to an application, and it’s a major factor behind why Linux applications don’t always use them, or have very limited/lightweight options. The installer for IIS Express, Microsoft’s web server software, is 10.8 MB. The installed package is larger, and IIS Express will allow you to host a limited number of web applications with limited features. The download for nginx comes in at 1 MB and offers substantially more features, but you have to configure it with a text editor and running commands. Both are small, but the differences are huge.
I don’t want to have to use the command line for everything!Me in previous forays into Linux
There are GUI tools for a lot of command line utilities. For example, dconf Editor is a GUI to manage the settings for various system configurations previously only available through manual editing or separate commands. Here are some for the desktop interface in Gnome:
The Power and Cost of Choice
One of my favorite things about Linux has been that I get to pick and choose what I want to have as part of the OS. A friend of mine showed me Ubuntu Studio, a slightly different flavor of Ubuntu that included applications for video and audio recording/editing and a low-latency kernel to improve the response times that are so important to audio recording. Ubuntu Studio uses KDE as its desktop environment, which I quickly ran into problems with regarding its lack of display scaling settings. Fortunately, I didn’t have to stick with KDE, I could switch back to Gnome and still keep the kernel and applications under the environment I was quickly growing familiar with. Earlier in this post I mentioned removing the desktop environment? Yeah, KDE got set as the default and I removed it without switching back to Gnome. Whoops! Lesson learned, and it made perfect sense that I just didn’t foresee the consequences of my actions. No major loss, I just started from scratch and installed only the components I wanted, which was a really cool feature.
As far as Gnome’s default layout and settings, I did not like them. I only had a clock on my primary monitor, so if I was playing a game (yes you can game on Linux, that’s coming up) I couldn’t tell what time it was unless I hit the system key on the keyboard to get a view of the clock. Enter extensions, the easy and lightweight way to completely overhaul the desktop experience with a few clicks. While I started using Firefox to install extensions via extensions.gnome.org, I quickly ran into issues where they would stop working and I’d get an error about an unsupported API. Fortunately, I found Extension Manager, the non-web browser version of the same functionality. My extensions were now stable and worked correctly on a consistent basis.
Thanks to the Dash to Panel extension, I could combine the bars at the top and bottom of the screen into one and display my clock on all my monitors. Windows is able to do this by default, but there are some serious problems with the Windows taskbar (also coming up).
We Need to Talk About Resource Usage
Ahh, my favorite topic, bragging about my own desktop hardware. My primary desktop is named Savage, and it runs a Ryzen 5900x 12 core CPU, 32 GB of 3600MHz RAM, and a Radeon 6900XT through an ASUS Crosshair VIII Hero motherboard. Storage is comprised of a Gen 4 1 TB NVMe drive for Windows (that’s changing soon), a Gen 4 2 TB NVMe drive for game installs, and a 1 TB SSD for my Ubuntu instance. Before I go further I want to stress that I haven’t done an apples-to-apples comparison of which programs are utilizing exactly what amount of resources in each OS, but I have some pretty noticeable differences between the two.
Booting into Windows is pretty fast because of the hardware I’m running. There are a number of applications that run on startup that increase this time, and I can go from powered off to ready to go in about a minute. During the startup process, the fans on my CPU cooler spin loudly until everything is fully loaded, then they cycle down as the system finishes the boot process. In Ubuntu, everything finishes loading before the CPU gets warm enough for the fans to increase their speed. The Ubuntu boot time is under 30 seconds from a cold start on a drive with significantly lower throughput than the Windows volume.
With the number of applications and browser tabs I generally have open, in Windows, I hover around 14 GB of memory utilization. In Ubuntu, it’s consistently under 12 GB, even after not rebooting for days. That’s not a huge difference, but let’s look at a more direct comparison in performance, the game No Man’s Sky.
I’ve run No Man’s Sky in Windows, then booted into Ubuntu to run it for a direct comparison, and the results are buck wild. No Man’s Sky does not have a native Linux version, so I’m running it through Proton, a compatibility layer that translates DirectX (Microsoft’s graphics API) into Vulkan (the open-source graphics API for Linux). When you install a game through Steam and have it use Proton, you can see directly on the file system that you’re downloading and installing the Windows version of the game. There’s a folder for Windows settings like the registry in addition to the game files, which show up in the expected DLL and EXE file extensions. Here’s how the same game files performed in each OS.
On Windows, my framerate was consistently around 90 with occasional drops/stutters when loading a new planet or assets. Texture pop is common, which is where surfaces look blurry for a few seconds before magically becoming sharp and defined. The game runs great on my Windows system.
In Ubuntu, using (almost) the same hardware (NMS is installed to the SSD in Ubuntu, it’s on the 2 TB NVMe for Windows), my framerate was consistently over 120 FPS. Texture pop is non-existant, loading times are the same, resolution is the same, and the graphic quality settings are the same. The biggest difference I noticed? In Ubuntu, the fans on my 6900XT weren’t screaming the entire time. Typically I don’t notice when the fans spin up during a game in a Windows session, but the absence of the fan noise under Ubuntu struck me immediately.
Further adventures in Proton, previously when I mentioned display scaling issues, Prison Architect would encounter a bug in its native Linux version when minimizing and restoring the game. The interactive part of the screen became limited to the scaled resolution of the monitor until I reset the display settings in the game. I switched to the Proton version and not only did the scaling issue go away, but the graphics and text were noticeably sharper and easier to read.
A fun detail with having Gen 4 NVMe drives is that the Windows Storage API can’t keep up with them. I installed Windows 11 purely for the DirectStorage API, which in a limited number of games will bypass the Windows Storage API for better load times. Results weren’t really noticeable. Linux can take full advantage of the speeds by not relying on the very old and comparatively slow Windows Storage API, so the fact that I’m getting better load times on a slower drive blows my mind. Next steps are to backup my remaining Windows items that I intend to keep (primarily my project files and plugins for MPC Beats, everything else is copied over) and switch which OS is on which drive. I can only imagine the differences I’ll notice when my new primary OS is on a faster drive it can actually make use of.
Windows is Getting Worse
I was reluctant to upgrade from Windows 10 to Windows 11, but they were similar enough I wasn’t too worried. I’m also a highly capable Windows Systems Engineer, so what harm could the newer version of the OS I knew so well possibly do? In retrospect, I should’ve stayed on 10. The taskbar in 11 is a mess, with features such as Task Manager missing from the right click context menu. The Start menu is redesigned and less usable, requiring more effort to find installed programs.
My primary display is 4k and I use display scaling at 150% to make things readable. Something with this causes the taskbar on one of my secondary monitors, which are 1080p, to display at 1.5x the height despite icons being the same size. The fix for this traditionally is to disable the display, reboot, and re-enable it. This works sometimes. I’ve given up on trying to fix it.
Speaking of my primary display, whether or not HDR support was available was a roll of the dice, even with the monitor drivers installed. The workaround here was to install the manufacturer’s desktop utility to force HDR on, which is a toggle I have to perform every. single. time.
Something with the power settings in Windows is messed up too. When my displays go to sleep for more than a few minutes, on waking them up, the entire UI is sluggish and Explorer has to be forcibly restarted. During the sleep time, applications will randomly crash. No matter what I’ve tried, the only true way to clear up the sluggishness is a full restart.
The Microsoft Store is also a hot mess. I’m a big fan of the Forza series of racing games, and the games Microsoft publishes generally have to be purchased through the Microsoft Store. I’ve never had a smooth install process of a game through the MS store, often requiring several resets of the store itself in addition to unregistering and re-registering the game app just so it will download in the first place. There’s a saying about insanity being doing the same thing over and over and expecting different results. Well, that insanity is necessary to play my racing games. I bought the $100 ultimate edition of the latest Forza title, and now that it’s on Steam, I’m seriously considering a re-purchase just to remove one more dependency I have on the Windows ecosystem. So far, every game I’ve tried using Proton has worked with at most adding a startup parameter, which is easily done through the Steam UI.
Linux Isn’t Without Issues Either
I’ve run into problems with my Ubuntu instance as well, but nothing that hasn’t been a good learning experience. Display scaling in general isn’t great, so I’m running my 4k screen at a 2560×1440 to not have to rely on scaling. This taught me about window managers and display server/client relationships, so I understand why the scaling issues exist and aren’t easy to resolve. Wayland and X11 both exist and try to talk to each other using different languages, and if I’m remembering correctly, scaling isn’t something X11 has. Running at a lower resolution isn’t my favorite workaround, but the experience has left me with what I expect things to look like and nothing breaks, so it’s not something I feel entitled to complain about.
As mentioned, Snap isn’t great. Sometimes applications need to talk to other applications. I had issues with Discord not accepting pasted images, Firefox crashing entirely when trying to browse to a file to attach/upload, and Spotify not being able to add local files, all because of Snap. I still use some Snap packages, but I prefer not to and at some point will disable it entirely when I’ve moved to the native packages.
Speaking of Firefox, the Snap version registered a window manager class called firefox. This makes sense. When I ditched the Snap version and went to a native Mozilla build, it registered a class called Firefox. This also makes sense. However, Linux being case-sensitive, this meant every time I updated Firefox I also had to take ownership of and update the .desktop file to call the correct window manager class (Firefox and not firefox), or I’d end up with a duplicate icon on my dock. With my most recent Firefox update yesterday, this trick no longer worked. I’ve since purged and disabled the Snap package, changed the priority of the Mozilla repo in apt to precede the Snap repo, and copied my profile back over to be the default one for Firefox. This was a lot of effort just to update a web browser, but again, learning experience.
Updating Shouldn’t Suck
As my final point, updating software in Ubuntu (and I mean all the software) is easy. Every few days, I’ll go to my computer and see a window that updates are available for Ubuntu or one of the major packages it’s built on. I click install and it’s done within a few seconds, no reboot required. There has been an instance where a reboot was required, but most of the time, you can update and just continue on your merry way. Updating software packages through apt? Also super easy, and you can update everything in one fell swoop. Further, you can run autoremove to clean up space. In Windows, that cleanup process requires running Disk Cleanup or manually removing the system folder where update files are stored. For applications, you have to re-download and reinstall, often manually unless the application supports automatic updates, which are painfully slow by comparison. Updates in Linux are also significantly smaller, letting them run really quickly, and only updating the necessary files.
I’ve spent an unknown number of hours troubleshooting failed Windows updates, and generally, it’s faster to make a backup and restore on a clean install than to try to get Windows Update to function correctly again. Another point of contention I have with Windows is the WinSxS folder. This is a protected system directory that stores hundreds of redundant copies of system files and drivers in case you need to roll anything back. The idea isn’t bad, but the disk usage is. On my work laptop, which hasn’t undergone any major changes, the WinSxS directory is over 8 GB in size for a Windows 10 install. This accounts for 7.5% of the total drive usage, and almost 25% of the Windows directory of 25.9 GB.
Despite previous failed efforts to try to learn and use Linux, this time around, I’m sticking with it. Support for games is much better than it was. It’s slightly harder to learn than Windows because you have to remember commands, not just locations, and it doesn’t have the safety nets of Windows. It runs better and has been easier to maintain with significantly less downtime. The hardest part has been changing my expectations of what an operating system should be, as they were set for me by Microsoft a quarter of a century ago. Overall, I find the way things work to be simultaneously simpler and more computery. After years of criticizing others for it, I finally understand why Linux people look at things in Windows and go “why are they doing it like this?”