F
Fedkin is thinking
12.07.2026 18:23 · 👁 2.6K
Как чуть меньше страдать от нейрослопа
Или небольшой полезный тех, который ты можешь сделать за пару дней
Давеча я писал, что агенты без должного контекста о системе склонны к локально оптимальным решениям. Это часто приводят к:
• нарушению направления зависимостей в коде
• смешиванию доменной логики и инфраструктурной
• странному неймингу и расположению классов
Хорошая новость — многое из этого можно ловить детерминированными тестами
Есть прекрасные инструменты, как например ArchUnit для Java (если знаете похожие инструменты для других языков, пишите в комменты), которые позволяют писать декларативные тесты на архитектуру приложения:
Домен не должен зависеть от инфры:
noClasses()
.that().resideInAPackage("..domain..")
.should().dependOnClassesThat()
.resideInAPackage("..infrastructure..");
In-порты называются ...UseCase
classes()
.that().resideInAPackage("..port.in..")
.should().haveSimpleNameEndingWith("UseCase");
Все порты должны быть интерфейсами:
classes()
.that().resideInAnyPackage("..port.in..", "..port.out..")
.should().beInterfaces();
Потратив пару дней на обдумывание и написание таких правил в паре с агентом, можно заметно увеличить качество летящих в тебя пулреквестов, потому что они будут корректны как минимум по структуре. По ходу движения список правил может дополняться
Как уже многие писали, разработка с агентами не привносит каких-то кардинально новых принципов, а только усиливает значимость старых добрых бест-практисов
p.s.: зачем эти детерминированные проверки, если я могу дать агенту правила в виде текста:
• промпты не дают гарантий
• не проверяют уже написанный код
F
Fedkin is thinking
04.07.2026 15:04 · 👁 4.8K
Несколько избитая тема, но мне кажется очень красивой идея, которая стоит за structured output в современных ллмках
Задача — пользователь передает json-схему, нужно сгенерировать ответ строго по переданной схеме
1. Наивный вариант
Подложить схему в контекст:
...
Return a JSON object that strictly matches the following schema:
{
"type": "object",
"properties": {
"status": {
"enum": ["SUCCESS", "FAILED"]
}
},
"required": ["status"],
"additionalProperties": false
}
Будет ли работать? Да, в большинстве случаев. Но без каких либо гарантий, что схема в итоге будет корректная
2. Добавляется constrained decoding
LLM генерирует ответ токен за токеном, на каждом шаге строя распределение вероятностей:
"{" = 0.75
"status" = 0.20
":" = 0.04
"answer" = 0.01
А дальше в процесс вмешивается constrained decoding
Из json-схемы строится контекстно-свободная грамматика (CFG), которая позволяет понять, какие продолжения ответа в текущий момент всё еще могут привести к валидному результату
Например, для схемы выше грамматика могла бы выглядеть как-то так:
root ::= "{" ws "\"status\"" ws ":" ws status ws "}"
status ::= "\"SUCCESS\"" | "\"FAILED\""
И, согласно грамматике, инференс-движок накладывает маску на распределение вероятностей следующего токена
"{" = 0.75
"status" = 0.20
":" = 0.04
"answer" = 0.01
Превращается в
"{" = 0.75
"status" = 0
":" = 0
"answer" = 0
Сгенерили {
—
"status" = 0.6
":" = 0.3
"answer" = 0.1
Превращается в
"status" = 0.6
":" = 0
"answer" = 0
Сгенерили {"status"
... и так далее
—
С относительно небольшим оверхедом это позволяет генерить ответ, строго соответствующий схеме
F
Fedkin is thinking
04.07.2026 13:10 · 👁 4.1K
Если ты слишком хорошо решаешь проблемы — возможно, ты решаешь не те
Пост по мотивам одного из худших полугодий на работе:)
Когда всё вокруг горит, мы начинаем преувеличивать значимость каждой конкретной проблемы. Каждая проблема кажется той самой, что нужно решить прямо сейчас. Естественная реакция на такое — сделать хоть что-то, что продвинет ситуацию вперед
• Команды не договорились — синхронизировать
• Сроки едут — заовертаймить
• Где-то возник затык — лично прийти разблокировать
...
Это дает ощущение движения и контроля — ты же что-то делаешь, постоянно кому-то помогаешь, с каждым разом все лучше и быстрее решаешь проблемы. Становишься эдаким эффективным пожарным. Результат у этого всегда один — выгорание и демотивация
Что делать — вы и без меня знаете: остановиться и позадавать себе вопросов
• А почему проблема дошла до меня?
• Почему глобально система допускает возникновение таких проблем?
• Что сделать, чтобы починить корневую причину таких проблем?
В условиях горящих сроков и давления такое бывает сделать правда сложно, но нужно сделать волевое усилие и "zoom-out"-нуться
Поэтому если ты N-ый раз решаешь одну и ту же проблему, подумай, ту ли проблему ты решаешь
F
Fedkin is thinking
07.06.2026 12:29 · 👁 6.8K
Очень грубо инженеров можно классифицировать на два типа:
1. Те, кто работает с техническими проблемами проактивно:
• Увидел плавное повышение cpu usage на БД => раздебажил из-за чего, добавил нужных индексов, предотвратил инцидент
• Увидел, что новая функциональность в модуль добавляется очень странным образом => инициировал и довел до конца рефакторинг, благодаря этому крупный проект сошелся в срок
• Сделал удобные алерты, что позволило видеть проблему раньше пользователей и предотвращать инциденты
2. Те, кто работает с техническими проблемами реактивно:
• TTM фичей вырос в два раза, постоянные баги => только тогда начинаем рефакторинг
• Количество инцидентов стало совсем неприемлемым => только тогда инициируем проект по стабилизации
(да, не существует чистых типов 1 и 2, это всегда спектр, и всегда нужно уметь работать в обоих режимах)
Но в чем неприятный парадокс — признание за технический вклад в основном получают люди, работающие во втором режиме
Почему так происходит? Потому что для наблюдателей есть прозрачная логическая цепочка: что-то сломалось, конкретный человек это починил, он молодец
Если же чинить проблемы проактивно, то со стороны может показаться, мол ничего особенного, все так и должно работать — фичи делаются быстро, система работает стабильно
Поэтому очень важно для всех опрозрачивать эту логическую цепочку: "что бы произошло, если бы мы не сделали эту техническую доработку". Да, это сложно. Но оно того стоит
Хороший руководитель безумно ценит людей, которые самостоятельно предупреждают проблемы. И задача руководителя — помочь опрозрачить такой вклад сотрудника для остальных
F
Fedkin is thinking
30.05.2026 14:11 · 👁 7K
Разработка фичей без достаточной экспертизы в системе зачастую превращается в набор "локально-оптимальных" решений: здесь добавили ифчик, здесь протянули новую зависимость, здесь скопипастили похожий код, здесь обошли существующую точку расширения
Каждое такое решение обычно выглядит норм в моменте — оно закрывает задачу, проходит тесты, не выглядит совсем плохо на ревью
Проблема начинается, когда такие решения последовательно наслаиваются друг на друга. Это приводит к architecture drift: фактическая архитектура системы постепенно отклоняется от той, которая была задумана
С агентской разработкой принципы те же — если у агента нет достаточного контекста о системе, он будет стараться делать минимальные локальные изменения, которые приведут к решению задачи. Только с агентами это все происходит быстрее
Главная проблема в том, что самая полезная архитектурная экспертиза обычно живет не в документации, а в головах людей, которые годами работали с системой. Они держат огромный набор фактов о том, почему сделано так, как это развивать, как точно делать не надо и т.д.
И честно говоря, я пока не видел чтобы такая экспертиза была в достаточной степени оцифрована — всегда остается много вещей, которые живут только в чьей-то голове. В таком сетапе агенты всегда будут медленно тянуть архитектуру куда-то в сторону (зачастую не самую хорошую)
А как вы боретесь с этим явлением?
F
Fedkin is thinking
12.05.2026 15:02 · 👁 7.9K
Как сделать карьерный рост чуть приятнее
Чем выше роль, тем меньше работа про сами задачи и тем больше — про людей. Всегда кто-то что-то требует, кто-то не согласен, кто-то аккуратно тянет одеяло на себя. Кто-то заходит в разговор так, что выходишь после него с ощущением, будто из тебя высосали всю энергию
Но, на самом деле, в таких сложных разговорах у разных людей одни и те же паттерны — тебя уводят от сути разговора, тебя пытаются ставить в оправдывающуюся позицию, разговор о предмете обсуждения подменяется разговором о личности и так далее
Нормально это осознать помог курс от ребят из SSL, который я проходил аж в 2024 (и до сих пор считаю одним из лучших вложений)
Один из тренеров курса — Миша Ромашов, который параллельно преподает переговоры в ВШЭ и лидит одно из направлений в Сбере. Миша ведет свой тг канал, где рассказывает интересные кейсы из практики:
• Про эмоции
• Про чужую картину мира
• Про конфликты без права сепарации
Если у вас в работе много сложных коммуникаций — рекомендую
F
Fedkin is thinking
11.05.2026 12:45 · 👁 6.3K
Хочешь долгого выполнения задач — нагрузи всех подзавязку
В теории массового обслуживания есть очень простая и удобная модель M/M/1:
Есть бесконечный поток задач, один узел обслуживания и очередь перед ним
поток задач -> очередь -> узел обслуживания
Где:
• поток задач описывается Пуассоновским процессом
• время обслуживания описывается экспоненциальным распределением
Интересно вот что: если взять
• λ — скорость прихода задач
• μ — скорость обработки
• ρ = λ / μ — утилизация
• W — среднее время в системе
То получается, что
• W = 1 / (μ - λ)
(proof)
И если переписать через утилизацию:
• W = 1 / μ(1 - ρ)
То есть среднее время нахождения задачи в системе растет гиперболически относительно утилизации. Возьмем простой пример: μ = 1 задача / день
И по формуле выше получаем такое среднее время нахождения задачи в системе W:
50% utilization -> 2 дня
80% utilization -> 5 дней
90% utilization -> 10 дней
95% utilization -> 20 дней
99% utilization -> 100 дней
Такое происходит из-за того, что задачи поступают в систему неравномерно. Поэтому если обработчик загружен под 100%, то любая неравномерность приводит к скоплению очереди, и как следствие, взрыву времени ожидания
Например, при переходе 95% -> 99% утилизация выросла всего на 4п.п., при этом среднее время ожидания скакнуло с 20 дней до 100 дней
На произвольные распределения этот эффект обобщается формулой Кингмана
—
Какой из этого можно сделать практичный вывод? Не хочешь внезапных задержек — оставляй исполнителям задач некоторый запас капасити
Например, разработчик загружен на 100%, он сидит, работает себе, а потом ему прилетают 3 пулреквеста на ревью. И 3 задачи встанут, потому что у разработчика нет капасити на то, чтобы их поревьюить. Ну и в такой ситуации обычно начинают браться в работу новые задачи, начинает раздуваться WIP, и проявляться прочие спецэффекты, описанные в этом посте
F
Fedkin is thinking
02.05.2026 12:34 · 👁 6K
Хотел написать пост не про эйай но получилось как обычно
Обзор на книжечку Agentic design patterns, которая оказалась скачана на телефон во время 8ми часового полета
Несмотря на многословность и не очень прикрытую рекламу гугловых инструментов (книга от инженера из гугла), она дает хорошее понимание, как из ллмки - функции, которая просто предсказывает следующий токен, набором инженерных решений получаются крутые инструменты типа claude code
Рассказываются основные паттерны, которые устоялись за последние пару лет разработки агентских систем
Базовые:
• prompt chaining — пайплайн из вызова ллмок, где результаты передаются по цепочке
• rouing — ллмка решает, куда дальше идти в воркфлоу
• parallelization — кусочки, которые можно распаралеллить, параллелим. Например, сбор данных из разных систем
• reflection — первая ллмка отвечает, вторая оценивает ответ, дает фидбек первой, первая корректирует ответ
• planning — вместо "реши сложную задачу" сначала просим ллмку сформулировать план. Далее выполняем набор более простых задачек
• reasoning techniques — chain-of-thoughts, tree-of-thoughts, ReAct и несколько других
Как достучаться до внешнего мира:
• tool use — обычный тул колинг: ллмке даются спеки тулов, а она отвечает, что и с какими аргументами нужно вызвать для продолжения работы
• mcp — простой небольшой рассказ что это, что такое mcp client, mcp server
• rag — ретривим релевантную информацию из базы знаний перед ответом
Память:
• memory management — про short term memory (на уровне одного чата) и long term memory (глобальная память)
• learning and adaptations — прикольная глава про то, как сделать так, чтобы агент автономно (или полуавтономно) обучался и не повторял тех же ошибок
Как не допустить говна:
• exception handling and recovery — просто глава-напоминание о том, что внешние системы могут лежать/агент можно не справляться с задачей, и это надо как-то уметь обрабатывать
• human in the loop — зовем человека, когда делаем рисковое действие
• guardrails — ллмке как на вход, так и на выход поступает примерно что угодно, поэтому хорошо бы добавлять явные проверки/валидации, что запрос/ответ приемлем
Системы из нескольких агентов:
• multi-agent — есть несколько агентов, заточенных под свои узкие области, которые друг другу дают задачи. Зачастую есть отдельный агент-оркестратор
• A2A — гугловый протокол взаимодействия между агентами в распределенных системах
Всякое разное около самих агентов:
• evaluation and monitoring — какие есть способы мониторить агентов и их качество
Примеров оч много (даже слишком), поэтому читается легко
7/10
F
Fedkin is thinking
11.04.2026 11:01 · 👁 6.6K
yet another random thought
Внезапное место, где хорошо раскрылись принципы функционального программирования — LLM агенты
Агенты в большинстве своем устроены так:
• LLM — функция без сайд эффектов (string -> string)
• Все сайд-эффекты инкапсулированы в тулах
• LLM сама ничего не вызывает. А просто возвращает агенту, какие тулы нужно вызвать
А это и есть реализация паттерна
• functional core (LLM)
• imperative shell (Агент)
И в целом никто не запрещает перенять эти принципы для продакшн кода. Чистая бизнес логика — это супер-простое юнит тестирование и простота поддержки
F
Fedkin is thinking
05.04.2026 07:50 · 👁 7.6K
Про Стратоплан и менеджмент (итог)
Я уже как ~месяц назад закончил обучение в Стратоплане на руководителя отдела https://stratoplan-school.com/head/
Обучение весьма удачно совпало с новой зоной ответственностью на работе, поэтому многое удалось попробовать на практике. Если меня попросить топ выводов/мыслей, в которых убедился на собственном опыте, я бы ответил так:
• Не хочешь внезапных разочарований (в т.ч. от себя) — явно проговаривай ожидания
• Регулярное обеспечение прозрачности таки действительно рождает доверие (как и наоборот)
• Эффективность каждого конкретного человека по отдельности ≠ эффективность команды
• Если проблемы со всеми людьми одновременно, то скорее всего проблемы не с людьми)
—
Еще на первом занятии упоминалось, что задача рук-ля отдела — строить систему, и в целом курс действительно направлен на то, чтобы абстрагироваться от решения локальных проблем, и решать их на уровне всей системы
Поэтому я думаю, обучение точно будет полезно:
• тимлидам, у которых начала разрастаться команда, и "уследить за всеми" уже стало как-то нереально
• M2 руководителям, которые не понимают, что происходит
Если у вас только-только появилась команда, то скорее всего будет полезнее тимлидское обучение
Подробности про обучение писал в постах
• раз
• два
• три
• четыре
• пять
Если интересно пообщаться лично и поспрашивать подробности, можно писать в личку, всем отвечу!