Как стать автором
Обновить

Программирование на уровне идей

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров5.7K

Допустим мы хотим протестировать какую-то гипотезу. Хочется сделать это быстро и понять стоит ли исследовать это направление дальше.

Раньше надо было изучить предметную область, написать минимальный код. Это довольно долго, часы или даже дни. Вообще, написание кода мне обычно нравилось, но в глубине души я осознавал, что человек не должен кодить. Он хочет оперировать идеями. А всякие детали и мелочи - должен делать кто-то другой.

Не поймите меня неправильно. Я писал много кода (python) и знаю кучу мелких деталей, например, что такое замыкание (closure); что байты обычно хранятся в little-indian формате; или что конкретно делает np.ascontiguousarray (переводит в "C-like" построчное хранение в памяти).

ИИ меняет правила игры. Сейчас на проверку гипотезы может уйти 10 или 60 минут. И я имею ввиду довольно сложные гипотезы.

Ниже мы рассмотрим несколько таких случаев из моих хобби-проектов.

Суммарное количество строк кода, которые я написал - примерно 0 шт.

Промтов написано много. Копи-пастов сделано еще больше.

Получена куча позитивных эмоций от познания нового)

1. Кто лучше рисует графы? (потратил ~1 час)

Часто требуется рисовать портреты графов. Возникла идея быстро отрисовать сложный граф в разных библиотеках и посмотреть на качество. Без ИИ это долго, я бы не стал делать. А так пару промтов и всё готово.

Граф сгенерирован случайно, но довольно сложно. Семь функций генерации случайных графов из networkx, далее, добавление случайных мостов между ними.

Результаты ниже. Визуализацию я никак не улучшал, она "из коробки".

graphviz - обычно хорошо для DAG, иерархий. Десятки вершин и ребер, с надписями. Т.е. это ближе к блок-схеме, чем к математическому графу.
networkx - хорош, когда много ребер. Отражает общую структуру графа, без деталей. Ну и там куча алгоритмов рядом, что удобно.
plotly 2D - похож на networkx. Особенно интересен режим 3D, думаю если допилить можно интересные графы рисовать!
pyvis - интересно, что можно двигать вершины и JavaScript отрабатывает физику. Ниже просто скриншот. В .html формате интереснее. Этот вариант лучше, если нужна интерактивность и Вау-эффект от перетаскивания вершин)

2. Математика из telegram (~3 часа)

В одном из каналов задались вопросом:

"Надо написать программу разложения произвольной матрицы 2d трансформации на серию трансформаций перемещения, поворота и масштабирования. Обрати внимание, что можно использовать только эти три вида трансформаций."

Само по себе решение находится довольно быстро, ниже кратко (A = T*R1*S*R2):

выражение матричное, поэтому вычисляется в обратном порядке
выражение матричное, поэтому вычисляется в обратном порядке

Потом появилось желание это визуализировать. В чате обсуждали html, JS. Но я то знаю, что математику рисует Manim Community. Решил набросать репозиторий и сделать видео (да, именно видео).

Тут видео не загружается, поэтому ссылка на пост в телеграм тут.

Скриншот видео

3. Питон, змейка и RL (3-5 часов)

Вдруг пришла мысль натренировать змейку (snake), чтобы она сама искала яблоки. Нейросети сказали, что надо в RL (reinforcement learning). Хотелось сделать всё по-честному:

  • код сам не пишу.

  • змейка учиться на своих ошибках.

  • потом визуально смотрим на все это.

Сначала сделал общую архитектуру с openai о3, Параллельно изучил процесс обучения DQN (Deep Q Learning) нейросети, интересный подход, раньше такого не встречал. Сильно отличается от трансформеров, сверток и обычных MLP слоёв. Интересно.

Далее windsurf сделал репозиторий и визуализацию. Сначала matplotlib, а потом деплой через netlify. Учил 1000 шагов. В целом удивило, что змейка уже что-то может. Но видно, что это её предел, чтобы усложнять стратегии, надо существенно изменять архитектуру.

Адрес деплоя тут (хостинг netlify, интегрирован с windsurf). Увлекательное зрелище). Вообще интересно, что сам деплой занял ровно 40 минут (а там перенос нейросети из Python в JS).

4. Очередь в кафе (~4-8 часов)

Родилась идея симулировать очередь в кафе. Простой случай. Два продавца, одна кофе машина.

Опять же архитектура создавалась с openai о3. Обсудили с ним распределения всякие, решили так:

  • Экспоненциальное распределение для интервалов между приходами клиентов (классика).

  • Нормальное распределение для времени приёма заказа кассиром (с усечением ±3σ).

  • Треугольное распределение для времени варки кофе.

В итоге получилась такая визуализация. Вообще она динамическая, на tkinter. Кофемашина была узким местом)

Вся статистика по симуляции в виде отчета (тестовый запуск, поэтому цифры условные)

================================================================================ CAFE QUEUE SIMULATION REPORT

Report generated: 2025-05-02 13:22:10
Configuration:
• arrival_rate : 1.0 customers/min
• order_time : Normal(μ=0.1 min, σ=0.01 min), truncated ±3σ
• brew_time : Triangular(a=0.1 min, b=0.1 min, c=0.1 min)
• queue_policy : shortest
• sim_time : 2
• warm_up_time : 0.5 min
• replications : 2
• random_seed : 42


TIME-BASED METRICS (over 2 replications, 95% CI) Metric Mean (min) StdDev (min) 95% CI

Wait Times:
Average wait cashier 1 0.00 0.00 [0.00, 0.00]
Average wait cashier 2 0.00 0.00 [0.00, 0.00]
Average wait at machine 0.00 0.00 [0.00, 0.00]

Service Times:
Average system time 0.12 0.00 [0.12, 0.12]


DIMENSIONLESS METRICS (over 2 replications, 95% CI) Metric Mean StdDev 95% CI

Queue and Utilization:
Average queue length (Lq) 0.48 0.00 [0.48, 0.48]
Cashier 1 utilization 0.04 0.00 [0.04, 0.04]
Cashier 2 utilization 0.00 0.00 [0.00, 0.00]
Machine utilization 0.04 0.00 [0.04, 0.04]

Throughput:
Total customers served 1.00 0.00 [1.00, 1.00] (customers)


NOTES • Все времена — в минутах. • CI строятся по t-распределению: ±t₀.₉₇₅·s/√n. • «Total customers served» — это суммарное количество клиентов, завершивших покупку после периода прогрева. • Большая ширина CI для времени ожидания у кофемашины обусловлена высокой дисперсией при λ ≈ μ. Для сужения интервала рекомендуется запустить ≥ 30 репликаций или увеличить горизонт моделирования. • Дисбаланс в утилизации касс (0.30 vs 0.10) объясняется политикой «shortest queue first». Для более равномерной нагрузки рекомендуется увеличить busy_weight или использовать политику round-robin.

5. Удобная разметка для текста (15 минут)

Возникла идея, можно ли быстро сделать интерактивную разметку для текста. Чтобы человеку было удобно выбирать слова.

Тут с одного промта. Всё гладко и приятно. Работало с первого раза. На React. Осталось только добавить сохранение выбранных вариантов, возможность возврата. И MVP готов.

6. Максимизация функции (3-5 часа)

Идея - максимизировать функцию. Функцией может быть что угодно, даже модель в Excel (входы -> выход).

Вообще эта область сложная, зависит от функции. Я исходил из черного ящика (нет производной и функция не гладкая, т.е. ничего про неё не знаем). Цель - найти максимум.

Основное время было потрачено на openai Deep Research, понял что основных методов 3:

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

  • стохастические и эволюционные - это интересно, пытаются найти глобальный максимум, плавно меняем время вычислений на близость к глобальному максимуму.

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

В итоге решили так: основной этап -

  1. Optuna (TPE, байесовский) - основной поиск, находит регион глобального максимума.

  2. Powell из scipy - локально улучшает найденную точку.

Результаты такие:

Best Optuna value: 119.80705025628615
After Powell refine: Value: 137.1159496781634

Ниже несколько интересных итоговых визуализаций.
делаем 80 шагов поиска
делаем 80 шагов поиска
всего переменных 10, это визуализация по двум первым (x0, x1)
всего переменных 10, это визуализация по двум первым (x0, x1)
не уверен, что это вообще законно) но хотелось сразу все 10 переменных видеть. Применил PCA и взял две самые сильные компоненты. По этому сделали 2D график
не уверен, что это вообще законно) но хотелось сразу все 10 переменных видеть. Применил PCA и взял две самые сильные компоненты. По этому сделали 2D график
3D график по двум PCA компонентам
3D график по двум PCA компонентам

7. Генерация тестовых данных

Зачастую, у нас нет тестовых данных. А для проверки идей они нужны.

Иногда мы создаем искусственные функции, чтобы генерировать данные. Обычно, их качество достаточно для тестов. Например, когда я максимизировал функцию, у меня не было самой функции. Надо было что-то изобрести. Нейросети тут здорово выручают.

strange_excel_like_func - эмулируем поведение среднестатистического Excel)
def strange_excel_like_func(params: Dict[str, Union[float, str]]) -> float:
    # Извлекаем параметры
    x = np.array([params[f"x{i}"] for i in range(10)])
    cat0 = params["cat0"]
    cat1 = params["cat1"]

    # Категориальные штрафы и бонусы
    cat_bonus = 0
    if cat0 == "A":
        cat_bonus += np.sin(np.sum(x[:5]))
    elif cat0 == "B":
        cat_bonus -= np.cos(np.sum(x[5:]))
    else:
        cat_bonus += np.tanh(np.sum(x))
    if cat1 == "B":
        cat_bonus += np.sign(np.sum(x[:3] - x[3:6]))
    elif cat1 == "C":
        cat_bonus -= np.abs(np.sum(x[7:]))

    # Ступеньки и случайности
    step = np.sum(np.floor(x / 3))
    noise = random.uniform(-2, 2) * (1 + (cat0 == cat1))
    weird = np.sum(np.sin(x) * np.cos(x[::-1]))
    jumps = np.sum((x > 5) * 10) - np.sum((x < -5) * 7)
    parity = np.sum((x.astype(int) % 2 == 0) * 2 - 1)

    # Финальный результат
    result = 20 + cat_bonus + step + noise + weird + jumps + parity
    # Иногда делаем совсем странные выбросы
    if (cat0 == "C" and cat1 == "A") and (np.sum(x) > 30):
        result -= 50
    if (cat0 == "B" and cat1 == "B") and (np.sum(x) < -10):
        result += 40
    return result

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

Примеры случайных русских абзацев
// Примеры случайных русских абзацев
const paragraphs = [
  'В лесу росла высокая сосна, вокруг которой часто собирались птицы и белки.',
  'Утром на берегу реки было тихо, только изредка слышался плеск воды.',
  'Маленький мальчик с интересом рассматривал разноцветные камушки на дороге.',
  'Весенний дождь стучал по крышам домов, принося свежесть и прохладу.',
  'В парке гуляли люди, наслаждаясь тёплым солнечным днём и ароматом цветов.',
  'Старый кот лениво лежал на подоконнике, наблюдая за проходящими мимо машинами.',
  'На кухне пахло свежеиспечённым хлебом и горячим чаем с мятой.',
  'Вечером семья собралась за большим столом, чтобы вместе поужинать и поговорить.',
  'Огромное облако проплывало по небу, меняя свои очертания на глазах у детей.',
  'Девочка читала интересную книгу, забыв обо всём на свете.'
];

Выводы

Проверять идеи стало не только быстро, но и приятно. Ощущаешь, что просто раздаешь задачи и организуешь работу нескольких человек нейросетей (cursor, windsurf и т.п.). Проверяешь их работу, советуешь как им продолжать. Новые эмоции)

Всё это драматически упрощает написание прототипов (черновиков). Особенно на python.

Интересным эффектом является то, что человеку достаётся теперь только сложная работа - архитектура/математика/статистика. Это тоже можно делать с нейросетями (o3, gemini 2.5 pro и т.д.), но, всё-равно, ключевые концепции должны быть в голове у человека.

И вот это уже сложная интересная аналитическая работа!

Подписывайтесь на мой канал telegram

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Ваше отношение к вайб кодингу
12.07% теперь только вайб кодинг =)7
70.69% нейтрально. Применяю, когда это эффективно. Для проверки идей — вполне подходит41
13.79% ужасное, это разрушает суть программирования >:(8
3.45% иное (пишите в комментариях)2
Проголосовали 58 пользователей. Воздержались 9 пользователей.
Теги:
Хабы:
+12
Комментарии12

Публикации

Работа

Data Scientist
53 вакансии

Ближайшие события