For those people who’re hardworking and disciplined, learning software design and architecture and good coding practices shouldn’t be so difficult.
Learning by contributing to Open source projects where top worldwide programmers collaborate should be enough to pick up these skills.
First of all, they are specially heavily prepared; they are not ordinary students. Universities typically have a special department, which specializes ONLY in solving abstract Olympiad problems. Studying there is free, but in order to get in, you need to win a contest. Only 1 in 500-1000 students is accepted and only from eligible specialties (math and computer science). The competition is insane. From what I’ve seen, they either have outstanding programming skills or are math prodigies.
Secondly, all teachers are ex-winners (i.e. they won a few international contests but simply outgrew the program. Now they teach newbies). Essentially the same group of people will win repeatedly.
Finally, those universities have direct benefits from this. During any convenient opportunity, they boast by saying “WE WON A WORLD CHAMPIONSHIP!” (Read: our university is better than MIT, Stanford, and Berkeley combined.) Additionally, it’s often used to get financial aid from the government.
(News, national TV channel, on a meeting with the prime minister.)
Not surprisingly, with such selection and training, they win contests.
Now back to tech companies…
Why do you think we lack tech companies; JetBrains, Kaspersky, Dr. Web, Nginx, for example? Actually, there are plenty of small and medium-sized companies in every city.
Maybe you wanted to ask, “Why we don’t have giants such as Google, Microsoft, and so on?” The answer is simple – programming skills are not enough. In order to succeed, a company needs designers, managers, competent leadership, investors, customer support, and so on.
Finally, “computer science” and “software engineering” are two different fields. While they can solve difficult, abstract problems their code is often messy and unreadable. To build complex systems, you need to have vision on software architecture and be a team player.
And it needs to be aware of. “Problem solving skills” doesn’t equal to “writing highly optimized, structured, well-documented code”. On the contests time is limiting factor, so they usually write code only to pass tests. Such programs have a very short lifetime. While in real world development it’s a continuous process of endless improvement.
Written By — Ravindra Gupta