Last Saturday I attended my first programming competition. It was the ACM Mid-Atlantic regional competition held at Duke. It went terribly.
Toward the beginning of the semester, the president of my local ACM chapter mentioned the then upcoming completion and asked if anyone was interested. Seeing this as another opportunity to hone my algorithm writing skills I put my name down on a list at started thinking of potential teammates.
I suppose it was natural to choose two friends from my classes that I had worked with quite a bit over the past several semesters. I knew “Bob” and “Sue” were both smart, hard working, and pretty good at coding. Sounds good enough, right? Wrong.
First of all, we didn’t practice. Not even one time. Shortly after getting approval from the department we had a regional ‘qualifier’ to test our skills. The day of the qualifier “Bob” says he wont’ be to make it and “Sue” is going to be late if she comes at all. So, I spent two and a half hours working my hardest and knocked out two problems by myself. To my surprise, I couldn’t even figure out how to start any of the remaining problems. Time to reassess things, right? Also wrong.
Bolstered with false-confidence after knocking out two problems solo, I told myself, “Well, even if we can’t find time to practice I should be able to get some problems at the real competition by myself.” Wrong, wrong, wrong.
The problems competitors are given require a wide set of skills and the ability assess difficult issues, design algorithms to solve them, implement them quickly, and account for huge data sets and odd edge cases. I love “Bob” and “Sue”; however, we all have very similar skill sets. As such, we weren’t the best choice for a strong, versatile team even if we had practiced. Not practicing just made things much, much worse.
Facing eight problems to solve, with one computer, and a time crunch was like riding the Titanic down after the life boats had already departed. To be completely honest, we worked poorly together, got stumped on simple stuff, and spent entirely too much time on all of the wrong things. After five hours of bashing our heads against desks and a whiteboard we walked out to greet the other teams with our heads hung low. Normally, this would be enough for someone to vow never to enter a similar competition, right? Still wrong.
I will be back for round two next year. I will also go better prepared. Many mistakes were made and many lessons learned.
First, a well rounded team is a must. Ideally, I would like my team to consist of: A very strong, experienced programmer, a master of data structures and well known algorithms, and a math-lover. Second, practicing problems that are similar to what is to be expected is vital. I don’t think this is because we will ‘learn’ solutions but rather, we will learn how to tackle problems together. Finally, I will not be blinded by false confidence or delusions of how easy, or difficult, the problems will be.
I can’t lie, the results of the competition have been hard to swallow. Failing is not something I do very often. But, I have come out of everything with a renewed passion for knowledge and a better student.
“We learn from failure, not from success!” – Bram Stoker, Dracula.