These are the questions that characterize computer science:
What can and can not be computed?
How fast can a certain computation be carried out?
How much information is needed to carry out a certain computation?
How can information be efficiently (and securely) encoded, stored, retrieved, and transmitted?
How do we design programs?
How do we know a program is correct?
How can computational theories help explain intelligence and consciousness?
None of these requires a computer to answer, right?
Wait—there’s one more question: Does P = NP?
What Computer Scientists Do
In case anyone asks you, computer scientists:
Architect large software systems, i.e., identify the components and their behavior and interaction (this requires skill and enormous experience)
Organize information into data structures for efficient processing
Devise algorithms to carry out the specified behavior of the components (this is a creative, artistic process)
Express algorithms (this is called programming)
Validate algorithms (using formal proof and heavy mathematics)
Analyze algorithms (usually to determine whether they satisfy efficiency constraints)
Test code (to increase confidence that a system meets its specification)
Here’s a more poetic answer to what computer scientists do:
I am a computer scientist; I approach the cosmos though a very different path: I take the simplest of principles - information theory, logic, design - and from them create new worlds that are bound only by my imagination.
Exercise: Has anything changed? Can you think of recent trends in computing that might warrant another category?
More Subject Areas
Here’s a finer breakdown of subject areas within computer science:
Compilers and Interpreters
Decision Support Systems (Knowledge-Based Systems)
Distributed, Parallel, and Cluster Computing
Human Computer Interaction
Modeling in Science, Engineering, and Finance
Natural Language Processing
Networks and Internets
Neural and Evolutionary Computing
Scientific (Numeric, Symbolic) Computation
Search and Information Retrieval
Security (including Cryptography and Cryptanalysis)
Virtual Reality (and Virtual Worlds)
Vision and Pattern Recognition
Computer scientists need to understand the following concepts. Note that these are not specific to computers that have keyboards and monitors.
Consistency and Completeness
Levels of Abstraction
Ordering in Space
Ordering in Time
Tradeoffs and Consequences
Kinds of Software
People use principles form computer science to create lots of
different types of systems.
Here’s a rough list of (overlapping) software system categories:
Information Systems that create, store, retrieve, manipulate, present, and destroy information (such as in databases).
Technical Systems such as control equipment in telecommunication, military or industrial production.
Embedded Real-time Systems which deal with physical sensors and actuators; you see these most often in run in cars, aircraft, appliances, etc.
Distributed Systems which contain many different physical computers connected via some network.
System Software, which is the low level code for operating systems, database systems, and user interfaces.
Application Software like games or word processors, which run on desktops, laptops, and mobile devices.
Speaking of software, it’s useful to point out that software runs on many different kinds of devices, and computer scientists need to take into account how people use these devices when writing software for them. Devices include:
You’ve undoubtably noticed, when using your phone, tablet, or laptop, all your programs are running on the same device. You don’t need a separate machine for each of those different things!. You don’t need one machine for adding numbers, one for communicating by voice to other people, one for telling the current time, one for telling you how far away your destination is, one for finding the number of days between two dates, one for maintaining your TO-DO list, one for telling you your current direction, one for timers and alarms, one for translating Irish poems into Swahili; you get the idea.
You just need one machine.
But this was not always obvious. It was not obvious until the 1930s or later. People had to ask the deep question “What even is computation?” and get it onto a formal footing, for the field of Computer Science to arise. Alan Turing answered that question by representing computation as a “machine” described as a mathematical object. Then he showed every machine could be simulated by a single machine (since named the Universal Turing Machine in his honor).
That was stunning. Brilliant. The first big idea is universality.
Exercise: What does that supercomputer in your pocket do that separate “single-function” devices used to (or still) do? Come up with a list of 20 things. Here are some things to get you started: set and activate alarms, make phone calls, tell the time, count your steps, navigate, manage your appointments). What things do they not currently do that you think they should do?
But there’s one more big idea: Turing was able to show (others discoverd this independently by the way) that there were some problems that could not be solved (a.k.a. functions that could not be computed, a.k.a. questions that could not be answered) by any machine. The second big idea is called undecidability.