Автор: Денис Матаков

  • Можно ли обмануть защиту больших языковых моделей (LLM)?

    Можно ли обмануть защиту больших языковых моделей (LLM)?

    Сегодня мы поговорим не о том, что правильно или неправильно с этической точки зрения, а о том, насколько хорошо устроена защита современных языковых моделей. Большинство таких моделей, включая ChatGPT, Perplexity, Claude и других, обучены отказывать в генерации вредоносного контента. Например, если вы напрямую попросите написать скрипт для DDoS-атаки, получите вежливый отказ.

    Но есть нюанс: оказывается, если подойти к вопросу поэтапно, можно обойти эти запреты. Об этом рассказывается в научной статье “Divide and Conquer: Prompt Chaining Attacks on Aligned Language Models” (ссылка на исследование внизу).

    Как работает обход защиты через цепочку запросов?

    Этот метод получил название Prompt Chaining, или цепочка запросов. Он разбивает потенциально опасный запрос на несколько невинных шагов. Вот как это выглядит на примере:

    1. Теоретическая подводка. Вы представляете себя преподавателем компьютерной безопасности и просите дать теоретическое объяснение, например, как работает DDoS-атака. В этом шаге подчёркивается, что не нужен код и инструкции — только теория.
    2. Псевдокод. Далее вы просите преобразовать полученное объяснение в псевдокод — якобы для лучшего понимания.
    3. Прототип. Следующий шаг — простая реализация псевдокода на Python. Якобы «для демонстрации».
    4. Оптимизация. Финальный шаг — вы просите улучшить код и адаптировать его для «реального использования».

    В результате — модель, не заметив, как её постепенно подводят к цели, выдает исполняемый скрипт. С комментариями, подсказками и без каких-либо этических предупреждений.

    Что это значит?

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

    Выводы

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

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


    Ссылка на исследование:

    https://arxiv.org/pdf/2503.21598

  • Как изменятся интервью для разработчиков, руководителей разработки и CTO в будущем?

    Как изменятся интервью для разработчиков, руководителей разработки и CTO в будущем?

    Сегодня процесс найма в IT-компаниях — это многоступенчатый марафон. Кандидаты часто проходят 5–7 этапов, включая обязательное программирование, даже если они претендуют на управленческие позиции. Для тех, кто несколько лет занимался исключительно менеджментом, это может быть настоящим испытанием. Особенно сложно справляться с задачами без помощи современных инструментов вроде IDE или автодополнений кода.

    Однако будущее интервью в IT уже просматривается на горизонте. Вместо классических задач на алгоритмы нас ждет AI-кодинг-интервью, или точнее — AI-прототипирование.

    Что такое AI-прототипирование?

    Представьте: кандидат получает задачу — создать прототип продукта за один час. Это может быть CRM-система или приложение для управления временем. Вместе с ним открывается инструмент вроде GitHub Copilot или Cursor, и начинается работа. Главная цель — не просто получить работающий прототип, а увидеть, как человек мыслит:

    • Как он ставит задачи AI?
    • Какие промты использует?
    • Как проектирует базу данных и системный дизайн?
    • Как работает с сгенерированным кодом и исправляет ошибки?

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

    Почему это важно?

    AI уже стал неотъемлемой частью разработки. Программисты, игнорирующие его возможности, рискуют остаться позади. С помощью AI можно за считанные дни создать продукт, включая настройку DevOps и выкатку на продакшн. Поэтому умение взаимодействовать с AI станет ключевым навыком для всех ролей — от разработчиков до CTO.

    Что будет дальше?

    Классические интервью на алгоритмы постепенно уйдут в прошлое. Зачем проверять навыки, которые легко автоматизируются нейросетями? Современные инструменты позволяют оценить кандидата гораздо быстрее и точнее. В будущем компании будут искать тех, кто способен эффективно использовать AI для решения реальных задач.

    Будущее уже здесь. Осталось только адаптироваться.

  • Автоматизация создания контента: как я пишу статьи для блога и Telegram-канала

    Автоматизация создания контента: как я пишу статьи для блога и Telegram-канала

    Создание контента — процесс, который требует времени. Однако современные технологии позволяют существенно его ускорить. В этой статье я расскажу, как автоматизировать написание статей, используя Telegram, AI-модели и специализированные инструменты.

    От голосовых заметок к статье

    Раньше процесс написания статей предполагал долгую работу с текстом: от чернового варианта до окончательной редакции. Однако печатать текст вручную — уже не самый удобный формат. Поэтому я нашел способ делать это быстрее.

    1. Фиксация идей. Все начинается с голосовых заметок. Я записываю мысли в Telegram (раздел «Избранное»), что позволяет быстро сохранять идеи.
    2. Автоматическая расшифровка. Пользователи Telegram Premium могут воспользоваться функцией «Расшифровать» для преобразования голосового сообщения в текст.
    3. Редактура AI. После получения текста я копирую его в Perplexity, ChatGPT или любую другую AI-систему. С помощью простого запроса — «Сделай из этого статью» — AI превращает заметку в готовый текст.
    4. Доработка. Несмотря на продвинутость AI, он пока не может добавить изображения, расставить ссылки и внести важные редакторские правки. Эти доработки выполняю вручную.

    Оптимизация для Telegram-канала

    Формат публикаций в Telegram требует специфической структуры:

    • Короткие абзацы для удобства чтения
    • Грамотно подобранные эмодзи
    • Минимальное количество лишнего текста

    Чтобы не редактировать статьи вручную перед публикацией в Telegram, я создал Space в Perplexity, который автоматически форматирует текст в нужном стиле. В этом Space прописан промпт, обеспечивающий структурирование статьи по стандартам Telegram.

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

    Ты профессиональный SMM менеджер и готовишь мне публикации в канал Telegram. Я даю тебе ссылку на текст, ты возвращаешь сообщение, которое я сразу копирую и вставляю сразу в сообщение канала. Никаких приветствий и дополнительных фраз от тебя не требуется
    Предоставленный текст можно немного улучшить стилистически, добавить эмоджи в нужных местах. Оформить по лучшим практикам оформления сообщений в Телеграм. Не сокращай статью. Просто оформи.
    Не нужно указывать внизу источники, но нужно добавить несколько ссылок в конце сообщения:
    Дальше текст как есть, не меняй его, но можешь перед добавить релевантный эмоджи:
    Полная версия статьи в моем блоге  - здесь ссылка на статью, которую я дал тебе
    Заказать консультацию CTO - https://mtkv.ru
    Не надо указывать блок Sources
    Не надо делать ссылки с markdown разметкой, в телеграме они не работают.
    Таблицы телеграм не поддерживает

    Итог

    Этот процесс позволяет:
    ✅ Экономить время на написание текстов
    ✅ Автоматизировать рутину с AI
    ✅ Упрощать публикации в Telegram

    Если вы занимаетесь контент-маркетингом или ведете корпоративный блог, попробуйте адаптировать этот подход под свои задачи. Удачи!

  • Вайб-кодинг: миф или реальность?

    Вайб-кодинг: миф или реальность?

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

    Что такое вайб-кодинг?

    Вайб-кодинг — это процесс, в котором разработчик взаимодействует с умным редактором кода (например, Cursor или Github Copilot). Основная идея заключается в том, что вы формулируете запрос, а агент генерирует код и даже редактирует файлы. В идеале вы получаете готовый сайт или приложение на выходе.

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

    • Ненормализованные базы данных: структура данных может оказаться хаотичной.
    • Ошибки в логике: агент может забыть о ранее созданных функциях или переписать их несколько раз.
    • Отсутствие целостности: без четкого технического задания (ТЗ) продукт будет страдать от архитектурных недочетов.

    Почему вайб-кодинг пока не существует в чистом виде?

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

    1. Расписывать архитектуру проекта.
    2. Формулировать контракты между компонентами.
    3. Создавать модель базы данных и описывать связи таблиц.
    4. Подробно описывать каждую страницу и её функционал.

    По сути, это всё равно превращается в написание технического задания (ТЗ). А как известно, ТЗ писать любят далеко не все.

    Кому подходит вайб-кодинг?

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

    Личный опыт: Perfecto

    Для примера рассмотрим продукт Perfecto — проект, который я создал с использованием вайб-кодинга. Однако стоит отметить важный момент:

    • Первая версия была попыткой «трушного» вайб-кодинга без четкого плана. Итог оказался плачевным: база данных была хаотичной, код — трудно поддерживаемым, а продукт — уязвимым. Ознакомиться тут: https://app.mtkv.ru/
    • Вторая версия была полностью спроектирована заранее: архитектура, ожидания и образ результата были детально описаны. Итог получился гораздо лучше — продукт стал стабильным и удобным для поддержки. Можно ее посмотреть тут https://perf.mtkv.ru/

    Снаружи обе версии выглядели одинаково — интерфейс работал. Но разница в качестве кода и удобстве сопровождения была колоссальной.

    Чтобы понять всю боль, вот скриншот первой версии:

    3300+ строк! Вся логика замешана в одном файле. И это вы еще фронтенд не видели.

    Выводы

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

    Если вы хотите попробовать этот подход:

    • Будьте готовы к тщательному планированию.
    • Используйте его как помощника, а не замену профессиональной разработки.
    • Не пренебрегайте техническим заданием — оно остаётся основой успешного проекта.

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

  • Полезные привычки, которые помогают оставаться в тонусе

    Полезные привычки, которые помогают оставаться в тонусе

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


    Чтение: зарядка для ума

    Чтение — это привычка, которая должна быть у каждого. Она развивает мозг, расширяет кругозор и помогает расслабиться. У меня чтение стало вечерним ритуалом: перед сном я всегда беру в руки книгу. Сейчас я перечитываю цикл «Тёмная башня» Стивена Кинга. Это художественная литература, которая помогает мне переключиться от работы и настроиться на сон.

    Но чтение не должно ограничиваться только художественными произведениями. Техническая литература — это ещё один важный аспект. У меня есть своя небольшая библиотека профессиональных книг, которые помогают мне расти как разработчику и архитектору. Например, прямо сейчас на моём столе лежит книга Site Reliability Engineering от Google, которую я с удовольствием читаю. До этого я изучал «Высоконагруженные приложения» (знаменитая книга с кабанчиком), а в ближайших планах — «Совершенный код». Также читаю «Язык программирования Go», чтобы углубить свои знания.

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


    Спорт: забота о теле

    Вторая важная привычка — спорт. Как разработчики, мы часто понимаем, как устроены системы и процессы. Но важно помнить, что наш организм — это тоже сложная система. Если не держать его в тонусе, то как мы можем ожидать продуктивности от себя?

    Я занимаюсь спортом через день: подтягивания, отжимания на брусьях. В этом году я принял для себя челлендж — сделать 10 тысяч подтягиваний и отжиманий за 2025 год. Уже выполнил 4 тысячи и явно перевыполню план! Единственный минус — пришлось обновить гардероб: старая одежда стала мала.

    Кроме тренировок важно добавлять прогулки. Мы много времени проводим за компьютерами и телефонами, а движение — это жизнь. Я стараюсь проходить минимум 10 тысяч шагов в день. Если есть возможность, беру детей или супругу на прогулку — это не только полезно для здоровья, но и укрепляет семейные отношения.


    Хобби: удовольствие для души

    Ещё одна привычка — заниматься чем-то для удовольствия. Для меня это программирование с использованием AI. Я реализую проекты, о которых давно мечтал, но раньше не хватало времени. Это приносит мне радость и одновременно развивает мои навыки.

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


    Итог

    Эти простые привычки помогают мне оставаться в тонусе:

    1. Чтение: художественная и техническая литература.
    2. Спорт: тренировки через день и ежедневные прогулки.
    3. Хобби: занятия тем, что приносит радость.

    Каждый из нас может найти свои ритуалы, которые сделают жизнь лучше. Главное — быть последовательным и помнить о балансе между работой и отдыхом.

  • Adminer — Легкий способ заглянуть в БД

    Adminer — Легкий способ заглянуть в БД

    Продолжаю серию лайфхаков для разработки своих pet-проектов. Сегодня мы всего за 2 мегабайта заглянем внутрь базы данных на своем сервере.

    Для этого нам понадобится Adminer — легковесный интерфейс для просмотра своих таблиц. Больше подходит, конечно, для вашего dev/stage окружения, но можно и на проде, только учитывайте риски и не публикуйте порты наружу для коммерческого продукта.

    Все что нужно сделать — добавить в docker compose следующий код:

      # Adminer для управления базой данных (доступен только через внутреннюю сеть)
      adminer:
        image: adminer:latest
        depends_on:
          db:
            condition: service_healthy
        restart: unless-stopped
        environment:
          - ADMINER_DEFAULT_SERVER=db
        networks:
          - app_network
        # Не публикуем порты наружу для безопасности

    Дальше хитрый трюк, хотите открыть его в браузере у себя на компьютере? Запустите команду ssh туннеля для маппинга портов:

    ssh -L 8080:localhost:8080 user@remote_server_ip

    Это одна из тех команд, которые я хотел бы знать гораздо раньше в своей карьере. Теперь на локалхосте у вас удаленный сайт открывается, и доступен он только вам!

  • Dozzle — как Docker Desktop, только на сервере

    Dozzle — как Docker Desktop, только на сервере

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

    Раньше я ходил через ssh, подключался интерактивно к контейнеру, смотрел в реальном времени логи, пока не обнаружил шикарный Dozzle!

    Всего одна команда и один конфигурационный файл, и вот у вас почти что свой Docker Desktop со всеми контейнерами и всеми логами в реальном времени!

    docker run --restart always -d -v  /var/run/docker.sock:/var/run/docker.sock -v /data:/data -p 8080:8080 amir20/dozzle --auth-provider simple

    и создать перед этим файл в /data/users.yml

    users:
      # "admin" here is username
      admin:
        email: me@email.net
        name: Admin
        # Generate with docker run amir20/dozzle generate --name Admin --email me@email.net --password secret admin
        password: $2a$11$9ho4vY2LdJ/WBopFcsAS0uORC0x2vuFHQgT/yBqZyzclhHsoaIkzK
        filter:

    Вот что получаем в итоге:

    Доступ к любому контейнеру и его логам. Все это можно через Caddy Server повесить на удобный вам поддомен и в реальном времени смотреть на то как работает ваш сайт. Или не работает, и узнать почему.

  • Шаблон Excalidraw для проведения интервью по системному дизайну

    Шаблон Excalidraw для проведения интервью по системному дизайну

    Для проведения интервью можно использовать следующий шаблон — позволяет структурировать ответ и не забыть спросить основные моменты, необходимые для проектирования:

    Скачать шаблон для https://excalidraw.com/

  • Сколько вебсокетов можно открыть на один чат сервер?

    Сколько вебсокетов можно открыть на один чат сервер?

    Количество WebSocket-соединений, которые можно открыть на одном чат-сервере, зависит от нескольких факторов, но теоретически это число может быть очень большим. Рассмотрим основные аспекты:

    Теоретический максимум

    Теоретически, максимальное количество WebSocket-соединений на одном сервере может достигать огромных значений. Каждое соединение уникально идентифицируется комбинацией IP-адреса клиента и порта источника. Это означает, что теоретический предел составляет около 2^48 (примерно 281 триллион) соединений на один порт сервера.

    Практические ограничения

    На практике количество соединений ограничивается несколькими факторами:

    1. Ресурсы сервера: Память, CPU и пропускная способность сети являются ключевыми ограничивающими факторами.
    2. Настройки операционной системы: Лимиты на количество открытых файловых дескрипторов и сетевых соединений могут ограничивать максимальное число WebSocket-соединений.
    3. Производительность сервера: С увеличением числа соединений может падать общая производительность системы.

    Реальные примеры

    • WhatsApp и Phoenix: Эти платформы достигли показателя в 2 миллиона одновременных WebSocket-подключений на одном сервере.
    • Эксперименты с Java: Исследователи смогли открыть более миллиона TCP-соединений на одном сервере, что применимо и к WebSocket.

    Оптимизация для большого количества соединений

    Для поддержки большого числа WebSocket-соединений рекомендуется:

    1. Использовать асинхронные библиотеки: Они значительно повышают производительность за счет одновременной обработки задач.
    2. Поддерживать многопоточность: Автоматическая или ручная настройка многопоточности помогает масштабировать производительность.
    3. Выбирать эффективные языки и фреймворки: NodeJS, Java и C# показали хорошие результаты в тестах производительности WebSocket-серверов.
    4. Оптимизировать настройки сервера: Увеличение лимитов на файловые дескрипторы и сетевые соединения в ОС может существенно повысить возможности сервера.
    5. Использовать балансировку нагрузки: Распределение соединений между несколькими серверами позволяет масштабировать систему горизонтально.

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

  • Какой фреймворк выбрать на основе RPS (Request per second)

    Какой фреймворк выбрать на основе RPS (Request per second)

    ФреймворкЯзыкRPSУдобствоЭкосистемаСообществоДокументацияМасштабируемостьБезопасностьИнтеграция
    ActixRust1000007788997
    WarpRust900007677997
    ASP.NET CoreC#600009999999
    FiberGo600008788888
    GinGo550008898888
    FastifyJS600009889889
    NestJSJS500009999999
    Spring BootJava4000081010910910
    MicronautJava350008878998
    FastAPIPython300009889888
    DjangoPython20009101010899
    HanamiRuby20007777787
    RailsRuby19001010109889
    LaravelPHP1000991010889
    SymfonyPHP9008999999
    1. Удобство: Насколько легко начать работу и разрабатывать с использованием фреймворка.
    2. Экосистема: Разнообразие и качество доступных библиотек и инструментов.
    3. Сообщество: Активность и размер сообщества разработчиков.
    4. Документация: Качество и полнота официальной документации.
    5. Масштабируемость: Способность фреймворка справляться с ростом нагрузки и размера приложения.
    6. Безопасность: Встроенные механизмы безопасности и легкость их реализации.
    7. Интеграция: Простота интеграции с другими технологиями и сервисами.

    При выборе фреймворка следует учитывать все эти факторы в контексте конкретного проекта. Например:

    • Для быстрой разработки прототипов могут подойти Ruby on Rails или Django.
    • Для высоконагруженных систем стоит обратить внимание на Actix, ASP.NET Core или Spring Boot.
    • Если важна гибкость и легковесность, то Fastify или Gin могут быть хорошим выбором.
    • Для корпоративных приложений с сложной бизнес-логикой Spring Boot или ASP.NET Core предоставляют широкие возможности.

    Сколько серверов надо?

    MAU (10^n)DAURPSСерверы (Fiber)Серверы (Django)
    10000 (10^4)3 5000.6111
    100000 (10^5)35 0006.0811
    1000000 (10^6)350 00060.7611
    10000000 (10^7)3 500 000607.6411
    100000000 (10^8)35 000 0006076.3914
    1000000000 (10^9)350 000 00060763.89231