Computational Problem solving Getting Started with

Getting Started with
by brian C. dean, Phd
Computational
Problem solving
A
s I am writing this article, my staff and I are making final preparations for the 2013 U.S. Open programming contest,
the last of several programming contests hosted throughout the academic year by the USA Computing Olympiad.
One of several major Olympiads within the USA, the USACO supports talented precollege computing students
by providing online instructional materials and programming contests, and by hosting a summer training camp for top
computing students in the country. In recent years, I have seen hundreds of dedicated students work their way up through
our program from outright beginners to true international superstars who have gone on to attend top universities, publish
groundbreaking research, and start successful companies. If I am lucky, they also volunteer their time and energy to help the
USACO educate the next generation of computer science leaders.
Unfortunately, the number of students participating in computing
activities across the U.S., such as those organized by the USACO, is still
alarmingly small. This may seem somewhat surprising, especially considering that demand for computing talent is soaring: smart phones and mobile
devices have now made computing an integral part of our daily lives, and
broad trends toward “big data” analysis in science and industry are creating
a crucial need for computing expertise in nearly every other discipline.
But if computing is in such high demand, why aren’t more precollege
students interested in programming and computational problem solving?
building blocks
I believe the problem is not a lack of interest, but a lack of resources and
guidance. The big hurdle seems to be in the very first step: learning to
program in the first place. It is widely acknowledged that K–12 computing education in the U.S. is in a somewhat deplorable state. And modern
computers themselves often do not lend themselves well to tinkering and
programming. In the past, one actually needed some familiarity with programming to even use computers, but now computing devices are more
user-friendly and consumer-oriented, making it harder to “see under
the hood.” The Internet, on the other hand, contains an overwhelming
amount of information one can use for learning about computers, but
without proper guidance, it can be hard to identify the best information.
Fortunately, in the past few years, many options have become available to help students—even those starting from a blank slate—achieve
10 imagine
programming proficiency. The most notable are probably graphical
“block-based” programming environments such as Scratch (scratch.
mit.edu), which allows you to write surprisingly elaborate programs
by dragging differently shaped blocks together. Blocks only fit together
in valid configurations, so accidental syntax errors are a thing of the
past (for example, forgetting a semicolon or a bracket somewhere),
removing one of the primary frustrations experienced by novice coders. Block-based programming is so simple that even young students
can easily grasp the concept; with little or no instruction and zero
programming background, they can often write meaningful code
within minutes. A similar block-based programming environment
called App Inventor (appinventor.mit.edu) lets you write simple apps
for your Android cell phone, all with zero programming background
and minimal effort.
Many other free online tools exist that can help one learn to program.
Popular environments like Alice (alice.org) and Kodu (fuse.microsoft.
com/projects/kodu) allow students to easily write code that produces 3D
interactive animations and video games. Khan Academy (khanacademy.
org/cs), well known for its rich set of instructional videos across many
subject areas, has a growing collection of excellent interactive tutorials
that help you learn programming, with fun projects mostly involving
interactive graphics. New languages such as Processing (processing.org)
make it very simple to generate amazing graphical art and embed it in
web pages.
may/Jun 2013
Problem solving in Any language
Even if you start coding in a more graphical,
block-based setting, you will eventually want
to learn a “real” programming language. Which
language is best for beginners is the subject of
much debate, and you will hear a number of
strong opinions depending on whom you ask. I
learned programming in BASIC, which is still an
excellent starter language, although its popularity seems to be waning. Python is probably the
most popular choice for a new teaching language
at present, but there are many other reasonable
choices as well, such as JavaScript, a relatively
simple language that runs on web pages to make
them interactive (although to get the most out
of JavaScript, one must also know several other
web development technologies like HTML
and CSS to at least a limited extent). Another
fun language, and very different from the ones
above, is Racket (racket-lang.org), a dialect of
a very simple language called Scheme. Racket
allows you to embed media objects like pictures
directly into your code, and you can manipulate
these in very elegant ways. In addition, many
high-school computer science courses use the
language Java (which is completely different
from JavaScript), so you may find it convenient
to consider that as well.
That there are so many languages and
environments to choose from when learning to
program makes the process a bit more daunting than it needs to be. At the end of the day, I
always remind my students that programming
is not really about the language you use. It’s
about the underlying thought process, the
ability to break down complicated ideas into
simple steps that you can express in code. In
fact, many aspects of computing are not particularly dependent on writing code at all. This is
well illustrated by a wonderful program called
Computer Science Unplugged (csunplugged.
org), which teaches a surprisingly broad set of
computer science concepts in a fun, hands-on
fashion—without using computers. In Europe,
hundreds of thousands of students take part
in the Bebras contest (“bebras” is Lithuanian
for “beaver,” the contest mascot chosen for its
engineering prowess), which involves solving
www.cty.jhu.edu/imagine
computing problems that require no prior
knowledge of programming or algorithms.
(This contest does not yet exist in the States,
but I know many who are interested in setting
up a U.S. version down the road.) Solving a
computational problem is like solving a fun
puzzle, and the analytical and logical skills that
help with mathematics are the same skills you
want to develop for solving computing problems. Participation in mathematics activities is
therefore highly encouraged, since it is hard
to be a good computer scientist without also
being a good mathematician.
The outlook is becoming even more promising for those who want to learn computing
using online resources. Universities such as
MIT have opened their entire curriculum,
placing all their class materials online for
free, and we are now witnessing the advent
of Massive Open Online Courses (MOOCs),
where well-regarded professors teach highquality versions of their university courses to
up to tens of thousands of students online at a
time. In addition, inexpensive hardware interfaces like Arduino (arduino.cc) and Rasberry
Pi (rasberrypi.org) are enabling novice students to easily write code that interfaces with
electronics and robotics. There is also increasing momentum for large-scale initiatives to
help improve programming and computing
instruction at the high-school level, such as
Code.org.
I
t is an exciting time to learn computing,
and I encourage you to explore as many
of the above options as possible. Hopefully
I will meet many of you one day when your
skills rise to the level of a finalist in the USA
Computing Olympiad!
I
LEARN,
COMPETE,
GROW
f you already know how to program,
you can improve your problemsolving skills virtually without limit
by working through problems on
websites like Project Euler (projecteuler.
net), the USACO online training pages
(usaco.org), and online programming
contest problem archives such as the
UVa Online Judge (uva.onlinejudge.
org) and Sphere Online Judge (spoj.
com). These sites not only give you
access to thousands of problems at
varying levels of difficulty, but they allow
you to submit your code and receive
feedback on whether it produces the
right answer.
There are also numerous programming competitions available, such
as the American Computer Science
League (acsl.org), TopCoder
(topcoder.com), Google CodeJam
(google.com/codejam), and of
course my own favorite (although
I may be slightly biased), the USA
Computing Olympiad (usaco.
org). Many of these programming
contests are available at different
levels of difficulty, allowing novices
as well as experts to continue
developing their skills.
—Brian Dean
Brian Dean holds a PhD
from MIT and is an
associate professor of
computer science at
Clemson University and
director of the USA
Computing Olympiad.
imagine
11