Wikipedia’s Definition, as of 2015-01-01:
Computer science is the scientific and practical approach to computation and its applications.
My definition:
Computer Science is the theory and practice of computation, algorithms, software systems, data organization, knowledge representation, language, intelligence, learning, and consciousness.
A shorter definition, relating it to other broad fields of study:
You might also want to see what Wikipedia has to say about Computer Science. (After all, this is one of the areas in which Wikipedia is “way better” than Britannica!)
These are the questions that characterize computer science:
None of these requires a computer to answer, right?
Wait—there’s one more question: Does P = NP?
In case anyone asks you, computer scientists:
Here’s a more poetic answer to what computer scientists do:
The ACM, IEEE-CS and the AAAI have gotten together and defined a set of knowledge areas for computer science.
Knowledge Area | Code | Some Topics |
---|---|---|
Algorithmic Foundations | AL | Foundational Data Structures and Algorithms • Algorithmic Strategies • Complexity Analysis • Computational Models and Formal Languages • Algorithms and Society |
Architecture and Organization | AR | Digital Logic and Digital Systems • Machine-Level Data Representation • Assembly Level Machine Organization • Memory Hierarchy • Interfacing and Communication • Functional Organization • Performance and Energy Efficiency • Heterogeneous Architectures • Quantum Architectures |
Artificial Intelligence | AI | Fundamental Issues • Fundamental Knowledge Representation and Reasoning • Machine Learning • Applications and Societal Impact • Probabilistic Representation and Reasoning • Planning • Logical Representation and Reasoning • Agents • Natural Language Processing • Robotics • Perception and Computer Vision |
Data Management | DM | The Role of Data • Core Database Systems Concepts • Data Modeling • Relational Databases • Query Construction • Query Processing • DBMS Internals • NoSQL Systems • Data Security & Privacy • Data Analytics • Distributed Databases • Cloud Computing • Semi-structured and Unstructured Databases • Society, Ethics, and Professionalism |
Foundations of Programming Languages | FPL | • Compiled vs Interpreted Languages • Scripting • Object-Oriented Programming • Functional Programming • Logic Programming • Event-Driven and Reactive Programming • Parallel and Distributed Computing • Type Systems • Systems Execution and Memory Model • Language Translation and Execution • Program Abstraction and Representation • Syntax Analysis • Compiler Semantic Analysis • Program Analysis and Analyzers • Code Generation • Runtime Behavior and Systems • Advanced Programming Constructs • Language Pragmatics • Formal Semantics • Formal Development Methodologies • Design Principles of Programming Languages • Quantum Computing |
Graphics and Interactive Techniques | GIT | Fundamental Concepts • Rendering • Geometric Modeling • Shading • Computer Animation • Visualization • Immersion (MR, AR, VR) • Interaction • Image Processing • Tangible/Physical Computing • Simulation |
Human-Computer Interaction | HCI | Understanding the User • Accountability and Responsibility in Design • Accessibility and Inclusive Design • Evaluating the Design • System Design |
Mathematical and Statistical Foundations | MSF | Discrete Mathematics • Probability • Statistics • Linear Algebra • Calculus |
Networking and Communication | NC | Networked Applications • Reliability Support • Routing And Forwarding • Single-Hop Communication • Mobility Support • Network Security |
Operating Systems | OS | Role and Purpose of Operating Systems • Principles of Operating System • Concurrency • Protection and Safety • Scheduling • Process Model • Memory Management • Device Management • File Systems API and Implementation • Virtualization • Real-time and Embedded Systems • Fault Tolerance |
Parallel and Distributed Computing | PDC | Parallel Programs • Parallel Communication • Parallel Coordination • Parallel Evaluation • Parallel Algorithms |
Security | SEC | Foundational Security • Defensive Programming • Cryptography • Security Analysis and Engineering • Digital Forensics • Security Governance |
Society, Ethics, and the Profession | SEP | Social Context • Methods for Ethical Analysis • Professional Ethics • Intellectual Property • Privacy and Civil Liberties • Communication • Sustainability • History • Economies of Computing • Security Policies, Laws and • Computer Crimes • Equity, Diversity and Inclusion |
Software Development Fundamentals | SDF | Fundamental Programming Concepts and Practices • Development of Fundamental Data Structures • Development of Algorithms • Software Development Practices |
Software Engineering | SE | Teamwork • Tools and Environments • Product Requirements • Software Design • Software Construction • Software Verification and Validation • Refactoring and Code Evolution • Software Reliability • Formal Methods |
Specialized Platform Development | SPD | Web Platforms • Mobile Platforms • Robot Platforms • Embedded Platforms • Game Platforms • Interactive Computing Platforms |
Systems Fundamentals | SF | Basic Concepts • Resource Allocation and Scheduling • System Performance • Performance Evaluation • System Reliability • System Security • System Design |
Here’s a finer breakdown of subject areas within computer science:
Computer scientists need to understand the following concepts. Note that these are not specific to computers that have keyboards and monitors.
People use principles form computer science to create lots of different types of systems. Here’s a rough list of (overlapping) software system categories:
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:
Computer science borrows from, and touches, a whole lot of other fields, including:
Wikipedia has a list of famous computer scientists. If you want to read about some of these people, don’t skip Alan Turing, Grace Hopper, and Alan Kay.
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.
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.
We’ve covered: