sua

My Linux Journey

Humble Beginnings

I don't think I touched Linux before I got to college to study Computer Science. The only experience I had with the computer is when I was playing video games with my brother and cousins. My dad tried to teach python to my brother and I when we were in elementary school on a Raspberry Pi, but that never stuck. I think that's surprising because Bryan and I have always been pretty nerdy, but I guess it wasn't that kind.

I'm somewhat mad at myself for not sticking with it and instead being infinitely absorbed in video games like Warcraft 3, Maplestory, and League of Legends. We would have been like those dudes winning Facebook and Google coding challenges (an exaggeration of course). I think high school and college would have been so much easier if I had those skills built up over more years, rather than starting from nothing in college.

Linux but not really

For my low and mid-level computer science courses, I used wsl2 when I was daily driving Windows. I forget how exactly I came across it, but it solved my issues with path and include errors that I was getting on Windows on VSCode. My professors recommended using full-fledged IDEs like PyCharm and CLion to avoid these exact headaches, but these programs made my poor laptop sound like a jet engine. Don't get me wrong, these programs were pretty amazing in their own right especially for me as a beginner. But sometimes, too much is too much and I just need something simple, fast, and easy for my computer to handle.

I liked VSCode especially because it was so customizable, and I loved the extension ecosystem. I could have the best of both worlds with the vim extension, for example. It was the Swiss army knife of text editors. I could bounce between C++ in data structures and networking, python and jupyter in statistics and embedded hardware, and latex for discrete math and algorithms with ease. I still use it regularly at work and sometimes at home (a topic for another day).

I know some people hate it, but VSCode holds a special place in my heart.

There was one mandatory class for Computer Science students called "Introduction to the Linux Operating System". At this point, this was my freshman year still, so I had no idea what that even meant. I had sort of used Linux at this point, but was I going to become an IT god? I knew that the professor was going to make us choose and learn vim or emacs, so I did a ton of research the Summer before of which one was better. I decided to learn a bit of vim in my free time so I wouldn't be caught off guard. I remember someone in one of my classes using vim, and I literally thought it was wizardry because he was just flying through the files.

As an aside, vim can be a whole new post or series of posts on its own topic because I have so much to say about it.

My university provided a shared Ubuntu server called Isengard for general development and testing lab and project submissions. I didn't use the server too much because of the high latency when trying to do anything. It was especially bad when it was the deadline night and everyone was frantically testing their code before submitting. There were one time in Operating Systems when VSCode extensions like cpptools crashed or locked up Isengard so badly that the professor had to send out announcements telling people to stop using it or else he would start going after violators.

I also had a Chromebook that supported a Linux VM running and Debian (11?) that was decent for most things. I will admit that it was pricey for what it was. A used Thinkpad would have done the same thing, if not better. It was never the full Linux experience though because it was still ChromeOS (which I guess is a distribution of Linux) at the end of the day. I tried running a window manager like i3wm (which is, in fact, possible but I can't find the setup code for it anywhere), but it was just too scuffed so I gave up on that. Later in 2024, I would hack the Chromebook and install Linux directly despite the risks as a spoiler.

There was also a point in time when I was using my Raspberry Pi 4B as a general development computer. I installed the desktop version of Raspberry Pi OS, connected it via HDMI to the TV in the living room, attached a Bluetooth keyboard, and coded using plain vim. Even using plugins and LSP servers would make it lag. Obviously this wasn't a great experience, but it did teach me more about Linux and how to be a better programmer, especially on a computer with constrained resources. Who needs all those fancy plugins anyway?

In my Junior year, I remember researching which Linux distribution was the best for me to use. It came down to Debian and Fedora. Debian was boring but reliable, and Fedora was like the cooler Ubuntu because it was cutting edge yet stable. I tried doing a dual-boot setup on my main Windows computer to experiment with Fedora, but there was just too much friction swapping around that it never stuck. There was really just no point for me since my MacBook or desktop could do the same things, if not better.

macOS Era

I got a base MacBook Air M1 in 2022 and have been daily driving macOS for the better part of three years now. I was immediately hooked when Apple first unveiled their new in-house CPUs for their WWDC 2020. Since that conference, I followed every single video of leaks and spoilers to catch up. I remember hinting my parents so much that I wanted a MacBook, but they were so expensive at the time. I wasn't working at the time, so I wouldn't be able to buy it out of my own pocket. My dad bought my mom the MacBook Air for Christmas, but my mom refused to use it because it was too expensive, so I volunteered to take it.

I loved it from the first day. I was always skeptical of MacOS being a Windows guy my whole life, but I knew from the start that they were meant for me. The performance is amazing for the small frame, the battery life is amazing, the keyboard is snappy, most software for Computer Science students just works out of the box, the chassis is fanless (thank God because no more embarassment during lectures), and more.

I really do think that MacBooks are the best machines for students and software developers because they strike a perfect balanced between ease of use and performance. There really is no other laptop on the market, in the same price range, that offer the same value proposition. I know it's expensive, don't get me wrong. And I'm not saying it's the best machine for everyone since people have different needs. All I'm saying is that it is an incredible machine that comes at a price. All I wish is for my work to give me a MacBook, and I will be happy.

Today

That brings us to today. I have been daily driving NixOS (and nix-darwin) for almost a year now. I heard of NixOS from a professor who was raving about it in college, but I wasn't interested enough in the Linux world to take that leap. After I came home from the college apartment in June 2024, I think I was finally ready to explore Linux and was especially bored at home.

I hacked my Chromebook to install Debian, Arch Linux, and finally NixOS on it (and back to Debian for hardware reasons). The process was super sketchy because I had to take off the back cover of the laptop, disconnect the battery, and remove a few screws that acted as hardware write protection. This was a safeguard so that people couldn't just flash a new operating system on top of ChromeOS so easily. There were many so many warnings that I could permanently ruin the Chromebook along the way, but that's a story for another day.

Anyway, I officially started using NixOS in September 2024 when I installed it on a spare Dell Optiplex that my dad had lying around. Until then, I had been dabbling with NixOS in a virtual machine on my MacBook trying to figure out nix and the why of everything. It was very overwhelming even for someone who like me who thought they were pretty tech-savvy. It took me months of watching videos, reading docs and Reddit posts, and using the system to begin to understand. I will say, NixOS is not plug and play at all, especially if you want to make the system truly yours.

There was something unique about NixOS that called to me. The declarative nature of the configuration files scratched an itch in my brain. The idea about NixOS is that the entire system configuration is stored as code (.nix files). You might be thinking, "doesn't every operating system store its configuration in files?" The answer is yes, but NixOS has a very interesting twist. Sure, you can go change registry options in Windows and edit config files in other Linux distributions. These are are all very manual operations. It was not be easy to remember when and where you made these changes, unless you are very diligent about documentation (and I know people are bad at that).

The idea of NixOS is that your code defines your system completely. A flake.lock file tracks input hashes to ensure that your programs and setup is reproducible. This is especially important when if you are syncing the configuration across machines. Lastly, because the configuration is code, the code is self-documenting, so git blame will also give you context such as time and commit messages when you made certain changes. This makes understanding and reverting changes especially easily.

As an exercise, I can wipe my computer, run one command, wait a 20-30 minutes for the downloads and installation steps, then come back to a machine with everything the way it was, the way that I want it. You can even partition your disks in the same installation step. If you know Ansible, NixOS is sort of the same idea where you can deploy "playbooks", except the playbook is a configuration. These deployments can even be remote, so I can update my Raspberry Pi from my other computers (granted they have nix).

You can even configure a large part of your MacBook using nix-darwin, but there doesn't seem to be a Windows equivalent.

At this point, I have over 1000 commits (8000 lines) in my configuration, which at one point spanned 7 computers. It is sort of embarrassing because I'm not even counting my Neovim configuration which I had refactored out into its own repository. This is an average of 4-5 commits every single day for the past year, oh god.


NixOS seems like the end-game operating system, but it isn't always that simple. I mentioned earlier that I reinstalled Debian on my Chromebook. There were a few post-install steps that I had to take because of hardware quirks. The audio and keyboard is working properly now, but the thunderbolt ports are still broken sadly.

The reason why these post-install scripts didn't just work out of the box is because NixOS is a non-standard distribution. There are many quirks which make it incompatible with regular Linux scripts and software. Luckily, many smart people who have been using and developing for NixOS have solved many of these problems (graphics, desktop environments, non-FHS software, etc.) before I adopted NixOS. There are still many pain points here and there because of the high skill barrier to enter. I am still very much a noob, but I am so much better than I was even 6 months ago.

All in all, I'm really happy with the setup I have going right now. I have the main gaming computer dual-booting, my MacBook being the general purpose computer, my custom built server serving, and my Chromebook being my tinkering machine. Even though it's taken a long time to get to this point, I am happy to have learned and struggled with Linux.