Вчера мой скрипт завис. Процессор горел на 100%. Я убил процесс.

Я Senior Developer с 10 годами опыта. Пишу на Python, знаю Java и много модных фреймворков. Но в этот момент я понял: я не умею программировать. Точнее, я умею использовать инструменты. Но я не понимаю природу вычислений.

Эта статья — о том, как одна математическая задача изменила моё понимание разработки.

И почему через пару лет, когда ИИ будет писать весь код за меня, это понимание станет единственным, что меня спасёт.

Возможно, и тебя тоже.

Иллюзия абстракции

Мы живём в эпоху максимального удобства. Нужна сортировка?.sort()Нужно распознать лицо? Подключаем API. Нужна модель? Auto ML.

Это хорошо для бизнеса. Time-to-Market сокращается. Продукты выходят быстрее. Компании зарабатывают больше. Но есть цена: мы теряем "чувство материала". Мы перестаём ощущать вес вычислений.

Джун пишет вложенный цикл по массиву из миллиона элементов. Не чувствует боли. Процессор "съедает" всё за секунду.

Потом этот код попадает в продакшн с 10 000 пользователей одновременно. Серверы падают. Бизнес теряет деньги. CTO орёт на команду. И джун не понимает, что пошло не так. Ведь у него на ноуте все работало.

Разница между джуном и инженером не в знании синтаксиса. Она в способности почувствовать катастрофу до запуска. И вот задача, которая научила меня этому чувству.

Задача, которая всё изменила

Представь треугольник из чисел:

   3
  7 4
 2 4 6
8 5 9 3

Правила простые:
- Начинаешь с вершины (число 3)
- Двигайся вниз, выбирая левого или правого соседа
- Цель: найти путь с максимальной суммой чисел

В примере выше оптимальный путь: 3 → 7 → 4 → 9 = 23.

Задача с треугольником из 15 строк решается за секунду перебором. Но что, если в треугольнике 100 строк?

Первая реакция разработчика

"Напишу рекурсию, которая проверит все пути и выберет лучший".

def find_max_path(triangle, row=0, col=0):
    if row == len(triangle) - 1:
        return triangle[row][col]

    left = find_max_path(triangle, row+1, col)
    right = find_max_path(triangle, row+1, col+1)

    return triangle[row][col] + max(left, right)

Запустил на треугольнике из 15 строк. Ответ получил за доли секунды.

Отлично! Запускаю на треугольнике из 100 строк. Подождал минуту, пять, десять. Процесс завис.

Математика катастрофы

Давайте посчитаем, что происходит. На каждом шаге путь раздваивается. У нас 100 шагов. Количество возможных маршрутов = 2⁹⁹ ≈ 6.3 × 10²⁹. Число с 30 нулями.

Если представить, что у нас есть суперкомпьютер, который проверяет 1 миллиард маршрутов в секунду, то на это уйдет 20 миллиардов лет.

В этот момент я понял: проблема не в Python. Не в памяти. Не в процессоре.

Проблема в том, как я думаю.

Мой алгоритм математически обречён, какой бы мощный сервер я ни арендовал.

Смена парадигмы

Решение требует фундаментального сдвига в ментальной модели. Вместо того чтобы стоять на вершине и гадать, какой путь выбрать (смотреть в будущее), нужно начать с конца. Пойти из будущего в настоящее.

Посмотрите на предпоследний ряд:

  2 4 6    <-- Текущий ряд
 8 5 9 3   <-- Основание

Возьмём число 2. У него два потомка: 8 и 5. Если мы когда-нибудь придём в точку 2, мы обязательно пойдём к 8, потому что это выгоднее. Значит, реальная ценность клетки "2" = 2 + 8 = 10.

Возьмём число 4 (посередине). Его потомки: 5 и 9. Лучший выбор: 9. Ценность клетки "4" = 4 + 9 = 13. И т.д.

Теперь предпоследний ряд превратился в:

10 13 15

Последний ряд больше не нужен. Он "схлопнулся" в предпоследний. Треугольник стал на одну строку меньше. Повторяем процесс 99 раз, поднимаясь к вершине.

# Идём снизу вверх
for i in range(len(triangle) - 2, -1, -1):
    for j in range(len(triangle[i])):
        # К текущему числу прибавляем лучший вариант из нижнего ряда
        triangle[i][j] += max(triangle[i+1][j], triangle[i+1][j+1])

print(triangle[0][0])

Три строки кода. Вместо 20 миллиардов лет вычислений (O(2ⁿ)), процессор решает задачу за 0.002 секунды (O(n²)). Это торжество инженерного мышления над грубой силой.

Где это работает в реальной жизни?

Эта логика управляет миром вокруг нас. Когда Photoshop сжимает фото и оставляет лицо нетронутым (Seam Carving) — это тот же треугольник, только ищется путь с минимальной энергией.

Когда трейдеры оценивают опционы (Binomial Pricing) — они сворачивают дерево вероятностей от будущего к настоящему.

Когда автокоррект исправляет слово — он вычисляет расстояние Левенштейна через динамическую матрицу, а не перебирает весь словарь.

Один принцип, тысячи применений.

Как развить это чувство?

Но как научиться видеть эти паттерны? Как развить интуицию, которая кричит "Стоп!" до того, как ты напишешь O(2ⁿ)?

Инженерное мышление — это навык. И как любой навык, его нужно тренировать.

Именно для этого существует Project Euler — платформа с более 900 задачами разной сложности. Обожаю её.

Это не LeetCode с зубрёжкой паттернов. Это тренажёр вычислительной интуиции. Каждая задача устроена гениально просто: она выглядит решаемой в лоб, но подобрана так, что у тебя не хватит ни времени, ни ресурсов вычислить ответ напрямую. Ты обязан изобретать.

Взять ручку и бумагу. Найти математическую закономерность. И только потом касаться клавиатуры. После решения каждой задачи — кайф. Не от того, что ты победил систему. А от того, что ты увидел то, что было невидимо.

Ты начинаешь чувствовать вес цикла. Когда ты видишь O(2ⁿ), у тебя сжимается сердце.

Системное решение задач прокачивает программистское IQ — способность видеть неэффективность до запуска кода. И это умение станет критически важным совсем скоро.

Что останется, когда придёт ИИ?

Через пару лет ИИ будет писать весь код за меня. Что тогда останется?

  • Способность понять, что задача неразрешима перебором.

  • Интуиция, которая подскажет: "Иди с конца".

  • Инженерное мышление, которое превращает 20 миллиардов лет в 2 миллисекунды.

Что останется навсегда

Инструменты меняются. Вчера был jQuery. Сегодня React. Завтра что-то, сгенерированное ИИ. Но сложность O(2ⁿ) навсегда останется сложностью O(2ⁿ).

Project Euler возвращает к основам. Он напоминает: за любым красивым интерфейсом всегда стоит "железо" и математика.

И понимание того, как превратить 20 миллиардов лет в 2 миллисекунды — это то, что отличает настоящего инженера от пользователя IDE.

Вчера мой скрипт завис.

Сегодня я знаю, почему.

Завтра, когда ИИ будет писать код за меня, я всё ещё смогу сказать ему: "Твой алгоритм обречён. Начни с конца".

Время чтения: 8 минут.
Время экономии вычислений: 20 миллиардов лет.

P.S. А с другой стороны, зачем мне прокачивать инженерное IQ, если ChatGPT может проверить сложность и написать оптимальное решение? Зачем решать задачи на Project Euler, если Claude сделает это за меня?

Комментарии (136)


  1. pahanhik700
    04.12.2025 04:28

    Спасибо, об этом стоило напомнить


    1. poige
      04.12.2025 04:28

      И почему через пару лет, когда ИИ будет писать весь код за меня, это понимание станет единственным, что меня спасёт.

      ChatGPT, о котором стоило напомнить, передаёт привет, и даже спасибо не просит — в карман, говорит, не положишь — подписку давай: «…

      Bottom-up решение (in-place). Идём снизу вверх, накапливая максимальные суммы прямо в массиве. Псевдокод:

      def max_path_sum(triangle):
          # triangle: list of lists, triangle[i] длины i+1
          n = len(triangle)
          # начинаем со второй снизу строки
          for i in range(n - 2, -1, -1):
              for j in range(i + 1):
                  triangle[i][j] += max(triangle[i + 1][j],
                                        triangle[i + 1][j + 1])
          return triangle[0][0]

      Смысл:

      • на шаге i строка i+1 уже содержит максимальные суммы от каждой своей позиции до низа;

      • мы обновляем triangle[i][j] до «макс. сумма от (i,j) до низа»;

      • в конце triangle[0][0] — ответ.

      Оценка сложности

      Для треугольника из n строк:

      • количество элементов: 1 + 2 + … + n = n(n+1)/2, для n=100 → 5050;

      • операций порядка O(n²) — здесь ~5·10³ действий, смешно мало.

      По времени это оптимально (надо хотя бы один раз прочитать все элементы). По памяти — можно:

      • либо модифицировать треугольник «на месте» (как выше);

      • либо держать отдельный массив для «текущей строки» снизу (тогда O(n) памяти).

      …».

      — После чего показала вариант с отдельным массивом, закончив так: «… Итого: для 100 строк (и сильно больше) оптимальное решение — динамическое программирование снизу вверх с квадратной сложностью O(n²) и O(1) или O(n) памяти. Полный перебор с ветвлением 2^(n−1) бессмысленен уже при n≈50. …»


      1. alanin006
        04.12.2025 04:28

        Да, даже Deepseek предложил версию решения с "низу-вверх"


      1. fivelife Автор
        04.12.2025 04:28

        Нейросети умеют все, если ты не ощущаешь сложности, то ты не сможешь сказать нейросети сделать по другому, когда она предложит линейный вариант


        1. abcdsash
          04.12.2025 04:28

          но только кто то должен уметь делать нейросети


      1. fivelife Автор
        04.12.2025 04:28

        Если ты не чувствуешь, как ты ей скажешь, и как поймешь что решение ок?)


        1. poige
          04.12.2025 04:28

          Так это валидация уже (а не написание), и ключевое тут собственное знание и критическое мышление — как и ресурсы на таковые, потому что они таки вполне ограничены, а не какое-то абстрактное «чувствование» вообще-то. Инженерное мышление — это на 99 % использование готовых шаблонов, нюанс лишь в их уместности. Творчества в этих процентах, грубо говоря, лишь в масштабах выбора как и какие кубики складывать. И, кстати, проблема валидации была и задолго до того, как модели код писать научились.

          Но суть моего комментария не в этом даже. Он лишь о том, что даже под конец 2025 так называемый AI вполне себе сходу решает эту задачу, и даже способен указать на критерии оценки её эффективности. И «паттерны» эти модели видят уже получше большинства из нас. Так что заявления громкие, но в основном вхолостую.


          1. Alexandroppolus
            04.12.2025 04:28

            сходу решает

            Это хрестоматийная задача, миллион раз обмусоленная и как пример ДП, и как "задача для собесов". Странно было бы, если бы гпт про неё не знал


            1. poige
              04.12.2025 04:28

              Это хрестоматийная задача

              А то. Но суть-то всё же в том, что нейронки по мере роста своих масштабов способны «зреть в корень» всё эффективнее, так что задача может быть, условно говоря, переодета, но тем не менее, распознана и решена эффективно.


              1. AdrianoVisoccini
                04.12.2025 04:28

                есть прикол и с этой задачей и с тем как её решает нейронка
                Подавляющее число алгоритмов типа этого... уже решены. Гораздо более умными, чем я по крайней мере, людьми. Некоторые решены всякими супер хитрыми приколами, которые и не к программированию относятся первым делом, а к математике и всяким её заковыристым подразделам.
                Именно по этому нейронки умеют их решать, а точнее находить уже существующее решение и применять его.
                "Но они же не смогут решить принципиально новый агоритм", воскликнешь ты, на что я сразу же вспомню мем из "Я Робот"

                ой не, не этот
                "А ты сможешь?"
                и ещё более интересный "а тебе надо?"

                Допустим у нас есть какой-то супер-пупер бигтех продукт, который будет решать сверхсложные задачи за сверхкороткое время.
                Сколько разработчиков будет работать над продуктом? А сколько из них будет писать этот алгоритм?
                В 99.99% случаев, если ты натыкаешься в проде на момент где нужно использовать алгоритм, то первым делом ты должен посмотреть уже готовые решения этого алгоритма, выстраданные тысячами продуктов и миллионами разработчиков и взять лучшее из них. Ты же не пишешь свою реализацию ECDSA или SHA когда тебе их нужно использовать, ты берешь уже готовое решение так как в нем годами происходит оптимизация, чистка уязвимостей и прочие прелести.
                И только в тех единицах случаев, когда ты упираешься в неведомое доселе чудо ты начинаешь разрабатывать свой алгоритм.


                1. Wesha
                  04.12.2025 04:28


                  1. poige
                    04.12.2025 04:28

                    «А ты — хотя бы год на энергии в 2-х граммах плутония?»


                    1. AdrianoVisoccini
                      04.12.2025 04:28

                      ну не скажите, 2х граммов плутония ЛЮБОМУ разработчику-человеку хватит ДО КОНЦА ЖИЗНИ!!!!


                      1. Wesha
                        04.12.2025 04:28

                        ...в первую очередь потому, что без нескольких тонн свинца этот конец наступит достаточно скоро!


                      1. poige
                        04.12.2025 04:28

                        без нескольких тонн свинца

                        Из той же википедии: «… Плутоний-238 используют в радиоизотопных источниках энергии (например, в РИТЭГах)[6]. Ранее (до появления литиевых батарей[8]) использовались в кардиостимуляторах[9][10]. …»

                        Тунца, а не свинца…


                      1. Wesha
                        04.12.2025 04:28

                        Тунца, а не свинца…

                        Вы бы, прежде чем ехидничасть, задались вопросом — «а что больше потребляет энергии: 500 топовых видеокарт, или один кардиостимулятор?» — глядишь, и не выглядели бы глупо...


                      1. Zalechi
                        04.12.2025 04:28

                        Мне хватит ~ куб воды;)


                    1. Wesha
                      04.12.2025 04:28

                      «Видите ли, Жора...» ©, в случае с плутонием (и прочими радиоактивными источниками) есть нюанс несколько нюансов — на 2 грамма путония нужно много килограммов радиационной защиты (которая, да, роботам — в первую очередь их «мозгам», хотя и не только: радиационное охрупчивание конструкционных материалов — это не выдумки — тоже нужна).

                      Не говоря уж об огромной куче агрегатов, обеспечивающих превращение радиации в электричество (а «простые» РИТЭГи в лучшем случае имеют КПД где‑то в районе 5%).


                      1. poige
                        04.12.2025 04:28

                        Ну если ужас с какой серьёзностью в ответ на мемасики wesha'ть, то сам по себе плутоний — источник альфа-излучения, которое экранируется без всяких «килограммов»: «… Плутоний-238 является практически чистым альфа-излучателем …», а вот современный реактор не нём — это уже другое дело, но «видите ли, Жора» начало этого комментария достаточно чётко?


          1. IAmBogdan
            04.12.2025 04:28

            Да, но мне вот как-то хотелось перебрать весь кэш в Firefox (не спрашивайте зачем, я просто люблю пострадать фигней), так там gpt не смог написать мне решение для чтения файлов по строкам не держа их полностью в оперативке (надо было отслеживать наличие определённых слов и отдавать мне текст между ними, а они могли оказаться половиной на 1 строке, половиной на другой).

            Вроде не сложная задача, но блин, самому пришлось писать.


            1. poige
              04.12.2025 04:28

              GPT сильно разный, в зависимости от релиза и оплаты. Ну и вообще, те, кто в теме, знают, что модельки нужно пасти-вести к решению, а не ставить задачу от забора и до обеда, образно выражаясь.


        1. AdrianoVisoccini
          04.12.2025 04:28

          Если ты не чувствуешь, как ты ей скажешь, и как поймешь что решение ок?)

          "Проверь свое решение, оно точно ок?"


          1. poige
            04.12.2025 04:28

            Вообще это наивная попытка конечно, потому что в итоге легко получить n вариантов решения, которые могут быть неверными вообще, или далеки от оптимальных. Проблема валидации гораздо хитрее, и в общем виде, сродни проблеме останова — «анализатора не существует»… ©


          1. fivelife Автор
            04.12.2025 04:28

            Ставить под сомнение и перепроверять никогда не помешает. А вот что и как перепроверять зависит от того самого iq


      1. seregina_alya
        04.12.2025 04:28

        Так-то да, но правы вы оба. Любой пример - только пример. В данном случае у нас каноничная задачка, которую мы в средней школе разбирали, и я чётко помнила, что на расстоянии одного поискового запроса есть правильный ответ

        Но для более уникальной задачи такого рода готового решения уже не существует. ИИ не проявлял здесь изобретательности, он взял стандартное решение для стандартной задачи


  1. Politura
    04.12.2025 04:28

    Хм, а где там в литкоде зубрежка-то? Сборник задачек как-раз таких, вокруг которых построена статья. Не знаю как можно зубрить литкод, всегда когда садился за него, играл в него как в головоломки, иногда над сложными задачками по три дня зависая.


    1. 4kirill20
      04.12.2025 04:28

      Вы искали решение (через поиск информации, гулол) или полностью сами думали над решаем 3 дня?


      1. Politura
        04.12.2025 04:28

        Чтобы искать, три дня не нужно, достаточно зайти в обсуждение задачи и там наверняка будет чье-то решение.


  1. sale201210
    04.12.2025 04:28

    Мне тоже проект Эйлера понравился, занимался им, пока была возможность.


  1. ionicman
    04.12.2025 04:28

    Можно поспорить?

    Инженерия тут не причем - понятно дело, что если возникла необходимость решения математической нестандартной задачи (ибо стандартные типа sort и тд давно уже живут ф библиотеках и фреймворках), то необходимо посмотреть, а как ее лучше решить не "в лоб" (перебор - это, например, в лоб).

    И вот тут нужно либо воспользоваться математиком, который подскажет куда копать, или как раз таки спросить у ЛЛМ - именно не код написать, а про алго и оптимальные пути его решения, потом самому переложить это в код.

    И, имхо, правильный инженер должен поступит именно так.

    Затем, в сухом остатке остается знание, что при возникновении такого типа задач нужно воспользоваться таким-то алгоритмом. Не нужно инженеру или программисту знать наизусть кучу вещей, которые могут не понадобиться вообще. Нужно лишь понимание где может возникать бутылочное горлышко - а для этого нужна лишь базовая логика, остальное можно будет уточнить или проверить.

    Ну и, иногда, решения "в лоб" работают лучше, чем куча хитростей и сложный алго - это тоже надо понимать.


    1. Rikimortuy
      04.12.2025 04:28

      А как вы поймете что LLM не галлюцинирует, предлагая вам "оптимальный путь"? Как вы оцените, действительно ли предложенный алгоритм подходит для вашей задачи и ваших ограничений? Чтобы эффективно пользоваться советами математика, нужно самому быть немного математиком


      1. JBFW
        04.12.2025 04:28

        Нужно понимание и логика.

        Если есть предложенный вариант, но нет понимания как он работает - попросить обьяснение, а не алгоритм или сразу код.
        И подумать над ним, понять - и тогда принимать или не принимать этот вариант.

        А просто быть "немного математиком" - это как вычислять длину деревянной распорки по модулю комплексных чисел над полем Галуа, вместо того чтобы воспользоваться теоремой Пифагора (можно даже не понимать ее доказательства).


        1. wataru
          04.12.2025 04:28

          Вот объяснения LLM делать вообще почти не умеет. Она почти гарантировано галлюционирует их. Весьма правдоподобные, но противоречивые, ложные и нелогичные.


          1. JBFW
            04.12.2025 04:28

            Представьте что вы общаетесь с учеником-троечником, который очень много чего читал, но сам не понял.

            Пусть извлечёт воспоминания и попробует вам объяснить - так сами увидите связь


            1. wataru
              04.12.2025 04:28

              Тут другая ситуация: студент к экзамену ничего не выучил, но списал ответ у товарища (не факт что правильно, кстати). И он начинает вам заливать. Складно, красиво, но вообще не факт что релевантно к теме экзамена. Дело в том, что эти задачки много где приводятся с кодом, но редко с вменяемым объяснением. Поэтому LLMка, даже если угадает код, редко "вспомнит" хоть какие-то факты из объяснений.


        1. cpud47
          04.12.2025 04:28

          Ну вот говорит говорит Вам нейронка: пиши здесь здесь два вложенных цикла. Вы возразите: "но это же O(n^2)!" А она Вам: всё будет работать быстро, там вложенный цикл выполняется редко. И как быть?

          Или вот говорит она Вам: вот дерево/куча, без балансировки, используй его здесь. А это опять намёк на квадрат. Начинаете расспрашивать, и оказывается, что у них операции выполняются за "аммортизированный логарифм". И добро пожаловать в удивительное приключение об анализе аммортизированного времени.

          К сожалению, есть довольно много весьма простых и эффективных алгоритмов, которые, тем не менее, имеют очень сложные доказательства корректности и ещё более сложный анализ сложности. И без хорошей алгоритмической подготовки(а иногда и с ней) эти доказательства не прочитать даже.


    1. WASD1
      04.12.2025 04:28

      Буквально ещё 3 года назад легко в процессе работы можно было наткнуться на задачу, которую проще решить чем опознать (ну какое-нибудь префиксно-суффиксное дерево я сначала писал, а потом узнал как оно называется).

      Сегодня - да по описанию нейронка часто способна воспроизвести правильные термины.


  1. nin-jin
    04.12.2025 04:28

    У меня к вам только один вопрос: зачем вы старались, писали статью руками в лоб, когда можно было бы просто сгенерировать ее с помощью нейросети за минуту? Пора бы уже совершить фундаментальный сдвиг парадигмы в своей ментальной модели, и перестать заниматься этой ерундой.


    1. fivelife Автор
      04.12.2025 04:28

      Ну так для этого нужно промпт писать


      1. nin-jin
        04.12.2025 04:28

        Понимаю, короткий промпт написать сложнее, чем большую статью, но это важный навык в современном мире, где промпт-инжениринг совершил тектонический сдвиг в сфере революционных перфомансов.


        1. fivelife Автор
          04.12.2025 04:28

          Бесспорно, да. С таким же успехом можно комментарии генерить)) Короче пришлите мне ссылку на вашу сгенерированную статью, любо посмотреть


          1. nin-jin
            04.12.2025 04:28

            Пожалуйста: https://habr.com/ru/articles/972630

            Только никому не говорите, что она сгенерирована, а то растащат на цитаты.


        1. seregina_alya
          04.12.2025 04:28

          От случая к случаю всё меняется

          Если надо написать мусорный текст, то да, короткий промпт. Но если нужен качественный материал, который меня бы устроил, нейросеть годится искать материал, подбирать выражения, менять и согласовывать стиль, вычитывать, даже писать куски. Но максимальное ускорение работы, которого можно достичь в принципе - я пишу сумбурно и тезисно, а она вслед за мной раскрывает, упрощает и украшает мысли, не добавляя отсебятины. И потом это придётся ещё и править

          Повторюсь, это именно самый быстрый метод для качественного текста. Но другой нам не нужен, ведь так? И то тут я должна от и до знать, чего хочу. Если работа более исследовательская, так просто не выйдет.

          Это помощник, но ошибка позволять ему делать что-то самому. Даже если на вид норм


    1. Hardcoin
      04.12.2025 04:28

      Прошу лишь не выкладывать то, что вы сгенерили за минуту. Пользуйтесь сами, но не замусоривайте сайт.


    1. BlackArcher
      04.12.2025 04:28

      Так статья так и создана, странно, что тут серьезное обсуждение в комментах. Обороты в духе "Джун пишет вложенный цикл по массиву из миллиона элементов. Не чувствует боли. Процессор "съедает" всё за секунду." или "В этот момент я понял: проблема не в Python. Не в памяти. Не в процессоре. Проблема в том, как я думаю." -- это же очевидный гпт, я будто в мусорные инстаблоги с аи слопом зашел


      1. 4kirill20
        04.12.2025 04:28

        А ловко это вы заменили длинный девиз на 2 тире, чтобы мы не подумали что вы ии))