CS Photography Project

John R. Hott, Nada Basit, Ray Pettit, Derrick Stone

Summary

This project steps learners through a series of assignments that culminate into a photo viewer/archive tool. The assignments are designed to emulate a software development "sprint" in the Agile development process parlance. Each sprint consists of an assignment that builds off the code of the previous assignment, and is by itself a valuable piece of the overall end product.

Our aim is to give students the feeling and experience of working on a large project via a sequence of carefully crafted homework assignments. This project helps students gain experience with Object Oriented Programming in Java, combined with software development techniques, commenting and documenting code for maintenance, unit testing with JUnit, exception handling, event-driven programming and use of pre-built Java Swing components. The project culminates in a fully-functional graphical user interface and leaves plenty of room for creative expression.

Engagement Highlights

Through the series of assignments, the students build a photo viewer and archive application, which is relevant to their daily experiences with apps such as Instagram, Facebook, and SnapChat. As the project progresses, the sprints incorporate student choice. Sprint 4 provides students some freedom to interpret the GUI software requirements to build an application that expresses their personality and personal design preferences. We also provide Sprint 4+ as a substitute for Sprint 4 with additional flexibility. Our GUI mockup for the final product expresses the diversity of contributors to CS in the included photos.

Avoiding Stereotypes

This project was designed and developed with a neutral position regarding gender, race, and other protected classes. We believe the end product has a universal appeal for users of technology and the potential software developers of tomorrow.

Details

Topics
Inheritance, Object-Oriented Programming, Interfaces, Unit Testing, Event-Driven Programming with GUIs
Audience
Appropriate for a CS2 (or CS1.5) course. Designed for a CS2 course introducing Java and Object-Oriented Programming following a CS1 course in Python.
Difficulty
This is an intermediate to advanced assignment. Each sprint is expected to take 1.5 weeks to complete, totaling 6 weeks for the entire project.
Strengths
This project helps students learn software development techniques through code reuse and refactoring, by having them incrementally build a larger but relevant application: a photo management software. It encourages best practices, including well-formatted code and well-written JavaDoc documentation to facilitate the maintenance and expansion through each sprint. It also promotes creativity as the project progresses, such as allowing for flexibility in the look-and-feel of the GUI.
Weaknesses
Since each sprint builds upon the last, there is the possibility for mistakes to be carried forward across sprints or students to fall behind later in the sequence. To mitigate this risk, our test cases account for this weakness by only testing the new functionality required in each sprint. Another option would include providing solutions for a previous sprint before the next one is assigned.
Dependencies
Requires an understanding of Java fundamentals, control structures, basic data structures, and classes. Historically, students who are taking this CS2 course have had an introduction to programming in Python, but are just making the transition to Object-Oriented Programming and the Java programming language. We imagine that this project may also fit well in the second portion of an advanced CS1 course taught in Java.
Variants
The project could be modified in the following ways to tailor it to different courses:

Sprints

Sprint 1: Even Instagram Started Somewhere...
Even Instagram started somewhere. In this assignment you will be breaking ground on a photography application, beginning with the foundational classes PhotoLibrary and Photograph. These classes will define what it means to be a photograph and PhotoLibrary and how they interact; specifically a PhotoLibrary may contain photographs a user posts to their photo feed
.
Sprint 2: Albums: Keeping Photos Organized
Now that you’ve harnessed the power of Instagram, posting Photographs to your photos, it's time for more power! Our photo feeds have gotten out of control and we'd like to be able to organize our photos a little better, so we've introduced Albums! To implement this additional functionality, you will need to modify your original PhotoLibrary and Photograph classes and add an Album class.
Sprint 3: Refactor and Reuse: Towards Sustainable Code
The project manager noticed the PhotoLibrary and Album classes have nearly identical functions with regard to a list of photographs and wants you to harness the power of inheritance to clean then up. Additionally, the project manager is aware that as a photo library grows, it will be helpful to be able to better manage large numbers of photos through sorting, searching, and other techniques.
Sprint 4: Graphical User Interface
The project manager wants a Graphical User Interface (GUI) front-end to the PhotoLibrary organizational application that we've been building. We've started the development of a prototype interface, but you will need to add the event handlers and image display.
Sprint 4+: Graphical User Interface
The project manager wants a Graphical User Interface (GUI) front-end to the PhotoLibrary application that we've been building. To start development of this application, you have been assigned to develop a prototype of the album viewer GUI using Swing.
This assignment mimics a possible internship assignment and is a more time-consuming and flexible replacement for Sprint 4. It is intended for more advanced courses. As a software engineer, part of your job is to deduce requirements from general instructions and design an elegant solution. Your client or manager may say "I want an iOS app that does X, Y, and Z" and you will be expected to ask the appropriate design questions so you can deliver what the customer had in mind effectively and efficiently. Therefore, some of this assignment is intentionally ambiguous. In this case, instead of a client to pose questions to, some creative license is required, meaning that you will need to make some assumptions about how this software will best work. State those assumptions as you complete the project.