Final Independent Project
ASSIGNMENT OVERVIEW
In this assignment you’ll be working on an independent project of your own choosing, subject to the approval of the instructor. Some possible options that you might consider—either as actual topics of study or as inspiration for something similar—are listed below.This assignment is worth 50 points and is due during your last week of class.
BACKGROUND
We’ve spent the year in this course investigating various aspects of computer science, computer programming, and technology. As a culminating project in here, you will be pursuing further study in one of the topic areas that we’ve covered, or investigating some aspect of computers and technology that you find particularly intriguing.
ASSIGNMENT SPECIFICATION
Pursue an independent study of some aspect of computer science, computer programming, or technology.
General Possibilities
- Write a Java/Python application (main program with associated classes) that a user interacts with.
- Write a Java application that demonstrates an algorithm, or a process that can be modeled by an algorithm.
- Create a website, either static (HTML/CSS) or dynamic (PHP/MySQL)
- Build a hardware-based project using Arduino board, Beagle board, Raspberry Pi, etc.
- Do something using a commercial server (Linode, Amazon Web Services, etc.).
- Research a topic, and write code that illustrates aspects of the topic.
More Specific Ideas
Examples of topics that you might consider focusing on include:
- Computer Game - Graphics Based
Write a graphics-based computer game: Craps? Snake? Poker? Flappy Bird? Java supports graphical programs, or use Processing to write your code. - Computer Game - Text Based
There are lots of games that can be programmed without having to resort to developing graphics: Rogue? Mastermind? Poker? Use Java/Python to create a text-based game of your own design. - Computer Utility - Graphics Based Write a utility: a graphical calculator, an encoder/decoder, an image processor, a simple graphical drawing program, etc.
- Computer Model/Simulation
Write a Java/Python application that allows the user to simulation traffic flow through an intersection, elevators in a building, swarm behavior, etc. - Website
Learn about HTML and CSS in order to build a small (10-15 page) website, or investigate PHP/MySQL and create a dynamic site (perhaps one that implements a simple discussion board). - Hardware
Using an Arduino, Raspberry Pi, or some other hardware platform, build a stationary motion-tracker, a line-following robot, a numeric keypad lock, or an iPhone-based lock. - Research: Server Virtualization
Start an account at Linode or Amazon Web Services and start up a server that manages a simple webpage. Write a tutorial that guides someone through that process. - Research:Study of Recursion
Recursion can be a powerful tool for studying the behavior of certain functions, or even solving certain types of problems such as “The Towers of Hanoi.” Learn more about this subject, and build programs to demonstrate the process of recursion. - Research: Diffie-Hellman key exchange, or RSA asymmetric encryption
Research the Diffie-Hellman key exchange process and explain it. Write a program that illustrates the RSA asymmetric encryption process.
You may consider other options as well, subject to the approval of the instructor.
DELIVERABLES
Deliverables for this assignment vary depending on your chosen project.
- You will need to write a proposal for your project in the shared Google Doc that will be used to track students' work. The instructor will provide written feedback of your proposal.
- You will need to enter Progress Reports on the Google Doc the instructor has shared with the class. This will be one of the most important means of communicating with the instructor regarding your project, and these progress reports earn points toward your final score.
- The completed final project will be submitted in a zipped file,
IndependentProject.zip
. This zipped file will contain a directory with supporting files that vary depending on the type of project. - For Java-based projects the
IndependentProject.zip
directory will contain all .java source files, non-standard modules, external files, package.BlueJ files (if you used BlueJ), and documentation as necessary. Your zipped directory will need to include a single source file and a README.TXT file that explains the program and provides supporting documentation as necessary. (See below for further information on the README.TXT file.) All Java source files must include appropriate JavaDoc documentation and use self-documenting variables, methods, and class names as discussed in this course. - For non-Java-based projects, the
IndependentProject.zip
directory will contain a PDF version of a written report (minimum 7 pages, including cover page and References page) and a README.TXT file that explains the contents of the directory. - Projects that involve hardware will require delivery of that hardware to the instructor for evaluation. Hardware will be returned once evaluated.
You should keep a copy of your files in your home folder on the server—see additional comments on backup strategies below. To submit your assignment for grading, zip your deliverables as specified above and upload it to the directory /home/userID/forInstructor at crashwhite.polytechnic.org before the deadline.
ASSIGNMENT NOTES
- As a culminating project and my last opportunity to interact with you via our curriculum, style and formatting are important. Pay careful attention to requirements outlined in this document.
- One of the difficulties in choosing and developing an independent project is identifying a project of the correct scope. You want a project that is challenging and will show off your capabilities, but you want a project that you can complete—or complete with few unfinished features—in the time available.
- It may be helpful for you to choose a project based on a subject area or topic of interest that is similar to that of another student. Students are encouraged to assist each other where convenient/appropriate, but each student is responsible for his/her own individual project.
- Because the project will be challenging, you will almost certainly find yourself having to learn new things, and this often relies on learning from other people's coding projects or programs. As with the rest of this class, it is permissible to use coding strategies, techniques, or structures that you learn from inspecting other's work. DO read others' code, learn from it, and adapt it for your own purposes. Do NOT copy code verbatim from someone else’s program.
- If you have any code that you yourself have already written—for this class, for another, or on your own—you are welcome to use that code as a base for your project. Make sure that you indicate what codebase you are starting with, and what you plan to add on top of that code base that makes it appropriate for an independent project in here.
- Now is an especially important time to consider your digital backup strategy. You should have:
- Three copies of your data
- Two of these copies on different types of media (magnetic disk, CD/DVD, flash drive, or hard copy
- One copy offsite (on the course server, for example)
- For program-based projects, you can expect that there will be good days and bad days in terms of the progress you make. It’s not uncommon for several days worth of work to be discarded after trying an approach to a problem that ultimately doesn’t work—some of you have experienced this fact already. Be patient with yourself, and leave some time for unforeseen circumstances.
- The purpose of this project is to give you some freedom to explore an aspect of this course that is interesting to you and with which you have little or no prior experience.
- For someone who has already built a PC, building another one isn’t sufficiently challenging for this project. For a person who knows how to create HTML website, creating an HTML website is not an appropriate project, although learning how to create a PHP website would be.
- For someone who has written a program that plays Poker, writing a program to play Hearts isn’t sufficiently challenging. Writing a different kind of game would be more appropriate. The quality of that work should represent the 10-15 days that you have to work on it. Your work should impress.
GETTING STARTED
- Give some thought to what you want to do for your project, and submit your proposal on the spreadsheet online. I’ll be doing the same thing (doing an independent project, filling out the spreadsheet), so if there’s any question about what to do, copy me. :)
- Make a general game plan for what you plan on doing over in the time we have left. This might be a little difficult, especially if you’re taking on something that you’re not quite familiar with like learning to use a Java library. Make sure you budget a day or two for commenting and sprucing up your code—it's easier if you write JavaDocs as you go!—and a day for preparing your files for delivery and creating your PowerPoint presentation for the class. Those things take time, too.
- Based on your chosen project, outline the classes that you think you’ll need, as well as the methods those classes will require. Large-scale projects require consideration of the big picture—how are all those classes going to work together?—along with an attention to the detail work of implementing each class.
- As you come to better understand your problem,you will almost certainly find that you have to refine your project, including editing your classes, occasionally rewriting them entirely, or even throwing some of your original work out entirely. The ultimate goal is a robust program that works as intended, is easy for you to explain, and is easy for people reading your code to understand.
- If you’ve chosen a project that's appropriately difficult—and you should!—you might find yourself slipping behind self-imposed deadlines. In that case, you’ve got a few options:
- Accept that it’s crunch time and get busy—with enough time, you can solve any problem.
- Make appropriate modifications to your game plan and document them on the progress report spreadsheet.
- Keep going, and accept that your project is not going to be as successful as you’d hoped it would be. That happens sometimes.
SAMPLE PROJECTS (from past years)
- An iPhone game (Ninja Battle)
- Battleship game
- Building a Gaming PC
- Crimson Wood (text-based adventure game)
- Graphics-based HexChess Game
- Text-based Scrabble game
- Rogue clones (text-based game)
- Text-based Hearts game
- Epidemiology simulation (spread of disease)
EXAMPLE PROPOSALS
- Earlier this year we calculated pi using a formula given in class. I looked up some other techniques for calculating pi and found an interesting one called Buffon process. It's a process that involves dropping pins onto a lined surface. I'm going to create a graphical demonstration of the Buffon process that displays virtual pins dropping onto the screen (virtually "lined"), and indicates what the value of pi is as more and more pins are dropped onto the surface. I'm also going to indicate how far off the Buffon value of pi is from the actual value of pi as a percentage.
- Creating backups of a computer’s data is annoying: it involves either signing up for an online service, or remembering to plug in an external hard drive at home. After learning about cron jobs and LaunchAgents, I’m going to figure out how to write a shell script that will automatically keep copies of work I do on the computer on a tiny USB drive that I’ll always leave plugged into my computer. I’ve done some research and it looks like I’ll need to use the rsync command, but beyond that, I’m not sure what I’ll need to do. Once I’ve figured the system out and tested it (bash script using rsync and a plist file), I’m going to demonstrate it and share it with other students in the class.
YOUR README.TXT
FILE
A README.TXT
file is type of documentation for your work. It is a plaintext file that accompanies your project, and identifies all sorts of salient information about the project.
Whenever you've started a New Project in BlueJ, you may have noticed that a generic README.TXT file is created in your project folder as part of that process, and that file does as good job of describing exactly what it is to be used for:
------------------------------------------------------------------------ This is the project README file. Here, you should describe your project. Tell the reader (someone who does not know anything about this project) all he/she needs to know. The comments should usually include at least: ------------------------------------------------------------------------ PROJECT TITLE: PURPOSE OF PROJECT: VERSION or DATE: HOW TO START THIS PROJECT: AUTHORS: USER INSTRUCTIONS:
In addition to the information listed above, the README.TXT file often contains other information about the program:
- the program's history
- which features currently work, which have limitations, and which don't work at all or are being debugged
- which features haven't been implemented yet but are planned for future releases
- how to contact the author or developer with questions, corrections
In this project the README.TXT file will be a major component in your final project. The instructor needs to know this information for being able to evaluate the program, and may cite this information when exhibiting your work to others.
EVALUATION
To be determined