ECE 651

This class focuses on software skills required to move to larger scale projects: design, testing, and teamwork. The class is built around learning fundamental design principles, and then seeing how they appear at different scales. The class begins with the small scale, i.e., a few classes, and we explore design patterns and revisit testing. We move to larger and larger scales, until we are considering system architecture, and revisit similar principles throughout.


Students are expected to have successfully completed ECE 551 prior to taking this course.   Students who did not take 551 but believe they have an equivalent course that adequately prepares them for this may ask the instructor for permission to take this course.  As we get many requests from students who do not have adequate preparation, please consider the following basic questions about object oriented programming as a quick check of whether or not you should ask.  If you cannot answer these easily, you are not ready for this course:

  • What is parametric polymorphism?  How do you use it in the OO language with which you are familiar?
  • What is sub-type polymorphism?  What is dynamic dispatch?  How are the two related? 
  • Explain the four standard levels of exception safety (also called "exception guarntees").
  • What is an abstract class? Why are they useful?
  • Write a method (or member function) for a BinarySearchTree class that holds integers, which will negate all of the values in the tree, while maintaining proper BST ordering.




  • Development environment setup
    • Note that if you are a Mac user, you may need to alter some security settings to install VirtualBox.  See here  for details and instructions.
    • The trackpad on a mac does not naturally support middle-click (paste in Linux).  If you have an external mouse, great.  However, if you only have the track pad, this can be a pain.  We included "" which will re-bind "right option" (next to arrow keys) to be middle click, so it will paste. 
    • If you have problems, post on Piazza and/or come to Drew's office hours.
  • CI/CD on Duke's GitLab
  • Forge: Emacs's integration with Gitlab Issues+Pull Requests 
  • JavaFX: Graphical User Interfaces in Java


  • First individual programming assignment: Coming January 24! (Due February 6).
  • Second individual programming assignment: Coming February 7! (Due February 20).
  • Team project evolution 1: Coming February 21! (Due March 19).
  • Team project evolution 2: Coming March 20! (Due April 2).
  • Team project evolution 3: Coming April 3! (Due April 22).


Schedule and Topics

The following is a preliminary list of topics and when they are going to be covered.  This is subject to change as the semester progresses.  Slides will be placed in a git repository AFTER we complete them.

Thursday Jan 21 Overview and Course Policies
Tuesday Jan 26Design Principles
Thursday Jan 28From C++ to Java
Tuesday Feb 2Object Oriented Design Fundamentals
Thursday Feb 4Software Design Process and Requirements Definition
Tuesday Feb 9Wateverfall vs Agile, Task Breakdown, Estimating Work
Thursday Feb 11Testing 1: Blackbox, Whitebox, Mutation
Tuesday Feb 16UML, Design Patterns 1
Thursday Feb 18Design Patterns 2
Tuesday Feb 23Bad Code, Smells, Refactoring, Technical Debt
Thursday Feb 25Apply recent ideas to problems
Tuesday March 2Teamwork, Feature Branches, Code Review
Thursday March 4DevOps, CI/CD, Blue/Green, Canary, Scrum
Tuesday March 9(no class)
Thursday March 11Testing 2: Stubs, Spies, Mocks, Unit, Integration, and System Test
Tuesday March 16User Interface and User Experience
Thursday March 18User Interface and User Experience (cont'd)
Tuesday March 23Midterm Exam
Thursday March 25User Interface and User Experience (cont'd)
Tuesday March 30Designing Modules and Interfaces
Thursday April 1TBD
Tuesday April 6System Architecture
Thursday April 8System Architecture (cont'd)
Tuesday April 13System Architecture: Micro-services
Thursday April 15Security
Tuesday April 20TBD
Thursday April 22Review for Final
As stated by registrarFinal Exam