I'm a long time software engineer and computer enthusiast. My love for computers and programming was kindled by video games and simulations, and the first serious programming language outside of the passing exposure to Java in high school class was when I learned C++ on my own in order to start hacking out games on top of some physics engine source code I found.
But ever since my college days at the School of Computer Science at Carnegie Mellon, I started to learn about the wonderfully arcane One True Way to drive computers, which is of course on the command line. Looking back, it actually started with a first year course, which was an introduction to programming with a focus on C and Unix. I ate all that stuff up and it's set me on this delightful path to exploring the rich history of the unix command line.
In that course we covered topics like connecting to the school's shared unix computing resources and they even taught us some basic principles about how shells work and we were even taught about fork-bombing, where you can bring down a system fairly quickly if you write a simple infinite loop that continually spawns operating system processes.
One of the things about the command line/terminal/shell that is really appealing to many of us is the absolute minimalism in what it is and how it works, and when you understand how the pieces fit together, the simplicity is really beautiful compared to the typical Graphical User Interfaces that we use with to create "normal" applications.
When you're doing things on a computer on the command line, you are primarily working with text. And text is
represented in computer memory with strings where when we use a reasonable encoding like UTF-8, each common character
(like, say, A
) being represented with a single byte of 8 ones-or-zeros (bits). Strings of course are some of the most
basic and natural computer memory primitives, and you couldn't really do a lot of computer programming without a healthy
amount of screwing around with strings.
The beauty in the UNIX philosophy of separating tools into programs that have well defined responsibilities and simple
minimalistic interfaces means that we are able to get work done by reaching out for beautifully designed independently
crafted tools that just do what they need to do and nothing else. The contrast between this and modern GUI applications
is vast. For example on the command line you can run ls
to ask the program "ls" to produce a listing of the files in
the current file system directory. It is designed to perform this task and has many options you can use to tweak the
format of its output, but the output that it produces is merely a string. It consumes input to the command line
arguments as strings and it produces output on its output stream (commonly referred to as standard out or stdout).
It's minimalistic by any measure if you compare this to something like Finder or Windows Explorer. Note how when it comes to building software, if you wanted to show file listings in your GUI app, you would need to bring in a library and implement for yourself how to display it and how you want the user's input to interact with this widget. It brings in so many ambiguities and complexity about interfaces.
In this collection of posts I will be going over topics that relate more specifically to experimentation and findings in the command line lifestyle.
It's a very interesting topic with many areas to dive deep into because the command line lifestyle was naturally the original way that computing came about. It was the only real way to use computers. In the very beginning computers were programmed with punch cards but soon after, terminals were introduced where the user would type directly to provide input to the computer. Later on in the 80's or so, Apple and Microsoft came to introduce graphical interfaces which changed how the general public perceives and interacts with computers. With operating systems gaining a more intuitive visual interface, textual interfaces were relegated to a realm inhabited by hackers and enthusiasts.
What may be interesting to you, dear reader, is that the technological advancement in this space has not stagnated, and has continued to advance from the time it fell out of popularity with the general public. Although I hope that my posts can illustrate some of this quite well, realistically I'm going to be spending most of my time talking about really esoteric topics, but I will try from time to time like in this intro to refer back to basic principles to help tie things together for those of us less well-versed in this universe.