Object-Oriented Programming and Abstraction
(Archive from Fall 2025, all sections)

Course content

About the course

What happens as programs grow large and complex? How do we break a large program into manageable pieces? How do we make those pieces reusable beyond their original context, and their original author? Programming is a deeply complex, collaborative, and human endeavor. How can we humans, with our human minds, work with computers and each other to create something of value?

This course is an introduction to the way software developers create structure in code. It provides practical experience: it is a heavily hands-on course, and you will spend time building the skills necessary to create software using many of the same tools that professionals use to build it.

However, at least as importantly, this course is a grounding in underlying principles. In the fast-changing world of software, no matter what you learn today, rest assured you will need to learn something unfamiliar tomorrow! This course will give you groundwork to recognize the familiar in the unfamiliar, and stay adaptable by anchoring your learning in things that have remained present through programming’s many topsy-turvy years.

In this class, you will learn about subject matter in three general categories:

  • Concepts: These are the ideas of which code and code structures are made. They take on many forms, appear in many contexts, and apply across many programming languages and kinds of software. Examples include: abstraction, classes and objects, encapsulation, type systems, ASTs, polymorphism, closures, APIs, separation of concerns, contracts, immutability, and parallelism.

  • Practices: These are the processes and habits developers use to build software. They are the heart of the software practitioner’s craft, and are not so much about what the code is as they are about what the programmer does. Examples include refactoring, testing, pairing, versioning, diagramming, writing for readability, documenting, and debugging. Collaboration and communication are recurring themes through all of these.

  • Tools: We will work with many tools professional software developers use on projects out in the wild, most notably Java, Git, GitHub, Visual Studio Code, JUnit, and Slack. Each of these tools is practical and useful in its own right! However, each is also a path to deeper learning about concepts and practices. Thus, you should not think of this as a “Java course;” it is a course that uses Java to teach the important concepts and practices of software development.

You can find a detailed overview of course content in our Comp 127 Learning Goals.