Tuesday, October 27, 2009

Computer Science at the University of Utah: a look back at team software projects

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.

Monday, October 5, 2009

IronPython Texas Holdem Poker Spreadsheet and other .NET Poker applications

Earlier this year I created a Monte Carlo Texas Holdem Simulator using an IronPython powered spreadsheet in Resolver One. The main goals were to learn IronPython, test how well it worked for creating complex spreadsheets, and enter a few of those spreadsheets into the Resolver One competition. Well I can honestly say that I exceeded even my own expectations on all three accounts, and it didn’t stop there either. After learning IronPython I started using it for the occasional random “Hey could you ...” tasks that get assigned to me at work, and I found a few other interesting uses for Resolver One as well.
I also found that I really like coding contests! After the Resolver One competition ended, I came across another .NET coding contest sponsored by the International .NET Association (INETA) that was trying to promote reusable components from various vendors. I submitted Windows Form and Windows Mobile versions of the Texas Holdem hand evaluator, along with a short video clearly showing why my younger brother is a professional radio DJ and I am not :-P I didn’t have enough time to get everything that I wanted to into the new versions, but it was still enough to get an honorable mention and score a few free licenses for .NET components from the sponsors.
Shortly after the INETA contest, I found a Silverlight contest sponsored by Telerik. Since I learned IronPython in the Resolver One contest I figured that this was a great excuse to spend a week or two learning Silverlight, WPF, and XAML. While I didn’t end up winning the contest, I did get a license for their Silverlight controls and was able to create a pretty cool Silverlight 3.0 Texas Holdem Monte Carlo simulator that runs entirely in the browser. I also organized all the source code and various versions of the application into one website for all your Poker needs.
I have had a few people ask about how to modify the poker spreadsheet for different purposes, such as analyzing the outcome for specific hand groups or being able to include multiple hands in the player’s pocket card set. The original spreadsheet was designed to show the hands in a specific layout so it is not very easy to customize. Instead I made a new spreadsheet that uses a standard column layout and lets you enter hands using the Hand Query language that is integrated into the C# HandEvaluator library. This new spreadsheet lets you customize the opponent hands and allows you to define multiple hands for the player (ie: What would my odds be if I had AK offsuit or AQ offsuit?). It also lets you specify the number of trials to run for each Monte Carlo simulation and is smart enough to enumerate the cards if you specify more trials than it would take to go through all possible board cards.
Texas Holdem Spreadsheet
If you want to try out the new poker spreadsheet you can download it from the Resolver Exchange. The free player license for Resolver One will let you open and run the spreadsheet, but you will need a commercial license or research license if you want to make any changes to the code. I would like to add multi-threading and a hand win type breakdown table, but there is another coding contest deadline coming up, so I have to work on another project for a little while :-P