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
© Copyright 2026 Paperzz