Propose a UI-intensive problem to be solved. Design a user interface for it. You are encouraged to use state-transition diagrams, screen sketches, entity-relationship diagrams (of the user's view of the program, not the actual class structure of the code), etc. Try to be as clear, detailed, and unambiguous as you can without writing any actual code.
Present your proposal and UI in an oral presentation to the class. You may use PowerPoint or the like, or you may just draw on the board.
You are to turn in five things: your proposal and UI design, as described above; a user's manual, teaching a user how to use all the major features of the program; a prioritized list of features, suggesting to the implementer which features are most important; an in-class presentation; and a development log, showing each major design decision you make, when and why. If you change your mind about some earlier decision, this should go into the log too. Please provide each of these (except the in-class presentation) by e-mail, so I can easily give them to your implementer as well as grade them myself.
Write a program that implements your classmate's UI design.
As before, you'll probably want to do a sequence of versions, each adding one feature, based on both the prioritized list of features and implementation dependencies. Each version should be testable in its own right.
In the course of implementation, you may need to ask your designer for clarification, or propose changes to the design or user's manual. All such changes must be explicitly approved by the designer.
You are to turn in four things: the source code; the user's manual as modified (and annotated to indicate features that you didn't have time to implement); the development log, to which you have added entries for your own design decisions and milestones; and a presentation to the class demonstrating what your program actually does. (In most cases, it won't do everything specified in the proposal -- you've only had three weeks to write it -- but show us as much as it does.)
Write two reviews (say, 1-3 pages each) of your classmate's program. The first review is as a user: run the program, with the user's manual in front of you, and see how well it does what it claims to do. The second review is as a programmer: look at the source code and the development log, and try to understand how the code works. Comment on good and bad software practices you see.