Try Competitive Programming out!
International Collegiate Programming Contest (ICPC) is a competition where teams of students try to solve hard problems that involve algorithms and data structures. After being myself a (terrible) contestant, I have my own opinion about what ICPC can give to a student.
In this post, I will talk about what I think is good about ICPC and some possible drawbacks.
This is the core activity an ICPC contestant makes. You need to train a lot to classify to a higher instance of the competition (eg: a Regional or a World Final). So the first benefit is this one, you get used to work a lot.
But the benefits are not limited to the amount of training. The training way is the main feature a contestant can develop.
Great contestants (not me, although I luckily know a bunch of them) spend entire days solving a lot of challenging problems.
It's not just learning binary search, it's solving a lot of problems using binary search. I have never seen a better preparation.
By the way, you can solve a lot of awesome problems using Binary Search. I could write a post about it in the future but there is a lot of great material all over the internet.
Think about how many times you, or some of your peers, read about something and right after finish claim to have learned something new. You haven't learned anything until you can apply it to solve several problems. You need to aim to become that new thing in something natural for you.
That's what a good ICPC contestant does.
In ICPC you have two teammates and all of you need to share a single PC. Contest last about 4-5 hrs that are rarely enough. A good team is not just the sum of the individual value of the three members. Teamwork and partnership can play an important role.
So you don't only train yourself, you need to make training sessions with the rest of the team, sharing a single PC. You need to explain to others your reasoning and debate with them your solutions.
Here the only issue is that you get used to communicate with people that think pretty much like you. Then, when you need to talk to someone that is not a contestant about your work, it can be tricky.
But the important thing here is that you get used to share resources and respect the work of your peers.
In our society, this skill is priceless.
What about real life?
Problems you solve in ICPC are well-posed and you know that a bunch of people has solved it. If you become a researcher tomorrow you'll find real life is far different.
You only make little console applications, only use C++ because is faster, don't use AI, nor ML, nor Design Patterns. If you've only coded ICPC problems you are a terrible developer right now. You don't have the most important skills a regular company is looking for.
There are a lot of choices out there to sharp whatever skill you want. You can dedicate part of your time to learn Object-Oriented Programming or ML. You can contribute to an Open Source project and do some research. It would be a shame you only make one activity. If you have good possibilities to achieve awesome results in ICPC, train a lot. But you also can train a little bit and make other activities with the rest of your time.
I see ICPC training as a way to shape your learning process. But the great thing about it is that you actually learn a lot of awesome techniques by training! And you really learn them, you won't forget them tomorrow (if you did it right).
When a contestant poorly performs a real-life task, that's on the contestant, not on the contest. Training competitive programming doesn't erase the rest of your capabilities, but taking care of them is up to you.
I know World Finals competitors that are good in other activities like AI. They spent months training a lot, they were pros. Now they are a great choice for any company or research department.
I have heard a lot of different opinions about the about Competitive Programming. I really don't think that activity harms you in any way.
Yes, you need to be aware that the outside world is different. Is up to you to stay tuned with real life.
Being a contestant allowed me to know very talented people (that's another benefit!). I don't know if I would like to have trained harder, but I'm sure I'm better because of my training.
Of course, I recommend you to try competitive programming out. If you are a University student you can even get involved in ICPC competitions. But you can always try to solve one or two competitive programming problems each week. I assure you it doesn't hurt.
Feel free to leave your comment with any impression, doubt, or suggestion. You can follow me on Twitter for more talks about related topics.