Learning Objectives and Learning Assessments
To directly assess your mastery of the learning objectives of this course, we will conduct a series of learning assessments over the course of the semester.
The use LAs of this course is inspired by mastery-based testing practices found in mathematics.
Most of the LAs will also appear as in-class paper-based ten-minute quizzes, given in class on various days.
Each LA will correspond to one of the learning objectives described below.
If you do not complete the learning assessment for a learning objective the first time, you will have multiple chances to retry.
The objectives may change slightly during the semester as the schedule shifts.
Object-Oriented Design
I expect that by the end of the semester, you will have mastered the basics of object-oriented design. In particular, I expect that you will be able to
- describe and use four pillars of object-oriented design:
- encapsulation (OOP LO #01: Encapsulation),
- inheritance, representing a form of the is-a relationship (OOP LO #02: Inheritance),
- composition, representation a form of the has-a relationship (OOP LO #03: Composition), and
- polymorphism, including both
- parametric polymorphism (OOP LO #04: Parametric Polymorphism) and
- subtype polymorphism (OOP LO #05: Subtype Polymorphism);
- apply object-oriented design principles to separate interface from implentation (OOP LO #06: Data Abstraction)
- identify and use a variety of basic design patterns (OOP LO: 07: Design Patterns), such as Model-View-Controller, Factory, Singleton, Adapter, and Decorator;
- identify objects and classes that will contribute to a program or solution, design those objects and classes, and implement those objects and classes (OOP LO #08: Object Design); and
- describe a common layout of objects in memory (OOP LO #09: Mental Models).
Design and Analysis of Algorithms
I expect that by the end of the semester, you will have significantly extended your skills in the design, implementation, and analysis of algorithms. In particular, I expect that you will be able to
- describe and implement classic algorithms, including
- binary search (Algorithms LO #01: Binary Search),
- sequential search (Algorithms LO #02: Sequential Search),
- insertion sort (Algorithms LO #03: Insertion Sort),
- selection sort (Algorithms LO #04: Selection Sort),
- heap sort (Algorithms LO #05: Heap Sort),
- Quicksort (Algorithms LO #06: Quicksort),
- merge sort (Algorithms LO #07: Merge Sort),
- graph and tree traversal (Algorithms LO #08: Traversal), and
- shortest path (Algorithms LO #09: Shortest path);
- design new algorithms using a variety of approaches including
- greed (Algorithms LO #10: Greed) and
- divide and conquer (Algorithms LO #11: Divide and Conquer);
- read and interpret the formal definition of Big-O (Algorithms LO #12: Big-O Notation);
- informally analyze the running time of iterative algorithms and the number of steps in complex nested loops (Algorithms LO #13: Analysis of Iterative Algorithms);
- informally analyze the running time of recursive algorithms (Algorithms LO #14: Analysis of Recursive Algorithms);
- describe or use loop invariants to better design and verify iterative algorithms (Algorithms LO #15: Loop Invariants).
Design and Analysis of Abstract Data Types and Data Structures
I expect that by the end of the semester, you will have significantly extended your skills in the design, implementation, and analysis of abstract data types and algorithms. In particular, I expect that you will be able to
- describe and implement classic ADTs and data structures, including
- lists (ADT/DS LO #01: Lists),
- stacks (ADT/DS LO #02: Stacks),
- queues (ADT/DS LO #03: Queues),
- priority queues (ADT/DS LO #04: Priority Queues),
- dictionaries/maps (ADT/DS LO #05: Dictionaries),
- hash tables (ADT/DS LO #06: Hash Tables),
- binary search trees (ADT/DS LO #07: BSTs),
- heaps (ADT/DS LO #08: Heaps), and
- graphs (ADT/DS LO #09: Graphs);
- implement one or more data types using arrays (ADT/DS LO #10: Array-based Structures);
- implement one or more data types using linked structures (ADT/DS LO #11: Linked Structures);
- design new ADTs using the PUM (philosophy, uses, methods) approach (ADT/DS LO #12: Design ADTs);
- design new data structures using the LIA (layout, implement, analyze) approach (ADT/DS LO #13: Design Data Structures); and
- design, implement, and use iterators for one or more compound data types (ADT/DS LO #14: Iterators).
Software Design and Development
I expect that by the end of the semester, you will be a competent beginning software developer. In particular, in addition to having the skills described above, I expect that you will be able to
- work with one or more other students on the creation of a program (Development LO #02: Collaboration);
- manage development of multi-file programs in Java using a build tool (in our case, Maven) (Development LO #02: Build Tools);
- design, implement, and run unit tests (Development LO #03: Unit Testing);
- develop software using an integrated development environment (in our case, Visual Studio Code) (Development LO #04: IDE);
- collaborate on and keep track of the development history of code using a version control system* (in our case, Git) (Development LO #05: Version Control);
- read, understand, and modify code that you did not write (Development LO #06: Code Reading);
- exercise good practices in documenting code and create Javadoc documentation for Java programs (Development LO #07: Documentation);
- design and develop libraries for use in other programs (Development LO #08: Build Libraries);
- use libraries in your own programs (Development LO #09: Use Libraries);
- signal and recover from errors using exceptions (Development LO #10: Exceptions);
- responsibly incorporate code that you did not write into your own program (Development LO #11: Ethical Reuse); and
- understand and explain the responsibilities of a software designer (Development LO #12: Professional Ethics).