Project Ideas for a Master’s in Software Engineering?

I’m enjoying the A/C and faster-than-South-African Internet access here at Makerere University in Kampala, Uganda. I’m would like to ask for help from the readers of this Weblog in coming up with a set of projects that will lead a master’s in Software Engineering student through all of the relevant theory and practice.

The goal is to design a program that addresses the problems identified in http://philip.greenspun.com/teaching/undergrad-cs , a notable excerpt from which is the following:

All student work should have the character of an engineering project: client talks about a problem; student team prepares a written plan for solving the problem; student team discusses the plan with the client; student team builds a prototype; student team tests the prototype with the client and users; student team refines the prototype in response to the testing; student team documents its results. Everything in a standard engineering curriculum can be taught with this process. For example, students building a flight simulation game might need to refer to a Physics textbook and do some practice Physics problems in order to learn enough to build their prototype. This makes it a bit tough for the faculty, who need to be clever enough to weave such courses as Physics, Calculus, and Biology into engineering projects. The payoff is that by the time the student graduates he or she will be completely comfortable with the engineering process of listen, design, discuss, implement, test, refine, and write up.

I’ve come up with some project ideas but would like to get more from other folks. Here are some as a starting point for discussion:

  1. Set up server, RDBMS, and HTTP server
  2. Build Web-interface/database-backed personal information manager (like MSFT Outlook) for a businesswoman, providing more limited access to her husband, children, secretary, including capabilities such as spamming a subset of the contacts to invite to a party (touches on data modeling, security, human-computer interaction and interface design)
  3. Collaboration environment for computer science literature, where a paper can be represented locally as a PDF or HTML in the database. Build full-text index of papers in the database. Support registration of multiple users and discussion of each paper. Add a way to mark up or annotate or discuss specific paragraphs (hard for PDF, maybe not too tough for HTML). Example of completed student project in this area: http://philip.greenspun.com/seia/gallery/spring2002/chip/ (touches on full-text indexing for first time)
  4. Web site for a department or a research group within the university. http://philip.greenspun.com/seia/gallery/spring2002/cwnonline/ (touches on collaborative content management)
  5. Web site for uploaded geo-coded photos and videos, mostly from mobile phone cameras, a bit similar to http://philip.greenspun.com/seia/gallery/spring2000/poa/ but with phone browser, MMS interfaces in addition to standard Web interface. Also integrate with Google Maps and other services to enable browsing by location.
  6. Web site for a small local business that also wants to be able to serve customers via Web/mail. (touches on ecommerce for the first time; security becomes a more serious concern if credit card numbers are processed).

Some additional smaller projects that don’t require an external client:

  1. Build own simple HTTP server (maybe in Java, which eliminates the need to implement threads), implementing CGI but not username/password authentication. Also leave out advanced features such as keep-alive. This is an assignment that students at other schools are generally able to do within 10-20 hours, but if we insist on strict implementation of the HTTP standard, it could take a full week.
  2. Build a load tester for Web sites that they can then use on their own servers. This should be built in Perl, Ruby, or some other scripting language with powerful libraries for requesting Web pages. The load tester should be capable of fetching SSL-encrypted pages and also following links that require filling out forms (so that it can simulate a user accomplishing a task). This should be a one-week project (full time).

Thoughts?

13 thoughts on “Project Ideas for a Master’s in Software Engineering?

  1. I like the idea of the smaller projects, it’s good to know the details of a commonly used protocol. HTTP is a good one, simple enough to begin with but with plenty of advanced features (and interoperability issues) to keep a student interested. HTTP is about the only thing (aside from SMTP) that is allowed outside of corporate firewalls these days, so it is the way to go to tunnel traffic.

    There are a few companies now (Copilot, Go2MyPC) that are sending VNC across the web using HTTP for desktop sharing. A very rudimentary version of this could be fun to write as a bigger project. It’s been done, but it is really good experience (client side development plus lots of HTTP knowledge necessary to traverse through the firewalls). Plus, it’s something you could show to friends and family and actually have them understand what you are doing. 🙂

    What about a mechanism to intelligently tag pictures for Flickr? If you take pictures of the same things frequently (my dogs, sailing, etc.), could you come up with something that could learn enough to start suggesting tags? Or, from another angle, could you take a facial recognition algorithm and write something that could tag pics for you? If it saw a face it didn’t recognize, it would ask you who it was. This could be an interesting application of an advanced algorithm to a service that is used every day (Flickr).

  2. I think it would also be helpful for students to “inherit” a really poorly built system and have to add some new features to it. The client will be on a tight schedule and doesn’t have much money. That will teach one of the most important lessons: “most of the stuff you’ll learn here is not practiced by others”.

    -Dave

  3. I think it would be very useful to learn the skills required to specify requirements clearly – as per the failings that you mention of CS students in communicating their ideas. Even if the student never takes the fairly typical path of progressing from developer to team leader to project manager (“rising to the level of one’s incompetence”), it gives valuable insight. I am thinking of something like the role of the Bid Requester on RentACoder. It’s actually reasonably difficult to write an unambiguous specification and list of deliverables for something that isn’t trivial if you expect what you were hoping for to be delivered at the end. Of course, rather than paying someone in India to do the implementation you could get another student to do it. Complete the circle by having them start by building the RentACoder equivalent bidding system in the first place.

    I think real world data modeling is something that is often poorly taught. It’s all very well modeling a library with books with authors because it fits a RDBMS in normal form; people “get” that when it’s used as a teaching case. But in the real world, for instance, where the big bucks are (i.e. in investment banking), coming up with a schema to handle a variety of financial instruments, all with varying attributes, and the cash flows associated with them is much more involved. The CS students that I’ve hired might be able to manage it and it works okay with your typical CS-sized dataset of a hundred of these and a thousand of those, but when you’ve 100,000 trades each generating several daily cashflows in several currencies and you need to calculate a cash position for a given day, it all goes to hell.

    In more general terms, get them to work with some less than perfectly structured data; things with duplicates where you wouldn’t expect them, things where 99.999% of the time there is a one to one relationship but 0.001% it’s one to many and so on. And when they test it out make them do it with real-world sized data, not just a handful of rows where it doesn’t matter if you’ve got full table scans coming out of your ears.

  4. I’m puzzled by what you mean in this part of your post:

    Build own simple HTTP server (maybe in Java, which eliminates the need to implement threads)

    Threads are part of any OS these days – there’s no need to implement them. Did you mean to say that threads are somehow easier to use in Java than in other languages?

  5. Wade: I shouldn’t have said “implement” but rather “choose a thread library”. I guess I’m not enough of a C/Unix/Windows expert, but my understanding is that there is not a completely obvious standard way to do threads from C (though maybe if you said C/POSIX it would work on Linux, Solaris, and Windows?). In Java, though, the threading code is the same regardless of the OS or whether it is running inside a Web browser even, no?

  6. A general advise. The students should be discouraged from writing things from scratch. Tools are available and the first step of the process, after discussing requirements with the client, is to find out which tools to use. This would rule out your small examples.

    What should be important in the advent of Web 2.0 to also think out of boundaries and use existing webservices to do part of the work, if they provide a decent API. Why not develop a GTD enhancement to Outlook which helps you track your projects, including family in basecamp. Obviously you should not state these things when coming up for the request for the businesswoman, but this should be the general direction.

    Or provide a framework for communication between the various students projects, e.g if one is building some PM software, the other is building some enhancements to SQLLedger to make it useful in Uganda, the third set enhances a CRM system by the tools necessary to effectively communicate with people and so on. So one group of students would deal with providing the framework to stitch it all together so you have a general solution for an SME operating in Uganda. This includes Accounting, CRM, PM, Fullfillment and HR (and whatever else you want). General idea though: Do not write it on your own, use what is there and ammend it to the situation at hand.

  7. Ah, java. Write once, debug everywhere. It’s true, the Java programmer doesn’t have to think about the threading. And the virtual machine takes care of integrating the program with the local OS. But java’s the language most often abused by recent grads with little real world experience. You want horror? Try inheriting someone else’s java code. Although I had a similar work experience with ruby/rails. So perhaps java is being tossed aside for the newcomer…

    Reading your post made me realize I’ve drunk a little too much kool-aid at my new job to be really helpful to your questions. But, yes, I agree with your commenters on spec writing and real world data sets being imperative to achieving “master” level of software engineering. IMO, of course.

  8. Actually implementing a simple version preemptive multithreading, mutexes, etc would be a good project. It should be done on a simple microcontroller board of some time. They should write all the code, down to the bare hardware, in C and assembler. By the end they might actually have some clue as to how computers actually work, unlike most c.s. grad these days.

  9. I agree with the post about having your student’s develop a specification and present/refine with management. Your simulated management team could consist of yourself and/or other professors/TAs or some volunteers. I’d be glad to do it. At least one volunteer needs to play the role of the boneheaded upper management guy. Your students pass with flying colors when they can explain the how and why of the project (including how it integrates with existing systems/initiatives/business processes) without relying on any technical language.

    Seriously, unless your students want to compete with $5/hr developers in another hemisphere then why even bother giving them super technical projects like “build a web server.” You need to teach them how to differentiate and lead.

    Maybe that’s not what you do in a CS course – I don’t know – never took one.

  10. Philg: POSIX Threads (PThreads) are available on all popular Unix derived platforms, and there is a large subset of PThreads (Pthreads-32) available for Windows. Directly from C or C++ you can create, synchronize, and destroy threads with one standard API.

    The Java APIs for using threads are the same regardless of platform too, and they certainly provide at least as much portability.

  11. The trick with building an HTTP stress-tester is, it has to scale better than the server. This might be difficult for student with access to only one machine.
    Also, there are good stress testers out there (Siege) which one could use instead of writing one from scratch.

Comments are closed.