What is Computer Science?
If you’ve ever wondered what Computer Science was, then this may be for you.
When describing the history of computer science, many begin with the ancient Babylonian Abacus as the precursor. Then come the references to various mechanical computational devices and algorithms of the 18th and 19th centuries. These form a sort of timeline leading up to the recent explosion of computing technology that began during the 1940s.
Computing technology achievements during the early 20th century are primarily attributed to mathematicians. Around the mid-1930s, Alan Turing and Alonzo Church examined the possibilities of computers with their Church-Turing thesis. The birth of modern computing began with scientific achievements made by the code breaking Allied mathematicians and scientists of World War II.
By the 1950s programmable computers were being used in research, and during the 1960s Computer Science became its own discipline. The developments made by researchers and scientists in the 1960s and 1970s lead to the popularization of the personal computer, and later of the World Wide Web.
Current research indicates possible future advancements in the areas of Artificial Intelligence, Nanotechnology, Quantum Computing and Biological Computing. Indeed; computing technology has greatly influenced civilization in a relatively short span of time, and it appears that more discoveries are the way.
As one of the newest academic disciplines, Computer Science academic programs must change in reaction to not only improved methods of teaching Computer Science. But they must also react to the very fast rate of advancement in technology relative to many other sciences. As a result, the Association for Computing Machinery, a professional computing organization, has developed guidelines to help colleges and universities create relevant Computer Science curriculums. I am a participant of such a program.
A typical Computer Science curriculum today (like the one I am participating in) requires the following coursework:
Mathematical Background:
Integral and Differential Calculus, Sequences and Series, Multivariate Calculus, Linear Algebra, Discrete Mathematics with Number Theory, Probability
Science Background:
Physics for Science and Engineering (statics and fluids, light and sound, electricity and magnetism)
Additional Science Background:
Most programs, including mine, require an additional year of science in addition to physics. I took General Chemistry because it was the only valid choice at my community college. I’ve noticed that many of the students in my program took Geology as their additional science sequence.The rest of the curriculum involves courses that were designed specifically for Computer Science students. A few of these are modifications of courses from other departments. The Computer Science student must also take the regular dose of general university requirements, which generally includes foreign language, writing proficiency and humanities courses.
There is some debate about the best order in which to take the Computer Science specific courses. The following listing is roughly the order in which I took them.
Introduction to Computer Science:
This is an overview course, and involves a basic introduction to most of the major areas of Computer Science. These are usually two courses long.
Propositional and Predicate Logic:
Humans have been studying logic for centuries, and the material has likely given students headaches for just as long. It is essential to master this material if one desires to fully understand Computer Science. This stuff is found in basically every Computer Science course offered. It is part of the nuts and bolts of Computer Science.
Computer Architecture:
This is split up over two or more courses. It usually begins with circuit logic and circuit design. Many institutions require that their students build a basic computer from the ground up using basic circuitry. The other part of the course examines in great detail the major components of a computer including the processor, memory system, paging system and interrupts. My architecture courses included a component on Assembly Language, but this could be found as a separate course. Assembly Language is the underlying language used for programming computers.
Data Structures:
These are theoretical constructs contributed by many brilliant researchers during the young life of Computer Science. They are used for storing and retrieving data in a computing environment. Some of the most famous data structures include the array, list, and tree. There are many others, and it’s the job the Computer Scientist to understand all of the primary data structures in detail, so as to know when and how to use a particular data structure to solve a particular problem.
Software Engineering:
Because computers are now being used by a majority of institutions and businesses, the field of Software Engineering has become increasingly important. Software Engineering examines all of the aspects of how people write programs for computers. Businesses and institutions have conducted many experiments in this area in an attempt to improve the process of writing good programs. Most universities offer a degree that is specifically designed for those interested in software engineering.
Concurrency:
This area of Computer Science has been around awhile, but seems to be really coming into its own recently. Dual-core or dual-processor computers are becoming more common, as are distributed systems. Both parallel and distributed computing paradigms require programmers who understand concurrent programming. It is a major area of research right now, and more Computer Science departments are offering it to, or requiring it of, undergraduates at an introductory level.
Numerical Computation:
This is a mathematically intensive course that examines how computers represent numbers and some of the major algorithms used for mathematical calculations. In my course we studied the primary algorithms used for finding roots of equations, for performing numerical integration, for solving systems of linear equations and for matrix factorization. Computers have proven extremely useful for researchers in any field that requires crunching large amounts of data. This course gets into the nuts and bolts of how computers are often used to perform such calculations.
Formal Languages and Automata:
This is the formalized theory of Computer Science, or of computation in general. The formal languages component is essentially a study of linguistics as it is applied to Computer Sciences. It is a study of the language of machinery, and is supposed to give the student a good idea of what is going on between a computer and a programming language.The Automata component is the study of theoretical machines, which can be mathematically proven to react in a certain way to a particular input or set of inputs. Along with these components, the course also examines Turing Machines and complexity theory. Complexity theory examines classes and subclasses of problems that are computable or not computable within particular space and time constraints. Some of the biggest theoretical questions in Computer Science are found in the arena of complexity theory.
Programming Languages:
In my Computer Science curriculum there is a Programming Languages course, and then there are numerous courses that integrate a particular language into the course. The Programming Languages course itself is a formalized study of the theory of programming languages and their major constructs, along with an examination of specialized types and classes of programming languages. Programming languages are classified according to paradigms based on intended usage. Major paradigms include the procedural, object-orientated, functional and logical.Specific programming languages that I’ve studied as either part of another course, or as a course about a particular language itself, include the following: Visual Basic, C, C++, C#, Java, Ada, Scheme, Pascal, SR, Scripting Languages (VBScript, JavaScript), and Markup Languages (HTML, XML, TeX).
Operating Systems:
This course gets into the details of the ubiquitous operating system. It is about utilizing hardware and managing resources in a timely, fair, and concurrent manner without screwing up very often, and ideally not at all. The two major flavors of operating systems in the world today are Unix and Windows. My curriculum includes a course specifically designed around each, as well as an overview course which examines both how specific tasks are accomplished by operating systems, as well as additional theoretical methods of accomplishing those tasks.
Algorithms:
Understanding algorithms is integral to understanding Computer Science. In this set of courses algorithms are examined at the mathematical level in terms of how quickly they can run in the best, worst and average cases; as well as in terms of how much space a particular algorithm will require. Aside from learning the tools, and gaining savvy, on how to analytically evaluate the algorithms that correspond to all of the major data structures, the student will also get a chance to design algorithms that solve novel problems within particular constraints. This is the application of Computer Science.
Networks:
This is a study of the hardware, languages and algorithms that have been designed to allow computers to communicate with one another. One of the most obvious results of networks is the World Wide Web. This course is a study of the hows and the whys of safely and efficiently moving text, images, sound and video (or simply data) represented as binary across some medium such as electricity, radio waves or light waves. This course also covers some of the protocols that machines use to communicate with one another.
Capstone:
The capstone course in my curriculum involves a quarter-long team software engineering project that we design and implement. A Computer Science field examination is also taken as part of this course.
Electives:
No undergraduate degree would be complete without several electives. In my program I was required to take three or four elective Computer Science courses. I primarily chose mathematics based courses for my electives, but there are a variety of choices. Some of them include:- Advanced versions of many of the above-mentioned courses (some of these are graduate level though)
- Courses about a specific programming language like Java, Prolog or Lisp
- Web programming courses: a good provider of practical jobs for some graduates
- Game Programming: many Computer Science majors take this
- Artificial Intelligence: games use this stuff a lot
- Compiler Theory: this is the implementation version of Formal Languages
- Database Theory: an advanced understanding of databases is necessary for many programmers
- Software Testing: yes, an entire course on testing code
- Security: this is the mathematics of cryptography and other areas of computer system security
- Graphics: a mathematically intense topic involving the visual output side of Computer Science
- Animations: 3-D graphics with motion and even more intense mathematics
- Robotics: this is a sort of melding of Computer Science and Electrical or Computer Engineering
- Bioinformatics: the newer field of computational biology combines biology with computation
Well, that should cover most of it. If I’m missing something let me know, and it's possible that I'll add it.
