Topic Name Description
Page Course Syllabus
1.1: Programming Paradigms Page What is Computation?

This video addresses the basic nature of computers and speaks to what they are capable of. It emphasizes the fact that computers only do what humans program them to do. The video mentions the language Python, but any language would apply here, including Java and C++. Watch from 6:55-28:40.

Book Functional Programming

Read this introduction to functional programming, through Section 3.3.1. As you will see from the article's index, many languages support functional programming, including (although not mentioned in the article) C/C++.

Page A Brief Review of Object-Oriented Concepts

These slides review the object-oriented approach and relate it to earlier approaches.


1.2: Generic Programming and Late-Definition of Data Types Book Generic Programming

Read this text, which discusses the basics of generic programming and relates it to different languages.

Book Staged Generic Programming

As with all efforts to simplify programming so that systems of greater complexity can be more easily created, there are issues to consider.

1.3: Fundamental Concepts of Object-Oriented Programming Book Objects and Classes
Object-Oriented (OO) concepts of modularity, abstraction, composition, and hierarchy are very powerful and require intense attention to detail. This chapter gives a detailed presentation of OO as implemented by Java. The terminology in this article is a little different; name-binding is called name-scope. The chapter begins with an explanation of the data and procedures of a class (called class variables and class methods). The class data can be fixed for all objects, in which case, it is called static. Static variables are common to all objects. There is only one copy and, thus only one value, stored in the class.

A name (variable) is associated with a 'value'. A Java class can have any number of variables and each object (instance) of the class contains its own copy of those variables. In the terminology for Java, each object has a name, which is a pointer to the location of each instance of an class, and its variables. The next detail to note is how objects are created and initialized (i.e. values assigned to its instance variables and its methods names) by assigning values to them in the class via constructors. 

A consequence of the concepts of modularity and abstraction is reuse. In writing an OO program we can use classes that have been written by others and are part of the language or contained in class libraries associated with the language. Recall that the generic computing paradigm consists of several states: requirements, design, implementation, and validation. In software engineering, it is referred to as the programming process.

Section 5.3 gives insight into writing programs using classes. What classes, what objects, and how they are related are questions of program design. Section 5.4 illustrates the design and implementation stages of the process. The latter sections continue with the VERY important OO details of inheritance and polymorphism. They create a class hierarchy that enables code to be shared among classes and among similar, but different, objects. Whereas Java has simple inheritance (a subclass can extend one superclass), C++ has multiple inheritance ( a subclass can extend 2 or more superclasses). Java does, however, have a restricted kind of multiple inheritance called interfaces, where an interface can be implemented by 2 or more classes. As you read, think about how the concepts are connected. If you understand variable names, in particular the object names 'this' and 'super', the class name 'Object', and the dot naming convention (like ClassName.objectName.methodname), you should have a good understanding of the concepts and details presented in this article.


1.3.1: Practice Using Classes and Objects Page Classes and Objects in C++

Read this text on the implementation of classes, methods, attributes, and driver programs.

1.3.2: Practice Using Inheritance Page Inheritance in C++

Read this article, and then take a shot at an implementation using inheritance. The text gives a detailed walkthrough of one approach.

1.4: Insights from Experienced Programmers Page Beyond Patterns: Technological Systems and the Nature of Order

Paraphrasing this video's speaker, "Design patterns have been a part of the vocabulary of software design for quite awhile. At the same time, the scope of systems design has moved broadly away from straightforward client-server technology. Systems and services are now expected by end users to be accessible from innumerable points including wearable or embedded devices through mobile phones, tablets, augmented or virtual reality systems, voice assistants, conversational chatbots, and others only barely conceived. As designers of the new range of experiences enabled by this technology, we require new ways to describe, to communicate, and to reason about these increasingly complex systems. This talk describes one such approach: an understanding of the craft of system design that takes its inspiration from functional programming, and from the nature of order as an earlier generation did from pattern languages". The speaker guides us in taking a broad high-level view of programming computers so that their operation is not limited to virtual reality but effective in the world in which we live.

Page The Aesthetic of Programming

The speaker in this video notes that experienced coders can sometimes tell bad code on sight, not from any aspect of its inherent functionality, but from largely aesthetic characteristics. He also recognizes that writing code is often like writing good literature, if we want it to be understandable and useful. This video is a very interesting step from the philosophical to the practical.