
Вчера мой скрипт завис. Процессор горел на 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)

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

ionicman
04.12.2025 04:28Можно поспорить?
Инженерия тут не причем - понятно дело, что если возникла необходимость решения математической нестандартной задачи (ибо стандартные типа sort и тд давно уже живут ф библиотеках и фреймворках), то необходимо посмотреть, а как ее лучше решить не "в лоб" (перебор - это, например, в лоб).
И вот тут нужно либо воспользоваться математиком, который подскажет куда копать, или как раз таки спросить у ЛЛМ - именно не код написать, а про алго и оптимальные пути его решения, потом самому переложить это в код.
И, имхо, правильный инженер должен поступит именно так.
Затем, в сухом остатке остается знание, что при возникновении такого типа задач нужно воспользоваться таким-то алгоритмом. Не нужно инженеру или программисту знать наизусть кучу вещей, которые могут не понадобиться вообще. Нужно лишь понимание где может возникать бутылочное горлышко - а для этого нужна лишь базовая логика, остальное можно будет уточнить или проверить.
Ну и, иногда, решения "в лоб" работают лучше, чем куча хитростей и сложный алго - это тоже надо понимать.

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

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

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

JBFW
04.12.2025 04:28Представьте что вы общаетесь с учеником-троечником, который очень много чего читал, но сам не понял.
Пусть извлечёт воспоминания и попробует вам объяснить - так сами увидите связь

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

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

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

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

fivelife Автор
04.12.2025 04:28Ну так для этого нужно промпт писать

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

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

nin-jin
04.12.2025 04:28Пожалуйста: https://habr.com/ru/articles/972630
Только никому не говорите, что она сгенерирована, а то растащат на цитаты.

seregina_alya
04.12.2025 04:28От случая к случаю всё меняется
Если надо написать мусорный текст, то да, короткий промпт. Но если нужен качественный материал, который меня бы устроил, нейросеть годится искать материал, подбирать выражения, менять и согласовывать стиль, вычитывать, даже писать куски. Но максимальное ускорение работы, которого можно достичь в принципе - я пишу сумбурно и тезисно, а она вслед за мной раскрывает, упрощает и украшает мысли, не добавляя отсебятины. И потом это придётся ещё и править
Повторюсь, это именно самый быстрый метод для качественного текста. Но другой нам не нужен, ведь так? И то тут я должна от и до знать, чего хочу. Если работа более исследовательская, так просто не выйдет.
Это помощник, но ошибка позволять ему делать что-то самому. Даже если на вид норм

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

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

4kirill20
04.12.2025 04:28А ловко это вы заменили длинный девиз на 2 тире, чтобы мы не подумали что вы ии))
pahanhik700
Спасибо, об этом стоило напомнить
poige
ChatGPT, о котором стоило напомнить, передаёт привет, и даже спасибо не просит — в карман, говорит, не положишь — подписку давай: «…
Bottom-up решение (in-place). Идём снизу вверх, накапливая максимальные суммы прямо в массиве. Псевдокод:
Смысл:
на шаге
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. …»alanin006
Да, даже Deepseek предложил версию решения с "низу-вверх"
fivelife Автор
Нейросети умеют все, если ты не ощущаешь сложности, то ты не сможешь сказать нейросети сделать по другому, когда она предложит линейный вариант
abcdsash
но только кто то должен уметь делать нейросети
fivelife Автор
Если ты не чувствуешь, как ты ей скажешь, и как поймешь что решение ок?)
poige
Так это валидация уже (а не написание), и ключевое тут собственное знание и критическое мышление — как и ресурсы на таковые, потому что они таки вполне ограничены, а не какое-то абстрактное «чувствование» вообще-то. Инженерное мышление — это на 99 % использование готовых шаблонов, нюанс лишь в их уместности. Творчества в этих процентах, грубо говоря, лишь в масштабах выбора как и какие кубики складывать. И, кстати, проблема валидации была и задолго до того, как модели код писать научились.
Но суть моего комментария не в этом даже. Он лишь о том, что даже под конец 2025 так называемый AI вполне себе сходу решает эту задачу, и даже способен указать на критерии оценки её эффективности. И «паттерны» эти модели видят уже получше большинства из нас. Так что заявления громкие, но в основном вхолостую.
Alexandroppolus
Это хрестоматийная задача, миллион раз обмусоленная и как пример ДП, и как "задача для собесов". Странно было бы, если бы гпт про неё не знал
poige
А то. Но суть-то всё же в том, что нейронки по мере роста своих масштабов способны «зреть в корень» всё эффективнее, так что задача может быть, условно говоря, переодета, но тем не менее, распознана и решена эффективно.
AdrianoVisoccini
есть прикол и с этой задачей и с тем как её решает нейронка
Подавляющее число алгоритмов типа этого... уже решены. Гораздо более умными, чем я по крайней мере, людьми. Некоторые решены всякими супер хитрыми приколами, которые и не к программированию относятся первым делом, а к математике и всяким её заковыристым подразделам.
Именно по этому нейронки умеют их решать, а точнее находить уже существующее решение и применять его.
"Но они же не смогут решить принципиально новый агоритм", воскликнешь ты, на что я сразу же вспомню мем из "Я Робот"
ой не, не этот
"А ты сможешь?"
и ещё более интересный "а тебе надо?"
Допустим у нас есть какой-то супер-пупер бигтех продукт, который будет решать сверхсложные задачи за сверхкороткое время.
Сколько разработчиков будет работать над продуктом? А сколько из них будет писать этот алгоритм?
В 99.99% случаев, если ты натыкаешься в проде на момент где нужно использовать алгоритм, то первым делом ты должен посмотреть уже готовые решения этого алгоритма, выстраданные тысячами продуктов и миллионами разработчиков и взять лучшее из них. Ты же не пишешь свою реализацию ECDSA или SHA когда тебе их нужно использовать, ты берешь уже готовое решение так как в нем годами происходит оптимизация, чистка уязвимостей и прочие прелести.
И только в тех единицах случаев, когда ты упираешься в неведомое доселе чудо ты начинаешь разрабатывать свой алгоритм.
Wesha
poige
«А ты — хотя бы год на энергии в 2-х граммах плутония?»
AdrianoVisoccini
ну не скажите, 2х граммов плутония ЛЮБОМУ разработчику-человеку хватит ДО КОНЦА ЖИЗНИ!!!!
Wesha
...в первую очередь потому, что без нескольких тонн свинца этот конец наступит достаточно скоро!
poige
Из той же википедии: «… Плутоний-238 используют в радиоизотопных источниках энергии (например, в РИТЭГах)[6]. Ранее (до появления литиевых батарей[8]) использовались в кардиостимуляторах[9][10]. …»
Тунца, а не свинца…
Wesha
Вы бы, прежде чем ехидничасть, задались вопросом — «а что больше потребляет энергии: 500 топовых видеокарт, или один кардиостимулятор?» — глядишь, и не выглядели бы глупо...
Zalechi
Мне хватит ~ куб воды;)
Wesha
«Видите ли, Жора...» ©, в случае с плутонием (и прочими радиоактивными источниками) есть
нюанснесколько нюансов — на 2 грамма путония нужно много килограммов радиационной защиты (которая, да, роботам — в первую очередь их «мозгам», хотя и не только: радиационное охрупчивание конструкционных материалов — это не выдумки — тоже нужна).Не говоря уж об огромной куче агрегатов, обеспечивающих превращение радиации в электричество (а «простые» РИТЭГи в лучшем случае имеют КПД где‑то в районе 5%).
poige
Ну если ужас с какой серьёзностью в ответ на мемасики wesha'ть, то сам по себе плутоний — источник альфа-излучения, которое экранируется без всяких «килограммов»: «… Плутоний-238 является практически чистым альфа-излучателем …», а вот современный реактор не нём — это уже другое дело, но «видите ли, Жора» начало этого комментария достаточно чётко?
IAmBogdan
Да, но мне вот как-то хотелось перебрать весь кэш в Firefox (не спрашивайте зачем, я просто люблю пострадать фигней), так там gpt не смог написать мне решение для чтения файлов по строкам не держа их полностью в оперативке (надо было отслеживать наличие определённых слов и отдавать мне текст между ними, а они могли оказаться половиной на 1 строке, половиной на другой).
Вроде не сложная задача, но блин, самому пришлось писать.
poige
GPT сильно разный, в зависимости от релиза и оплаты. Ну и вообще, те, кто в теме, знают, что модельки нужно пасти-вести к решению, а не ставить задачу от забора и до обеда, образно выражаясь.
AdrianoVisoccini
"Проверь свое решение, оно точно ок?"
poige
Вообще это наивная попытка конечно, потому что в итоге легко получить n вариантов решения, которые могут быть неверными вообще, или далеки от оптимальных. Проблема валидации гораздо хитрее, и в общем виде, сродни проблеме останова — «анализатора не существует»… ©
fivelife Автор
Ставить под сомнение и перепроверять никогда не помешает. А вот что и как перепроверять зависит от того самого iq
seregina_alya
Так-то да, но правы вы оба. Любой пример - только пример. В данном случае у нас каноничная задачка, которую мы в средней школе разбирали, и я чётко помнила, что на расстоянии одного поискового запроса есть правильный ответ
Но для более уникальной задачи такого рода готового решения уже не существует. ИИ не проявлял здесь изобретательности, он взял стандартное решение для стандартной задачи