This course aims at introducing to students principles and methodologies of computer programming. Emphasis is on good programming style, techniques and tools that allow efficient design, development and maintenance of software systems. The course focuses on the design of computer applications drawing attention to modern software engineering principles and programming techniques, like object-oriented design, decomposition, encapsulation, abstraction, and testing. A significative case study is used to allow students to experiment with the principles and techniques considered in this course. Depending on the background of the class, Java, C++, and/or Python are considered in the course.