Tuesday, May 3, 2011

WHAT IS COMPUTER SCIENCE?

Computer Science is defined in different ways by different authors. Wikipedia (http://en.wikipedia.org/
wiki/Computer_science) defines computer science as the collection of a variety of disciplines related to
computing, both theoretical and practical: theoretical foundations of information and computation, language
theory, algorithm analysis and development, implementation of computing systems, computer graphics,
databases, data communications, etc.
The US National Coordination Office for Networking and Information Technology Research and
Development (NITRD) defines computer science in a similarly broad way:
the systematic study of computing systems and computation. The body of knowledge resulting from this
discipline contains theories for understanding computing systems and methods; design methodology, algorithms,
and tools; methods for the testing of concepts; methods of analysis and verification; and knowledge representation
and implementation. (http://www.nitrd.gov/pubs/bluebooks/1995/section.5.html)
Another broad definition comes from the Association for Computing Machinery (ACM) Model Curriculum.
It says that computer science is the “study of computers and algorithmic processes, including their principles,
their hardware and software design, their applications, and their impact on society.”
A famous definition of computer science by Gibbs and Tucker (Gibbs and Tucker, “A Model Curriculum
for a Liberal Arts Degree in Computer Science,” Comm. of the ACM, vol. 29, no. 3, March 1986) emphasizes
algorithm development and analysis as the central focus of computer science.
It’s also a fair question to ask, “How is computer science a science?” In contrast to physics, biology, and
chemistry, computer science is not based on the study of the natural world. In that sense, computer science is
more like mathematics than science. Some argue that computer science is really computer art (where “art”
means practice). On the other hand, computer scientists do use the scientific method to propose and test
hypotheses, and some very nonobvious discoveries in computer science have important real-world implications.
An example, which we will discuss later, is the discovery that some important problems simply cannot be solved
by computation.
Despite many variations, essentially all definitions of computer science emphasize the study of algorithms.
Algorithms, in one form or another, are central to computer science. Computer science combines the theoretical
concepts of algorithm design and analysis with the practical considerations of how to implement algorithms on
a computer and solve practical problems.


An algorithm defines a detailed and unambiguous sequence of actions for solving a particular problem or
for performing some task. If you have ever followed a recipe when cooking, followed a set of driving directions,
or filled out an income tax form, you have worked with an algorithm.
For example, at some point in time you were probably taught how to determine the greatest common divisor
(GCD) of two numbers. In case you’ve forgotten, the GCD of two positive integers is the greatest integer that
is an even divisor of both numbers. For example, the GCD of 42 and 30 is 6. The algorithm given below can be
used to compute the GCD of two positive integers a and b:
If b is zero, then the GCD of a and b is a. Algorithm ends.
Set r to be the remainder obtained from the integer division of a and b.
Repeat this process using b and r.
Consider computing the GCD of 42 and 30. Let a = 42 and b = 30. We start the process at step 1 of the
algorithm. Since b is not zero, we proceed to step 2. In step 2 we compute the remainder obtained when 42 is
divided by 30, which is 12. Step 3 instructs us to repeat the process, this time using 30 and 12. So on this second
trip through the process a is now 30 and b is now 12. Since b is not zero, we compute the remainder of 30 and
12, which is 6, and repeat the process using 12 and 6. As before, since b is not zero, we compute the remainder
of 12 and 6 and get zero. We will now repeat the process using 6 and 0. This time through, since b is now zero,
we conclude that the GCD of 42 and 30 is 6.
Algorithms are essential to the way computers process information because a computer program is basically
an electronic form of an algorithm that tells the computer what specific steps to perform to carry out a specified
task. In order to study an electronic form of an algorithm, a computer scientist must also understand the computer
that will be used to execute the steps of the algorithm. The term hardware is used to describe the physical,
tangible parts of a computer. A keyboard, mouse, motherboard, graphics card, and processor are all examples
of computer hardware.
Just as a racecar driver needs to understand the capabilities and limitations of the vehicle they are driving,
a computer scientist must also understand the hardware platform on which computing algorithms will be implemented.
It is not enough just to “know how to drive” in the case of the racecar driver, and it is not enough just
to “know algorithms” to be a computer scientist. An algorithm that is optimal for a particular hardware platform
may not be optimal on another.
Algorithms are typically expressed in a form that can be easily understood by a human being. For example,
the algorithm given earlier to compute the GCD of two numbers was written using the English language so that
it would be easy for you to understand.
Even though you may understand more than one language, the only language that a computer understands
is machine language. Machine language is a system of codes that the computer is designed to interpret. Each
word in machine language represents a simple action that can be performed by the computer. For example the
machine language instruction “add” instructs the computer to add together two numbers. (In Chap. 3 on
Computer Organization, we will explain machine language in much more detail.) The set of instructions that,
when executed by a computer, executes the steps of an algorithm is called a program.

It is difficult for humans to work directly with machine language. Machine instruction words consist of
rows of ones and zeros, typically 8, 16, 32, or 64 bits long, and sometimes varying in length. Since people have
difficulty manipulating these strange codes directly, computer languages have been developed to ease the
process of converting an algorithm into a form that the computer can act upon. We refer to these languages as
higher-level languages, because the languages have been designed to allow humans to work at a “higher level”
than at the level of ones and zeros of the computer. Machine language, on the other hand, is often referred to as
a low-level language. Java, FORTRAN, Basic, and ADA are just a few examples of high-level languages that are
used by computer scientists to express the algorithms they have developed. The act of expressing an algorithm
using a low-level or high-level language is referred to as programming.
Over the years, starting in the 1950s, computer scientists have created many higher-level languages. In the
early days some experts thought that it should be possible to develop one language that would be best for all
uses. Since then, however, computer scientists have found that language design always trades off some features
and capabilities for others. As a result, today we have many good higher-level languages, some particularly
suited to symbol manipulation, some particularly good for teaching programming, some good for matrix algebra applications, some for fast one-off, one-time programs, some for mission-critical, life-dependent
applications, some tuned for applications in real-time automation control, and many good ones for general-purpose
use. Computer scientists study the general characteristics of computer languages and formal grammars, and
usually become proficient in several or many different languages.
The term software is used to describe the set of instructions, or programs, that a computer uses to execute
an algorithm. Software contains the instructions that direct the operation of the hardware. The software that
makes the basic functions of the computer accessible is referred to as system software. System software is
responsible for controlling and managing the hardware of a computer system, and for making the computer easy
to use for program developers as well as general users. Examples of system software include operating systems,
display managers, virus scanners, language processors (called compilers or interpreters—to be discussed in the
chapter on software), and device drivers.
Programs such as word processors or spreadsheets are referred to as application software. Application
software is used to accomplish specific tasks. Application software may consist of a single program, or a small
collection of programs that work together to accomplish a task for a user of the computer.
Operating systems are particularly important and complex system software. They are important because
the performance of the operating system has a dramatic influence on the quality of the computer user’s experience
and the efficiency of the computer system as a whole. In the days of simpler computing systems, in the
1960s and 1970s, a company might purchase a computer without an operating system, with the intention
of writing or using its own operating system, but today one always buys an operating system when one buys
a computer.
The operating system provides easy access to peripheral devices like printers and displays, a file system for
storing information like data, documents, and programs, a user interface to make it easy to start application
programs, a time-of-day clock, a connection to the Internet using the standard network protocols, a set of “calls”
or “methods” that application programs can use to request services of the operating system, an efficient algorithm
for allocating memory to the various programs active at the same time, and an efficient algorithm for sharing
access to the computer among several people and/or programs at the same time.
Popular operating systems today include Microsoft Windows, Mac OS, Unix, Linux (a variety of Unix),
and IBM’s MVS, among others. In fact, the field of operating system development is still a very active one in
computer science. Not only are operating systems becoming more complex (adding firewalls and other protections,
for example), but operating systems are also becoming more diverse. As simpler devices like thermostats and
dishwashers come under computer control, computer scientists have created specialized “embedded systems”
operating systems for those requirements.
Even into the 1980s many, if not most, computers were stand-alone—not connected to one another. During
the 1970s and 1980s computer scientists explored the advantages of computing networks and proposed
a number of different physical connections among computers, as well as different networking protocols. At the
time there was hot competition among different vendors of computers, each with a different standard, and each
hoping to “lock in” customers by selling its particular networking products. IBM offered System Networking
Architecture (SNA), Digital Equipment promoted DECnet, Hewlett Packard offered Distributed Systems
(DS), and Xerox offered Xerox Networking Systems (XNS). Even General Motors got into the act, with its
Manufacturing Automation Protocol (MAP). None was directly compatible with any other, but all offered
“bridges” to other systems.

Today the problems for computer scientists in networking are different. For the most part, the world
has agreed on the IEEE 801 standards and the TCP/IP protocols for the Internet. The problems now have
to do with expanding the number of Internet addresses without disrupting the operation of the older “installed
base,” adapting to new and much faster physical connections such as optical fiber, increasing the speed of
wireless connections, which are by nature slower and more susceptible to interference, managing larger
data transfers such as movies, which also require strict real-time performance so the movie doesn’t stop
midaction, and providing low-power, low-cost protocols for the ad hoc connection of hundreds or thousands of
digital sensors.
Supporting almost all applications today is database technology. The dominant database model is the
relational database, first offered for commercial use in the 1980s. Computer scientists develop algorithms for
storing and retrieving information quickly from absolutely enormous reservoirs of data. How is it, for example,  that Google can call up almost instantly more than 400,000 images of a “red barn” from over 1.5 billion
images in its database?
There is a great deal to know about creating a good database, accessing a database from a program, growing a
database, and managing a database. Application programmers and database administrators need to understand
databases at this level in order to use them efficiently. Even computer scientists focused on other specialties
need to know about databases today. For instance, some of the newer operating systems use database technology
in their file systems for the storage of all information, not just information formally devoted to a particular
database. The benefits to the operating system include speed, space savings, and data security.
At a deeper level, computer scientists develop algorithms for sharing access to a database among many
users simultaneously. For instance, a site like Amazon.com may serve more that 100,000 users at once, and it’s
important that each user’s choices and purchases be kept distinct from one another. Likewise, when you reserve
an airplane seat on-line, it’s important that two people on-line at the same time are not promised space in the
same seat!
Computer scientists also develop algorithms for making backup copies of the database to protect against
the possibility of data loss due to equipment failure. For a site like Amazon, such an algorithm must allow
backup without first stopping the operation of the primary database, for the site must be up at all times!
Algorithms to provide such service reliably and efficiently are very challenging to perfect.
It should not be hard to convince you that computers have dramatically changed the way in which human
beings live their lives. Technologies such as the Internet and the World Wide Web put a vast amount of information
at our fingertips. Instant messenger systems, electronic mail, and cell phones have revolutionized the
way in which human beings communicate. Computer surveillance systems are being used by police forces to
make the world a safer place to live.
While all of these technologies are primarily being used for the betterment of human kind, it is also possible
to use these technologies to inflict harm, obtain unauthorized access to information, or to spy on people.
Coupled with the ability to develop these technologies is a need to address the social and ethical uses of the
technology. It is just as important, perhaps sometimes even more important, to ask questions about the potential
impact of a technology on society, as it is to build the technology. As more and more people come to depend
on computing technology in their daily lives, computer science must also consider the study of social issues of
the technologies that it produces.
There is a common misconception that computer science is nothing more than the study of computer hardware
and programming. It should be clear to you now that computer science is much more than simply writing
programs. It includes the study of computer hardware, computer languages, operating systems, networking,
databases, and the social consequences of computing. In order to be effective, a computer scientist must understand
and master each of these areas. Further, computer science is a young discipline that is still rapidly evolving
since its beginnings in the 1940s. In the next section we will briefly explore the history of computing from both
a hardware and software perspective.

No comments:

Post a Comment