Discovering, formulating, and exploiting the structure of problems to aid in their solution by computer -- an introduction to algorithmic problem solving and computer programming in Java.