Fundamental programming concepts are presented together with supporting theoretical bases and practical applications. This course emphasizes the practical application of techniques for writing and analyzing programs: data abstraction, program verification, and performance analysis. These techniques are applied in the design and analysis of fundamental algorithms and data structures. The course is currently taught in Java. Prerequisites: 15-111 and either 15-151 or 21-127