A month ago, the next ACM-ICPC World Programming Championship (
results ) ended, in which the teams from St. Petersburg and Yekaterinburg brilliantly performed. Teams from Moscow, Perm, Novosibirsk, Saratov and Samara showed a bit worse. The team from Tomsk has an excellent result, the only way to the final of which was already a surprise for many. Note that almost all cities are millionaire, they have large universities and interesting companies to work with. Now imagine that you all childhood live in a city with a population of 50 thousand people, then you move to a neighboring city with a small university with a dubious quality of education, and the prospect of working at a factory for 20 thousand rubles a month looms ahead. There are effective ways to get out of this dark path, and one of them is ACM-ICPC. I want to share my story, tell how the experience of ACM-ICPC helps in everyday work and how these competitions became my start in life. If you are a first-second year student and choose between earning money and preparing for programming tournaments, then I hope this article will help you decide.
Photo
icpcnews icpcnews /
CC
First, tell a little about yourself. I studied in the most ordinary school in the most ordinary small town. I didn’t know about any programming competitions until I entered the university in the neighboring town. The names of the city and the university do not matter, because this story could occur in any province. I was lucky that I joined the ACM-ICPC participants in time, and in the university, they knew about these competitions not by hearsay. Despite the fact that no more than one team practiced regularly, that there was no competition among students, that there were no winners of All-Russian school competitions among them, the teams won the World Championship medals several times. So, I managed to make a long-term journey from the countryman to the final of the ACM-ICPC, and after growing to the team leader in a large federal company. My teammates also have a good life: one is the lead programmer at the same company, and the other is working at Google. The guys from the preceding teams feel great both in Russia and abroad, working in well-known companies or opening their own. I repeat: none of them showed any super-talent at school age. All that unites them is a huge number of solved programming problems for the student years. And they are a vivid example of the fact that, even studying in the most ordinary university in an unpromising city, one can get into the light.
Photo
icpcnews icpcnews /
CC
')
So, what to do if you study in a university that is not able to give you a decent education? Grow yourself! It is not enough for you to record lectures, decide laboratory and cram tickets. Read books, learn technologies, deepen fundamental knowledge. In the end, you can play sports or play KVN, it's better than no use to burn free time. One of the ways of development is participation in programming competitions. You can participate from tournament to tournament, and you can do it professionally, up to five days a week. Next, I will talk about the professionals.
Sometimes I travel to tournaments with students and see that often after the first or second year they lose interest in competitions and try to get a job as soon as possible. Such students associate ACM with algorithms and only with them, and since at work they most likely will never come in handy, participation in tournaments is of no practical use. Not once or twice I heard the question: “You have participated in ACM for several years. And what, were these algorithms useful to you? ”The first thing that needs to be learned is that classical algorithms are only a small part of ACM. This is a tool that helps solve problems. Exactly the same as a programming language, without the knowledge of which it is impossible to write a solution. Most of the tasks are unique, their solution is not based on the use of a well-known algorithm, for each task you need to invent your own algorithm, embedding the classical ones in it as a small part of the overall solution. Most likely, you don’t have to write a Dijkstra algorithm or a segment tree at work, but in ACM you will only use them as bricks, not a foundation.
It is widely believed (
1 ,
2 ,
3 ) that former ACM users write terrible code because they are so used to competitions where time is tight and there is no time to think about quality. However, with the same success we can say that the racers do not know how to drive around the city according to the rules, and skaters do not ride around the rink in a circle with everyone. First, it is individual. Secondly, often for the solution you need to write so much code that it is simply impossible to save on quality: it will take a lot of precious time to correct errors (and the world champions are of
the same opinion ). In addition, modern development environments stimulate writing decently and make it easy and quick to do it. ACM users are smart people, and they understand that on a real project, the code must be of high quality, and they quickly learn from colleagues to observe this quality. Already at least no slower than students who have not seen anything in their lives except laboratory work. On our project, a quarter of developers are ACMers, and all of them, as a rule, pass the review of the code without any serious consequences.
So what gives ACM? First, the fundamental knowledge and mathematical apparatus. At the lectures we were not told about the complexity of the algorithms, we did not study graph theory, we did not deal with optimization methods. ACM closes this giant gap due to the huge number of tasks on computational and discrete mathematics, probability theory, various topics from theoretical informatics. Each task requires an analysis of the computational complexity of the algorithm and makes one think about the effectiveness of the data structures used. Thanks to experience, ACMs do not think about the complexity of the operations of embedded data structures — they get these values ​​from the cache of their memory. They know their device and the subtleties of work, because they have repeatedly stumbled upon some implementation feature in a particular version of the compiler. At interviews, I am amazed that even experienced developers often believe that adding different keys to the hash table in .NET with the same hashes scrubs the data, and in practice collisions practically do not happen, and then with surprise find out about the
paradox of birthdays . Many candidates do not understand at all how the daily business uses them, suspecting that under the hood of List <T> a coherent list and addressing by index is a slow operation. There is no need to even speak about any database device.
Secondly, ACM develops the speed of thinking and typing code. This is facilitated by the fact that there is not enough time at competitions, but a lot of tasks, therefore it is impossible to delay In addition, in few places during study you can write as much code as during preparation for tournaments. In few places you can also pump up your wits. Due to this, in industrial development, ACM specialists can quickly create prototypes, refactor code, and combining these skills can work effectively on
TDD , because the first two parts of TDD are in the spirit of competition: to come up with tests for different cases, and then write any code, which passes them.
Thirdly, ACM develops attentiveness. In tournaments, the wrong code is punishable by fines, so it is very important to write the correct code. It is very important to be able to test it. It is very important to quickly find bugs. None of the 16 developers of our project finds more bugs at the review stage than ACM players. This is just a skill developed over the years, and it is very valuable in industrial development.
Fourthly, having achieved significant development in ACM, you can easily pass an interview in many world IT companies. In Google and Yandex, for example, interviews consist almost entirely of ACM-like tasks. Even if you do not want to get a job in these companies, it is even cool to go for an interview. For example, I first traveled abroad thanks to an invitation from Google for an interview in Zurich.
In the end, ACM gives a lot of non-technical advantages: trips around the country, friends and acquaintances from different cities, fluent reading in English (most of the tasks are written in English), prizes at tournaments, increased scholarship, respect from teachers, classmates and colleagues. ACM-ICPC brings variety to life.
Photo
icpcnews icpcnews /
CC
Finally, it is worth noting an important point: ACM does not guarantee anything. This is not some kind of magic pill, it is just a tool. Perhaps you will be very good at solving problems, but without the ability to communicate with people, you still cannot get a team in which you can grow and develop. The ACM experience is just a great addition to your skills. This is a good line in the summary, you will be noticed, you will easily pass a technical interview, but you can easily fail communication with managers. And it's far from a fact that participation in tournaments will help you in your studies. Quite the contrary: if this movement is not developed in your university, if teachers have never heard of it, then combining training with study will be incredibly difficult, and the management will be extremely reluctant to allocate money for trips to tournaments. But once upon a time, everyone started from scratch, in many universities, everything is still held up by the pure enthusiasm of the students.
Everything changes when significant successes come. These successes are almost the only noticeable achievement of a regional university, and the management begins to meet difficult questions, the teachers turn a blind eye to non-passed laboratory work and are favorably treated in examinations. If, at the same time, there is also a good leader at the university, he is seeking increased scholarships and sponsorship: all the years at senior courses I could not only not work, but also accumulate savings. But for all this it is necessary to work hard, make great efforts, and then everything will work out. ACM-ICPC is a great combination of interesting and useful extracurricular activities.
If you are a student of a little-known university in a godforsaken city, then ask yourself the question: “What are my prospects?” If you are not satisfied with the answer, if you want to join a “cool company”, if you are ready to set ambitious goals and solve complex tasks, and not to do your chores, if you want to be proud of your work, and not just to do it, if you don’t want to waste your student years, ACM-ICPC will give you a huge chance to achieve all this. Start by participating in tournaments at
Codeforces , the most popular venue in Russia for holding and discussing programming contests. Find a leader, assemble a team, participate in regional tournaments, train. Your participation in ACM will last only a few years, but its echoes will still be felt very, very long. For me, ACM-ICPC has become a major investment in life, for you it will at least turn into a useful and fascinating experience.