Experience from the ACM-ICPC journey

The past 5 years of my life I have been involved in many algorithms and problem solving contests, mostly the ACM-ICPC. In this post I'm trying to summarize my accumulated personal experience while living in this community, while learning from it, contributing to it and having fun being in it. This article is just trying to document the "good-bye" speech I gave at the German university in Cairo after ACM-ACPC 2014. I have tried to make this article as abstract as possible to be helpful for more people. However, there is a section at the end talking about the background of the community, and a background about myself, in order to be able to relate to some of the context mentioned in the rest of the article.

Attitudes to deal with things

  1. Realizing and questioning stupid limiting beliefs: Usually people have many limiting beliefs, that are mostly irrational, unjustified and/or stupid. For example, some of the beliefs that I had at some point in time:

    • " I'm not competitive enough to compete in a field like programming. "
    • " My brain is not fit enough to learn a new language. "
    • " I'm an anti-social guy, and my interests are so limited that they will make me remain the same way. "

    Such beliefs were mostly irrational, mainly because I have never really put the suitable amount of effort in any of them, furthermore the environment I grew in didn't develop any skills related to these stuff. The only effect I had from such beliefs was demotivation to pursue any of those things. One must be aware of such beliefs first (sometimes they are more subconscious) and then question their validity. For me I managed to prove many of such beliefs false.

  2. Competitive and challenging attitude: Considering most of the events in life are some sort of a challenge or a competition, gave me too much motivation to do many activities in life, even those that were so unfamiliar. It also gave the motivation to be good at them and to compete with others who are already good at it; furthermore, it gave me the courage to start doing new things, totally unfamiliar activities. There are more different perspectives regarding this in the remainder of the article.

  3. Having courage to make mistakes and fail: Learning something new always involves making mistakes, and failing, maybe really hard. Not having the courage to make mistakes and fail in learning something new, will demotivate one so much to actually try learning anything. Without this courage, there is a huge waste of time, effort and energy for no use whatsoever. However, having the courage to take a challenge even if one knows for sure that (s)he is going to fail will make one have a much challenging attitude, which will at least boost the efficiency of the learning process. Furthermore, taking such failing challenges can sometimes contribute in some unexpected ways, such as:

    • Failing a challenge gives one enough experience to be able to prepare for a preceding similar challenge much better.
    • The example I have in mind here, is my first participation in the ACM-ECPC national contest. I strongly believe that I would have never won my second national contest without the experience and the familiarity I gained during my first participation in the ACM-ECPC, even though the performance of my team was bad at this contest, but it made me much more familiar with the environment of the contest.
    • Just showing up presents some unexpected more suitable opportunities. For example:
    • Few weeks ago in Freiburg, I went to an audition to join an orchestra, that I knew I wasn't competitive at all to join, especially in a country of musicians like Germany. I went to the audition, and before the audition there were 2 girls practicing violin for the same audition; when I heard them I felt so much like a newbie, it was so hard to take, and I considered to leave actually, then I decided to remain and fail, in order not to break my code in taking challenges. After taking the decision, I became less nervous, and I went to play, and I was indeed rejected. However while I was leaving I met a guy who told me about another audition for another orchestra the next day, when I went, a similar scenario happened, however I was almost not nervous at all this time, I knew that my purpose that day was to fail and to be entertained while doing so; that day I played better, nevertheless I was indeed rejected for a second time. The opportunity presented after that, was a recommendation for another third basic orchestra that actually didn't need auditions, which is a much more suitable opportunity for me with my skills at that moment.
    • Actually it might not be a failing challenge, and the belief that it's a failing one is just a limiting belief. For example:
    • After few months of joining the ACM community and getting some introductory sessions, there was camp that needed at most 8 members from each university, and they were filtered by a contest. I joined this contest, and solved in the contest much better than expected, that I ranked the 9th. My unexpected performance this day motivated my coach back then to try and make me join the camp, and I indeed joined.

    'Anyone who has never made a mistake has never tried anything new.'Albert Einstein

  4. Altering and breaking habits and lifestyle: Having the flexibility to change your lifestyle and breaking some daily habits is sometimes necessary to learn something new, for example if you are practicing for the ACM-ICPC or a new instrument, one needs almost a daily practice; a weekly practice won't be enough to improve in such activities even if it was for a long day. One must break the usual lifestyle and dedicate an almost daily time to practice, because these activities need a lot of exposure and dedication in order for the brain to absorb and integrate the knowledge, without that it's just something that happens occasionally and no real improvement will appear.

  5. Avoid making excuses: One of the common attitudes is making excuses when things don't work out as planned, usually by blaming some external factors. For example, hypothetically (it's not entirely hypothetical), in one of the ACM-ICPC contests, if the problem set wasn't of good quality, that it failed to efficiently distinguish the competitiveness of the teams; and there is a team that made worse than what it expected, then this team will say they didn't do as good as expected because the problem-set wasn't of good quality; this is a good example to demonstrate making an excuse (namely, a problem set of bad quality), this is just an invalid reason to escape from the true and harsher reason, that this team wasn't actually competitive enough to win, because there's another team that won under the same circumstances. The moral here is, avoid making excuses, and try the least to blame the external environment, because probably it is just a delusion from the fact you didn't do it right, which will limit the room for improvement. And if the environment is indeed bad, then one needs to adapt to it; don't worry, it is one of the things that humans are very good at.

  6. Dedication (vs. Talent): I still recall the first question I asked my coach Abdallah, How I can improve at problem solving, and his reply:

    'I hope I knew a faster way than practice. Practice, practice, practice!'Abdallah Elguindy

    In my experience, practice with dedication makes perfect at almost everything. At a moment in time, there were many things (like learning languages, social skills and music) that I thought that, either one has the talent for them or not, and they cannot be learned (one either knows them naturally or not). I could have never been more wrong; I learned a lot of those things, it was mainly a matter of practice and guidance. Talent can help in learning and make it faster, however practice with dedication is true key for improvement.

    'Genius is 1% talent and 99% percent hard work...'Albert Einstein

  7. Self-dependence: The role of a mentor or a coach is just directing and guiding the practice in the right path, however it is one's responsibility to practice and improve. It happens a lot that people try to depend so much on their mentors to learn, but learning will never happen if one doesn't get his hands dirty. Read, learn and practice on your own, and if there is a mentor it would be better to guide you how to practice and learn, nevertheless it's only that.

    'I'm trying to free your mind, Neo. But I can only show you the door. You're the one that has to walk through it.'Morpheus

Learning

'If you keep on doing what you've always done, you'll keep on getting what you've always got.'W. L. Bateman

If one doesn't get challenged, then there is nothing new that is learnt. Learning simply happens when one faces an unfamiliar challenge, then one needs to get out of the comfort zone and push their limits by doing something new to solve the challenge. However, the limits must be pushed gradually, so trying to face a really big challenge won't be efficient for learning, because the knowledge will be very hard to grasp, and it might as well mess with the psychology of the person in a way that might make him give up on learning altogether.

The pattern I noticed during practice, is that, one keeps practicing without feeling any knowledge that is really gained (except for the very specific knowledge for the attempted exercises); one wonders during that, thinking they are stupid because they are still not feeling the improvement. I remember during an intensive practice I had few years ago, I used to question if I'm really stupid, I asked one a more experienced person who I believed that he became so good recently, Islam, and his reply was that he used to ask our coach Abdallah the exact same question, and his reply was that this a totally normal phase, and it will pass by more practice. Later on, I figured a more consistent pattern, is that one practices for a while without feeling so much improvement (wondering their stupidity during this phase), and then one realizes a good amount of accumulated knowledge, and a developed intuition for all the tools and tricks used. Using this intuition, one can manipulate the tools learned and even invent new ones, which provides knowledge to solve a bigger class of problems. This is when one feels the improvement.

Psychology and Emotions

Managing the psychology and emotions intercepted during the whole experience of practicing, competing and winning is an important key to help improving these phases and making them more efficient, moreover to make a good benefit of them in life.

Attachment and taking things seriously

One of the common attitudes when one is involved in contests, is getting too attached to winning. I would refer to Abdel-Fattah's quotations here:

'The best outcomes of a competition come along trying to win. Winning itself is not an outcome, it is what gathers us towards the same goal.'Mohamed Abdel-Fattah

What I'm trying to say here, getting too attached to winning itself is not the right attitude, because after a lot of preparation and practice for the contests, one learns a lot and this is the real value gained. Winning of course has its advantages, however the attachment to it has many disadvantages; it mainly affects the psychology during the time to compete because of putting too much pressure on it, which makes it harder to win actually; additionally it affects the motivation to compete again later on, which might be the reason for failure to go on.

Self Worthiness and value vs. Arrogance and devaluing others

There are two extremes of attitudes or concepts that I noticed on myself and many among the community, depending on some specific stages in the community.

  • Self worthiness and value: Members who are deeply involved in the ACM community, in terms of practicing, competing or coaching, are people of high value. It's a really prestigious position, especially after making some achievement or travelling for contests. This value remains high even if one is in a community that knows nothing about programming whatsoever; participating in a national or regional contest, travelling for such contests, and practicing for them with dedication are things of high value enough, and I get a lot of appreciation about them from a highly diverse collection of people, additionally one shouldn't get the real validation from the surrounding community. Having this self worthiness and acknowledgment of this value, should make one stable enough in order not to be outcasted by different communities by statements like "You're all a bunch of lonely nerds."; even though such a statement might have some truth in the sense that many programmers lack some good social skills, but this is something that can be worked on separately, as I did supposedly. Geeks can be people of high social value yes! The moral here is that, people from the community should not place themselves as inferiors.

  • Arrogance and devaluing others: There are really great talents in the ACM-ICPC, that people begin to measure the value of people by their intelligence in algorithmic skills, hence some of the people who are relatively good in the community, tend to place themselves as superiors to people outside the community, which is an invalid attitude. I met many examples that proved this view wrong, for example: I'd meet a girl who worked at a restaurant, and then we would pass by some situation, and then it happens to be that there was some social hijacking and I might get into trouble because of that, however the other girl who worked at a restaurant, developed much better social skills that she could be aware of this situation and get out of it so smoothly; such an event totally invalidates the view that I was superior. A relevant quotation:

'In my walks, every man I meet is my superior in some way, and in that I learn from him.'Ralph Waldo Emerson

The moral here is to have the self worthiness and confidence without placing oneself as an inferior, and also without exaggerating this and being arrogant and placing oneself as a superior irrationally.

Honesty

Honesty is a very important key for development, honesty with oneself mainly. Having the courage to admit honestly and precisely that one is not good at something, or good at something is the first step to know your strength points (in order to strengthen them more) as well as the weakness points (in order to change them). Knowing the strength and weakness points of your personality is one of the keys to construct a strong personality, because it makes one knows more who (s)he really is. Another important key is living peacefully with these weaknesses and imperfections, without feeling any shame about them or their history. Just start to change them!

On a bigger scale, honesty with team members; having everything cleared out between the team members, and that the team knows honestly the strengths and weaknesses of each member of it. For example, when I joined my first regional contest with Omar Azazy and Muhammed Atef, I had a belief that I was the least worthy member of the team (because I had the least experience in problem solving and contests), fortunately we spoke about it a day before the regional contest; they pointed out to me that I was wrong, and thanks to me and my mathematical skills we had a triumphant win in the national contest before qualifying to the regional one. Such knowledge made me much more comfortable with my presence in the team, and knowing my exact role in the team, which was an important factor that we won the regional contest the next day.

Diversity in life

Having diverse interests beside being deep in one interest (like ACM-ICPC contests here) is one of the key characteristics for strong personality. Suggesting this, doesn't mean that I have done all of the following, or I'm particularly good at them all, but I have tried some of them, and few of them with good depth. You can add whatever you want, here are some of the suggestions that I had in mind: (some of the categorizations maybe even wrong)

  • Social life: It's a common problem between computer programmers, engineers and some other similar technical fields, that they can hardly adapt with different social circles, that don't talk about these same technical fields. Therefore it's something of important effect to learn social skills, and try to socialize with different people from really diverse backgrounds.
  • Art and Music: Pickup a new musical instrument and learn it, it will ascend with the spiritual and emotional side, plus it's a really entertaining hobby. It probably improves the brain in a strong way, you can look that up. This can be any form of art, maybe in drawing or painting.
  • Sport and Adventures: Try new sports, and different adventures, for example: skydiving, skiing, diving, hitch hiking, hiking, camping, etc...
  • Science: Know about different fields of science, for example: Physics, Mathematics, Biology, Psychology, etc...
  • Literature : Know about different fields like History, Linguistics, Languages, Poetry, etc...
  • Philosophy: Learn about different fields of philosophy, and different philosophies in each field, it improves thinking about life strongly, in addition to giving more abstract views generally.
  • Computer science fields: In my experience, I concentrated so much on algorithms and theoretical computer science, that I didn't explore decently any other field in computer science, consequently this presented some difficulties in my career, because after some limit in algorithmic skills, it doesn't matter as much as the skills in different areas.

Initiative

Personally I owe a lot to the ACM-ICPC community, specifically in the GUC, moreover in Egypt, and the voluntarily efforts of my coaches, and the efforts of my competitors in the community that motivated me to be much better. I personally believed and still do that, it's my duty and ethical responsibility to pay it back by giving the time, effort and knowledge to help the community to improve. This can be directed in giving sessions, hosting camps (national ones also or maybe even regional ones), coaching teams, judging in the competition, hosting contests and help in organizing in the contest. I would also say it's the same ethical responsibility of younger generation that I gave my effort, to do the same later on.

One of the ideas I had but I could not implement, is trying to coach young students in high-school, for example in the IOI contest, however I lacked the experience in this particular competition, and I have to admit I didn't have enough initiative and courage to start communicating with schools about it. The main reason I had this idea, is because, the generation that came from the IOI to the ACM-ICPC was a really competitive generation, and it pushed the community too much forward, therefore I hope someone would have the initiative and courage to implement this idea.

My hope is, by the continuous efforts and initiatives of the members of the community, the community would be much more competitive internationally and start competing strongly on an international scale, eventually becoming an effective part of the international community and leading to dramatic improvement in computer science in general.

Gratitude

I would like to thank and show my gratitude and appreciation for each of the following for making a contribution whether big or small in my career in the ACM community, my career and my life in general.

Mohamed Abdel-fattah Abdallah Elguindy Omar Azazy Muhammed Atef Dima Korolev Ramy Wafa Islam Al-Araag Ahmed Abdrabo Prof. Slim Abdennadher Mohamed Abd El-Wahab (Fegla)

Background

ACM-ICPC background

The ACM-ICPC (International Collegiate Programming Contest) is a problem solving contest, the contest is conducted on national, subregional, regional and international scales. The competitors in this contest are teams of three members from the same university, they are provided with a set of algorithmic/mathematical problems (around 11 problems usually), and they are provided with a computer, and the task is to solve the most number of problems by writing an efficient program to solve each problem as specified. The community of this contest mostly consists of people who are involved in computer science, and it has a strong contribution to computer science. Usually the teams practice (maybe individually sometimes) by reading some topics and by solving problems.

Personal background

When I first joined the German university in Cairo in Winter 2009, I had kinda distinctive skills in mathematics, but I knew nothing about programming whatsoever. I came across the ACM community in my university, I had a limiting belief that I'm not fit enough to be able to compete in a programming contest. I just went the sessions for a while just because it wouldn't make me lose anything.

In summary, I started attending ACM sessions in December 2009 by Abdallah Elguindy, after that I attended an intensive training in the summer, that mainly consisted of a national camp at the British university in Egypt for 2 weeks, a series of some sessions and weekly practice contests by Mohamed Abdel-Fattah, another more advanced camp by Dima Korolev, and finally I attended a camp in ITMO St. Petersburg, Russia as a preparation for the ACM-ICPC world finals 2014. About my individual practice, I had an intensive practice in 2011 (for almost the whole year, daily practice during some periods, and some team practice as a preparation for the regional contest in 2011) and in 2012 (as a preparation for the World Finals in Warsaw 2012, during the camp I hosted at the summer, and as a preparation for the regional contest in 2012), then it was mostly occasional practice for contests in addition to consistently attending online contests like Topcoder's SRMs.

Competition History

I competed in the national contests (ECPC)

  • Cairo, Egypt, 2010 (21st place)
  • Alexandria, Egypt, 2011 (1st place)
  • Alexandria, Egypt, 2012 (3rd place)
  • Alexandria, Egypt, 2013 (7th place)

the regional contests (ACPC)

  • Beirut, Lebanon, 2011 (1st place)
  • Amman, Jordan, 2012 (4th place)
  • Sharm El-Sheikh, Egypt, 2013 (1st place)

the World Finals (ICPC)

  • Warsaw, Poland, 2012 (Champions of Africa and Middle-east)
  • Yekateriburg, Russia 2014

Initiative history

I hosted a national camp at the German university in Cairo in Summer 2012 coached by myself, Fegla and Omar Azazy. We had teams from German University in Cairo, American University in Cairo, Cairo University, Alexandria University and Ain-Shams University.

I coached 13 teams in the national contest 2013, 10 were junior teams (who I gave a camp for 2~3 weeks) and the other 3 were senior teams that included my team. The 3 senior teams won 1st, 4th and 6th places at the regional contest ACM-ACPC 2013.

I judged and authored problems at the regional contest 2014, in Sharm El-Sheikh.

Diverse Background

In addition to all of this, I started playing the violin in Summer 2012 (so it was around 2.5 years by the time of the audition mentioned), and I learned for more 5 months in Freiburg, at 2013; later on I played with the orchestra of the Music Ensemble in the German university in Cairo in May 2014, in a concert "El-Leila El-Kbira". I attended a philosophy class for a year. Furthermore, I worked on my social skills, that later I became much more extroverted and outgoing person, after I was a really awkward introverted person.

Ending

I wish you all Good Luck, successful and great life. Keep the community improving, challenge your fears, and practice, practice, practice!


Created on 2014-11-23 at 09:59