Why C
If you've ever taken a programming class in college, chances are it was either taught in Python or in C. These are two very different approaches with their own pros and cons. Advocates of Python as a starter language cite its closeness to the English language, forgiving syntax and logic, massive library collection and immediate gratification, with new users being able to build simple computer games in less than an hour of learning. On the other hand, the opposition believes that Python's weak typing, slow speed and high level abstraction robs new programmers of the intuition and low-level logic that would serve them well when they eventually encounter harder bugs down the line. I can't say I fully belong to either side here. Python is great for kids with software developer dads who think the magic lines on the monitor look cool and want to start learning programming early. For college students, though, I think they have the perseverance and patience to sit and read a few pages or slides of documentation to learn a concept they will use many many times later in their lives. You can probably guess why I was devastated when I learned they changed the Computer Seminar I curriculum to use Python instead of C starting from my year.
All is well that ends well, though. There was another class that taught us the basics of C, and although the instructors were nowhere near as enthusiastic about instructing the class, it still was fun to do the homework for a few hours every week in my favorite language. All in all, I was taught four programming languages in three years of college: Octave (a FOSS clone of MATLAB), Python, C and Fortran. At the end of these compulsory classes, though, one thing was always true: we knew how to write simple programs, do moderately complex operations like matrix operations, some data analysis, parallel computing, and use external libraries (especially with Python), but we never really went into the lower-level stuff like memory organization, or even just how file pointers work. We knew how to use standard library functions like scanf() or fopen(), but we didn't know how those functions work in the first place. Most of us just assumed they were things the computer just inherently knows how to do, and we should just read the documentation and use them accordingly.
The truth is, these functions were also written in C. In fact, most major C implementations are bootstrapped, meaning the compiler itself is written in C. Instead of just reading the docs and copying the function signature, I want to know why fopen() returns a pointer, how fscanf() uses that pointer to read from an external file, and how fprintf() writes a formatted string into the file. I want to know what happens when values are assigned to variables, what happens when there isn't enough memory to go around, and what happens when I inevitably write a buffer overflow bug.
While C is a beautifully simple language, it's also extremely powerful in the sense that it lets you do almost anything you want with the computer, to the byte level. With Python, I can pip install a library and call a function named createAAAComputerGame() or something and get a working application in 5 minutes (and there's beauty and much usefulness to that, too), but it would be very hard to break the machine down to its simplest parts. With Fortran, I could probably get into the weeds too, but that would require browsing through horribly formatted websites from when my dad was 15. Conversely, C still has very large support and community behind it, with many efforts to document and teach the language from hobbyists to corporations alike. Lastly, the Kernighan-Ritchie book is a short read (for a book about a programming language), wastes no time on unnecessary concepts and is laser-focused on preparing the programmer to write functional C code.
So this is "Why C" for learning the lowest level of computing. Here goes nothing!