Недавно на созвоне в Соер.Клубе обсуждали вопросы создания Architecture Decision Record (ADR), у нас была задача описать условия при которых целесообразно создавать и вести ADR.
Обсудили огромное количество деталей, которые хочется обобщить и зафиксировать в виде коротких подсказок. Возможно вам тоже будет полезно.
#cards #adr
Обсудили огромное количество деталей, которые хочется обобщить и зафиксировать в виде коротких подсказок. Возможно вам тоже будет полезно.
#cards #adr
1👍42 9 6🔥5
Forwarded from Соер.Клуб | инженерный подход
Первый шаг к понимаю архитектуры ПО - понимание контекста решаемого вопроса.
Я много консультирую, провожу воркшопы, делаю курсы по архитектуре и заметил одну важную деталь - часто люди упускают момент, который является основным ключом к пониманию архитектуры - контекст.
Сложность в том, что по архитектуре ПО нет общего стандарта, который можно было бы брать за основу и говорить всем "так и только так правильно", одни и те же термины используются разными авторами в разных контекстам по-разному (например, "зависимость" в UML и зависимость в DIP - имеют разные смыслы, или "пасивность view" в MVC и MVP тоже разные, более того есть свой вариант MVC для десктопов и веб).
Поэтому при проектировании я придерживаюсь следующего порядка:
1. Определить контекст
2. Определит архитектурную идею (об этом как-нибудь тоже расскажу)
3. Отразить схему или диаграмму для иллюстрации идеи.
Графическое представление идеи - очень важно, но без контекста может сильно запутать. Пока не появится привычки отделять "мух от котлет" ни о каком понимании речи идти не может.
Я много консультирую, провожу воркшопы, делаю курсы по архитектуре и заметил одну важную деталь - часто люди упускают момент, который является основным ключом к пониманию архитектуры - контекст.
Сложность в том, что по архитектуре ПО нет общего стандарта, который можно было бы брать за основу и говорить всем "так и только так правильно", одни и те же термины используются разными авторами в разных контекстам по-разному (например, "зависимость" в UML и зависимость в DIP - имеют разные смыслы, или "пасивность view" в MVC и MVP тоже разные, более того есть свой вариант MVC для десктопов и веб).
Поэтому при проектировании я придерживаюсь следующего порядка:
1. Определить контекст
2. Определит архитектурную идею (об этом как-нибудь тоже расскажу)
3. Отразить схему или диаграмму для иллюстрации идеи.
Графическое представление идеи - очень важно, но без контекста может сильно запутать. Пока не появится привычки отделять "мух от котлет" ни о каком понимании речи идти не может.
1👍14 4 3
Хочу поделиться с вами публичным гайдом Как правильно использовать и обрабатывать исключения в программе, который поможет улучшить обработку ошибок и исключений на бэкенде. Если хотите такой же гайд для обработки ошибок на фронтенде, то давайте соберем 100 отметок 💡 и я подготовлю материал для вас.
Please open Telegram to view this post
VIEW IN TELEGRAM
SOER.MEDIA
Как правильно использовать и обрабатывать исключения в программе (для бэкенда)
Постоянно сталкиваюсь с глубоким непониманием того как должны обрабатываться исключения в современных приложениях, реализующих клиент-серверный подход. Поэтому решил собрать краткий гайд об основных моментах, которые нужно учесть при обработке исключений
Сейчас на практике встречается четыре основных подход в архитектуре:
1️⃣ Монолит
2️⃣ Сервисный подход
3️⃣ Микросервисный
4️⃣ Событийный подход
Последний часто комбинируется вместе с микросервисами и по сути является способом организовать реактивное поведение в системе.
Это базовая четвёрка является основой абсолютного большинства решений на рынке. Я сделал небольшой обзор каждого из них. Думаю будет полезно ознакомиться каждому.
Последний часто комбинируется вместе с микросервисами и по сути является способом организовать реактивное поведение в системе.
Это базовая четвёрка является основой абсолютного большинства решений на рынке. Я сделал небольшой обзор каждого из них. Думаю будет полезно ознакомиться каждому.
Please open Telegram to view this post
VIEW IN TELEGRAM
SOER.MEDIA
Чем отличаются монолитная, сервисная, микросервисная и event-driven архитектуры
В современной разработке программного обеспечения существует несколько фундаментальных архитектурных стилей, определяющих структуру, принципы взаимодействия компонентов и эволюцию системы. Понимание их различий является критически важным для выбора оптима
3❤34👍22 9 6
В прошлом посте об обработке ошибок на бэкенде мы собрали больше 100 отметок 💡 , выполняю свое обещание и публикую новую заметку на тему исключений - Как правильно обрабатывать исключения (для фронтенда). На этот раз я больше задумался об архитектурных вопросах обработки ошибок, и в итоге получил более полный и глубокий разбор, надеюсь вам понравится.
SOER | PRO | Boosty
SOER | PRO | Boosty
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
S0ER
Хочу поделиться с вами публичным гайдом Как правильно использовать и обрабатывать исключения в программе, который поможет улучшить обработку ошибок и исключений на бэкенде. Если хотите такой же гайд для обработки ошибок на фронтенде, то давайте соберем 100…
1 19👍13 4
Программирование в значительной степени эмпирическая штука, теория строится не на базе строго доказанных теорем, а на основе обобщения личного опыта. Поэтому трудно винить программистов в том, что они придумывают и придумывают новые правила.
Ради справедливости стоит сказать, что некоторые правила оказываются весьма удачными, потому что просты и понятны. Примеры хороших правил - "is-a" и "has-a".
IS-A
гласит, что наследование уместно использовать там, где можно вместо слова "наследование" подставить "is-a" (является). Если мы хотим понять, может ли стул наследоваться от стола, то фраза "стул является столом" подсказывает, что нет, не можем.
HAS-A
гласит, что композицию уместно использовать там, где слово "композиция" может быть заменена на "has-a" (имеет). Например, "Стол это композиция столешницы и ножек" может быть заменен на "Стол имеет столешницу и ножки", правило выполняется, а следовательно композиция в данном случае применима.
Ради справедливости стоит сказать, что некоторые правила оказываются весьма удачными, потому что просты и понятны. Примеры хороших правил - "is-a" и "has-a".
IS-A
гласит, что наследование уместно использовать там, где можно вместо слова "наследование" подставить "is-a" (является). Если мы хотим понять, может ли стул наследоваться от стола, то фраза "стул является столом" подсказывает, что нет, не можем.
HAS-A
гласит, что композицию уместно использовать там, где слово "композиция" может быть заменена на "has-a" (имеет). Например, "Стол это композиция столешницы и ножек" может быть заменен на "Стол имеет столешницу и ножки", правило выполняется, а следовательно композиция в данном случае применима.
2👍61 10 6❤2👎2🔥1👌1
Forwarded from Соер.Клуб | инженерный подход
#бриф
Соер.Клуб активно пополняется новыми материалами, мы наконец-то подошли к концу курса по монолитной архитектуре и активно готовимся к курсу по сервисной архитектуре. Далее короткий список материалов, с которыми можно ознакомиться:
Без подписки (публичные материалы):
- Как правильно использовать и обрабатывать исключения в программе (для бэкенда)
- Как правильно обрабатывать исключения (для фронтенда)
- Чем отличаются монолитная, сервисная, микросервисная и event-driven архитектуры
- Что такое URL, URN и URI. В чем их различие
- Алгоритм работы https handshake
Лекции по архитектуре
- Лекция. Сбор требований
- Лекция. Архитектурный ландшафт монолитного приложения
- Лекция. Проведение границ и разделение обязанностей, модульные монолиты
- Лекция. Проектирование (модель C4)
- Лекция. Введение в паттерны проектирования
- Лекция. Шаблонизация
- Лекция. Работа с контейнерной инфраструктурой для монолита
- Лекция. Облачные провайдеры и виртуализация
- Лекция. Проксирование и маршрутизация запросов в монолитных приложениях
- Лекция. Анализ вектора развития приложения
Воркшопы
- Воркшоп. Разбираем сбор требований на примере
- Воркшоп. Описание архитектурного ландшафта приложения
- Воркшоп. Анализ границ готового приложения
- Воркшоп. Пример описания проекта по модели C4
- Воркшоп. Развертывание приложения NestJS в монорепозитории
- Воркшоп. Примеры применения шаблонизации
- Воркшоп. Контейнеризация приложения
- Воркшоп. Разбор примера облачной инфраструктуры
- Воркшоп. Развертывание Nginx как прокси сервера
Созвоны
- Созвон. Анализ и подготовка требований
- Созвон.Архитектурный ландшафт монолитного приложения
- Созвон. Рефакторинг архитектуры и сбор требований
- Созвон. Компонентная диаграмма и зависимости
- Созвон. Обсуждение модели С4, обсуждения эффективных методов погружения в архитектуру
- Созвон. Использование мультиагентных систем ИИ и планировние контекст
- Созвон. Обсуждение С4 и эволюции архитектуры
- Созвон. Terraform vs Ansible, планы на развитие курсов
Гайды
- Установка и настройка nginx
- Автоматизированное развертывание Docker с помощью Ansible
Все перечисленные материалы можно получить по подписке, до конца месяца действует льготная цена на подписки STREAM, WORKSHOP
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥6❤1
Промпт для исправления ошибок в коде
Некоторое время использую QWEN3-Coder-480b-А35b-Instruct и QWEN Coder. Модель в чем-то хороша, в чем-то не очень. Хочу рассказать о своем опыте борьбы с неверным поведением модели.
Когда ИИ генерирует программный код, он может допускать ошибки, как и обычный разработчик. Синтаксические проблемы исправляются довольно просто, но встречаются и более сложные случаи, связанные с семантикой.
Хочу разобрать конкретный пример, который демонстрирует, насколько по-разному может работать ИИ в зависимости от формулировки промпта.
Сообщение от интерпретатора выглядит так:
На первый взгляд кажется, что это стандартная синтаксическая ошибка, но в действительности наша проблема связана с семантикой. Рассмотрим фрагмент кода, на который указывает интерпретатор:
Особенность в том, что "function" здесь представляет собой имя поля в таблице, а не ключевое слово Lua для объявления функций. Это требование продиктовано не локальными особенностями, а спецификацией OpenAI API. Следовательно, ИИ должен не только диагностировать суть недочёта, но и предложить корректное решение. Например, вместо замены имени поля следует использовать обращение через квадратные скобки:
Некоторое время использую QWEN3-Coder-480b-А35b-Instruct и QWEN Coder. Модель в чем-то хороша, в чем-то не очень. Хочу рассказать о своем опыте борьбы с неверным поведением модели.
Когда ИИ генерирует программный код, он может допускать ошибки, как и обычный разработчик. Синтаксические проблемы исправляются довольно просто, но встречаются и более сложные случаи, связанные с семантикой.
Хочу разобрать конкретный пример, который демонстрирует, насколько по-разному может работать ИИ в зависимости от формулировки промпта.
Сообщение от интерпретатора выглядит так:
Failed to run `config` for agentsoer.nvim
vim/loader.lua:0: ...soer/projects/agentsoer.nvim/lua/agentsoer/engine/ai.lua:43: '<name>' expected near 'function'
# stacktrace:
- vim/loader.lua:0
- lua/agentsoer/commands.lua:5
- lua/agentsoer/init.lua:4
- ~/.config/nvim/lua/plugins/init.lua:34 _in_ **config**
- ~/.config/nvim/init.lua:17
На первый взгляд кажется, что это стандартная синтаксическая ошибка, но в действительности наша проблема связана с семантикой. Рассмотрим фрагмент кода, на который указывает интерпретатор:
42 local function handle_tool_call(tool_call)
43 if tool_call.function.name == "list_directory" then
44 local success, params = pcall(vim.fn.json_decode, tool_call.function.arguments)
45 if success then
Особенность в том, что "function" здесь представляет собой имя поля в таблице, а не ключевое слово Lua для объявления функций. Это требование продиктовано не локальными особенностями, а спецификацией OpenAI API. Следовательно, ИИ должен не только диагностировать суть недочёта, но и предложить корректное решение. Например, вместо замены имени поля следует использовать обращение через квадратные скобки:
['function'].name
.GitHub
GitHub - QwenLM/qwen-code: Qwen Code is a coding agent that lives in the digital world.
Qwen Code is a coding agent that lives in the digital world. - QwenLM/qwen-code
❤7👍7👎6
Здесь проявляется любопытная закономерность. Если просто попросить LLM исправить сообщение об ошибке, система воспримет информацию от интерпретатора буквально и сосредоточится на синтаксических аспектах, вместо того чтобы исследовать корневую причину.
Неудачный промпт:
Эффективный промпт:
Неудачный промпт:
Исправь ошибку
vim/loader.lua:0: ...soer/projects/agentsoer.nvim/lua/agentsoer/engine/ai.lua:43: '<name>' expected near 'function'
# stacktrace:
...
Эффективный промпт:
Проанализируй причину возникновения ошибки, рассмотри несколько подходов к решению и предложи способ устранения:
vim/loader.lua:0: ...soer/projects/agentsoer.nvim/lua/agentsoer/engine/ai.lua:43: '<name>' expected near 'function'
# stacktrace:
...
👎7👍4 2
В своих экспериментах я использовал QWEN3-Coder-480b-А35b-Instruct. При первом подходе модель начинала с синтаксического разбора, затем последовательно анализировала файл в поисках непечатных символов, способных сбить с толку интерпретатор, после чего пыталась создать минимально работоспособную версию и доработать её. В конечном счёте этот процесс приводил к исчерпанию лимитов сессии.
При втором, более эффективном подходе, та же самая модель находила и корректировала неточность всего за 2-3 итерации после начала диалога.
Чтобы сэкономить токины я в первую очередь предлагаю исправлять ИИ ошибки как синтаксические, потому что стадия "анализа ошибки" может быть весьма объемной, если ИИ не справляется с первого раза, то переходить на второй вариант. Если и второй вариант не помог, то смотреть ошибку самому. Как я уже сказал, большая часть проблема отсекается на первом этапе, семантические проблемы на втором. И крайне редко приходится смотреть самому, как правило если речь заходит о рефакторинге, где старый код сильно сбивает ИИ.
При втором, более эффективном подходе, та же самая модель находила и корректировала неточность всего за 2-3 итерации после начала диалога.
Чтобы сэкономить токины я в первую очередь предлагаю исправлять ИИ ошибки как синтаксические, потому что стадия "анализа ошибки" может быть весьма объемной, если ИИ не справляется с первого раза, то переходить на второй вариант. Если и второй вариант не помог, то смотреть ошибку самому. Как я уже сказал, большая часть проблема отсекается на первом этапе, семантические проблемы на втором. И крайне редко приходится смотреть самому, как правило если речь заходит о рефакторинге, где старый код сильно сбивает ИИ.
👍9👎5 1
Завел себе канал в Максе, говорят там самая адекватная аудитория! Когда телегу поблочат, увидимся с вами там)
https://max.ru/softwareengineervlog
https://max.ru/softwareengineervlog
max.ru
MAX – быстрое и легкое приложение для общения и решения повседневных задач
MAX позволяет отправлять любые виды сообщений и звонить даже на слабых устройствах и при низкой скорости интернета.
1👎304😁70👍27👀7 5❤2🥰2 2🔥1
Сколько токенов в сутки потребляют ваши ИИ агенты?
Anonymous Poll
68%
Не использую агентов
18%
До 10 млн. токенов
4%
10-30 млн. токенов
2%
30-60 млн. токенов
1%
60-120 млн. токенов
6%
Более 120 млн. токенов
😁19👎4