This course is for building strong programming fundamentals, so that students can use computing to solve problems in their research or other technical pursuits. We spend half the semester learning programming fundamentals in C. Then we introduce C++ and move on to data structures and algorithms. During the last few weeks of class, students write a program in C++ that generates a finite element mesh, plans a path for a robot, or does something else according too their interests. C and C++ are chosen for the pedagogical benefit of learning to program with "no magic," for their applications in computer engineering, and because a compiled executable can be very fast. After this course, learning an additional programming language will be much easier!
Background, preparation, and difficulty
Students should have graduate standing and a basic math background (exponents, logarithms, primality, limits), but there are no course pre-requisites and no programming background necessary. Novices are welcome, as long as they can devote about 15 hours per week to this course.
For students who are concerned about their lack of background and wish to gain some familiarity with programming prior to taking this course, we have a four-course Coursera specialization, which covers the first six weeks or so of material in this course. The courses are
- Programming Fundementals
- Writing, Running, and Fixing Code in C
- Pointers, Arrays, and Recursion
- Interacting with the System and Managing Memory
If you are a current Duke student or member of faculty or staff, you can access Duke-produced Coursera content for free through Coursera for Duke.
Flipped classroom and mastery learning
This course uses the "flipped classroom" model for most of the semester. In this model, students read and watch the videos in the assigned chapters of All of Programming for homework. Before each class session, students attempt the reading quiz, then in class, we discuss questions about the reading, and students work problems and practice programming.
For the reading quizzes and programming assignments, we use a mastery learning platform, which means students must demonstrate mastery of each assignment before the next one is released. The assignments are automatically graded, and students can attempt formative assignments as many times as necessary to demonstrate mastery. For programming, this is important because the skills build on each other, and one cannot progress without a solid foundation.
For more information, please see the 2021 course syllabus.