CS350, Spring 2020

CS350 Outline

Spring 2020

General Information

Below are the modules that comprise the course content.

Each module consists of a series of activities.

  • Not every assigned activity requires you to submit something for grading. Nonetheless, you are expected to do them all.

    • Do not skip or delay doing the labs just because they are ungraded. Most of them introduce skills (and sometimes set up specific data) used in a subsequent assignment or in the project.

  • If no due date is specified, you are supposed to complete the assigned activity by the end of the final day allotted for that entire module.

  • Where a due date is given with no time, you have the entire day (until 11:59:59PM ET of the due date).



    The syllabus lays out the basic course policies. It tells you what you need
    to do to earn a passing grade. It tells you when you need to have done that by.
    It tells you how to get in touch with me if you run into problems.


    You have the freedom to schedule your own time in this course, but you DO
    need to set up a schedule. Do not forget that this course exists and that you
    are registered for it. Do not think you can repeatedly set it aside for weeks
    at a time and make up the time later.


    In a web course, my role as Instructor changes from “lecturer” to “tutor”.
    You can ask questions in the course Forums. You can send me email. You can
    also contact me during office hours. You’ll find more information on these
    options in the syllabus and other documents on the Course Policies page.

    Some people are too shy to ask questions. Some are too proud to ask
    questions. My advice to both groups is to get over it! Part of being educated
    is knowing how to exploit your available information resources. In this course,
    I am one of those resources.

Upcoming Events
1 Introduction 01/11/2020 - 01/17/2020


This module introduces you to the course organization, policies, and mechanics. We’ll review the structure of the course website and give you an opportunity to get set up for the semester to come.

We’ll take a brief look at the major themes and areas of emphasis that you can expect to hear more about through the coming semester.


  1. Identify the requirements, protocols, and policies for the online course
  2. Use the selected technology tools for communication and collaboration
  3. Discuss the course themes and their relation to software development.


An understanding of the tools used in an online course is fundamental in becoming a successful online learner. It is also important to identify the expectations for participation, assignment submission, and the time management skills required in the online format.

You can expect that professional software development will be quite different from typical academic programming assignments. This course will emphasize the tools and techniques that developers use on a daily basis, with an emphasis on automating best practices of software engineering.

  1. text Read the syllabus.

  2. text Read the communications policy.

  3. event Watch the recorded orientation session

  4. asst Do assignment: Read Recitation & Participation

  5. lecture Read lecture notes: Course Structure and Policies

  6. activity Account Setup
  7. lab Do: Opening discussion

  8. lecture Read lecture notes: What Makes Software Development Difficult?

In your recitation section

  1. recitation Recitations will not meet this week. 01/15/2020 - 01/17/2020
2 The Software Development Process 01/18/2020 - 01/24/2020


Every development organization settles into a process that they use to produce new software. Although the component activities are largely the same, different processes place different levels of emphasis on the components and arrange those components differently.

We’ll look at the more common and the more influential models for software development processes and will examine the interaction between the development model and the organization and composition of development teams.


  1. Discuss the phases and component activities of software development
  2. Assess the likely impact of popular software process development models on a project
  3. Discuss common team organizations and roles in software development


A development model establishes the context in which we can consider more specific best practices. At the same time, the more modern and trendy development models take for granted that team members will have a high level of familiarity with common best practices.


Process Models

  1. text Tsui, Ch.4
  2. lecture Read lecture notes: Software Development Process Models
  3. video The Problem of Local Optimization

SSH & SSH Keys

  1. lab Do: Lab: Secure Shell Keys

  2. video Watch SSH Key Review

  3. asst Do assignment: Assignment - ssh Keys Due: 02/03/2020


  1. lecture Read lecture notes: Team Organization


  1. lecture Read lecture notes: High-Level Design: A Quick Overview

In your recitation section

  1. recitation Recitations will not meet this week.
    However, the recitation next week requires some preparation in advance of your scheduled session. You should read through the expectations this week.
3 Requirements 01/25/2020 - 02/01/2020


We will look at the processes of eliciting and analyzing requirements, and at common forms of documents for recording them. We will look at how these documents vary depending on whether we are doing requirements analysis “up front” or incrementally. We will discuss the characteristics that contribute to the quality of requirements statements.


  1. Recognize common forms of requirements documents
  2. Discuss quality characteristics for requirements
  3. Write a requirements document in an industry-standard format.


All software development projects begin with a statement of requirements. All subsequent software construction must refer back to those requirements. It is therefore essential that all developers be able to read and understand requirements documents, even if they were not actively engaged in writing those documents.


Eliciting and Writing Requirements

  1. text Wiegers, ch 6, 7, 10, 11
  2. lecture Read lecture notes: Eliciting Requirements
  3. lecture Read lecture notes: Writing Requirements

In your recitation section

  1. recitation Network Conferencing: Google Meet Practice 01/29/2020 - 01/31/2020

At the end of the week

  1. project Project Phase 1: Software Requirements Specification Start work on phase 1 of the project.
    Note: Due dates for project phases are collected in a separate section near the bottom of this outline.
4 Software Construction 02/02/2020 - 02/08/2020


Software construction is the term used for the development activities that follow requirements and lead up to the final system and acceptance tests. In this module, we will take a high-level look at the component activities of software construction and will discuss some of the critical decisions that need to be made at the start of construction.

Students will begin the process of building their personal development environment by installing and practicing with a modern IDE (Integrated Development Environment).


  1. Identify and discuss the constituent activities of software construction
  2. Discuss issues associated with these activities
  3. Review the contributions and features of IDEs in construction activities


This module sets the stage for the exploration of more detailed construction topics to follow in the remainder of the course.


Clean Coding

  1. text Martin, ch 2, 3, 6, 7, 10
  2. lecture Read lecture notes: Clean Coding
  3. text CS382, Sections 1-3 (Read lecture notes and do the labs.)
  4. lecture Read lecture notes: Integrated Development Environments
  5. asst Do assignment: Assignment - Setting Up Your Personal Development Environment (Eclipse) Due: 02/10/2020


  1. lecture Read lecture notes: High-Level Design: A Quick Overview

Organizing Incremental Construction

  1. text Cohn, ch 1-3, 7
  2. lecture Read lecture notes: User Stories
  3. text Shore, ch. 8, Stories

In Your Recitation Section

  1. recitation Informal Recitation Discussion & Office Hours 02/05/2020 - 02/07/2020
5 Unit Testing 02/09/2020 - 03/04/2020


In this section we will review the basic principles of unit testing, and then we will look at the problem of automating the testing oracle, the procedure of determining when our code has passed or failed each test.

This will lead us to the world of modern Unit test frameworks, which seek to make running tests so effortless that there is no longer any excuse to defer testing.

On the cutting edge of testing practice, we will look at mock objects as a means of further automating our tests.


  1. Discuss the position of testing in an overall verification and validation context.
  2. Discuss the varying scopes and goals of testing.
  3. Discuss the activities comprising testing and the role of automation in supporting those activities.
  4. Apply *Unit frameworks.
  5. Discuss the use of mock objects in unit testing.
  6. Apply the mutator/accessor strategy for ADT testing.
  7. Apply the mutator/accessor strategy to write a JUnit test suite for a documented (and unimplemented) Java Class.
  8. Discuss the benefits of Hamcrest style assertThat matchers over assertTrue, assertFalse, and assertEquals.
  9. Briefly discuss how Unit Tests can be written in Python and Rust.


Unit testing has always been seen as a critical part of software construction, but modern best practices place more emphasis on it than ever. “Test first” is a mantra in modern software development, and common practice integrates testing so tightly into the build process that it’s more trouble to avoid tests than to re-run them at each step.



  1. lecture Read lecture notes: Verification and Validation
  2. lab Do: Lab - Eclipse
  3. lecture Read lecture notes: Testing
  4. video Why Do We Test?
  5. lecture Read lecture notes: Choosing Tests
  6. video Testing the F16 Fighter

Getting Acquainted with JUnit

  1. video Watch JUnit 1 - A Quick HTML Color Class
  2. video Watch JUnit 2

Self-Checking Test Drivers

  1. text Good Unit Tests
  2. lecture Read lecture notes: Automating the Testing Oracle
  3. text JUnit Tutorial
  4. text (optional) Google Test Primer

  5. lab Do: Lab: Unit Testing
  6. lecture Read lecture notes: Testing ADTs

Putting JUnit to Use

  1. video Watch JUnit Review 3
  2. asst Do assignment: Unit Testing Part 1 Due: 02/29/2020
  3. asst Do assignment: Unit Testing Part 2 Due: 03/23/2020

Test-Driven Development

  1. text Martin, ch 9
  2. text Wambler, Introduction to Test-Driven Development
  3. lecture Read lecture notes: Test-Driven Development

Stubbing and Mocking

  1. lecture Read lecture notes: Stubs and Mocking
  2. text Mocks Aren’t Stubs
  3. text Google C++ Mocking Framework for Dummies

(Optional) Unit Testing in Python & Rust

  1. video (Optional) Perspective - Testing Code in Python & Rust
  2. text (Optional) Rust - Test Organization
  3. text (Optional) Rust - How to Write Tests


  1. recitation Informal Recitation Discussion & Office Hours 02/12/2020 - 02/18/2020
6 Version Control 03/05/2020 - 03/23/2020


Version control is concerned with managing the history of changes made to the software by the development team. A good version control system offers a team control over the history, exploration, and collaboration on a project. We’ll look at the issues and approaches to local, centralized, and distributed version control, and explore how to work with a distributed version control system from an IDE.


  1. Discuss the issues and problems involved in collaborative development of software

  2. Discuss the major types of version control (local, centralized, and distributed) and how team conflicts are resolved in each

  3. Discuss the concept of branches and their impact on software development strategy

  4. Apply a distributed or centralized version control system

  5. Manage a repository within a forge environment


Version control has rescued many a project from utter disaster of having lost or destroyed critical code. Probably the only practice that has done so more often would be regular backups. But version control is also central to managing collaboration among team members, allowing confidence that developers working independently need not fear overwriting or interfering with one another’s work.

7 Build Management 03/23/2020 - 03/26/2020


A build manager has the task of performing any automated steps required to rebuild a software project after programmers have made changes. We will look at the primary models for build management, file dependencies and task dependencies, and the most commonly used managers for each model. We’ll also look at how to replace an IDE’s built-in builder with a more flexible manager.


  1. Discuss the role of build managers in supporting a project
  2. Discuss the limitations of the default build managers provided with IDEs
  3. Discuss and assess the impact of the major forms of dependency management in builds
  4. Apply a common file dependency manager (make) and task dependency manager (ant/maven/gradle)


Modern projects now rely on build managers for much more than just the basic operations of compiling and linking. Build managers are also called upon to run tests, to prepare software packages for deployment, to deploy them, and to prepare project reports and post those reports to project web sites. These demands go far beyond the capabilities of the simple manager included in your IDE. Used properly, a build manger can save a team a lot of tedious work.


Overview & Perspective

  1. lecture Read lecture notes: Build Managers
  2. lecture Read lecture notes: File Dependencies: make
  3. lecture Read lecture notes: Task Dependencies: ant
  4. lecture Read lecture notes: Managing Builds with Maven

Introduction to Gradle

  1. lecture Read lecture notes: Gradle Whirlwind Introduction
  2. video (To Be Updated for Gradle 5.6.1) Watch Gradle Review

Working with Gradle

  1. text Gradle guide: Creating a New Gradle Build
  2. text Gradle guide: Building Java Applications
  3. text Gradle guide: Building C++ Executables
  4. lecture Read lecture notes: Task Dependencies: Gradle
  5. lab Do: Lab: Building with Gradle
  6. asst Do assignment: Gradle Assignment (cancelled)

(Optional) Maven & Ant In Detail

  1. text Ant Tutorial
  2. text Maven in 5 Minutes
8 Configuration Mgmt 03/27/2020 - 03/28/2020


Software Configuration Management (SCM) addresses a wide variety of issues in the development of software. These include version control, studied earlier, but also the problems of coping with portability to multiple target platforms and the incorporation of externally developed code libraries into a project. We’ll explore these new issues of SCM and will look at how configuration management tools can aid in keeping all the components of a project compatible with one another.


  1. Discuss issues in supporting multiple target platforms
  2. Discuss issues involved when incorporating 3rd party libraries as software components
  3. Discuss the role of configuration management tools
  4. Apply a common configuration management tool (maven/tvy)
  5. Discuss the role of repositories


With an increasingly rich universe of open-source and commercial libraries available, development teams are increasingly encouraged to avoid wasting effort by resolving problems already solved by someone else. Discovery of useful libraries can be difficult, however, and the possibility that a useful library may itself incorporate still other libraries raises the very real problem of inconsistency among a project’s components.


Configuration Management

  1. lecture Read lecture notes: Software Configuration Management
  2. text Appleton, Streamed Lines through "Using the Branching Patterns
  3. lecture Read lecture notes: Managing Third-Party Libraries
  4. lecture Read lecture notes: Managing Code Variants
9 Documentation 03/29/2020 - 04/02/2020


In this module, we will review some of the basic lessons on source code documentation that you may have learned as beginning programmers and will consider how well they translate to more professional practice. In accord with current best practice, we will look more closely at API documentation and the tools for building and maintaining that documentation. We will also look at some common project reports and how they might be posted to a project website.


  1. Discuss forms and roles of code documentation
  2. Discuss common API documentation tools
  3. Apply a common API documentation generator (Javadoc/Doxygen)


Modern practice places far less emphasis on source code documentation than beginning programmers are often led to believe. At the same time, developers are commonly expected to conform to a higher standard in preparing API documentation and project reports.

10 Analysis Tools 04/04/2020 - 04/08/2020


This module will examine some of the validation tools that lie outside the realm of testing, including analysis for dead code, for overly complex code, and for violation of coding standards and practices.

Also, with our now content-rich, automated builds, we will examine the practice of continuous integration as a means of keeping project status information up to date.


  1. Discuss the differences between dynamic and static analysis
  2. Apply code coverage tools
  3. Apply static code analysis tools and interpret their results
  4. Apply a continuous integration framework to manage report generation.


Many clients require the use of code analysis tools on delivered code, treating the reports from these tools as part of the acceptance test for the system. Developers need to understand both the abilities and limitations of the analysis performed by these tools. With so many reports being produced by projects, automating not just the build but the launching of new builds is an increasingly common practice.

11 System and Regression Testing 04/09/2020 - 04/14/2020


System testing often involves inputs that are hard to supply or outputs that are hard to capture (e.g., graphics on a screen). Some regression tests can face the same problem. We’ll examine the possibilities of automating tests at this level to a degree similar to what we achieved earlier with unit testing.


  1. Discuss problems introduced when testing at the system level
  2. Discuss tools for testing GUI code
  3. Discuss the role of bug/issue tracking in a development process
  4. Apply an issue tracking system in a team project


The rise of GUI interfaces as the most common way for users to interact with programs created a huge problem for system testing that, decades later, is still a source of difficulty for development teams. Developers need to know what can be done automatically about this and how they can design or plan around the problems when automated solutions are unworkable.

  1. lecture Read lecture notes: System Testing
  2. lecture Read lecture notes: Regression Testing
  3. lecture Read lecture notes: Issue Tracking
12 Agile Methods 04/15/2020 - 04/20/2020


Agile development is a set of practices centered on an incremental development model. Agile methods are threatening to topple the Waterfall as the most commonly used development process model.

We will explore the principles and practices that comprise agile development. We will see how many of the practices studied in the earlier modules lie at the heart of agile practice. We will look at some of the primary development models within the agile movement.


  1. Discuss the conflict between incremental and “up front” models
  2. Assess the impact of incremental models on a development project
  3. Discuss the philosophy and components of agile models
  4. Discuss the impact of agile models and requirements elicitation


Agile development is not only a set of development practices and process models, but also a social/political movement in the world of software development.

The Agile Manifesto calls for non-technical managers to properly respect software developers by adopting a hands-off attitude to technical decisions. This call would be unforgivably arrogant if the Manifesto did not also call for developers to demonstrate their professionalism by knowing and adopting the profession’s best practices, independent of any mandates from management requiring them to do so.

13 Updates in Progress 04/21/2020 - 05/01/2020

All deadlines and modules below this point will be updated (e.g., assignments and Module pacing).

14 Perspective - Python & Rust 04/21/2020 - 04/27/2020


This semester we focused on Java. However, the TDD process and tools we discussed are not unique to Java. If we look at Python and Rust we can find unit testing frameworks, analysis tools, configuration management, and even Hamcrest Matchers.

This module will revisit selected previous topics, but in Python (and Rust). This module is meant as a Future Work module. Everything covered in this module is meant for perspective, or a guide on where to start in other languages (e.g., Python or Rust).

You will not be required to write Python or Rust code on the Final Exam.

15 Project

Phase 1

  1. project Project Phase 1: Software Requirements Specification 01/30/2020 - 02/19/2020

Phase 2

  1. project Sign up for project teams 02/18/2020 - 02/19/2020
  2. project Project Phase 2, stories 02/20/2020 - 03/06/2020

Phase 3

  1. project Project Phase 3 03/07/2020 - 04/03/2020
  2. recitation Project: Design Brainstorming Meeting 03/23/2020 - 03/27/2020
  3. recitation Optional: Phase 3 Progress Discussion 04/01/2020 - 04/03/2020

Phase 4

  1. project Project Phase 4 04/04/2020 - 04/14/2020
  2. recitation Optional: Phase 4 Getting Started 04/08/2020 - 04/10/2020

Phase 5

  1. project Project Phase 5 04/15/2020 - 04/24/2020
16 Special Events and Dates
  1. event Spring Break 03/07/2020 - 03/15/2020
  2. exam Take the exam: Midterm exam 03/05/2020 - 03/06/2020
  3. exam Take the exam: Final exam 04/29/2020 - 05/01/2020

All times in this schedule are given in Eastern Time.

Symbol Key
lecture Lecture:
slides Slides :
event Event or important date
text Read
lab Do lab:
asst Assignment:
exam Take the
activity Do:
recitation In your recitation section:
construct Under construction: