Joel Spolsky wrote a piece today about Capstone projects and time management for Computer Science students and the new UCOSP program to help get undergraduates more involved in open source projects. While I completely agree with the inefficiency of long term deadlines and the UCOSP program sounds great, I feel like I need to write a bit to defend my recently acquired bachelors degree from a top 50 ranked university. About 18 months ago I graduated from the University of Utah with a degree in Computer Engineering (CE), which is basically a combination of Computer Science (CS) and Electrical Engineering (EE). It took 6 years to complete (also worked part time), and during that time I was exposed to many different programming languages (Scheme, Java, C, C++, C#, SQL) and a diverse array of subjects ranging from Survey of Jazz and the History Rock and Roll to Discrete Mathematics and, yes, Linear Algebra. While not all of the coursework was directly related to real-world work conditions I firmly believe that the mix of theory and practice made me well prepared to work in software development anywhere from embedded systems to “cloud computing”.
While other universities may not emphasize team programming, many of the CS faculty at the University of Utah tried to simulate real-world situations as often as possible. The Team Software Engineering class that I took from Robert Kessler in spring 2006 was my first experience solving a non-trivial problem using Visual Studio 2005 and Team Foundation Server. In that class teams used source control and project tracking to design and create a location aware communication library for PDAs, laptops and desktops using WiFi and IP network rule-based location detection. I also learned a lot about MSDN, web services, the software development process, and systems integration, and it was probably one of my favorite classes. The courses have changed a lot since I took them, but it is my understanding that the concept of building software in teams using real tools is still very much a part of getting a CS or CE degree at the University of Utah.
When it came time to complete my degree I had the option to do a theses or a personal project, but like most students I ended up doing a team based capstone project in cooperation with industry sponsors instead. CS students take a semester long Software Engineering Laboratory class in which they submit bids for projects sponsored by local companies. For the CE capstone experience students can team up with EE students to be part of the Engineering Clinic Program. Both projects start with a semester long class dedicated to project planning with a faculty advisor and improving professional written and verbal communication skills by working with the CLEAR group from the College of Humanities. The Engineering Clinic then has a team of 4-6 students spend a full 2 semesters working with an industry sponsor to solve a real world problem using real world tools. The project culminates in a 15 minute presentation for each student at the ECE Open house and a team written paper to be submitted to the IEEE student paper contest. The team that I worked with had a Google Code project site and even ended up presenting at the 2008 Flash Memory Conference in Santa Clara, CA.
The CS department also has an Industry Forum class that is “designed to expose students to topics that are not discussed in depth as part of the normal curriculum, but that are likely to be important after they graduate.” Each week they bring in speakers from software development companies or large industry players to help prepare graduates for the real world. They also have the Organick Lecture Series and various Colloquiums that bring in distinguished members of the computer science community. While these classes and events are not part of the normal curriculum, most ambitious students will recognize their value and attend as many as they can.
To summarize, during my 6 years at the U of U I can think of at least 4 significant team based projects that helped introduce me to standard software development techniques such as system design, source control, project management, team collaboration, and end user documentation. Some classes such as team software engineering or database systems provided the infrastructure for students to use (IE.. TFS, SVN, Oracle, Wiki, File server, Virtual Machines, etc) but others took a DIY approach and let students choose which technologies they wanted to use. I gravitated towards DotNetNuke, SVN, and Google Code, but I would have jumped at the chance to use hosted products like FogBugz if cost and implementation were not prohibitive. Also there was a very large emphasis placed on written and verbal communication skills, for which I will be eternally grateful! The more time and energy that you put into the education, the more you are likely to get out of it, but at the University of Utah there is ample opportunity to get a world class Computer Science education.