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.
- ← Previous
Understand the Blog Template - Next →
Neovim (September 2025)