The best programming teacher that never taught me a lesson

Maxim Leonovich
8 min readDec 7, 2020

I’ve been a computer programmer for over ten years now. I went from freelancing to running a consulting agency to working for a Silicon Valley startup full time and am now trying to build a product myself. While I do have a formal CS education, I consider myself mostly self-taught. A big part of my professional development comes from me doing competitive programming as a kid. More specifically, from being part of a small computer club in my hometown, run by a passionate university professor — Michael Dolinsky.

Photo by tut.by

If you have any familiarity with the competitive programming landscape, you most probably have heard of @tourist, who is considered one of the world’s best in the sport. He came out of that same computer club. While he put into it much more than just weekend practices, there were dozens of other “regular” kids like me, who haven’t become rockstars but built decent careers nevertheless. I think we’d all agree that the club played a decisive role in how our professional lives turned out, but what was so special about it? In this article, I’ll try to describe how the club functioned and what I think were the most important things that made everything work.

There was no age restriction at the club, kids could come as early as 1st grade

I deeply believe that motivation is the hardest and yet most important thing to solve in education. Schools, universities, and coding boot camps fail not because their content is not good enough or they can’t hire the world’s best experts in whatever they teach. It’s always because their students take learning half-heartedly, don’t step outside the curriculum, and don’t put in those extra hours that are so much needed to hone any skill. That’s in turn because they don’t understand why they’re doing what they’re doing. Learning doesn’t truly align with their passions, and the environment itself doesn’t help boost motivation. Motivation and environment were things that Michael, the teacher who ran the club, got perfectly right. He managed to build a system in which almost any kid would become a decent programmer after a few years, ready to skip the university and go directly to the market. What’s even more impressive is that Michael never really taught anyone in the club how to program. He was solely a manager who made sure the system was well-oiled and a few essential components continued operating. Here they are:

  • The platform
  • Competition
  • The long-term goal
  • Knowledge sharing
  • The community

The platform

At the heart of the entire process was a custom-built learning platform. It was similar to what you’d see at LeetCode, TopCoder, or CodeForces today, but a bit more dated. We’re talking about the early 2000s here. The platform had a giant archive of programming tasks and could automatically evaluate anyone’s solution against a set of tests. Everyone’s first day would begin with creating a profile in the system and submitting a simple task — a “Hello World,” “A+B,” “fizz buzz,” or similar. There were hundreds of puzzles for any level, and everything was centered around solving them. Notably, there wasn’t anyone maintaining the system aside from older kids and alumni. Here’s how it looked like back in the day:

Competition

Even more important than the tasks themselves was the ranking table that the learning system maintained. You’d score points for pretty much anything you do. We were constantly comparing ourselves to other kids. Everyone wanted to be higher on the table than their friends and get closer to #1.

Every Sunday, we had a practice competition — typically, a replay of some other contest re-hosted on our system. Half of them were individual, and half were ACM-style team challenges. The drill was always the same:

  • Come at 9 am.
  • Work on algorithmic puzzles for 5 hours straight.
  • Discuss the results.
  • Go home triumphant or devastated.
  • Spend the week working on mistakes.
  • Repeat.

Everything was carefully measured and recorded. You’d get separate points for competing, practicing, or submitting your fixed solutions after the main contest. There was a ranking table for every activity, and we, the kids, cared a lot about those tables. Aside from in-house contests, we actively participated in everything available to us online (TopCoder, USACO, SPOJ) and sometimes even traveled to other countries to compete in person. The most important of all was the national programming olympiad and the IOI (for those who scored well in nationals).

The never-ending contests were the thing that fueled our dopamine systems and kept everyone going. Nothing was mandatory, but if you wanted to score well, you had to practice. The best performers dedicated 100% of their free time to programming, and it was completely voluntary.

The long-term goal

Scores and competitions were great as short- and mid-term fuel, but our motivation wouldn’t be sustained in the long run without a bigger goal. Kids would typically join the club because they had an innate interest in computers. However, as we grew, we all converged towards the new objective — getting into a university without taking any tests.

In the country I’m from, we have free education, but it’s not available to everyone. You have to score well in a GMAT-kind of test to get a free college admission. Typically, your entire final year in high school would be dedicated to practicing for the test and remembering as many disconnected random things as you can. However, there’s a shortcut. If you perform well in the national olympiad, you can skip all of that and enter any university in Belarus without passing any exams. So, instead of competing with the entire country in 3–4 subjects, you could keep doing what you like and focus on just one skill. Needles to say, we all preferred the second option.

The trade-off, however, was that you must’ve scored well in your final year. Otherwise, you risk not getting anything at all, as you probably haven’t studied “those other subjects” anyway. The alternative of going to the university was serving two years in the Belarusian army, which is mandatory for all men, except those getting a higher education. Our teacher would constantly remind us about this, and it worked like magic, especially for older kids.

Nobody wanted to end up doing this

Knowledge sharing

Even though Michael Dolinsky was a working professor at the university, he never gave us a lecture of any kind. Instead, we would often come to him with questions, and all he would do was point at a more knowledgeable kid who could help with that. If the topic was too broad, he’d suggest a book, but he rarely explained anything himself — it just wouldn’t scale!

Another activity that worked exceptionally well were regular debriefs after every contest. We’d all get in the same room and, task by task, we had to explain our solutions to everybody. Beginners would be called out for simpler stuff, and more experienced kids would explain the rest. It was often a great challenge for people to lay out random thoughts on a blackboard in an understandable way for the first time. The entire audience would try to decipher what they meant and help present the idea in a cleaner way. The “rockstars” would often brag about a novel algorithm that they had recently learned and applied successfully. Those who wanted to catch up would take notes and spend extra time at home practicing the new approach to stay competitive. In rare cases, when there was a task that nobody solved, we’d collectively brainstorm solutions. It was fun!

There was always something to talk about, and it was a hundred times more useful than any lectures because the information wasn’t random. It was directly relevant to what we were trying to achieve in the last five hours (and often failed). I believe the debriefs were the single most crucial thing that accelerated our progress in the club.

The community

The final essential part of the club was, of course, the people themselves. Knowledge sharing doesn’t mean much if you’re the only person in the room. Fortunately, our town was relatively small, and every informatics teacher knew about the club. If they saw someone even remotely interested in computers, they’d send them there. The club was completely free and open to everyone. There were no obligations or prerequisites. Anyone could walk in any time they wanted and stay for as long as they had a desire to write stupid little programs. As a result, there was no shortage of smart kids around. It was all in-person, and a lot of us made lifelong friendships at the club. Everyone knew everyone, and that’s what made competition meaningful. Getting recognition from someone you know and scoring higher than your friend is very different than being the world’s number 10937 on a platform where everyone is online, hiding behind an obscure nickname.

As a bonus point, club alumni from different years would often attend debriefs and tell us stories about the future. What their university experience felt like, how they got a job, how some of them moved to Silicon Valley, etc. It was adding even more color to the “long-term goal” and worked as a great extra motivator.

I’ve been part of many online learning communities since then, and the lack of personal connection was always that bottleneck that didn’t allow the entire thing to function as its creators imagined. Personal relationships glue everything together and make the world move. You can easily replicate the other 4 parts, but it would be extremely hard to make the entire thing work without the community.

Final thoughts

These five components were at the core of a very successful system that produced hundreds of capable programmers over the years. It’s probably not that many on the grand scheme of things, but it was very significant on our town’s scale. The club also profoundly affected my professional development, and I can’t help but think about how I can build something similar on a larger scale. I have a few ideas in mind, but the first step was to write this article and summarize everything I know so far. I wish it was less dry, but I’m glad you’ve reached this far, and I hope you found it at least mildly interesting. I’d be happy to answer any follow-up questions you might have.

Finally, if you’re passionate about teaching (or learning) programming — let’s turn the comment section into a drawing board and contemplate some ideas together. Tell me what helped you learn how to program? What did you see working for others? What didn’t work? If you’re learning right now, what are your biggest obstacles, and how are you trying to overcome them?

--

--