Description: How to systematically design programs in functional and object-oriented languages. Includes inductive data definitions, data-directed program design, test-driven software development, semantic reduction rules, recursive problem decomposition, procedural abstraction, functions as values, tail recursion and loops, object-oriented design patterns, algorithmic efficiency, programming in Scheme and Java.