{{< partial "1000_potions_header" >}} I admit it: I'm an operating system addict. I've installed countless operating systems over my life, and I still use many of them. It may seem like a bad idea. It isn't. I jump between macOS, Linux, Windows, and Chrome OS across many devices, and that's just on desktop. On phones, my first was a Google Nexus One then a couple pit stops with Nokia Lumia 521 and 620 Windows Phones. Later I went back to Adroid with a Samsung S7, an S10, and others, I now carry an iPhone 13 Pro Max. I've also used long-dead operating systems like SunOS, Solaris, Warp OS, and many more. Oh, and I run Android TV on an Nvidia Shield and don't forget three different Raspberry Pis and a Synology NAS all running various flavors of Linux. I've used many Linux distributions. Slackware was my first. Then came Red Hat, the version that got people excited for offering a text-based user interface (TUI). Add Ubuntu, CentOS, Rocky Linux, and Debian, and you can see how many flavors I've jumped between. I've used nearly every version of Windows, from 3.11 to Windows 11. My current gaming box won't let me upgrade to Windows 11. That's likely a boon, though I have installed Windows 11 in a virtual machine using Parallels. I've used many VM runners: VMware, Oracle's VirtualBox, and Windows Hyper-V. Right now, I use Lima. I've worked in so many environments: Colima, Docker, all of it. Some people think that's a waste of time, and sometimes it is. I hit snags. But living across all these environments throughout my career taught me what it takes to [build software that won't break][software-maintainability] when it lands in a new environment. These environments differ in countless ways. You have to decide whether to write an [operating-system-specific implementation][software-design] or go bare-bones with something like a [POSIX shell][configure-my-shell], which runs everywhere. Whether in Windows Subsystem for Linux, on macOS, or on any Unix system, it will run as long as you avoid cute functions and features. Good luck getting bash to run everywhere, though; its seemingly innocent nuances make that hard. Don't get me started on PowerShell. It runs on Windows, but running it on Linux makes little sense. Add to that the choice between web and native applications. I prefer [web applications][the-web], because I can pop between operating systems without any trouble. Consider how you edit a file across operating systems. Only a couple, vi and Emacs, ship by default almost everywhere. Windows is catching up: pop into a Windows shell now, and you can run the Linux commands you'd expect, like vi. Most people wouldn't know that unless they'd roamed the jungles of different operating systems, learning their philosophies, why their designers made the choices they did, and what makes each one tick. ## How To Use Many Operating Systems You might be wondering, "How do I use many operating systems?" It's easier than you'd think. Install VirtualBox on the operating system you already have, then find ISO images of the ones you want to try. On macOS, install a Linux flavor. I recommend Ubuntu, which is very friendly. Linux Mint is simple and friendly too. To install Windows, search around for virtual machine images of questionable provenance, since Windows requires a license. Even without one, you can run Windows for a trial period to see how it goes. On Windows, do the same with VirtualBox; on Linux, do the same. That's the best way to try out operating systems if you don't want to buy a device with one installed, as I do. What to do once it's installed is a different beast. If you're a [software developer][software-development], take some [scripts you've written][software-automation] and run them in these environments. You'll quickly notice how differently software behaves from one to the next, and how installing things can vary wildly, or not at all, depending on your approach. On Windows, for example, there's a package manager called Chocolatey. Many will tell you that you don't need it, just run the Windows installer after downloading an app, or install from the Windows Store, and call it a day. Chocolatey gives you more control. You install and uninstall from the command line, and it cleans everything up regardless of the source: an executable you drop in and run, an installer, the Windows Store, or a zip file. Whatever it is, Chocolatey manages to extract the binary so you can run it. On macOS, you can choose among Nix, a package manager that's also an operating system worth trying in its own right, Homebrew, and MacPorts, among others. I recommend Homebrew to start. Nix simplifies a lot in the long run, but it's harder for a newcomer to manage. On Linux, your package manager depends on your distribution. On a Red Hat flavor, you have several tools, but [DNF][use-dnf] is the one to use, as the others have fallen out of favor. On Ubuntu, it's snap. On Debian, [apt][use-apt]. The choices form quite a jungle, and the same goes for software development. Here's what I want to stress: using multiple operating systems is complicated, and there are many ways to do the same thing. Over time, you build a taste for them, or rather, experience. You build enough experience to know which flavors suit you. What do you like: simplicity or flexibility? Until you've used these operating systems, you can't know. Getting out there and jumping in is well worth your time, even when it's a pain in the ass. ## Potion Attributes 🧠 **+10** Intelligence 🤸 **+10** Dexterity 🛡️ **+10** Constitution ## Potion Description Use when learning how to make amazing software. Before drinking, pause to decide what you intend to learn about an operating system. If you're not sure it's worth learning, save the potion for later. Do not take with other potions for maximum impact. {{< partial "1000_potions_footer" >}} [software-maintainability]: https://jeffbailey.us/fundamentals-of-software-maintainability/ [software-design]: https://jeffbailey.us/fundamentals-of-software-design/ [configure-my-shell]: https://jeffbailey.us/how-do-i-configure-my-shell/ [the-web]: https://jeffbailey.us/fundamentals-of-the-web/ [software-development]: https://jeffbailey.us/fundamentals-of-software-development/ [software-automation]: https://jeffbailey.us/fundamentals-of-software-automation/ [use-dnf]: https://jeffbailey.us/how-do-i-use-dnf/ [use-apt]: https://jeffbailey.us/how-do-i-use-apt/