Informatics 122 Winter 2013
Final Project

Due date and time: Thursday, March 21, 4:00pm

This assignment is to be done in a large, assigned group of eight


Introduction

This project will ask you to combine all of the knowledge that you've gained this quarter — in terms of implementation-level design, understanding the design of code written by third parties, and considering overall architectures for a system — and build one large product: a software infrastructure for a technology-assisted restaurant.

You'll work in a larger-than-normal group of eight students, so each of you will be responsible for only part of the overall product, yet together you will all bear the responsibility of getting everyone across the finish line. Along the way, you'll experience many of the ups and downs of real-world projects comprised of many software developers; while large groups enable projects that can't reasonably be completed by smaller ones in short periods of time, they do come with their own issues that must be managed, and you'll gain experience at managing them.


The Problem

For this project, you should first imagine that you have been approached by investors who are interested in running a business that builds out and manages technology-assisted restaurants, where customers sit at tables that are equipped with tablets that present menu information, allow them to place orders, check on the status of orders, pay their bills, and view nutrition and other information about the restaurant's offerings. During this project cycle, I will be acting as a technically-savvy liaison to those hypothetical investors.

From a technology standpoint, you will implement as much of the software to conduct such a restaurant's interaction between customers, servers, and the kitchen as possible. As is often the case when a business idea is initially blooming, the investors are still somewhat uncertain about many of the details of what they want, and are likely to be satisfied with a variety of approaches, but they do have some specific requirements that you will need to meet, which are described in the next sections.

Requirements

Investors have a particular arrangement in mind for their restaurants, and a particular workflow that the software will need to support. While the arrangement they envision is not unheard of in the restaurant business, they believe they can execute an exceptional business and marketing strategy around their vision, but need the software to make it happen.

Background about the envisioned arrangement of the restaurants, as well as the requirements for the software, are described in the bullet points below.

So, in general, the workflow followed in a customer experience at a restaurant might look like this:

Getting Clarification on the Requirements

As these requirements are fairly open-ended, you will have some amount of freedom in deciding which direction to go. For the most part, following your passion is fine here; in general, the investors are open to a lot of different possibilities, and I would not expect all three teams to build a system that has the same functionality, and that's fine. However, if you're unsure about any aspect of the system's requirements, feel free to ask. When you do, I will share your question and my answer to it with all of the groups. (On the other hand, when you ask questions that are specific to your implementation, I will not be sharing that with everyone.)

A Few Realities

Since this project focuses on building prototype functionality, it is fine to stub the parts of the functionality that cannot easily be implemented without external devices, such as payment processing and receipt printing.

Ideally, an implementation would include support for running the software on multiple machines with networking, but you can work around this limitation and run everything on a single machine to begin with, to keep things simpler.


Group Work

This project will require you to work in a large group of eight students. Each of you will be randomly assigned into a project group and will be receiving an email specifying who else is in your group. (After sending these out, we'll send an email out to the entire class, so you'll know when you should have received one.)

Even if you've done previous work in pairs or small groups, this group will likely be much larger than you may be accustomed to working with in a class project. Collaborating in a group this large is very different from small-group or individual work, and you'll need to think up front about some strategies for accommodating the differences. In short, there is a level of professionalism required here that will be new for a lot of you, but totally vital in future careers, regardless of what kinds of careers they are.

Necessarily, you will need to split up the work, as this project is too big for us to expect any one of you to complete in the few weeks available; as a combined force, however, your group will be able to accomplish great things if and only if you approach the team aspect of your project well. I'm happy to consult with each of you about how you might organize your group's work — and we can definitely talk about this in greater detail during the first Project Consultation meeting during the Thursday, February 28 lecture (described later) — but there are a number of things you can do to ensure that your group experience goes well, which you should think about before proceeding with this project.

Rating Each Other's Performance

As with Project #5, keep some notes on your assessment of the participation level of each member of the group, as you will be assessing each other in a more formal way at the conclusion of the project, with part of your score determined by others' perceptions of your contribution to the effort. This is partly to keep everyone honest — everyone should be pulling their weight — and partly to acclimate you to the idea that you also need to honestly evaluate others' work in real-world contexts, even in the presence of social and political implications.


Hosting Your Git Repository Online

One of your first goals, before your group moves forward with any of the implementation, should be to create a Git repository that is shared amongst all of the members of the group (and only the members of the group). Among other things, you will be required to submit your full Git repository, just as you were in previous assignments; the difference is that we expect, this time, for you to submit a single repository that contains the chain of events (including commits, branches, merges, etc.) contributed by everyone. Individual commits, done by individual users, should show up in the repository's history. You should be able to see, as you glance through the repository, who did what and when, because this will help you manage code changes as they happen in real time, so, for example, you can know who to ask when something doesn't work the way you thought it should. Additionally, we should be able to see this history, as a way to verify that each member of the group was pulling his or her own weight.

The best way to accomplish this is for the repository to be available to your project group on the Internet, so everyone in the group can access it at all times. There are a variety of hosting services available that can do this, with varying abilities and costs; you'll need to choose one of these services, meeting (at least) the following requirements.

A handful of options are listed below, in no particular order, including my interpretation of the basics of their offers, as of this writing. You'll need to choose the one that's right for your project group, and I could certainly have missed an important detail or two; I have not tried all of these services, so I don't have specific advice about which one is better.

An offering that included integrated issue tracking would be a nice-to-have; because of the relatively short duration of this project, an issue tracking solution that integrates deeply with source control (e.g., allowing you to associate Git commits with issues in your issue tracker) is not especially important, though you will want some way to track issues and assign them to team members as they come up.

The Realities of Using Online Tools That Are New to You

It is entirely possible that, early on, you'll find that your chosen repository host has an issue that blocks you from moving forward. Perhaps they aren't reliable, or they have a limit on how many people are allowed to commit to a project, or they provide free access only for a limited time. One of the upsides of using a standard tool like Git, though, is that it should be possible to migrate your repository from one host to another fairly quickly if an issue like this arises that proves to be insurmountable.


The Project Manager and a Project Schedule

In a group the size of yours, it is important to have at least one person who can maintain a holistic view of what's happening with the project from day to day: who's scheduled to complete what features at what times, where the dependencies lie between work being done by different people, how to plan a schedule that allows everyone to be making progress as much as possible, ensuring that important details are not missed, reworking the upcoming schedule because parts of the implementation are not proceeding as planned, and so on. I suggest that each group elect a project manager, who has the overall duty of tracking these kinds of issues. You can choose to give that person a lighter load in terms of implementation (or not, if that person can handle more).

There are no specific requirements with regard to how you are to maintain this schedule, and you won't be required to turn this in, though, as usual, you're best off standing on the shoulders of giants, so consider using well-known tools such as Gantt charts. If possible, a schedule chart available to everyone at a glance — there are loads of Gantt chart web apps available, at least some of which are available free — that identifies tasks, and who is responsible for each, would help everyone to track progress, see upcoming dependencies, and so on.

(Some of you have taken, or are currently taking, an Informatics course in project management; this is an excellent chance to put the techniques discussed in that course into deeper practice. Not all of you have taken this course, but that's fine; presumably, at least one member of each team has done so, and this is another factor in considering how to divide labor amongst the members of your team.)


Milestones and Presentations

Along the way, there are milestones that you will need to demonstrate, along with a sequence of meetings and presentations that correspond to most of the remaining lectures in the course. A good way to think about the process is to think of me as a technically-savvy investor liaison who has an interest in your success; while I will want to feel confident that you're making progress and will be prepared to deliver a complete product by the due date, I'll also be available in an advisory role to guide that progress. So I will be assessing your group in each of these instances, but I will also be trying to ensure that you remain firmly on track. (This is not uncommon in real-world projects, as stakeholders such as upper management, investors, and potential customers want to remain abreast of developments, at least periodically.)

The final deliverable is a complete product, though I do expect that it may not be possible to complete the entire project as specified here. If not, your goal should be to find a reasonable subset of the functionality to complete and demonstrate. An incomplete solution that is nonetheless fully working and demonstrable for some portion of the requirements will be rated much more favorably than a non-working attempt to completing everything, so you're best off finding a way to work incrementally.


Using Third-Party Components

In general, you should be willing to use third-party components to solve parts of your problem, especially those that are difficult to solve on your own. Obviously, if there is a reasonably complete product out there that already solves this whole problem, you are not permitted to use it — in whole or in part.

As you find third-party components that appear to be a good fit in your architecture, please contact me and let me know what it is, along with whatever information you think I need in order to decide whether you should be allowed to use it. (At minimum, I need to know what its name is, where I can find its documentation, and where I can find its source code.)

Licensing

Licensing plays a role in the selection process. Our goal here is to simulate the design and implementation of a product that could be used or sold commercially — though, granted, there are obvious legal issues surrounding the commercialization of this particular product — so it won't be possible for you to use just any code you find on the Internet. I will be holding you to the following restrictions surrounding the selection of third-party components:

I'm happy to help you interpret licenses as you find them.

A Word About Scheduling

Note that while I will do my best to answer questions about third-party components quickly, I cannot guarantee a response in, say, a few minutes or even a few hours necessarily, as I will sometimes need to research them before responding to your questions. As in a real project where there is an outside party involved in decision-making, you'll need to build this limitation into your scheduling. The best approach is to select your third-party components early in the process and get them approved sooner rather than later.


The Final Deliverables

You will be responsible for submitting the following deliverables in advance of the scheduled final exam time on Thursday, March 21 at 4:00pm:

As usual, deliverables will be submitted to Checkmate. Only one member of each team should submit; decide amongst yourselves who that will be.


Assessing the Work of Your Partners

After you've completed and submitted the project, please download and fill out the following form that allows you to comment on the done by each of your partners, along with any other information you'd like to include about your experience working on the project.

Instructions are specified in the form. Please email this form back to me after you've completed it.