Это личный опыт, оказавшийся для меня неожиданным. Настолько неожиданным, что я решил разобраться, почему результат оказался намного эффективнее, чем я ожидал. Когда я разобрался, мне захотелось поделиться новым пониманием. Блог ЛАНИТ показался лучшим местом для этого.

Учиться всю жизнь — реальность айтишника
Мне 52, и я разработчик в многопрофильной группе ИТ-компаний ЛАНИТ. Жить всем нам выпало во время перемен, и поэтому тем, кто связал свою жизнь с компьютерами и программированием, учиться приходится постоянно. Я как начал учиться в дошкольном возрасте, так пока что и не перестал. Университет дал мне математическое образование, но собственно программированию меня учили мало. На работе 30 лет назад мы писали системы на FoxBase (затем на FoxPro), и dBase пришлось учить методом погружения. Потом (25 лет назад) я понял, что настоящие реляционные базы данных мне интереснее и переключился на Oracle. Исследовать его тоже пришлось с колёс. Тогда мне казалось, что изучать что-то методом «вот существующая система, а вот твоя задача» трудно. Теперь я, конечно, знаю, что анализировать технологию, которую используешь на работе, проще всего: с одной стороны – нет недостатка в практических задачах, с другой – мотивация обеспечена, как положительная, так и отрицательная.
Куда тяжелее изучать то, что интересно тебе самому, но не твоему работодателю. В этом случае и время, и мотивацию на освоение нового приходится брать из личного запаса, а практические задачи нужно брать откуда-то ещё.
Python: долгий старт
Python я мечтал выучить несколько лет. Влезал в онлайн-курсы. Сейчас могу вспомнить только очень интересный курс Высшей школы экономики «Основы программирования на Python» на Coursera (к сожалению, больше не могу его найти на платформе). Я выучил синтаксис, более-менее научился читать программы (скорее менее), но это не давало значимых сдвигов.

Исследования показывают, что заканчивают онлайн-курсы далеко не все записавшиеся. Уже упоминавшийся курс «Основы программирования на Python» я закончил, но вообще-то он был рассчитан на девять недель, а проходил я его больше пяти лет. Разумеется, за это время я не один раз уходил и возвращался, каждый раз снова мучительно вспоминая синтаксис цикла for.
Advent of Code: как всё началось
Конечно, я раньше слышал про Advent of Code. Более того, я даже читал про него прямо на Хабре, но почему-то никогда не пробовал решить ни одной задачи оттуда.
В двух словах – AoC с 2015 года проходит с 1 по 25 декабря (кстати, он стартовал вчера и еще можно присоединиться) и предлагает по две задачи по программированию в день. Первая открывается в полночь по EST (UTC-5), вторая – тогда, когда решена первая. Задачи прежних дней и лет остаются открытыми, решать можно любые. Формулировка задачи одинакова для всех, а исходные данные у каждого участника свои (кстати, делиться ими нельзя). AoC принципиально не проверяет код: вводить всегда нужно только ответ, и задача считается решенной, когда ответ правильный. Хороший английский для участия в AoC необходим.
Однако 1 декабря 2024 года мне попался интересный пост про AoC, который написал Анатолий Воробей (aka avva). Я поверил, что задачи первых дней не очень сложные, и нырнул. Вынырнул я спустя 25 дней, и результаты оказались неожиданно хорошими. Месяц AoC дал мне больше, чем несколько предыдущих лет. В частности, я стал способен «думать на языке». Обычно в день я тратил от 1 до 2 часов чистого времени. Некоторые головоломки требовали в районе 4-5 часов.
Дозировка в две задачи в день очень хорошо подошла мне. В моём случае сутки начинались в 10 утра, и я начинал день с обдумывания задачи. В рабочий день код первой части я начинал писать во время обеда, оформлять и отлаживать вторую часть обычно приходилось вечером. Если бы задач было больше двух, я бы перестал успевать.
Три задачи (день 14, часть 2, поиск Рождественской ёлочки; день 17, часть 2, поиск наименьшего значения регистра; день 24, часть 2, исправление сумматора) я вообще не смог решить посредством программы и получил ответ «в режиме кентавра»: я искал решение вручную, используя результаты запусков программы для поддержки поиска. Я думаю, что именно использование языка программирования в режиме интерактивного инструмента очень способствовало привыканию к нему.
Почему Advent of Code работает
Я знал, что AoC помогает учить языки программирования, и даже знал, какие именно факторы при этом работают. Вы тоже их наверняка знаете или легко можете угадать. Оказалось, что значимость трёх факторов я очень сильно недооценил.
Прежде всего – я не ожидал настолько сильных эмоций от успешной сдачи задания. Особенно, когда несколько попыток дали неправильный результат, и вдруг ты понял, что именно делаешь не так, и сделал как надо.
Во-вторых, задачи, появляющиеся в реальном времени, мотивируют намного сильнее, чем онлайн-курс, который никуда не денется и завтра, и после. Если сдать задачу в течение тех же суток, когда она выложена, то сайт запомнит время сдачи с точностью до секунды. В противном случае будет записано, что потраченное время больше 24 часов. Этот мягкий дедлайн – первый источник мотивации.
Сообщество — источник силы
В-третьих, вокруг AoC постепенно собралось англоязычное сообщество на Reddit. Люди там профессиональны, обладают прекрасным чувством юмора и очень доброжелательно относятся к новичкам. Туда можно выложить кусок своего кода и спросить, что с ним не так. Вам обязательно ответят, быстро, понятно и правильно. Там можно просто спросить, что делать с задачей, и вам попробуют помочь, отнюдь не делая задачу за вас. Там обязательно будут выложены решения текущего дня, и их можно (нужно!) посмотреть, а если что-то непонятно – спросить. Для одних задач люди пишут полезнейшие обучающие материалы, а для других – прекрасные визуализации решений. Наконец, мемы сообщества – очень смешные.

Сообщество напоминает, что вы не один, и это – второй источник мотивации, дополняющий и усиливающий первый. Эффект весьма значителен: я продолжаю решать задачи предыдущих лет, но в архивном режиме и без поддержки сообщества моя скорость упала примерно в пять раз.

Резюме
Когда на 10-й день я понял, что ненароком изобрёл обход дерева в ширину, мне дали ссылку на видеокурс алгоритмов на графах, а также посоветовали изучить алгоритм Дийкстры и китайскую теорему об остатках. Алгоритм Дийкстры пригодился уже на 16-й день, теорема пока не потребовалась.
На сайте есть глобальная таблица лидеров, но мне кажется, что лучший способ использования AoC – делать вид, что её там нет: она для тех, кто соревнуется, а не для тех, кто учит язык. Бывали дни, когда она оказывалась заполнена раньше, чем я успевал прочесть и понять задачу.
Не пропускайте следующие события. AoC делает один человек, и никто не знает, сколько он ещё будет этим заниматься. AoC-2025 начался 1 декабря, и ещё не поздно к нему подключиться.
*Статья написана в рамках ХабраЧелленджа 4.0, который прошел в ЛАНИТ весной 2025 года. О том, что такое ХабраЧеллендж, читайте здесь.