How much institutions care about the contests can be a factor as well. I ended up as the only American placing in a data-mining contest once [1], which I entered as a hobby I spent a few weekends on. But a full 5 of the 12 awards went to a single German university, RWTH Aachen, which had a ton of entries, and apparently had set it up as something students would do as part of a course.
That does lead to the next-order question of why American universities don't care about such contests (if indeed they don't).
I had this discussion with one of my professors who basically said winning a CS or Math contest has little to no long term value for a student and the preparation required to win is not particularly useful.
Math departments seem more interested in competitions than CS departments, at least at places I've been. American math departments are quite interested in the Putnam competition in particular [1], which has a kind of legendary status in the field that CS competitions don't, maybe because a number of the past winners have become famous mathematicians [2]. Where I went for undergrad (but not as a math major) they even offered courses to prepare for it, and scholarships for students who did well [3].
I had a similar experience. As an undergrad I actually competed in the ACM competition but we had barely enough interest for a 3-person team. Furthermore, I only found out about the competition the year I graduated; advertising was very limited.
However, competitions like this are more focused on algorithms/math, which might not coincide with American universities' focus on software engineering. Hackathons, which do coincide, seem to be far more prevalent.
Not to say that I am even potentially capable of competing at the world level, but the exact premise the author describes happened to me. I won multiple contests at the university level, finished one spot away from going to the world finals at the region level, but after this performance got me noticed and a job at one of the listed companies, I spend no further time on the contests (granted in order to compete at the regional and/or world level again I would have had to have gone to grad school, which I had no plans of doing).
When I was actively working on improving my performance in the contests, I had to spend quite a bit of time practicing, and the practice is such a domain specific exercise that it really isn't that applicable to the real world. You are trying to optimize the following cycle: quickly read problem, identify type of problem, figure out applicable algorithm, find page in notes with that algorithm written out, try to write most concise possible code by hand, work with teammates to coordinate computer time (one computer per team!), submit, print, debug on paper, wait for feedback, if right move on, if wrong continue debugging on paper. Improving on each of these skills requires very specific practice that is often unrelated to any engineering skill. For example I saw many teams perform really badly because they couldn't manage the computer time properly. What a ridiculous skill to learn in 2013... sharing one computer between 3 people!
This just isn't that useful in the real world. In the real world you have a computer of your own, most of the things you are solving aren't algorithm problems, and you are trying to write readable and maintainable code. So basically the opportunity cost of continuing to improve in the contests was improving as a professional software engineer (IE my future profession), and the glory of potentially winning one of the programming contests just wasn't worth it to me.
What if these contests were more of an 8 hour practicum, everyone has their own machine (and each team has a meeting room with whiteboards?). At lunch you have to replace every member on your team with fresh faces who didn't watch anything you did, only get the problem description (subject to change) and any documentation you left in the code.
Probably wouldn't be as fun, but might provide slightly better signalling.
I was on an American team at the ACM world finals in 2004 and 2005 (and the top American team in 2005, which was a bad year for the US). There was very little pushing us to participate or practice, and I mostly did it because I thought the problems were more interesting than my classwork. Talking to participants from eastern Europe gave me an interesting perspective, though. It became clear that for American students, the prize was ~$10k (nice, but not a huge deal) and the cost was neglecting classwork. For an eastern-European or Chinese student, the prize was an American job. Some of those students even felt embarrassed about how hard their countries pushed these contests.
The indication that I've gotten from employers in Silicon Valley is that success in these contests is, if anything, overvalued as a signal for hiring. So the author is correct that the incentives aren't lined up to get CS students to participate in programming competitions.
I don't know whether this will be a problem for the US. It isn't right now, but you could imagine a potential future where US vs China in programming competitions becomes like chess competitions between the US and USSR during the cold war. I'm sure if that happens, the US will step up the participation incentives.
I represented a U.S. school at ICPC world finals twice (the maximum number of times). Just based on what I heard from other contestants and their classmates, it seems like the biggest contributor to the outcomes we see at finals is that some schools take this contest much more seriously than others. So a team at, for example, St. Petersburg State University may spend 20-60 hours/week practicing while a team at Stanford may spend 5-15. Both of the teams might opt to go to the summer training camp in Russia, though. My teams generally spent 5 hours/week practicing and did not attend any training camps.
While I don't think algorithmic programming contests are something inherently worthwhile, a lot of the replies here greatly understate their value. I have found that the experience provides some significant value in my work, in the form of recognizing moderately hard problems as problems I've solved in the past or just being able to write stock algorithms correctly without much thought. This might not apply to every job, though. A much more concrete benefit is that reaching even a moderate level of proficiency in algorithmic programming contests (like yellow on TopCoder maintained over a long period of time, or doing decently well at multiple ICPC regional contests) will build the same skills that are tested by most hiring processes at a higher level than the hiring processes generally test for.
> just being able to write stock algorithms correctly without much thought
Outside of a job interview, I don't see why this would be a good idea. If you need a stock algorithm and your environment has a stock implementation, why on earth would you roll your own umpteen zillionth implementation?
Sometimes you have an embedded problem or some weird feature of the problem domain that favours a non-stock algorithm. But that surely suggests only knowing algos to the depth required to pass Algorithms 202 ("this is an odd case, I'll look up the alternatives"), not having muscle memory that can instantly spray plain mergesorts into a text editor.
When it comes to providing stock algorithms, most environments are woefully inadequate. I have not yet encountered an environment with a usable maximum_bipartite_matching(), ternary_search(), or bfs(). To be usable, it would need to be easier to convert my problem instance into the types accepted by the library function than to write the code that does the right thing on my types. STL's next_permutation() is the only next_permutation() in any environment I am familiar with, and it does a great job. I believe I've also encountered one stock implementation of binary search that is useful for the case of "binary searching on the answer" (rather than just binary searching in an array), but this isn't a big deal because it saves you maybe 3 LOC.
You and I have different concepts of stock. I'd be amazed if 80% of what's required in practice isn't all boiling down to search & sort. They're baked into damn near everything, either explicitly or by indirect usage.
I don't really know or care which exact elaboration of quicksort that my database engine is using. I'd be unsurprised if there aren't a few that it chooses amongst at plan time. I just say ORDER BY and get on with the rest of my work.
Alternatively I could pull the unordered set and write my own sort. And I'd hope to be committed to an institution for the criminally wasteful for such an act.
The problem with reasoning like this is the implicit assumption that getting better at X does not carry over into performing Y. I promise you, if you memorized the top 100 computer algorithms by heart, you would absolutely come out a better programmer. Why? Memorizing computer science algorithms is not like memorizing a random string of numbers. Each unit is connected to other units which strengthen your recall and understanding of completely unrelated algorithms and concepts. Our brains organize information in a hierarchical fashion, and when we learn some algorithm we are strengthening our recall and understanding (connections to other concepts) of the basic building blocks of the algorithms. So, for example, while you may never need to roll your own quicksort, the concept of partitioning a set of items based on a pivot is a fundamental concept that will be re-enforced in the process.
Many of the US students are in the Product Management Contest that occurs at the same time.
You win programming contests by making computers perform better. That's hard. You win product management contests by making humans perform worse. That's easier. Doesn't conflict with the drinking schedule.
God forbid a college devote time and energy on an academic pursuit, instead of say, an athletic one (I know, off-topic, but just an analogy).
Personally, I've found many benefits to competing (or even practicing for) programming contests. Not least of which is personal enjoyment and mental exercise.
waste? Programming contests are pretty useful for working on your problem solving skills (algorithmic stuff, figuring out the "simplest" way to solve a problem).
I represented UT Austin twice for the world finals. I was really blown away by the amount of practice the Eastern European and Chinese students had (biweekly intra/inter school contests and regular coaching/TopCoder sessions). Even most top American schools (Stanford, CMU) had Asian grad students (they allow 1st year grad students in ICPC) and even those schools did not manage a top 10 ranking.
We won at the state level and, as a team, decided that we found it intensely boring and weren't going to pursue it any further and gave up our spot.
We are paying real money to have access to bright teaching staff and be able to take classes. I couldn't justify spending more time practicing for contests.
I've done ICPC for the past two years, and will probably get dragged into it this year (small CS program at my school). We don't practice, and usually end up in the top third regionally. Not great. But it's just not worth my time. I get enough algorithms in my coursework, I get enough stress and team action at my job at a startup, I don't care about trophies and the other prizes are weak...why bother?
I might be interested in, say, a 12-hour Rails contest to see who makes the best website in a day. That's actually building things--solving real problems. But that's of course not realistic for most CS students.
I competed in the acm. It was a complete waste of time. The teams that smashed us had memorized, line for line, C implementations of obscure algorithms that solve specific problems you'll likely never need in building a product. Or if you need the algorithm, you'll look it up and use a library.
Look at the solutions of problems from the top 10. I wouldn't hire any of those people.
23 comments
[ 0.19 ms ] story [ 54.6 ms ] threadThat does lead to the next-order question of why American universities don't care about such contests (if indeed they don't).
[1] The 2009 UC San Diego data-mining competition, which seems to have disappeared from the web, but is archived at http://web.archive.org/web/20101124175648/http://mill.ucsd.e...
[1] http://math.scu.edu/putnam/index.html
[2] https://en.wikipedia.org/wiki/William_Lowell_Putnam_Mathemat...
[3] http://www.math.hmc.edu/putnam/
However, competitions like this are more focused on algorithms/math, which might not coincide with American universities' focus on software engineering. Hackathons, which do coincide, seem to be far more prevalent.
When I was actively working on improving my performance in the contests, I had to spend quite a bit of time practicing, and the practice is such a domain specific exercise that it really isn't that applicable to the real world. You are trying to optimize the following cycle: quickly read problem, identify type of problem, figure out applicable algorithm, find page in notes with that algorithm written out, try to write most concise possible code by hand, work with teammates to coordinate computer time (one computer per team!), submit, print, debug on paper, wait for feedback, if right move on, if wrong continue debugging on paper. Improving on each of these skills requires very specific practice that is often unrelated to any engineering skill. For example I saw many teams perform really badly because they couldn't manage the computer time properly. What a ridiculous skill to learn in 2013... sharing one computer between 3 people!
This just isn't that useful in the real world. In the real world you have a computer of your own, most of the things you are solving aren't algorithm problems, and you are trying to write readable and maintainable code. So basically the opportunity cost of continuing to improve in the contests was improving as a professional software engineer (IE my future profession), and the glory of potentially winning one of the programming contests just wasn't worth it to me.
What if these contests were more of an 8 hour practicum, everyone has their own machine (and each team has a meeting room with whiteboards?). At lunch you have to replace every member on your team with fresh faces who didn't watch anything you did, only get the problem description (subject to change) and any documentation you left in the code.
Probably wouldn't be as fun, but might provide slightly better signalling.
The indication that I've gotten from employers in Silicon Valley is that success in these contests is, if anything, overvalued as a signal for hiring. So the author is correct that the incentives aren't lined up to get CS students to participate in programming competitions.
I don't know whether this will be a problem for the US. It isn't right now, but you could imagine a potential future where US vs China in programming competitions becomes like chess competitions between the US and USSR during the cold war. I'm sure if that happens, the US will step up the participation incentives.
While I don't think algorithmic programming contests are something inherently worthwhile, a lot of the replies here greatly understate their value. I have found that the experience provides some significant value in my work, in the form of recognizing moderately hard problems as problems I've solved in the past or just being able to write stock algorithms correctly without much thought. This might not apply to every job, though. A much more concrete benefit is that reaching even a moderate level of proficiency in algorithmic programming contests (like yellow on TopCoder maintained over a long period of time, or doing decently well at multiple ICPC regional contests) will build the same skills that are tested by most hiring processes at a higher level than the hiring processes generally test for.
Outside of a job interview, I don't see why this would be a good idea. If you need a stock algorithm and your environment has a stock implementation, why on earth would you roll your own umpteen zillionth implementation?
Sometimes you have an embedded problem or some weird feature of the problem domain that favours a non-stock algorithm. But that surely suggests only knowing algos to the depth required to pass Algorithms 202 ("this is an odd case, I'll look up the alternatives"), not having muscle memory that can instantly spray plain mergesorts into a text editor.
When it comes to providing stock algorithms, most environments are woefully inadequate. I have not yet encountered an environment with a usable maximum_bipartite_matching(), ternary_search(), or bfs(). To be usable, it would need to be easier to convert my problem instance into the types accepted by the library function than to write the code that does the right thing on my types. STL's next_permutation() is the only next_permutation() in any environment I am familiar with, and it does a great job. I believe I've also encountered one stock implementation of binary search that is useful for the case of "binary searching on the answer" (rather than just binary searching in an array), but this isn't a big deal because it saves you maybe 3 LOC.
I don't really know or care which exact elaboration of quicksort that my database engine is using. I'd be unsurprised if there aren't a few that it chooses amongst at plan time. I just say ORDER BY and get on with the rest of my work.
Alternatively I could pull the unordered set and write my own sort. And I'd hope to be committed to an institution for the criminally wasteful for such an act.
You win programming contests by making computers perform better. That's hard. You win product management contests by making humans perform worse. That's easier. Doesn't conflict with the drinking schedule.
Personally, I've found many benefits to competing (or even practicing for) programming contests. Not least of which is personal enjoyment and mental exercise.
We are paying real money to have access to bright teaching staff and be able to take classes. I couldn't justify spending more time practicing for contests.
I might be interested in, say, a 12-hour Rails contest to see who makes the best website in a day. That's actually building things--solving real problems. But that's of course not realistic for most CS students.
Look at the solutions of problems from the top 10. I wouldn't hire any of those people.
Something more like the netflix contest is more interesting and long-term sustained. Allows you to think better.
Which all isn't to say that studying algorithms is bad. It's not. But I don't want to be tested on speed-algorithming.
/me shrug