Final Project Proposal, and about the Final Project
NOTE: In addition to what’s below, there will be a couple of follow-up documents: One about the writeup that must accompany the submission of the final project in January, and another with some more detail about the features.
The Final Project (hereafter, FP) will be a web application designed and implemented by you. The requirements are as follows:
- You must write a FP Proposal and have it approved by your TA. (Approval means that you have an e-mail from the TA in which the TA writes: “I approve.” Your TA may tell you that the project is approved only if you make some changes in the proposal; if so, make the changes, and get that final approval!)
The FP proposal talks about what the application will do, what its models, controllers, and views are like, and what additional “features” you will implement — more on features below. - Due date for the FP proposal: We want to get these proposals wrapped up soon, but since we’re not meeting until the Wednesday after Thanksgiving, and since there is an assignment due Dec. 7, we feel that we can’t require you to get the proposal in when we’d really like it, which is on Dec. 4. Therefore, the “drop-dead” due date is: Dec. 11. If you can get your proposal in closer to the 4th, the staff will make every effort to provide feedback sooner rather than later, and I’ll be involved in that as well. One thing you might consider is to give your TA a brief “pre-proposal” that provides in a paragraph some idea of what you intend to do before you write the full proposal; by this means, you might be able to get a bit of tuning sooner rather than later.
- The FP proposal must be a document written in plain English (i.e., not just an e-mail, and not a PowerPoint or KeyNote slide deck; it must be a PDF, an RTF file, a TXT document, or a ZIP of an HTML page). The audience of the FP proposal is an informed developer who needs to know the application’s scope and (roughly) how it will work. You should include enough information so that the developer would be able to evaluate whether or not he or she would want to implement the project. It is not a specification; it is a proposal. Please, do not provide a cover page, table of contents, list of figures, etc., etc.: Stick to plain sentences and paragraphs; lists can be useful for things like your descriptions of models and use cases (see below). How long should it be? My advice is to keep it as short (but clear) as you can, and submit the proposal sooner rather than later; your TA will be able to tell you quickly if there is not enough detail, and then you will have time to resubmit.
- Your proposal must outline how you will satisfy the following requirements. This means you should describe the order of implementation, and how you will figure out anything that is currently unknown to you. It can help to include a calendar that lists milestones.
- The FP should accomplish something. It should allow a user (or users) to get something non-trivial done. You should begin your FP proposal with a description of what the application accomplishes, and why you think anyone would be interested in it. Your FP proposal should “argue” a bit for the usefulness of the FP. If you like, include real-world data on who would benefit from the application, perhaps in terms of getting its task done cheaper, faster, or better. In the past, some of the best final projects have been: (a) a tool to help the developer with a hobby or other topic about which the developer is passionate; (b) a clone of an existing application (as LinkWizz copies some of the basic functionality of delicious.com; if you want to clone an existing application, there should be some kind of significant twist that differentiates your project); (c) something that would be of use to a family member; (d) something that would be useful at work; (e) an application that “mashes up” two or more web-based third-party APIs (e.g., Amazon’s or eBay’s services to provide information about products). One thing we haven’t seen much of is genuinely interesting games.
- Models: Your FP must have a set of Models that is of similar complexity to the MetricsMine or ChildCare Co-Op Assignment; i.e., seven (or so) or more database tables, and relationships amongst the models. We expect you to use at least one has_many :through or, possibly, a pair of habtm relationships (as you will recall, John prefers has_many :through and hasn’t said much about habtm ["has and belongs to many"], but you can pick it up easily from AWDR). Models must define sufficient validations for the application to work properly (e.g., there should be no surprises because, say, two users have the same login name, if your application expects users to be unique). When you describe the models in the FP proposal, you NEED NOT include a diagram; you can simply list the models, what they represent, and their attributes, associations, and validations. The list should be easy to read. You do not need to list exhaustively all of the attributes — but we do need to hear about all of attributes that are functional.
- Use cases: Your FP must implement several use cases that exercise the models for one or more types of users. In the proposal and write-up, we like a list of sentences of the form “The user will be able to X.” For examples, see the requirements for the MetricsMine application, or for last year’s ChildCare Co-Op (http://e168f07.7fff.com/assignments/assignments-4-5-and-6-overview/). It can also be helpful to provide a user story or scenario (again, see MM or CCC). Your TA may well ask for more or less detail on this when reviewing your proposal.
It will count negatively against your grade if there are models that are not exercised by the implementations of the use cases, or are exercised trivially. In your FP proposal, you must define the user (or users) carefully, and explain which use cases apply to which users. In large part this is where your FP proposal will talk about controllers. NOTE: The use cases play a special part in the FP Write-up (see below). - Pages: You should itemize the most important pages and explain how the user experience in the use cases flows through those pages. In large part, this is where the FP proposal will talk about actions and views.
- Features: In addition to implementing models, controllers, and views, you must leverage three of the following additional features of Rails or plugins (depending on feedback from you, we may add to this list):
- E-mail. Send e-mail; but, more importantly for the e-mail feature, the e-mail must be functional to the app. In other words, it might notify users of a change of state in the application, and provide links that, when clicked, change the state of the application. In other words, merely sending notifications is not enough. (And e-mail confirmations sent by restful_authentication or other plugins is not enough.) You might also consider receiving e-mail. These topics are covered in AWDR.
- User management: Adapt the login / registration code to use the restful_authentication plugin (http://github.com/technoweenie/restful-authentication/tree/master).
- Authentication with Open Id. Typically you would do this in conjunction with restful_authentication. One way in is to study the Open Id screen cast at Railscasts: http://railscasts.com/episodes/68-openid-authentication
- Ajax: Ajaxify as much as seems appropriate. Using Ajax on one or two pages will result in very little credit. Creative, dynamic use of Ajax will be reward, as well as systematic and consistent use of Ajax throughout the application. Ajax is covered in AWDR.
- REST. Provide a REST interface for at least one of the models. Ideally, you will implement nested resources. If you expose resources through REST, you must provide a sample client. Your best bet for a client is to write a simple application using ActiveResource. . . . covered in AWDR.
- Feeds: Expose an RSS or Atom feed with updates regarding the state of some aspect of your application. To get started: http://intertwingly.net/blog/2008/10/14/Rails-AtomFeedHelper-just-got-better
- Asynchronous jobs: Manage tasks through Workling (http://playtype.net/past/2008/10/2/workling_version_03_released/) or something similar.
- Uploading. Try paperclip: http://www.thoughtbot.com/projects/paperclip/; AWDR also provides some guidance on supporting uploads in Rails.
- Time zone handling. See http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/
- Internationalization or Localization: Provide a means to present your application in another language. THis can be a big topic: Discuss with your TA if you want to try it.
- Testing: Provide a complete test suite. This may count as two features. A serious attempt at this feature would require learning about rcov, possibly mock objects, and possibly an alternative (to RUnit) test framework such as Shoulda. If you want to do this, you should already be a testing zealot.
- Something else. You must get approval from your grader.
- If you propose an application that has significant domain complexity (say, a project with 15 tables and a lot of use cases), we may accept a proposal that specifies only two of the above features.
- A few notes about the final project packaging, writeup, internal documentation, and implementation (and we will likely have more to say in this department):
- The project must have the standard Rails directory organization (i.e., the result of running the “rails” command). We can’t accept assignments that have some kind of home-grown structure. It must be possible to start the server with “script/server” and so forth. Models, controllers, views, and migrations should obey the standard conventions regarding positioning in the directory structure, naming, etc.
- The project must run in the environment you set up for Assignment 0! (So Rails 2.1.1, etc.; please, no Rails 2.2.x or edge Rails!)
- Your rakefile must be based on the course Rakefile from the last version of MetricsMine. What you submit should be produced by “rake package.”
- It must be possible to run all migrations.
- The Rakefile for MetricsMine does include a copy of the development database (db/development.sqlite3) in the ZIP. We do want this in case there are issues with your migrations. So don’t delete it prior to packaging.
- You must include sample data, i.e., a data migration that sets up sample users, data, etc.
- If you are using a gem or plugin that interfaces with a third-party (Amazon, eBay, etc), provide clear instructions on how to set any required components (including how to authenticate, if necessary) on the TA’s system.
- The project must be accompanied by a write-up, which is a plain TXT document (called readme.txt or an HTML document (called readme.html) which goes in the root of the project. Keep the formatting as simple as possible. The only reason we allow HTML is to make it a bit easier for you to include screenshots if you so desire.
- The write-up should cover the same topics as the proposal, but with a greater focus on implementation.
- As in the proposal, the write-up should include a list of use cases, and a clear explanation of how to exercise each use case; if you want to get credit for what you have done, provide us a way to see what you have done!
- The “crow”: On occasion, we have received submissions that do something incredibly cool, but for whatever reason the student forgets to tell us about it. Do not forget to “crow” (i.e., brag) about anything that is particular cool or amazing in your project. And don’t forget to tell us how to exercise that cool feature!
- As promised at the top of this page, we will provide another page with some details about how to create a great writeup. This document will also talk some about internal documentation.
blog comments powered by Disqus
Add New Comment
Viewing 19 Comments
Thanks. Your comment is awaiting approval by a moderator.
Do you already have an account? Log in and claim this comment.
Do you already have an account? Log in and claim this comment.
<% observe_field("new_customer", :frequency => 0.25, :function => "alert('Element changed')") %>
<%= text_field_tag "new_customer", '', :size => 30 %>
Do you already have an account? Log in and claim this comment.
Do you already have an account? Log in and claim this comment.
Do you already have an account? Log in and claim this comment.
I'm trying to save a worker.
How can I write a worker validation that will make sure the new worker has at least one skill in the worker_skill table? In the controller, I"m creating the skill, and then creating the worker, then creating the worker_skill record.
I thought validates_presence_of only works on columns in the actual table that you're creating so I'm a bit unsure how to approach this one.
Jody
Do you already have an account? Log in and claim this comment.
(This is discussed in AWDR.)
Jody -- Sure you need this? Suppose that a Worker has already been created with a particular skill, but for whatever reason, it's determined to be an error. You might want to remove the skill, save the worker, and come back to it later, to re-add an appropriate skill. In this case, it is easy to imagine a worker with no skills. So . . . don't worry about this? If a Worker has no skills, you would report this in the UI.
Do you already have an account? Log in and claim this comment.
We wouldn't have a worker that belongs to a company but doesn't do at least one of the company skills but I guess letting them add it later and catching it in the view is a perfectly good solution that makes this much easier for me.
Thanks!
Do you already have an account? Log in and claim this comment.
My app is multi-tenant meaning that skills belong to workers through worker skills but workers actually belong to a particular company. The only way I can associate the skills with the company are if there is a linkage through a worker. It's kind of flawed in that regard.
Is there a way to associate skills, to a company, even though it would be through 2 tables (workers, then worker_skills), not one?
Do you already have an account? Log in and claim this comment.
My experience is that it is best to write sentences about your entities and see what comes up. Here's what I am hearing:
There are skills.
Companies have skills.
Workers have skills.
[NOTE: The sentences do sound a bit funny; "skills" is not a word I associate with companies, but "capabilities" is a word I do associate with both companies and workers.]
Workers belong to companies. [only one?]
Now, I might engage a company for a particular skill. Do they, at this moment in time, have workers with that skill? I don't know. But it seems entirely reasonable to me to imagine a company that tells me that they have a skill, but for whatever reason can't fulfill work in that skill at the particular time.
There is nothing wrong with have a join table between skills and companies and a 2nd join table between skills and workers. It must means that to answer the question, can company X actually provide help in skill A, you have to do a bit more work. So say to yourself: Can I provide a list of companies with workers right now with a paricular skill? YES, that should be pretty easy. It's going to look like:
Worker.find(:all, :include => { :companies, :skills }, :conditions => [ 'skills.name = ?', needed_skill ])
And then get the unique companies. Something like that.
For the final project KEEP IT SIMPLE. I would STRONGLY advise having only one model (EITHER Company or Worker) that is ultimately associated with Skill. The reason is that if there are multiple, you are going to have to be very careful to define your associations. In the CCC example, you will see that we defined maybe too many associations, and had to define associations where we specify the class name, etc., and it got more complicated than we would have liked (which drove last year's students a bit mad).
Do you already have an account? Log in and claim this comment.
Do you already have an account? Log in and claim this comment.
A worker has skills.
A company has skills.
That's reality. Let the schema follow that at the start. You may very well find eventually that a company has "company skills" which are different from "worker skills." But that's for Version 2.0 after you get VC funding. :-)
Do you already have an account? Log in and claim this comment.
I.e., if the customer (web application user) is only interesting in skills, and a worker has no skills, then the customer doesn't care about the worker.
Do you already have an account? Log in and claim this comment.
Do you already have an account? Log in and claim this comment.
"In large part this is where your FP proposal will talk about controllers."
Do you want us to actually list the controllers? If so what sort of information are you expecting? I have a similar question about the "Pages" section and the views and actions.
Do you already have an account? Log in and claim this comment.
If you controllers diverge from the typical CRUD model, then it could help your TA understand better what you're trying to do.
Do you already have an account? Log in and claim this comment.
Spiritual Measurement Platform - Codename "InterEthos"
Create a system of data tables to allow users to create and apply taxonomy indexes (ie. a "folksonomy" system) against the human spirit of people. At its core the data system must have the flexibility to allow users from different cultures to have totally different ways of thinking about spirituality, taxonomy structures, and the valuable outputs such a system could / will provide.
Subsystem of three classes of user identities: 1) for non-registered users (user identities created by parties other than the owner, and not claimed or validated by the owners), 2) for registered users (owners create and pro-actively link to their own identity), and 3) verified users (owners create, verify, and maintain their identity with a structured regularity and protocol).
XML profile calls from browsers visiting remote websites where mentions are made of people measured by the system, along with displays in sidebar of the browser depicting the "ethos" of said people.
Browser plugin that allows users to input a list of "people to watch for", which pulls the profiles and allows manipulation of (posting to) those profiles when on relevant content. Posting to other people's profiles will require that the users be registered in the system, at the very least (there may be different levels and measurements of how users can be "registered with the system").
Once a core data platform is created and accepted as being valuable, then a system to replicate the server into a network of servers will be created and deployed. The ultimate goal is to create a cloud of servers, which stripe the overall data, and which preclude the possibility of one entity owning and/or controlling the platform.
Do you already have an account? Log in and claim this comment.
One other concept:
One far out end-goal is for a person to be able to walk into a physical ballroom filled with a hundred people whom s/he has never met, and be able to immediately "assess" who is in the room. Maybe the person is looking for "like-minded" people, or people with similar skills, or people with a similar Myers Briggs profile. Maybe the person is looking for a "diamond in the rough" person who can satisfy a particular need in a current project.
Of course the same situation might happen in a virtual reality ballroom, similar to Hero's trip to the bar in the book "Snow Crash".
Do you already have an account? Log in and claim this comment.
The ballroom app sounds like a lot of fun.
I am an old friend of Neal Stephenson's. Great guy. Scary smart.
Do you already have an account? Log in and claim this comment.
The project I am envisioning requires some geometry functions within the DB. MySQL has this functionality. Sqlite3 does not. May I use mySQL?
Specifically, I'm integrating geo-kit functionality for a Google Maps mashup which will provide dynamic user information on a live map. But I want to include asynchronous search functionality to find map points (stored in the DB) within some defined distance, and this is most easily accomplished via a geo-kit call which leverages functionality in the DB. While I could write the functionality in Ruby, it will not function as efficiently, and it will be an overly complex rewrite of a function which is available directly on mySQL.
Please let me know.
Mike
Do you already have an account? Log in and claim this comment.
If you can justify it, it may get approved.
Add New Comment