In this course, you will transition from a focus on basic programming skills to
applying those skills to solve problems. You will do this by learning to think of
software development as a rigorous process, in which the actual programming is one
of the smallest parts. You will be introduced to higher-level problem solving
approaches, such as recursion and generic programming, and larger-scale organization
and algorithms, like object orientation, lists, stacks, queues, searching, and
sorting. You will gain familiarity with software development techniques,
such as the importance of thinking about specifications, design, and testing
before coding and the utility of incremental development in an exploratory
environment. You will also develop an understanding of the mathematical
nature of software development by examining the relationship algorithms,
programs, and the underlying theory, including logic, sets, functions, number
bases.