Anything. Or at least just about anything. Programming is used for anything from creating 3D computer games to analyzing stock market trends on Wall Street, from writing software to drive high-tech medical imaging devices to writing the code that displays your Facebook page. Given the ubiquity of computers today, knowing how to control a computer at a sophisticated level is an obviously useful skill. It is also a fairly rare skill which means that having it makes you stand out (for college applications or job interviews). Programming can be lucrative (think Google, YouTube, and Facebook) and/or philanthropic (think Wikipedia). But more importantly, it can be very intrinsically rewarding to the programmer and highly motivating (both the process and the end result) if you know what you are doing (this is key).

The following are a few examples of the types of graphics programming we will cover in Unit 1. We start with very simple graphics like the windmill shown below:
Then we progress to basic special effects while introducing object-oriented programming techniques:
Finally we wrap up Unit 1 with game design.
If you successfully complete Unit 1 of this book you will be able to write each of these programs (and more) from scratch. It might of course be tempting to simply look at the code and figure out what it means by toying around with it. With some effort, you could probably be successful in modifying some parts of these programs to do what you want without reading another line in this book. However, there are a number of pitfalls to this approach. Think of programming as the ultimate puzzle with rules that define what is allowed and best-practice techniques that suggest the most effective strategies. You would be suprised by the number of people who understand the "rules" part and completely ignore the effective strategies part. Think of programming like solving a Rubik's cube. One can certainly solve a Rubik's cube by staring at it and trying different moves for long enough. However, well-known systematic step-by-step strategies exist that allow anyone with a sharp memory to solve a Rubik's cube in a matter of seconds. This is exactly the nature of programming. Many untrained programmers sit in front of code and attempt to get the computer to do what they want it to do by trial-and-error with litte understanding of the mechanics of the code. This often results in hours wasted and much frustration on the part of the coder. To some extent, parts of programming (especially when trying something new) will always be trial-and-error, but there are a number of techniques that simplify the job and can make it very systematic. Now, one might ask, why, if programming is simply a matter of knowing strategies and applying them, is programming considered a high level skill. The reason is that there are so many possible strategies to select from. Being able to determine why one strategy is better than another or why two strategies may be equally valid is the skill that requires much experience. Thus, you should view this book like a strategy guide to a game like Chess. You can always make moves by knowing only the basic rules, but to become great at programming you must have the patience to learn the proper strategies first.