Once you master a core knowledge
base including variables, sequencing,
conditionals, loops, abstraction, mod-ularization, and decomposition, you
will be a computing professional. This
is a woefully incomplete characterization of what computing professionals need to know. The concepts listed
are all programming concepts, and
programming is a small subset of CS.
The listed concepts were central in the
1960s and 1970s when programming
was the main interface to computers.
Today, you simply cannot be a competent programmer with little skill at systems, architectures, and design, and
with little knowledge of the domain in
which your software will be used.
Programming is easy to learn. Programming and coding are skill sets.
Programmers can progress from
beginners to experts over a long period of time. It takes more and more
practice and experience to reach the
higher stages. Becoming proficient at
programming real-world applications
is not easy. The much publicized kid
coders are mostly beginners.
Educators have been searching for
many years for ways to accelerate learning programming. Seymour Papert introduced the Logo language in the 1970s
and watched how children got excited
by computing and learned how to think
computationally. He attuned Logo to
children’s interests; even so, it still took
students time to move from the fascination of the introduction to the ability to
program useful computations regularly.
Computational thinking is the driver
of programming skill. Computational
thinking (CT) is an old idea in CS, first
discussed by pioneers such as Alan
Perlis in the late 1950s.
8 Perlis thought
“algorithmizing” would become part
of every field as computing moved in
to automate processes. Dijkstra recognized he had learned new mental skills
while programming (1974). In his 1980
book Mindstorms, Papert was the first
to mention the term CT explicitly when
discussing the mental skills children
developed while programming in Logo.
Jeannette Wing catalyzed a discussion
about how people outside CS could
benefit from learning computing.
common thread was always that CT is
the consequence of learning to program.
Modern versions of the CT story
have turned this upside down, claim-
We have worked closely with many
people in this movement. They have
been confronted with a number of mis-
conceptions about computer science,
both in the audiences they are trying to
reach and among themselves. These
misconceptions can lead to expectations
that cannot be met—for example, gradu-
ates thinking they have studied things
that will help them land and keep good
jobs, or employer expectations about
what graduating professionals can do
for them. These misconceptions can
also interfere with practitioner abilities
to navigate effectively in the real world
of computing. Our purpose here is to call
out the nine most pernicious of these
misconceptions and call on our profes-
sional colleagues to work to dispel them.
CS = programming. The idea that programming is the core activity of computer
science is easy to accept and yet it is only
partly true. Computing professionals are
expected to be able to program. But computing professionals engage in many
other important activities such as designing software and hardware systems,
networks, databases, and applications.
The idea that coding (a subset of programming) opens the door to many career opportunities has intrigued the public
because of the successful publicity of Hour
of Code, after-school coding clubs for boys
and girls, and coding competitions.
This misconception is not new. It
took root in the 1970s and was repeat-
edly challenged over the years; ACM
and IEEE, for example, spent consider-
able effort in the 1990s uprooting it.
The most recent ACM/IEEE college cur-
riculum includes 17 areas of comput-
ing technology besides programming.
Even when computing is distilled to its
core scientific and engineering prin-
ciples it is still a huge field in which
programming is not the lead.
4 The new
Advanced Placement course CS Prin-
ciplesb reflects a much broader view
of computer science for high school
seniors. Code.org’s K– 12 curriculumc
covers much more than coding. Yet the
“learn to code” movement seems to of-
fer quick access to many well-paying
jobs after you work your way through in-
tensive bootcamps and workshops. The
moment of truth comes when you dis-
cover in interviews that employers look
for much more than ability to code.
Programming is concerned with
expressing a solution to a problem as
notation in a language. The purpose
of programs is to control machines—
not to provide a means of algorithmic
self-expression for programmers.
Starting with Ada Lovelace’s example
programs in the 1840s, programming
has always been concerned with giv-
ing instructions to a machine so that
the machine will produce an intended
effect. A programming language is a
notation used to encode an algorithm
that, when compiled into executable
code, instructs a machine.
Computer scientists have long understood that every programming
language (the “syntax”) is bound to an
abstract machine (the “semantics”).
The machine—simulated by the compiler and operating system on the real
hardware and network—carries out
the work specified by the algorithm
encoded in the program. Advanced
programmers go further: they design
new abstract machines that are more
suited to the types of problems needing solution. The idea that programs
are simply a notation for expression
is completely disconnected from this
fundamental reality that programs
A recent illustration of this is the legal battle by copyright owners to block
the distribution of decryption software
that unlocked copyright protection.
The decryption software would have
been uninteresting if it were merely
a means of expression. But that software, when run on a machine, broke
the copy protection.
beginners to experts
over a long period
of time. The much
publicized kid coders
are mostly beginners.