What was Your Senior Project?
Caydel asks: "I am a third year CS major. This year I have a two-semester senior project course in which I can spend two semesters on a project of my choosing. I want to write something very cool, which at the same time provides quite a challenge to me, and serves a useful purpose; however, I am having trouble coming up with good ideas. For those of you out there who have done a similar course, what did you do? What would you have done differently? Which languages did you use? How many skills, that came from outside of your CS courses, did you use?"
Here's an idea... scour sourceforge for a project where the idea is great and the implementation is usable but the code and efficiency is really bad.. then rewrite it from the ground up with elegant code and at the end of it all... submit it for the rest of us to use.
FYI it doesn't have to be a web app either... lots of standalone applications out there too but of course if it can publish reports, logs and status to a web monitor app even better.
A fool throws a stone into a well and a thousand sages can not remove it.
'Cool' and 'Open Source' are nice, but don't make them requirements. The ideal senior project is something you can both get an 'A' on and looks good on your resume. Make you senior project something that you would potentially do at a job you hope to have in the future. If possible, get corporate sponsorship for your project. This is easier than it sounds. Some professor in your school's CS department is probably already in good with some local tech company and has a project waiting to be done right now.
If you project can end up being open source, that's a nice bonus, but it can be a mixed blessing. Believe me, 5 years from now when you've learned how little you knew when you graduated it will be awfully uncomfortable to explain during a job interview why you implemented that code the way you did.
Above all though, don't work on something with no obvious practical applications unless your goal is to get into grad school. A practical project will make you desireable to hiring companies in the same way past job experience would.
I mean a real one, not the SQL crap we have today. One that implements Codd's original ideas as well as recent updates (e.g. The Third Manifesto). Updateable views, user-defined types, arbitrary constraints, type inheritance, declarative syntax, the works.
Please. Somebody do this. Anybody. I have searched high and low and have found exactly 3 products. Two half-finished open source implementations, and Dataphor which is commercial and thus not worth using.
I'm seriously thinking of going back to school just so I can study databases and learn how to write one. I have written a couple attempts in Lisp and Ruby and I just don't have the brains to finish them.
My graduate project (c. 1984) was the development of a very low cost CSMA/CD system and network drivers for TSC/Flex. Hardware costs of $50/node were achieved when ethernet interfaces ran around $1000. Of course 125 Kb/s wasn't much, but in those days, it was impressive. Processing was purely interrupt-driven (no DMA), and the novelty was being able to mask the network controller interrupts for the right length of time once it was determined the packet was destined for someone else (or not grin).
The development system for the latter sported a 10 MB hard disk, as opposed to the usual 8" floppy-based systems -- I had written the hard disk drivers for that system in my final undergrad year: having a working HD-based TSC/Flex system was essential to the last course I needed to graduate and it was in danger of not being available, the course cancelled, and me having to wait a semester, so I did what was necessary to make the systems that were required for the course I had to take to teach me how to make such systems so that I might graduate when I expected.
I guess times have changed.
You could've hired me.
My senior project way back in '03 was to use genetic algorithms to figure out what musical scale/mode sounded the best to people. Two scales were chosen from the pool. A Java applet generated notes in the scale based on the likelihood that a given interval would happen in popular music. Then the scales were given names like Ludwig Van Nirvana and their generated songs were pitted against each other. The listener voted on the best one, and after the entire pool was tested, the winners made sweet love (genetic algorithm style) and the losers died till they were dead. Long story short - the blues scale won.
I actually had much higher aspirations for the project before the end. I had to whittle it down to just scales because I needed something that could easily be represented as a bit string (in this case, 12 bits determining whether a given tone was part of the scale). I really wanted to generate good, listenable music based entirely on votes from live bodies. It could be done in this way, but you'd have to bring in many other aspects of music to get there (rhythm, tempo, timbre, range, and (shudder) harmony for example). You could do the exact same process with each of these separately, or combine them where practical. I would certainly be willing to provide my code to anyone who wanted to try.
octave needs a hell of a lot of work. some suggestions:
.oct functions which can read a multitude of image formats, write a multitude of image formats, display images, implement the equivalent of ginput, and provide the basic functionality of the image processing toolkit (if you pick this and do a good job, i will buy you dinner). what meagre image processing functions octave has all fork off a copy of imagemagick, which is *painfully* slow
.oct functions to read and create movies (possibly as part of #3)
/wrong/ results last time i used it). major bonus points for implementing matrix factorizations, and eigendecompositions
1) a non-sucky plotting interface (there are some packages which claim to do just this, but i can't get bloody VTK to compile, so they're basically useless)
2) an optimization engine for octave
3)
4)
all of these projects demonstrate several key skills: good c++, good matlab, and the fundamentals of engineering with existing code.
other suggestions:
5) something like mtl (matrix template library, c++ code which uses expression templates and what not to try to help the compiler produce optimized code) that doesn't suck (their lu factorization produced plain
6) fix gnu's binutils so that they can use libraries generated by VC++
7) an optimized c++ toolkit for developing digital video processing and computer vision software under linux. i envision this as a kind of directshow lite --- you'd supply standard interfaces and a set of plugins providing basic transforms (color space conversions, for example), thread pools, and a nice gui to edit processing graphs and run them
incidentally, most of these things have been on my todo list for a long time. i think i'm going to crack at least the image reading and display portion of #4 over labor day weekend.
Amusing anecdote: I was an undergrad at the University of Missouri, Rolla and bored in my Senior AI course. Well, a little bored. We seemed to be spending an inordinate amount of time studying Expert Systems, a path that I thought would yield little fruit in achieving true machine intelligence.
After one of the Expert System lectures I asked Professor Arlan DeKock whether Expert Systems didn't seem a little bit too much like more sophisticated if-then-else branching systems, perhaps with a bit of if-then-else-maybe thrown in. He considered that for a little while and asked what I'd rather be working on. I said Natural Language Processing. Perhaps something like Zork.
He said, "Well, isn't that just a slightly more sophisticated version of a compiler?" He had me a little bit, but I was willing to give it a shot. He told me I'd never finish it by the end of the semester. That sounded like a challenge, so I took him up on it.
I did a ton of research on NL parsing and imperative command processing and eventually learned a ton about linguistics, Zork, object-oriented programming and AST parsing in LISP. A fantastic adventure. (Thank you Messrs. Winston and Horn)
As to when I finished, well, believe it or not I actually had a minimal space adventure coded and tested and ready to demo for Dr. DeKock 3 minutes before it was time. Of course, my other studies took a *slight* hit. 8-)
The really crazy thing was that the good Doctor was getting into and playing the adventure. One of the puzzles in the adventure prevented you from leaving a room until you gave a can of oil to a robot. He would block your way to the exit otherwise. Rather than solving the puzzle the inteded way, the professor picked up the robot and put him in his backpack. I didn't take physics into account and my adventure let him do that. He then exited the room and the robot could do nothing. The game / adventure actually let him do that and handled it properly.
I was a little dismayed that the *user* won by doing something I hadn't expected, but I was thrilled that my system was logically processing a world that in a moderately sophisticated way.
I got an A.
Then I got some sleep.
My project was a computer engineering project. We controlled a bunch of simple devices over the web through a server that we had set up.
One thing I learned was to have backup plans and modularity. We listed somewhere between 6-8 devices that we thought might work. We ended up getting 3 of them to work.
What was nice about that was that we could still deliver those 3 devices (which showed up the project that presented right after us which picked a single device and got it to work in a similar fashion).
But we also could scale the amount of work. If things had gone better, and we'd had a little more time, we could have added another device or two. As it is, it took us the semester to get what we did working.
I'd reccomend trying to pick a similar project where you can get a basic set of features working relatively easily, but also have a bunch of other interesting features that you can bring out if you have the time for them. That way you're guaranteed a project that does something right, and the ability to challenge yourself if you need to.
Also, always make sure to have more than one method for doing each part of the project. Inevitably you figure out that something isn't going to work out the way that you thought it would. We had to start from scratch on portions of the project a couple of times. It was immensely helpful to have a solid backup plan to start working on right away.
Hope that helps.
Here's a little project that I've been meaning to do for quite a while that I think would be a nice senior project. A full implementation would be way too much work, but a simplified version could be both accessible and useful. I think this is the sort of project that, if done well, could generate enough real-world usage and interest to make a name for the author.
A while ago I noticed that most geeky homes and small businesses have something in common: Lots of computers, few of which are backed up effectively, and most of which have disk drives that are significantly larger than needed. So it occurred to me that a backup solution could make use of this spare storage to create additional copies of important, or even all files, on different disks and in different machines. Files that already exist on multiple machines need not be duplicated further, so there would be no need to bother excluding most system files from the backup system.
If that sounds at all interesting, you can read this description I wrote a while ago while thinking through the issues and just threw on my web site (very plain OOo-generated HTML, sorry).
I'll get around to building this thing eventually, but I'd love to see someone use it as a project to get it started.
Note to ACs: I usually delete AC replies without reading them. If you want to talk to me, log in.
I concluded very early on the effort required to get an A was not worth it (to me) in engineering; I had no ambition to go into academia, and that's the only place it mattered. Getting a BSc. EE degree was a high enough bar to set. (does anyone really even care about the BSc. vs. BEng? does anyone even know the difference here? case in point)
The effort required for a 'B' was much, much less - often just going to class and doing assignments on time - this let me take all the effort I would have wasted getting an A, and pour it into working at internships, my own learning, and contracts - gaining real world, resume-stuffing experience.
That said, I busted my ass on my senior project and learned a LOT about wireless and packet-level IP communications - that and all the C++ experience I learned got me a very nice job when I graduated. Later, all the experience with embedded systems (learned from hacking on my car, NOT my degree), C++ and graphics paid off in spades and let me start my own company.
The degree was very valuable though - I learned enough about fourier transforms and calculus to study and read papers that helped me a lot when setting up my company. Did it matter that I got 10/10 of the complex integrals right in that fourier transforms class? Nope. All that mattered was I knew what they were, how they could be used, and what their limitations were.
I'm sure there's lots of counter examples, but almost all of it goes to: If you're motivated, you'll (probably) succeed.
Do something that interests you on your senior project, and make sure it works at the end. Regardless of grade, you'll have made out better than most of your classmates.
..don't panic
Yuo could always try to make something that's likely to bring you some money in the long run. My senior project involves the creation and use of a particle-based defensive weapon (no, i'm not making this up). Im also currently working on getting a patent to this, so i apologize for leaving this vague. But so far, the research has allowed me to write a 60page paper on the technology as well as test data. Try it, then you won't be forced to end up like some of these other guys, complaining about their jobs.
for free wallpapers, visit Sargosis.com