# Overview

The following sections outline the requirements for the course project. In general, we are building graphical mobile or desktop applications that leverage cloud services and remote databases. The project should be a non-trivial application that demonstrates your ability to design, implement, and deploy a complex, modern application that solves a problem for real-world users.

# Project Definition

  • You should be able to articulate the problem you are solving, and the users you are solving it for, in a few sentences. This is your "elevator pitch" for your application.
  • Your solution must be a software application more complex than a simple CRUD application. You should be designing something challenging enough that it offers interesting features! If you're unsure about this guideline, ask the instructor.
  • Your application doesn't need to be completely original! You can take inspiration from existing applications, but you must be able to articulate how your application is different or better than existing applications. It's fine to "build a better mousetrap" but you need to be able to explain how it's better.

# Design & Architecture

  • You must target either an Android application, or a multi-platform desktop application (meaning that it can run in Windows, macOS or Linux)1.
  • You need to use the development stack that we will introduce in this course (e.g., Android, Kotlin, Gradle, KMP/libraries). See required software for details.
  • You must effectively leverage "good design" practices from the course. This includes using a Clean Architecture style, and design principles that we identify in lectures.
  • Your application should have a compelling, clear and well-designed graphical user interface. You must use MVVM or some variant of that design pattern in your implementation.
  • Your application should include multiple "screens". They may be implemented as tabs, fragments, activities, or just different logical screens. Users should be able to navigate through different areas of your application, representing different functionality that you have designed.
  • Your application should work with relevant data, stored in a remote database hosted in the cloud, using reasonable security measures (i.e., platform-specific authentication). The exact details will vary based on the type of application you are building. e.g., a fitness application might store your workout history in a cloud database.

# Required Features

You will need to propose and implement features that are appropriate for your application. These features should be designed to solve the problem you identified in the design phase.

Additionally, you should implement all of the following:

  • If this is a mobile application, you should support portrait and landscape layouts, by rotating content and scaling to fit the interface as appropriate; no data should be lost when this happens.
  • If text data is used, you should support input validation e.g., ensuring that email addresses are a valid format, or phone numbers contain only digits.
  • Users should be able to cut/copy/paste text data between fields, using standard application context menus.
  • For Android applications, your application should be delivered as an apk that can be side-loaded on Android. Alternately, if you develop a desktop application, it should be delivered as an installer for Windows or MacOS.
  • Remote services (e.g. cloud or database) need to be either deployed to a host provider e.g., Amazon AWS, or containerized in Docker for testing. You should be able to demonstrate that your application can read and write data to this service.

Finally, you must implement at least one of the following:

  • Release multiple applications, across 2 or more platforms, that use a shared codebase. e.g. some combination of console, graphical desktop, mobile and web applications. It's reasonable for one of these to be a "lightweight" version that has fewer features. e.g., a notes application where the desktop version has more features than the console version.
  • Read and use data from an existing cloud service as part of your core functionality (e.g. search Twitter data; load image data from Google; lookup names of Pokemon on a custom REST service). See the list below for some potential APIs that you can use to query online data.
  • Author your own cloud service, which provides additional logic to your application. Must be RESTful, with a well-defined API, and be hosted on {AWS, GCP, Azure}. This would extend and build on your remote database functionality.
  • Support multi-user scenarios. This means supporting different users, each with their own data, stored in the cloud. Each user would need to be able to login and see their own data. Authentication must be secure; leveraging platform-specific authentication is a good idea. e.g., Google Sign-In for Android.
  • Support single-user multi-device scenarios. This requires the ability to have your data shared across different instances of your application, which running concurrently. Each application instance would need to detect and handle changes from the other application instance (e.g., if you update data on one device, the changes should reflect on the second device).
  • Publish to the appropriate application store (e.g. Google Play for Android). This is a non-trivial process that requires you to follow the guidelines for the store, and have a well-designed application that meets the store's requirements. Submitting to the app store is not sufficient; you must actually pass all gating criteria and be published such that I can purchase your application.
  • Build up a full CI-CD pipeline, with runners, and automated deployment to a test environment (not just unit tests). This would require cloud hosting e.g., AWS, GCP, Azure, and a CI-CD tool e.g., Jenkins, GitLab CI, Travis CI.

  1. Many of the examples in this course will assume Android development, but you are free to choose a desktop application if you prefer.