CS350 Outline

Spring 2024

1 The Software Development Process 01/07/2024 - 01/13/2024

Overview

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.

Objectives

  1. Identify the requirements, protocols, and policies for the online course
  2. Discuss the phases and component activities of software development
  3. Assess the likely impact of popular software process development models on a project
  4. Discuss the problems that led to the introduction of agile development models
  5. Discuss the common characteristics and activities of agile development models.
  6. Set up a personal development environment for use in the remainder of the course.

Relevance

A development model establishes the context in which we can consider more specific best practices. Older models are still is use for large projects, while more modern agile models dominate small to medium scale projects.


Getting started

  1. Read the syllabus.
  2. Read the communications policy.
  3. Account Setup 01/11/2024
  4. Attend the orientation session [2024-01-07T19:00:00]%endif

Software Development Process Models

  1. Mishra, Ch.2
  2. Software Development Process Models
  3. The Agile Manifesto & Twelve principles
  4. Agile Models

Tools

  1. If you are new to Java, read section 1 of CS261
  2. Setting Up Your Personal Development Environment
  3. Lab 1: Demonstrating Your Programming Environment Due: 01/20/2024

In Your Recitation Section

  1. Recitations will not meet this week. However, please check to be sure that you have a working headset and microphone (for Zoom meetings) in preparation for next week’s recitation.

2 Requirements 01/14/2024 - 01/20/2024

Overview

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.

Objectives

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

Relevance

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. Wiegers, ch 7, 8, 11
  2. Eliciting Requirements
  3. Writing Requirements
  4. Organizing Section 3 of the SRS

Tools

  1. If you are new to Java, read section 2 of CS261. Write at least one Java program of your own as practice.

In your recitation section

  1. Writing the Team Contract 01/16/2024 - 01/17/2024
    (Check your course schedule for the time and date of your recitation and the Canvas Course Collaboration Tool for the Zoom link.)

At the end of the week

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

3 User Stories & Design 01/21/2024 - 01/27/2024

Overview

Design begins with the process of decomposing a system into modules. We will focus on incremental development, and therefore incremental design, in this course. But incremental design is possible only if all team members understand the principles of good design and share a common high-level vision of the product.

User stories are a simple technique of breaking down the work required to implement a large project. They emphasize decomposing the functionality desired by the end users into small pieces. As a project progresses, the list of stories becomes a major tool in planning each increment and tracking the team’s progress.

Objectives

  1. Apply object-oriented design principles to decompose a problem and organize a software solution.
  2. Break the work required to develop a project into manageable units.
  3. Write user stories to describe units of work.
  4. Track progress on a project via user stories and tasks.

Relevance


Design

  1. High-Level Design: A Quick Overview

  2. Demonstration of High-level Design

Stories: Organizing Incremental Construction

  1. Cohn, ch 1-3, 7
  2. User Stories
  3. Shore, ch. 8, Stories

Tools

In Your Recitation Section

  1. . Recitations do not meet again until explicitly noted in the Project schedule below.

4 Clean Coding and Refactoring 01/28/2024 - 02/03/2024

Overview

Your prior CS classes focused primarily on getting the code working. But there is such a thing as good code and bad code, even among code that “works”. At its simplest level, good code is easier to read than bad code.

Refactoring is the process of making changes to code that do not affect the code’s behavior (i.e., whether it “works”) but that make the code better, in the sense that it is more readable and/or more easily maintained.

Objectives

  1. Discuss and apply the principles of Clean Coding
  2. Apply refactoring to software source code.

Relevance

It is widely accepted that programmers spend far more time reading code than writing it. On a team project, we can safely assume that programmers will also need to spend a lot of time reading other people’s code. Part of being a good team member, then, is making sure that your peers can read your code and understand it.

This can be achieved by a combinations of writing it “cleaner” to start with and of refactoring it later.


Tools

  1. If you are new to Java, read section 3 of CS261

Clean Coding

  1. Martin, ch 2, 3, 6, 7, 10
  2. Clean Coding
  3. Logging
  4. Refactoring demo

  5. Lab 2: Refactoring Code 01/31/2024

  6. Assignment: Clean Coding 02/03/2024

5 Unit & Integration Testing 02/04/2024 - 02/10/2024

Overview

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.

Objectives

  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 xUnit (e.g., JUnit) frameworks.
  5. Apply the mutator/accessor strategy for ADT testing.
  6. Discuss the use of mock objects in unit testing.

Relevance

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.


V&V

  1. Verification and Validation
  2. Testing
  3. Choosing Tests

Self-Checking Test Drivers

  1. Automating the Testing Oracle
  2. Unit Testing Frameworks
  3. (From CS 330) Writing a Unit Test - Identifying Mutators & Accessors
  4. JUnit 5 Tutorial, Sai Upadhyayula
  5. Hamcrest Tutorial
  6. Junit testing demo

  7. Lab 3: Unit Testing Due: 02/08/2024

Stubbing and Mocking

  1. Stubs and Mocking

  2. See website for assignment.

6 Version Control 02/11/2024 - 02/17/2024

Overview

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.

Objectives

  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

Relevance

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.


  1. Review the exam procedures and set up your proctoring for the midterm exam. 02/11/2024

Version Control

  1. Version Control
  2. git: Beyond the Basics (from CS252)
  3. Understanding Git Conceptually
  4. See website for assignment.

Tools

  1. If you are new to Java, read section 4 of CS261

7 Test-First and Test-Driven Development 02/18/2024 - 02/24/2024

Overview

Software testing was, until nearly the end of the 20th century, treated as a necessary evil to be completed after the creative work of designing and writing the production code had been completed.

Modern practice turns this around, developing the tests before the production code.

In this module, we will look at

Objectives

  1. Discuss the advantages of early design of tests.
  2. Interpret unit test code as scenarios or demonstrations of how a module API can be employed.
  3. Apply TFD and TDD during software development

Relevance

TFD and TDD both lead to better testing practices.

By encouraging developers to think about test cases early, the developers often avoid introducing faults into the production code.

By writing unit tests as scenarios for the use of an interface, developers can see flaws or missing components that would prevent the interface from being useful.


  1. Wambler, Introduction to Test-Driven Development, sections 1-3, 6-8
  2. Test-First Development
  3. TFD Case Study, task 1
  4. TFD Case Study, task 2
  5. Test-Driven Development
  6. Example of TDD: The Bowling Game Kata (from Martin.)
  7. TDD Case Study

  8. See website for assignment.

Exam

  1. Midterm exam 02/25/2024 - 02/26/2024

8 Build Management 02/25/2024 - 03/02/2024

Overview

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.

Objectives

  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)

Relevance

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.


  1. Build Managers
  2. File Dependencies: make
  3. Task Dependencies: ant
  4. Maven
  5. Task Dependencies: Gradle

  6. Gradle: Learning the Basics
  7. See website for assignment.

(Optional) Ant & Maven In Detail

  1. Ant Tutorial
  2. Maven in 5 Minutes

9 Configuration Mgmt 03/10/2024 - 03/16/2024

Overview

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.

Objectives

  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/ivy/gradle)
  5. Discuss the role of repositories

Relevance

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. Atlassian, Comparing Workflows, Feature-Branch Workflow, and Gitflow WorkFlow
  2. Trunk-Based Development
  3. Software Configuration Management
  4. Managing Third-Party Libraries
  5. Managing Code Variants

10 Documentation 03/17/2024 - 03/23/2024

Overview

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.

Objectives

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

Relevance

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.


  1. Martin, ch 4
  2. McConnell, Ch. 32
  3. Documentation and Documentation Generators
  4. Project Reports & Websites
  5. Deploying Websites
  6. Lab 4: Report Deployment 03/23/2024

11 Continuous Integration 03/24/2024 - 03/30/2024

Overview

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.

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.

We will look at the use of cloud computing resources in conjunction with continuous integration.

Objectives

  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.

Relevance

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.


  1. Program Analysis Tools
  2. Continuous Integration
  3. Assignment: Continuous Integration Due: 03/30/2024

12 System and Regression Testing 03/31/2024 - 04/06/2024

Overview

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.

Objectives

  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

Relevance

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. System Testing
  2. Regression Testing
  3. Issue Tracking

13 Agile Methods 04/07/2024 - 04/13/2024

Overview

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.

Objectives

  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

Relevance

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.


  1. Review the exam procedures and set up your proctoring for the final exam. 04/11/2024
  2. The Agile Manifesto & Twelve principles
  3. Agile Methods
  4. Beck, Ch 7
    1. Agile Terminology
  5. Extreme Programming (XP)
  6. Scrum Guide
  7. Scrum
  8. Is Agile for Amateurs?
  9. Trends in Agile

14 Operations 04/14/2024 - 04/22/2024

Overview

What happens after the developers (think that they) are done?

Operations covers deployment of a software application to server machines, running the application and monitoring its performance, tuning the performance, and recovering from failures/crashes.

Modern forms of operations rely heavily on remote servers, often provided as cloud services, and on virtualization and containers.

Objectives

  1. List the components of modern operations.
  2. Discuss the impact of agile development on operations.
  3. Discuss the competing forms of virtualization.
  4. Understand the role of virtualization and the cloud on deployment and system testing.
  5. Discuss the principle factors that comprise DevOps

Relevance

The DevOps movement is a response to stress imposed on operations by the short release cycles championed by agile development. It calls for close cooperation between developers and operations staff, making it imperative that developers understand the fundamentals of operations.


  1. Foundational Terminology and Concepts, Davis & Daniels, 2016
  2. Operations
  3. Software Architecture Patterns, Ritvik Gupta & Ankit Sahu , 2023
  4. Projects & Architectures
  5. What is DevOps?

  6. DevOps
  7. Virtualization

15 Project

Phase 1

  1. Writing the Team Contract 01/16/2024 - 01/17/2024
  2. Project Phase 1: Software Requirements Specification 01/21/2024 - 02/05/2024

Phase 2

  1. Project Phase 2, stories 02/06/2024 - 02/22/2024

Phase 3

  1. Project Phase 3: Sprint 1 02/23/2024 - 03/23/2024
  2. Project: Design Brainstorming 02/27/2024 - 02/28/2024 (in your recitation section)
  3. Project phase 3 review meetings (in your recitation section) 03/26/2024 - 03/27/2024

Phase 4

  1. Project Phase 4: Configuration Management and Continuous Integration 03/24/2024 - 04/06/2024
  2. Project phase 4 review meetings 04/09/2024 - 04/10/2024

Phase 5

  1. Project Phase 5: Analysis, Integration and Systems Tests 04/07/2024 - 04/22/2024
  2. Instead of a group review meeting, fill out the Phase 5 Review Questionnaire in Canvas 04/22/2024

16 Special Events and Dates

  1. MLK Holiday 01/15/2024
  2. Midterm exam 02/25/2024 - 02/26/2024
  3. Spring Break 03/04/2024 - 03/10/2024
  4. Last day of classes 04/22/2024
  5. Final exam 04/25/2024 - 04/26/2024

17 Preamble

General Information

Below are the modules that comprise the course content.

Each module consists of a series of activities.

17 Postscript

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:

18 Presentation

Topics Lectures Readings Assignments & Other Activities
topics lecture slides event exam video project construct text exam asst selfassess exam activity lab recitation
Document Kind Prefix
lecture Read lecture notes:
event
exam Take the exam:
lab Do:
asst Do assignment:
reading Read (optional):