CS: A Casual Introduction

Sharon John
TheVoyager
Published in
5 min readOct 1, 2019

Computer Science by virtue of growing out of Electrical Engineering departments in the 1970s following the semiconductor revolution was placed in schools of Engineering around the country. Yet, 50 years later your average CS undergrad probably has less in common with fellow engineers than a math or physics undergrad does. This has much to do with what Computer Science is really about.

Computers, or more specifically Turing/Von Neumann computers (every computer you have ever used) are essentially highly efficient calculators that can perform arithmetic on 1s and 0s. This notion of a computer is so foreign to us that few of us would approve of such a reduction. You’d be right of course, 1s and 0s in of themselves are not what make computers interesting or useful to us. But even your prettiest animation under the hood is really just a specific meaningful binary sequence. Modern software development has almost nothing to do with this for the same reason that we no longer use sounds to communicate with other humans- we need a high-level interface to express what we want from a computer and we want it to interpret it correctly and perform those operations for us. This high-level interface is a programming language. A programming language is a notation for expressing ideas to a computer. The mapping of high-level code to binary is performed by a compiler (also a program) which takes in lines of high-level code from a user (programmer) as its input and converts it to binary code as its output for the computer to execute. Each of the 1s correspond to certain hardware functions being turned on and 0s correspond to other hardware functions being turned off. The overall orchestration of various pieces of software running on a computer is performed by an Operating System. The way in which the Operating System accesses the underlying hardware of the machine is provided through its Computer Architecture. Computers remotely communicate with other computers through Networking. Some programs attempt to solve harder problems than others. A solution to a problem is called an algorithm. Various ways of organizing data in order to solve problems are called data structures. The difficulty of the problem an algorithm is solving is classified using computational complexity theory. This is all a simplification but nonetheless covers the primary abstractions of the domain. Everything else you think computer science is about is an application of some combination of the above. Apps for instance can be achieved through networking, a programming language and associated compiler and probably a couple of data structures and algorithms. For more detail, I would recommend Coursera/Udacity/Udemy and for even more detail (probably don’t need it) a computer science degree.

The placement of CS alongside EE only really makes sense if you think of it as the science of computers: how to build and optimize computers. Infamously known to undergrads as Computer Architecture, this field is so removed from what the majority of students know as software development that almost no one would agree that CS is really about the science of computers. The science of computing is closer to what draws people to the field in 2019. Computing is essentially how a computer is able to solve problems- but not on the level of which circuits are being turned on but rather in terms of how the problem is resolved mathematically. So computing is really about algorithms and algorithms emerge from the algorithm designer (a human, so far) rather than the computer. Computer Science attracts tremendous mathematical talent for this reason. Smart people enjoy solving hard problems- some of the hardest problems in the world are describing how to make a computer produce definitive answers to various questions. These questions include when the next solar flare will be, how to organize files on a computer, making people click ads (big one!) and how to match people on a dating app without giving them enough poor matches that they don’t leave the platform entirely. Most problems you can think of are, if you strip away the irrelevant details, some version of a solved problem. This is one way in which people are able to develop apps seemingly overnight with little to no new discovery even if you were the first person to build a dating app.

Since its mass adoption in the late 90s, the internet has dramatically changed access to information and human interaction. The internet is a mechanism for making many computers across the world network with each other which as speeds and data transfer size got better allows for things like streaming Black Mirror in Singapore from a Netflix server in California. The overwhelming majority of students in a CS program are motivated by building new services on the internet because it’s applicable, has tons of support and is very monetarily rewarding. The web is a subset of the internet, by far the most popular kind of traffic and enabled over the HTTP protocol on top of the default and mandatory TCP/IP. This is why all websites begin with http:// or https:// (secure http). The magic of web and modern software creation is the incredible layers of abstraction provided to the user and this is what allows people to develop apps over a weekend. Not because they’re geniuses but because companies like Amazon and Google provide terrific infrastructure to rapidly develop and deploy web apps. This is perhaps the most central idea of computer science- the dual weaponry of abstractions and interfaces. These allow you to build on top of existing platforms without necessarily understanding how those platforms really work. It’s quite analogous to real life: You learn to ride a bicycle by repeatedly trying to ride a bicycle, not by grasping the fundamental laws of physics that enable you to do work on your pedal which in turn propels your bicycle against the friction of the road. Likewise, assuming you’re already a good programmer, you then learn the modern tooling around web development and can often find great success without needing to understand how the web app on your browser calls various system services on your laptop, how your operating system schedules these services and how the hardware executes your software instructions. It would be unproductive and wasteful to have everyone need to learn everything down to the atoms before they can build anything. If you want to, feel free.

Software development is top-down unlike math which is bottom-up. Unfortunately universities don’t often teach to this philosophy leaving students frustrated about the disconnect between what they’re lectured and how software is actually developed. Paul Graham spends an entire chapter in the excellent Hackers & Painters discussing how computer science is really a vague and premature term to a discipline with as much difference between its subdomains as the rest of engineering combined. In another couple of decades, we’re sure to see many majors develop out of this amorphous department as people begin to recognize the deep differences between software engineering, computer systems, AI and algorithms.

But for now all we’ve got is CS.

--

--