Computer science itself is a surprisingly difficult thing to define.
If you do a search on the web you’ll turn up quite a few definitions for computer science.
Some people take a very academic approach and say that computer science is about studying computation and systems of computation. (What the heck does this mean?)
Other people will define it in terms of what they believe it is about, saying things like computer science is using computers to solve problems.
None of these definitions or attempts at defining computer science sit well with me.
Why it is important to know what computer science is?
So, you might be thinking “who cares?” “What does it matter what computer science is?”
Well, the reason why it matters is because many of us programmers and software developers either have a degree in computer science, are studying to get a degree in computer science, or simply associate our knowledge with the field of computer science.
It seems kind of silly to have a degree in something that you can’t clearly define nor can anyone else.
Have you ever thought about how strange it is that when someone gets a degree in biology they become a biologist, but when someone gets a degree in computer science they become a senior software engineer?
Why is computer science so hard to define?
Before we can even really attempt to define what computer science is, we have to understand a bit about why it is so hard to define.
It all stems from the problem that unlike many other sciences, computer science isn’t based on any naturally occurring phenomenon. Even social sciences and formal sciences deal with things that exist in the world without our creating them.
But, computers are a creation of humans. At least the kind of computers that we commonly recognize as computers and use in the field of computer science.
Everything within the idea of computer and computation is completely fluid and lacks perfect definition including the idea of a computer itself.
We can’t even define computers
I spent several weeks researching what a computer is and I found there is no commonly accepted definition of a computer. It wasn’t even till around 1940 that the definition of computer transferred from the term for someone operating a computing machine to the actual machine itself.
No, that is not a typo and I’m not off my rocker. It is a true statement. Consider whatever computer you are using to read these very words; are you actually running your software directly on the hardware?
Most likely you have some sort of operating system which is running on your hardware that is virtualizing the actual physical hardware to a large degree. Most applications are written to run on an operating system, not to run on actual hardware. This, in effect makes the operating system the computer.
We can take it one more level and say that the very web browser you are using to view this post, is itself a computer, since a browser can be programmed to run just about any application (That is to say that a browser is Turing Complete).
Data and code
Even the text content of this blog post, which most people would say is data, is actually code, because it is programming the web crawlers from search engines like Google and telling them what to do based on the actual content of the words. You may have even found this post due to my attempts to program Google’s web crawler through SEO techniques.
Everything about a computer is fluid and abstract
All of this leads up to the realization that just about everything in the computer world is defined in terms of abstractions which are always “leaky.” Other branches of science like mathematics and chemistry are much less abstract and based on real concrete things that exist in reality.
What then is computer science?
Ok, so now is the part where you probably expect that I will tell you what exactly computer science is, right? Wrong.
Computer science is nothing. It isn’t a thing that can be defined, because it is not a thing that exists beyond our imaginations.
Computer science itself is an abstraction that we have created for dealing with all the things involved with computers which is itself and abstraction for all kinds of programmable machines.
It is a false science. Everything you might study in a computer science program actually belongs in some other field of science, but is conveniently grouped into the computer science abstraction in order to catalogue the important things that form the basis of how we build computers and how we program them.
This isn’t to say that the things you would learn in a computer science program don’t have value. It is important to know about algorithms, data structures, computer architecture and the mathematics that many of these things are based on, but it is important to realize that the study of computer science is very different than the study of other fields, because most of the concepts you learn about in a computer science program are abstractions. They are not rules that are set in stone, like the forces of nature that form the basis of other fields of study.
I say this because it is important to understand that everything we learn about computers is based on abstractions we have created to simplify the complex and these abstractions are based on very few actual rules that can’t be broken.
We will eventually hit a point where many of these existing abstractions about computers that we have put into place and built our knowledge upon, will have to be broken and replaced with new abstractions.