CS 3240: Senior Design

What constitutes a Senior Design project?



About
Announcements
Coursework
FAQ

In a nutshell, an SD project needs to have core computer science as its "meat", something that's innovative, somethat that will challenge you and take you out of your comfort zone. We know that some projects involve a lot of work, but a lot of programming is not a substitute for innovative core CS content.

To illustrate, here are some projects that would NOT be acceptable, no matter how ambitious the programming effort:

  • Any project where a dbase-backed website is the core contribution. You already know how to build websites - there is no new technical or algorithmic achievement in merely building a more feature-rich website. Websites can definitely be part of a project, but not the core contribution.
  • Any project that is mostly a direct application of sophisticated APIs. A good example is populating Google maps with data from some other source. For example, showing restaurants and their ratings on maps. Again, we know you can use APIs and piece together an innovative application.
  • Any project whose primary contribution is game design. Even if the game is dazzling and innovative, if the effort is primarily in game design and graphics-package mastery, it won't suffice for a project.

Now, there are exceptions. For example:

  • A website can be part of a project whose core includes some algorithmic or systems content. Or your website can be include some key algorithmic component. For example, you can show school bus routes on a map and also provide a sophisticated scheduling algorithm, demonstrating why it's effective.
  • Similarly, you can do a game if your primary contribution is something core in graphics or computational geometry.
However, to be granted an exception, you will have to make a strong case for an exception.

Here are some criteria to use in looking for projects:

  • Does the project have an algorithmic challenge and a compelling application of the algorithm? Again, it is not enough to merely code up an algorithm to a problem, as you might in a research project or an algorithms course. The algorithm needs to be part of a substantive application.
  • Are there novel CS abstractions/mechanisms and a compelling application?
  • Will your project build or significantly augment a software tool (e.g., language, compiler, OS) that is useful and innovative in some way?
  • Does your project make use of interesting hardware where there's a challenge in controlling the hardware?

A few more points about the project:

  • If the success of your project depends on a lot of data, then you'll need to explain how you're going to get the data. For example, if you were going to create a searchable image database (with a new kind of search algorithm), to show that it's effective, you'll need lots of images. Where are these going to come from?
  • Your project needs to be innovative - not a copy of some previous project, or some existing product. We urge you to think out of the box.
  • Another informal criterion to apply is: will your project excite a patent lawyer (for its technical contribution)?
  • You also need to think about what you will demo and you will make your demo compelling. Thus, you could think that roughly 70% of your project is about the technical meat, while 30% or so is to be devoted to the "wow" factor. Of course, we understand that it's harder to demonstrate "wow" with an OS project than, say, a robotics project. We will weight accordingly, and help you with that aspect.


Examples of Past Senior Design projects

Here are some examples of past projects that fit the criteria:

  • Projects that won the 2011-12 Meltzer and Bard prizes. Chan Chandrapunth (Meltzer prize) used a Kinect to build a virtual sculpture system called Sculpteo. A user faces a Kinect and uses their hands to shape a virtual blob of clay. David Breneisen (Bard) built a system to recognize written chemistry structures and turn them into standard notation.
  • Projects that won the 2010-11 Meltzer and Bard prizes. Patrick Thompson and Matt Harlan shared the Meltzer prize for their projects. Patrick developed a safe language for writing low-level systems code and showed how this could be used in applications; for example, with his system you can write pointer-free code that gets translated into C. Matt developed a unique file-system interface that allows easy searching and storage of past query results. For example, when you search for a particular type of file, the result is a new directory with those files, and this directory can be used by other applications. Matt's work eventually led to a research publication; Patrick's project is headed there too. The Bard award was won by Zack Schwartz for his real-time live analysis of tweets. His system categorizes tweets into a variety of categories such as "entertainment", "sports" etc so that one can observe a snapshot of the national conversation on many topics. His combined both systems (servers, fast processing of tweets) and language-related machine-learning.
  • A cellphone enabled secure voting system (Alex Florescu, 2010, Meltzer Prize). In this project, Alex designed and built a system consisting of a mobile device, a voting machine, and a central server. A user enters a voting booth, makes choices on the voting machine, receives an unforgeable electronic receipt on the cellphone, while the vote gets tallied by the central server. Through a complex set of security protocols, it can be shown that the vote is private, is always counted and that the user can ensure that it was recorded correctly. Thus, the project involved implementing user interfaces, some of it on a cellphone, a series of complex security protocols, and the communication between three devices. As an interesting aside, an earlier version of this system was used in the first voter-verifiable secure election in the U.S, for Tacoma Park local elections in 2009. See Prof. Vora's website for more details.
  • Secure, permanent postal addresses (Sam Sternberg, 2010, Bard Prize). In this project, Sam built and demonstrated a system of using encrypted addresses on envelopes so that addresses are private and can be mapped to changing physical addresses, along with an unforgeable delivery receipt. From a technical viewpoint, the project combined elements of security, optical character recognition, printer control, and web development.
  • A 3D gesture-recognition system (Adam Zeldis, 2007, Meltzer Prize). This project featured a webcam aimed at a PC user and set up to track fingertips. The idea is that the user can make fingertip gestures, which can then be used to control the desktop - for example, to open or close windows, interact with applications etc. The project involved video and image analysis, along with programming the desktop API.
  • Sython - a language for privacy-preserving programming (Michael Gaiman, 2004, Meltzer Prize). Mike modified the Python language to support a certain type of security feature: privacy-preserving programming. The idea was to create a programming language for out-sourced development so that those developers would be able to write server code without actually being on the server or being able to access the actual data in the databases that the applications would be using. Thus, a programmer could write and test an application for a hospital dbase without actually being able access the actual data. This is a good example of a top-to-bottom "systems" project, involving a language modification (grammars, interpreters), systems support (servers, runtime systems) and networking (between client and server). The project resulted in a publication and release of open-source software - see the Sython page.
  • A tablet-grading system for writing classes (Sean Hanlon, 2002, Meltzer Prize). The goal of this project was to build a complete system for English writing assignments - an editor for students, a tablet-based grader for professors, and a system that would track student drafts and assignments. The project involved development on a tablet PC to recognize gestures, and display pen-strokes, Java GUI development (the editor, and grading system), and backend servers (to upload and download drafts). This project was eventually extended (after Senior Design was over) into one of the most successful products to come out of Senior Design, resulting in an actual test in University Writing (UW20) at GW. Blackboard Inc., previewed the project but ultimately declined to commercialize it. See the project page for more details.
  • SmartMail - an enhanced email system (Herve Roussel in 2002, Nayan Patel and Scott Levi in 2000). Starting in 2000, a series of Senior Design projects took on email, with the idea of enhancing the user experience by adding features to track emails, provide receipts, open chat windows, preempt emails with standard responses, calendar integration, allow multiple users into a single account, and so on. Many of these are now standard, but this was not the case 10 years ago. These projects involved significant GUI and protocol development, and all of them resulted in sophisticated full-featured email clients, one of which was demonstrated to a group that was studying email for the U.S. Congress.
(Note: if you are a prior award winner and your project isn't listed here, please get in touch with Prof. Simha).


Examples of tools that you can use or be inspired by

Below is a list of "systems" and software tools that you could consider building on, or that could stimulate your own project ideas:

  • Valgrind (valgrind.org) - A suite of programs that monitor a program's execution. They debug memory management problems (double frees or dangling pointers), simulate cache behaviors of the program so that the programmer can optimize for the cache, produce call graphs of actual program execution, profile heap usage, and more. This could be used in projects that require understanding the run-time behavior of programs.
  • Dynamorio (dynamorio.org) - A tools that enables you to do runtime code manipulation while a program executes. It takes as input an x86 binary, and -- instead of executing it directly -- evaluates every instruction and produces new x86 code to actually be executed controlled by you. It essentially does JIT compilation on x86 code. Techniques like this are used, for example, to do virtualization in VMWare! Some example uses: whenever a function is called, you can instruct it to call your function first (thus enabling you to generate a call-graph); whenever a the stack is manipulated, you can make note, to provide a stack usage profiler; or even possibly to provide garbage collection to unmodified C applications!
  • Lua (lua.org) - A scripting language with a small and well-written runtime. Would be a good platform for projects that propose adding to or modifying a scripting language.
  • LLVM (llvm.org) - A compiler infrastructure that focuses on the "backend". It provides compilation of a low-level intermediate language into efficient executable code, and even supports JIT. This could be used in a project that creates a new language, investigates garbage collection strategies, or even provides novel code optimizations.
  • FUSE (fuse.sourceforge.net) - User-level programming of Linux file systems. Make file-system programming fun!
  • SQLite -- A compact and well-coded data-base. If you wish to modify a data-base by adding additional indexing schemes, replacement policies, etc..., this is a good vehicle for that work.