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 fundemental 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.


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