Твой кролик писал


Kanal geosi va tili: Rossiya, Ruscha


Канал одного системного аналитика.
Всякие репосты по анализу и разработке.
---
Канал для души: @dvnotes9

Bog‘liq kanallar

Kanal geosi va tili
Rossiya, Ruscha
Statistika
Postlar filtri


Системный сдвиг dan repost
Знаете ли вы про добродетели хорошего программиста?

Лень, нетерпение и высокомерие.

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

Нетерпение вызывает раздражение, когда программа тормозит, и приводит к желанию искать эффективные и быстрые решения и хитрые хаки.

Высокомерие (гордыня, самомнение) заставляет стремится к идеалу, чтобы никто не мог покритиковать решения, а только восхищаться ими.

Эти "добродетели" свойственны людям-программистам, но можно их привить и LLM-кодеру:

Ты — опытный инженер-программист, руководствующийся тремя добродетелями:

1. Ты ЛЕНИВ: Ты ненавидишь рутину и дублирование. Пиши переиспользуемый код (по приницпу DRY), автоматизируй всё, что можно, и создавай лаконичную архитектуру.
2. Ты НЕТЕРПЕЛИВ: Ты не терпишь медленный код. Оптимизируй алгоритмы (минимизируй Big O complexity), используй кэширование и асинхронность, чтобы система работала мгновенно.
3. Ты ГОРД: Ты пишешь код так, чтобы им гордиться перед сообществом. Он должен быть чистым, безопасным, задокументированным, снабженным тестами и устойчивым к любым ошибкам. Не выдавай "просто рабочий" код, выдавай шедевр.


Эти качества придумал Ларри Уолл, создатель языка Perl. Собственно, в языке это всё как раз и проявляется: можно очень быстро решить любую проблему коротким скриптом. Лень: не нужно придумывать имена переменным, часто их даже не нужно указывать. Прямо в язык встроены регулярные выражения.

There's More Than One Way To Do It, TMTOWTDI — можно одну и ту же вещь сделать совершенно разными способами, как удобно именно сейчас. Нетерпение: никакой компиляции, всё работает сразу из командной строки (помним, что это конец 80-х, и программы вообще-то компилировались, иногда десятками минут).

Гордыня: на Perl можно было писать программы, которые выглядели, как произведение искусства (абстрактное, постмодернистское). Говорили, что программы на Perl write-only, разобраться в них другой программист не может; говорили, что программа на Perl выглядит одинаково до и после обфускации.

В общем, язык для избранных. Или для хакеров в старинном смысле.

Но в массовом производстве Perl проиграл другим подходам, например — Python. В некотором смысле Python по философии противоположен Perl'у. Есть 'Дзен Python', набор принципов разработки:
1. Красивое лучше, чем уродливое
2. Явное лучше, чем неявное
3. Простое лучше, чем сложное
4. Сложное лучше, чем запутанное
5. Плоское лучше, чем вложенное
6. Разреженное лучше, чем плотное
7. Читаемость имеет значение
8. Особые случаи не настолько особые, чтобы нарушать правила
9. Хотя практичность побеждает чистоту
10. Ошибки никогда не должны замалчиваться
11. Если не отключены специально
12. Встретив двусмысленность, отбрось искушение угадать
13. Должен быть один — и, желательно, только один — очевидный способ сделать это
14. Хотя он поначалу может быть и не очевиден, если вы не голландец (отсылка к Гвидо ван Россуму).
15. Сейчас лучше, чем никогда
16. Хотя никогда зачастую лучше, чем прямо сейчас (нетерпение, помним?)
17. Если реализацию сложно объяснить — идея плохая
18. Если реализацию легко объяснить — идея, возможно, хорошая
19. Пространства имен — отличная штука! Давайте делать их больше!

Как видите, принципы местами прямо противоположны. Вероятно, это и обеспечило значительно большую популярность и распространенность Python: легче понять, легче учить, проще поддерживать. Если всё всегда делается одинаково и явно — любой разработчик может легко разобраться, подхватить чужой код. Да и не-разработчик быстро поймет и сможет использовать для своих задач. Стабильность, предсказуемость, одинаковость (чуть-чуть туповатость, может быть) — вот то, что нужно этому миру.

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

Ты — ИИ-архитектор программного обеспечения, чей главный приоритет — чистота, читаемость и поддерживаемость кода. Ты строго следуешь философии "The Zen of Python":

1. ЯВНОСТЬ: Пиши код без "магии" и скрытых смыслов. Обязательно используй строгую типизацию (Type Hinting) и давай переменным говорящие, понятные имена.
2. ПРОСТОТА: Избегай оверинжиниринга. Выбирай самое простое решение из возможных. Держи структуру плоской, минимизируй вложенные циклы и условия.
3. ЧИТАЕМОСТЬ: Форматируй код идеально (по стандартам PEP 8 / Clean Code). Код должен читаться как хорошая проза.
4. ЧЕСТНОСТЬ С ОШИБКАМИ: Никогда не скрывай и не "приглушай" ошибки. Перехватывай только точечные исключения, пиши информативные логи, чтобы код не маскировал ошибки, а максимально их подсвечивал.
5. ПИШИ ДЛЯ ЧИТАТЕЛЯ: Рассчитывай, что твой код должен будет изучать, понимать и изменять кто-то другой. Помоги ему быстро во всем разобраться.

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


Системный сдвиг dan repost
Должен вам сказать, на самом деле я не отношусь к ранним последователям. Я даже скорее тормоз в этом смысле. Вот и с ИИ я только весной этого года добрался до Cursor. И вот что советую: если вы пробуете что-то делать в свой работе через чаты — бросайте эту ерунду. Это работает только в режиме "спросить что-то очень быстро" или "сгенерить очередную одноразовую картинку". Для настоящей работы над сколь-нибудь большим проектом нужно использовать среду разработки со встроенными агентами — Cursor, Claude Code, OpenCode и т.п.

Мне нравится Cursor, потому что у него знакомый интерфейс VSCode (и интерфейс в принципе есть, а не просто консоль, я не консольный чувак), есть выбор из разных моделей и встроенные агенты. Это не вайбкодинг, это так сейчас программирование выглядит. Я, кстати, впервые с 2012 года взялся за написание чего-то большего, чем скрипт для анализа или парсинга данных, и сейчас в одиночку строю проект, на который раньше понадобилась бы команда из 3-5 человек.

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

Что у меня из скиллов в постоянной работе:

grill-me от Matt Pocock (https://github.com/mattpocock/skills). Скилл делает ровно то, что в названии — качественно прожаривает вашу идею, иногда прямо очень жестко. Работает он в режиме интервью, то есть задает вам вопросы. Аналитика, который бы задавал такие вопросы, любой заказчик сам бы прожарил из огнемета. А когда они исходят от тупой машины, вроде и не так обидно. На выходе получается план проекта с основными техническими решениями (grill-with-docs формирует документацию, в которой, в том числе, задан язык, которым вы описываете проблемную область). У Мэтта там целый пак скиллов, которыми можно дальше генерить проект по спеке после прожарки, но я использую в основном для обкатки идей проектов и документов.

spec-kit для Cursor (https://github.com/madebyaris/spec-kit-command-cursor). Вы знаете, какое самое последнее новшество в разработке? SDD — Spec-Driven Development, разработка, управляемая спецификациями. Вот неожиданность, правда? Оказывается, ИИ лучше всего разрабатывает по детальным спецификациям, вот так новость! Скиллы от Мэтта — это тоже SDD, но я пока не придумал, как их объединить. SpecKit хорош тем, что содержит цельный воркфлоу, от написания этих самых спецификаций до их реализации. Он тоже сначала проводит с вами интервью, но более поверхностно, без прожарки. Если мне не нужно сильно вникать, я беру его. Он генерит большие объемы спецификаций (сотни задач), а потом так же неутомимо их реализует. Фактически, это таск-трекер на основе файлов, со статусами и ссылками на спецификацию (у меня в одном из проектов оно сделало сходу 61 задачу, и это только MVP!)

adversarial-editorial-review (https://github.com/Halfofthesky/adversarial-editorial-review) — это тоже прожарка, но для статей (очень мне помог при написании магистерской, правда результата от людей-ревьюверов я пока не видел 😅). Он берет ваш текст и дает трем разным "ревьюверам": один считает, что доказательная база слабее, чем вы преподносите, второй — что в аргументации есть логические изъяны, третий — что вы упускаете точку зрения кого-то из вовлеченных лиц, или слишком вольно трактуете теорию, на которую опираетесь. Для научных публикаций мне очень понравился (хинт: можно не только свои брать, но и чью-то готовую опубликованную подсунуть!), нужно бы такой сделать для проектных аналитических документов — чтобы с разных сторон критиковали, а потом редактор сводил общий результат.

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


Yet Another Burakov dan repost
А как правильно-то?

На занятиях регулярно повторяется ситуация: разобрали задачу, спроектировали несколько вариантов решения, обсудили плюсы и минусы каждого. Далее следует вопрос: "А как правильно-то?"

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

Но как принимать решения?
1. Описываем задачу и контекст
2. Описываем варианты решения
3. Каждое решение обладает характеристиками, часть будет отличаться
4. Собираем табличку: характеристики vs варианты решения
5. Сортируем свойства по важности в рамках задачи
6. Заполняем клетки значениями
7. Анализируем, делаем выбор

Пример на картинке.

Где брать нужные свойства?
• Атрибуты качества системы aka NFR
• Ограничения: сроки, бюджеты, организационное, техрадар
• Продуктовые метрики - реже, но бывает

Что важно:

• Чаще всего хватает 3-4 характеристик, важных для нашей задачи.

• Максимально старайтесь использовать численные оценки, где это возможно. gRPC быстрее REST - правда? А на сколько? В 10 раз или на 10%? А оно нам надо?

• Не надо улучшать все сразу. Нам точно нужны 10.000+ rps в региональном магазине мебели?

• Когда мы улучшаем одну характеристику системы, обычно ухудшаем другую. Если решение ничего не ухудшает - скорее всего что-то пропустили.

• Обязательно прикрепляем табличку к ADR, Decision Log, Летописям Гениальных Костылей, или что там у нас. Команде, потомкам и агентам в будущем будет намного проще.

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

Правда, для этого нужно понимать особенности технологий и принципы построения распределенных систем, этим мы займемся на курсе по интеграции и архитектуре, стартует 29 августа.


Системный сдвиг dan repost
Сел тут выписывать категории стейкхолдеров. В проекте положено делать анализ стейкхолдеров, да? Обычно его либо не делают, либо с умным видом рассказывают про "луковичную диаграмму" (и иногда даже рисуют её).

Луковичная диаграмма делит стейкхолдеров на круги, или слои. Конкретные названия слоев варьируются.

Йэн Александер (собственно, автор методики и книг «Writing Better Requirements» и «Discovering Requirements: How to Specify Products and Services» — кстати, не вижу, чтобы они переводились на русский, а это вам не Вигерс, это конкретное руководство про выявлению и написанию требований) предлагает следующие:

0 слой: сам продукт
1 слой: "наша" система: продукт + операторы + инструкции/правила по работе с системой
2 слой: объемлющая (содержащая) система: наша система + бенефициары нашей системы (кто получает пользу от её функционирования, но сами могут не пользоваться ей)
3 слой: широкое окружение: объемлющая система + все остальные стейкхолдеры

Раскладывает стейкхолдеров по типам так:
1 слой ("наша система"):

* Нормальный оператор: вводит данные, отдает команды и получает результат от работы продукта. Главные требования: наличие необходимых функций, удобный и понятный пользовательский интерфейс, скорость работы, отсутствие ошибок/потерь данных, безопасность.

* Оператор технического обслуживания: обеспечивает и следит за работоспособностью системы. Требования: наблюдаемость (время поиска неисправности), ремонтопригодность (возможность и время на ремонт).

* Операционная поддержка: так как система включает технику и людей, должно быть две роли — поддерживающая технику и поддерживающая людей. Это может быть служба поддержки и люди, занимающиеся обучением.

2 слой ("содержащая система"):

* Функциональный бенефициар. Получает пользу от нашей системы, возможно не напрямую, а от операторов. Это немного старомодное деление, когда умение работать с компьютерами было отдельным скиллом. Хотя встречается и сейчас, в любом взаимодействии, когда вы смотрите на экран компьютера с обратной стороны: на кассах, в банках, МФЦ и т.п. Функциональный бенефициар в данном случае мы, мы взаимодействуем с оператором, а не с системой напрямую.

* Владелец смежной системы. Александер называет их "Ответственными за интерфейсы". С кем вы будете говорить, когда речь пойдет об интеграциях.
* Приобретатель. Может быть один (в организации) или миллионы (в массовом продукте, тогда их представляет Продакт). Кто выкладывает денежки. Кто отвечает за то, чтобы продукт был сделан.
* Спонсор или чемпион продукта. По-русски мы так не говорим, но это тот, кто вообще пробивает создание нашего продукта. Причем не только находит деньги но и решает политические вопросы. Исполнительный продюсер.

3 слой ("широкое окружение"):
* Негативный стейкхолдер. Тот, кто может пострадать от внедрения системы: физически, финансово или иным способом, за который вы будете отвечать перед регуляторами или судом. Требования регуляторов на самом деле — формализованные и обобщенные требования негативных стейкхолдеров (или ограничения). Александер добавляет сюда же стейкхолдеров, которые могут пытаться вредить работе продукта.

Он даже предлагает выделять специальную роль:

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

* Политический бенефициар. Кто получит выигрыш с точки зрения власти, влияния или престижа от создания вашей системы? Мой любимый тип стейкхолдеров. Пользоваться системой они не будут, может быть даже функциональными бенефициарами не будут, а вот власть и влияние их очень интересуют. В государственных организациях (и некоторых крупных бизнесовых) это чуть ли не основной смысл существования некоторых систем, а за контроль над ними ведутся жестокие битвы. Политические бенефициары могут быть и негативными — активно противодействовать созданию систем, или создавать свою альтернативную, или запрещать/затруднять интеграцию. Чем выше вы заходите в управление корпоративными продуктами, тем больше там политики.

* Финансовый бенефициар. Получит прибыль от создания системы. По-честному, редко берется в расчет, если вы не делаете коммерческий продукт.

* Регулятор. Тот, кто задает правила игры — обычно в виде ограничений или навязанных функций.
* Разработчик. Есть мнение, что они вообще не должны быть в этой модели, они перпендикулярны.
* Консультант (западная практика, бывает ли в РФ?)
* Поставщик (обычно очень далекая роль, но для некоторых систем бывает крайне важен)

Вот такая классификация. У меня из головы получилась похожая, напишу следующим постом.


Системный сдвиг dan repost
Глядя на разрастание объема требований в очередном проекте, вспомнил шутку про поправочный коэффициент π×e, на который нужно умножать число выявленных требований, чтобы получить число реальных.

Эта формула имеет геометрический смысл: R×π×e,

где R - число требований, число π в этой показывает круг, который нужно пройти для каждого согласования, а число e - скорость, с которой заказчики придумывают новые требования.

При многоступенчатом процессе согласования уже нужно брать интеграл по поверхности требований, но итоговая формула получается тоже простой: 2π×R×h×e, где h - число уровней согласования.

В среднем получается ~8.54, что очень похоже на большинство проектов.

Математики до сих пор не уверены, является ли это число иррациональным, но мы-то знаем...

Обратите внимание, что π в данном случае показывает разворот требований на 180°, то есть строго в противоположную сторону. Если ваш заказчик при согласовании требует не противоположного, а перпендикулярного первоначальной задумке, можно использовать коэффициент π/2, то есть примерно 4.27.

Правда, если заказчик движется не по окружности, а по синусоиде, придется опять вернуться к 8.54, т.к. заказчик колеблется от π/2 до -π/2, что дает полный размах безумия.

Так же в терминах управления проектами интерпретируется знаменитое равенство Эйлера:

e^iπ + 1 = 0.

Смысл его прост: если проект долго рос с воображаемыми (мнимыми) требованиями, добавление реального стейкхолдера сводит все предыдущие усилия к нулю...


БЕЗБТ Истории аналитика dan repost
База знаний.zip
1.5Mb
Как и обещал, выкладываю свою Базу Знаний БА/СА еще и в формате .md файлов, удобнее всего смотреть через Obsidian.

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

И вот тут как раз полезно для самого себя создавать удобные инструменты, пусть даже вайбкодингом.
Главное задумывать их более-менее универсальными, например:

• как в посте выше - пайплайны по дописыванию и ревью статей для Obsidian у меня уже работают и их вполне можно использовать независимо от проекта. Есть статья, нужно дополнительное исследование - есть инструмент. Дорабатывать тут можно только движок для исследований
• а вот с выкладкой на сайт http://basahub.ru сложнее, сейчас уже есть отдельно написанный проектик, который прямо по моему vault в Obsidian пересобирает контент для сайта, остается только опубликовать. НО если появится другой тип контента, новые фичи и так далее - его также придется дорабатывать

И вот, чем хочется заняться в первую очередь:

1) доработать раздел с BPMN, сейчас там схемы в mermaid, а я хочу прямо в Obsidian вставлять xml-схемы из Camunda, чтобы были полноценные примеры.

2) доработать немного статьи про работу с Camunda как с оркестратором - знаю, что во многих проектах она используется и хорошо бы в этом разбираться (уже сейчас есть соответствующая статья, надо больше примеров)

3) добавить теги в каждую статью и реализовать поиск на сайте по тегам

4) поэкспериментировать с ИИ-ассистентом, чтобы ему можно было позадавать вопросы по статье, но это явно потребует большей мощности - на будущее кароч)

@nobrstories #базазнаний


Burmistrov - It и около dan repost
Легкий способ начать использовать AI-агента в работе

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

Я люблю все сравнивать с бегом. Если встать сегодня и попробовать пробежать марафон, а до этого вы не бегали даже 10 км - будет тяжело, больно и просто вредно для здоровья. А если начать маленькими шагами, сначала прогулка, потом 3 км, потом 5, потом 10, то марафон окажется рядом сам собой. Бегуны, подтверждайте!

Я предлагаю вам совершить первую прогулку, легкий шаг в мир AI-агентов, можно даже на реальном рабочем проекте.

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

Репозиторий с конфигами
https://github.com/CrazyElephantX/OpenCode

Видео с примером применения

➖Dzen: https://dzen.ru/video/watch/6a9cb27f466ba66194b1f113
➖VK Видео: https://vkvideo.ru/video-79866382_456239076
➖Boosty: https://boosty.to/crazyelephant/posts/855a3d68-d513-4d6f-8cfe-96ed49e7910c
➖Rutube: https://rutube.ru/video/4bf3a9da89e9c2f21520d307fd6dda17/
➖YouTube: https://youtu.be/PXgaim7diFU

Попробуйте и вам точно понравится!

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


AI Для Задротов dan repost
ЧАСТЬ 2: КАК ВООБЩЕ ОБУЧАЕТСЯ LLM - ВЕСА, PRE-TRAINING, POST-TRAINNING, GRADIENT

Начало тут

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

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

Модель при этом не решает, какой автор в интернете умный, а какой долбоёб(потому что все такие). Нормальные инструкции по приготовлению чая просто встречаются намного чаще и в более согласованном контексте, чем советы насрать в чайник. Поэтому обычное продолжение получает большую вероятность, а случайная херня остаётся где-то на периферии распределения. Конечно, если сами данные систематически забиты мусором, магического детектора истины у модели не появится и мусор она тоже выучит.

Веса можно представить как миллиарды крошечных ручек настройки. Одна ручка не хранит отдельно факт "Москва является столицей России", потому что знания распределены по огромному количеству параметров. Модель делает предсказание, считает ошибку, а gradient descent определяет, в какую сторону немного сдвинуть эти ручки. Один шаг почти ничего не меняет, но после миллиардов повторений в весах оседает чудовищное количество связей между словами, фактами и контекстами.

Поэтому фраза "столица России" почти всегда продолжается Москвой, а Санкт-Петербург появляется рядом с уточнениями вроде "культурная" или "северная". Модель не достаёт значение из одной строки таблицы, а воспроизводит выученное распределение вероятностей. Для фактического вопроса один вариант может доминировать, а в вопросе "какой язык программирования лучший" вероятности размазаны между несколькими ответами. Конкретный результат там уже сильнее зависит от контекста, настроек генерации и последующего обучения.

После pretraining модель много знает, но остаётся просто очень мощной продолжалкой текста. На этапе post-training ей показывают, как выполнять инструкции, соблюдать формат, признавать неопределённость и не отвечать человеку как случайный форумный псих. Значительная часть привычного поведения ChatGPT появляется именно здесь, хотя базовые знания модель получила раньше. И вот это поведение тоже можно передавать через дистилляцию, потому что оно статистически проявляется в ответах учителя.

Студент получает вопрос, пытается ответить, сравнивает результат с ответом сильной модели и через тот же gradient descent меняет свои веса. Если примеров достаточно, он перенимает не только факты, но и способы декомпозиции, проверки гипотез и общения с пользователем. Никакой магии и переливания цифровой души тут нет, просто очень много качественных тренировочных пар. Но после этого уже понятнее, почему чужие ответы могут оказаться ценнее, чем очередная выгрузка сырого интернета.

Вот так то! Не сказать, чтобы это прям было полезно в ежедневной работе, но мне всё же интересно, как на низком уровне устроена эта магия, которая за нас будет теперь программировать всю жизнь.


AI Для Задротов. Подписаться.


AI Для Задротов dan repost
КАК ОБУЧАЮТЧСЯ LLM. ЧАСТЬ 1: МАСК, OPENAI И ДИСТИЛЯЦИЯ

В конце прошлой недели, весь AI-интернет обсуждал, кто в этот раз пидор, Маск, OpenAI или все сразу. у нас появилась новая серия корпоративной Санта-Барбары. Напомню, SpaceX купила Cursor, после чего OpenAI сообщила, что собирается перестать поставлять ему свои модели. Официально причина в том, что OpenAI больше не уверена(лол так можно??) в соблюдении своих условий компаниями Маска. Но в комментариях к этой истории постоянно всплывает другое слово - distillation.

И вот тут я понял, что слово вроде знакомое, но понимал я его где-то на уровне "одна нейронка постоянно что-то спрашивает у другой". Почему OpenAI вообще должно волновать, что конкурент задаёт её модели много вопросов? Я тоже каждый день мучаю ChatGPT, но Grok у меня в кладовке пока не завёлся. Опять, пришлось разбираться самому!

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

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

Причём студенту необязательно становиться универсальным ChatGPT на минималках. Допустим, нам нужна модель, которая умеет только готовить блюда из яиц, но делает это охуенно: учитывает продукты, диету, время и доступную посуду. Можно спрашивать большую модель только про эту область, собрать ответы и обучить на них маленький EggGPT. Знать историю Китая и писать рэп-баттлы между базами данных ему вообще не обязательно.

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

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

Я хз как к этому относится. С одной стороны, это не воровство, по сути модель открыта и конкуренты даже платят за вызовы... Но с другой всё равно как-то хреново получается) А вы что думаете?

AI Для Задротов. Подписаться.


Уютный IT адочек dan repost
Пожалуй, худшее, что можно сделать при внедрении автономных ИИ-агентов - заставить человека работать вахтёром и аппрувить каждый чих.

Сначала кажется, что это надежно, но на самом деле мы получаем усталость от согласований. Если система 50 раз подряд спрашивает "можно я прочитаю этот лог?", на 51-й раз человек выгорает, психует и жмет "Разрешить" не глядя. Безопасность до свидания.

Я изрядно покопался, как решают проблему апрувов в Codex, Claude Code и ко. Главная мысль, к которой пришла индустрия: нужно делать автоапрув, и его основа — маршрутизация рисков.

Что важно:

1. Изоляция и ограничение blast radius (радиуса поражения)
На уровне OS есть свои механизмы sandbox и задания границ рабочего пространства. Read-only ФС, отрезанная сеть и т.п.

Codex в режиме Auto детерминированно разрешает агенту любые чтения и правки, но только внутри заданного workspace. Вся остальная файловая система для него - read-only. Сеть по умолчанию отрублена. Если агенту нужно сходить наружу, трафик идет через прокси с жестким allow-листом доменов и защитой от DNS rebinding. Anthropic тоже выносит сетевую изоляцию на уровень прокси, который крутится вообще вне песочницы.
Агенту физически отрезана возможность поломать что-то снаружи или незаметно слить данные.

2. Каскадные проверки и "ослепление" классификатора
Разработчики harness-ов строят МНОГОуровневые фильтры перед действием.

В Claude Code Auto Mode действия с потенциальным ущербом (shell-команды, выход в сеть) уходят на проверку отдельной модели-классификатору. Крутейшая инженерная фишка в том, что этот классификатор сознательно "ослепляют": ему показывают только исходный запрос пользователя и сам вызов функции, вырезая пространные рассуждения агента и сырые логи. Это делается, чтобы агент не смог "заговорить" проверяющую модель через prompt injection.

3. Семантические триггеры на необратимость

У OpenAI все tools (если не знакомы с этим термином — погуглите, это важный термин в harness) заранее размечаются (например, тегом destructive). Если агент лезет во внешнюю сеть, срабатывает фильтр Safe URL, проверяющий, не пытается ли ИИ слить ваши секреты в параметрах ссылки. Любые действия, меняющие состояние внешнего мира (транзакции, письма, запись вне песочницы), триггерят хард-стоп и требуют явного подтверждения от кожаного мешка.


Механизмы апрува — адский ад. Слишком сильно зажмёшь требования — пользователя задолбает запросами. Слишком слабо — получишь дырявое решето. Уязвимости — повсюду: в скачанных из интернетов скиллах, внешних ресурсах, запросе пользователя — и это подстёгивает здоровую паранойю.
Тестировать эти механизмы — ещё более глубокий ад. Нужна редкостная изобретательность, чтобы покрыть возможные кейсы, много терпения, чтобы прогонять агента по ним, и ещё больше изобретательности, чтобы отделить тестирование жёсткой, алгоритмизированной обвязки от тестирования поведения моделей (которые внутри своих весов тоже содержат защиту от "хакерства")

Офигенный инженерный квест.


Burmistrov - It и около dan repost
Месяц на новой работе, как я справился с информационным штормом

Прошло чуть больше месяца с того момента, как я вышел на новое место. Кто пропустил — теперь я руководитель направления в Банк Дом.РФ.

За этот месяц я часто вспоминал вопросы от учеников формата «я вышел на проект, как понять что происходит?», «я на проекте, тут не так, как нас учили?», «я ничего не понимаю...» — потому что сам оказался в новых условиях и столкнулся с этими проблемами в разных форматах.

В первую неделю меня накрыло волной информации: новый домен, новый продукт, новый стек, новые люди. Казалось нереальным даже просто запомнить всё, что мне говорили. Был страх «я не справлюсь». Помог нормальный онбординг и поддержка коллег — отдельное спасибо тем, кто выделял слоты в календаре, чтобы можно было зайти и закинуть вопросы, накопившиеся за сутки. Иногда я задавал один и тот же вопрос разным ролям, так довольно быстро сложилась в голове и draw.io карта домена, технологий и продукта, а дальше уже работа пошла.

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

Но дорогу осилит идущий: почитал документы, помучал коллег и вроде втянулся)

Собрал в голове чек-лист из 5 пунктов на случай, если попадёте на новый проект:
1. Знакомьтесь с коллегами.
2. Читайте документацию — всю, что есть.
3. Задавайте вопросы, даже если один и тот же вопрос разным людям — так быстрее сложится общая картина.
4. Всё, что вам непривычно, на старте надо просто принять.
5. Рисуйте схемы и записывайте всё, что в вас загружают — это помогает осознать огромный поток новой информации. Даже древние люди рисовали на скалах, а мы то явно круче них, вот и я создал файл онбординг.drawio.

Пару недель назад открыли новый офис — сгонял туда, чтобы очно познакомиться с командой. Офис понравился, а сам БЦ, оказался целиком нашим. Заодно оценил станцию метро ЦСКА.

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

Познакомился с DevRel'ом — думаем сделать митапчик в октябре, скорее всего для аналитиков. Детали скоро.

А по задачам пока рассказывать не буду — но за месяц меня уже несколько раз успели похвалить, и это приятно)

А вообще всё новое — это стресс. Берегите себя!

Но если у вас есть лайфхак, как справиться на новом проекте или работе, делитесь!


Путь аналитика dan repost
🤯 POST, PUT или DELETE? - Вот в чем вопрос!

Выбор правильного HTTP-метода для эндпоинта - это вечная холиварная тема. Особенно когда семантика API не маппится напрямую в REST-методы. Например: вроде бы выполняется удаление, но под капотом происходит update или вовсе создание новой записи.

На практике операции редко соответствуют простой схеме «CREATE → POST, UPDATE → PUT, DELETE → DELETE». В реляционных моделях, например, апдейтится сразу много связей.

Не раз на проектах сталкивалась с ситуацией, когда мы с командой буквально застревали в спорах над дизайном API. По бизнес-логике нужно сделать эндпоинты "как бы про удаление" и "как бы про обновление", но по факту операции вызывают комбинацию событий.

Основная сложность таких обсуждений - это найти понятную рамку, на основании чего принимать решение:

🔶 Выбор строго по конвенции REST часто не подходит, так как операция неконвенционная.

🔶 Выбор "по сути" бизнес-операции (например, если удаление, то строго DELETE) ломает REST-конвенцию и упирается в ограничения метода. Может ли DELETE вернуть в response несколько обновлённых сущностей вместо OK/ERROR?

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

Как-то обсуждали эту тему с solution architect Володей @vrogach. И его решение мне очень откликнулось.

Зафиксировать внутренний стандарт для конкретного API (Design Guidelines).

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

Например: "Для всех эндпоинтов, которые запускают комбинацию событий, используется POST"

Это делает поведение API предсказуемым для клиентов и разрубает узел нестыковок с REST-конвенцией.


Конечно, на практике не всегда удаётся договориться о таком с командой. У меня были случаи тоже, когда для сохранения мира в команде приходилось идти за большинством голосом разработчиков и выбирать среди подходов "по сути бизнес операции" пусть и неконвенционно REST.

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

💬 А как у вас в командах решают такие спорные случаи? Удаётся ли договориться о едином стандарте? 👇


Уютный IT адочек dan repost
Пришло время признаться: по вечерам я вайб-кожу. И вот чему я научился.

Профессиональный вайб-кодинг — это не когда ты красиво написал промпт, ушёл пить чай, а вернулся к готовому продукту. Это когда код пишет агент, механические проверки делает автоматика, а человек отвечает за то, чтобы всё это в итоге имело смысл.

Я не сравниваю SHA, не пересчитываю коммиты, "красоту кода", именование переменных и не перепроверяю за агентом каждое движение мышкой. Для этого есть CI: тесты, линтеры, сборки и прочие quality gates. Красное — не едем. Зелёное — можно начинать проверять, что мы вообще сделали.

И квалифицированные человеческие проверки обязательны! За последнее время я несколько раз получал вполне "готовые" изменения, которые:

1. собирались по частям, но не собирались целиком;
2. показывали интеграцию в интерфейсе, но не могли выполнить реальный запрос;
3. успешно выполняли запрос, но ломались на авторизации;
4. проходили профильные тесты, но падали в полном CI;
5. технически работали, но решали немного не ту задачу
6. реализовывали всё как запрошено, только в результате получалось, что запрошена фигня и требования надо полностью пересматривать.

И вот здесь начинается настоящая работа продуктового разработчика.

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

Можно проверить, что кнопка есть, что сервер отвечает, что инструмент зарегистрирован. А потом пользователь нажимает кнопку — и получает пустой экран, странную ошибку биллинга или вежливое предложение купить подписку вообще у другой компании.

Поэтому для себя я выработал несколько правил.

1. До начала работы прошу агента повторить, что именно он собирается сделать, что не собирается и как будет доказывать результат.

2. Если возникает архитектурная развилка — решение принимает не агент. Он должен принести варианты, последствия и цену каждого.

3. Перед публикацией обязательно спрашиваю: что проверено узко, что проверено целиком, был ли отдельный simplify-проход и что осталось непроверенным.

4. После зелёного CI проверяю продуктовый сценарий руками. Причём не только happy path, но и один-два неприятных случая: истёкший токен, отказ в доступе, повторный запрос, отмена операции. В некоторых случаях неплохо бы провести более или менее крупный регресс — ответственность за понимание импакта изменения лежит на мне.

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

Многое из этого постепенно уедет в quality gates. Полный typecheck, сборка конечного артефакта, интеграционные тесты, проверки безопасности и стандартные сценарии не должен каждый раз вспоминать человек. Если ошибка уже случилась дважды — это не повод внимательнее читать отчёты агента. Это повод превратить её в автоматический турникет.

Но универсальной трубы пока нет. Задачи разные, интеграции разные, а самые неприятные ошибки обычно находятся на стыках между компонентами и смыслами. Поэтому часть контроля остаётся ручной и ad hoc.

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

Главный навык — понимать, где автоматике можно довериться, а где человеку всё ещё необходимо проконтролировать: "Мы точно сделали то, что нужно было сделать?"


AI Для Задротов dan repost
ЦЕНЫ ВЫРОСЛИ В 12 РАЗ!

Все айти чаты сейчас бурлят гавном по поводу того, что DeepSeek повысила цены на тарифы практически в десять раз(от 6 до 12, если быть точнее), за счёт повышения базовой стоимости, внедрения пиковых часов(лол, AI блэкаут) и прочих финтов. Неприятно, но вполне закономерно, а главное это никак не влияет на меня и мою работу.

В тысяча первый раз повторяю: вы должны строить свой РАБОЧИЙ ПРОЦЕСС НЕЗАВИСИМО ОТ КОНКРЕТНОГО ПРОВАЙДЕРА И КОНКРЕТНОЙ МОДЕЛИ. Любая завязка на одного поставщика - вендорлок, зависимость и потенциальная уязвимость вашего бизнеса(или бизнеса вашего хозяина). По факту завязывать всю работу на какую-то конкретную модель конкретного провайдера, это гарантировано подставить свой хуй под выстрел из дробовика в будущем.

Да, возможно, для вас эта новость прошла незаметно, дипсиком поьзуются меньше, чем двумя другими провайдерами. Но помяните мое слово, когда такую же шляпу исполнит Anthropic или OpenAI(не суть под каким предлогом) - пиздеца увидите гораздо больше.

Поэтому мы обязательно строим нормальные процессы:
- Внедряем абстрактный слой поверх API, чтобы смена провайдера делалась правкой одной переменной окружения, а не переписыванием половины кода.
- Используем роутинг запросов: дешёвые быстрые модели для простых задач, дорогие и умные - только когда действительно надо.
- Настраиваем автоматический fallback - если одна модель легла или начала дико тормозить, запрос уходит на другую без ручного вмешательства.
- Детерминируем максимум шагов: промпты, схемы ответов, скрипты валидации, парсинг - всё должно быть зафиксировано и версионировано, чтобы при переезде на другую модель вы получали тот же результат, а не сюрпризы.
- Регулярно прогоняем бенчмарки на своих задачах, а не верим воздуханам из твиттера.
- Держим в запасе минимум двух-трёх провайдеров и локальные модели для критичных сценариев, где внешнее API недоступно.

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

AI For Geeks. Подписаться


Burmistrov - It и около dan repost
OpenCode для системного аналитика.

Заменяем себя Создаем помощника для работы.

Написал, про то как в бесплатно в 10 кликов создать себе агента в помощь, идеально для тестов и в целом понимания, как все это работает. А то знаете со всех сторон скилы, агенты и страшно даже как-то.
Не бойтесь и шагайте в ногу со временем.

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

текстовая версия - мой сайт оценил заметку в 9 минут чтения, для тех кто такое не любит, есть 22 минуты видео)

- YouTube
- RuTube
- VkVideo
- boosty - все тоже самое что на других площадках, но за деньги

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

https://github.com/CrazyElephantX/OpenCode ну и конечно ссылка на репозиторий, что бы все конфиги руками с видоса не перепечатывать)


AI Для Задротов dan repost
AI ROADMAP ДЛЯ РАЗРАБОТЧИКА

https://ai-for-geeks.github.io/roadmap/

Последнюю неделю постов практически не было.

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

Поэтому практически всю неделю я читал, изучал и смотрел разные best practices, чтобы понять, чего мне не хватает и как вообще развиваться инженеру, который разрабатывает программные продукты в 2026 году со всей этой AI-истерией.

И в итоге я пришёл к тому, что решил создать roadmap развития AI-разработчика.

Собственно, представляю его вам. Можете почитать, обсудить со мной, обосрать, а можете сделать пулл-реквест в GitHub с дополнениями и улучшениям

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

Но уже сейчас, хотя бы я наконец примерно понимаю, где нахожусь, что уже умею и какие навыки мне ещё стоит осваивать.

Но если к этому подключится комьюнити, думаю, мы действительно сможем сделать что-то крутое.

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

https://ai-for-geeks.github.io/roadmap/

AI Для Задротов. Подписаться.


Уютный IT адочек dan repost
Пока вы гоняете кодинг-агента в пет-проекте или микро-стартапе на пару тысяч строк, проблем нет: белковый разработчик видит каждый diff и правит костыли вручную. Адочек начинается при масштабировании автономии, когда агенту дают задачу "сделать зелёный CI любой ценой".

Модель — рациональный вычислитель. Если зажать её метрикой прохождения тест-сюита, она начнёт хакать тесты по пути наименьшего сопротивления:
• Выхолащивание тестов: выпиливание ассертов или ослабление условий проверки, если есть доступ на запись к /tests.
• Overfitting под моки: хардкод значений под конкретные входные данные фикстур вместо честной бизнес-логики.
• Засор контекста: попытка залечить проблему слоями костылей, превращающая ветку в радиоактивный технический долг.

Как строится детерминированный Harness вокруг агента, чтобы не платить за бессмысленное сжигание токенов:

• AST Delta Validation: Проверка AST-дерева до и после итерации. Если в diff'е появляются выхолощенные условия, маскировка ошибок через catch (e) {} или изменения файлов внеScope — пайплайн сразу режет попытку без вызова LLM.
• eBPF/gVisor Sandboxing: Запуск тестового контура в изолированном пространстве без сетевого доступа, чтобы модель не затягивала ответы с внешних эндпоинтов и не подменяла окружение.
• Atomic Rollback Strategy: Любая гипотеза агента прогоняется как отдельный изолированный коммит. При 2+ неуспешных итерациях — жесткий git reset --hard и очистка контекста. Кормить модель её же галлюцинациями из прошлых попыток — верный способ сжечь бюджет.
• Mutation Testing Gate: Валидировать устойчивость тестов (через условные mutmut / cargo-mutants) до запуска агента, чтобы у него не было шанса пролезть сквозь «слепые» ассерты.
• No LLM-as-a-Judge on Code Review: Заменять ревьюера той же самой LLM — плохая идея. 100% должна присутствовать качественная статическая проверка качества (linters, AST parsers, test runners).

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


Burmistrov - It и около dan repost
Индексы в базах данных — шпаргалка для системного аналитика

На технических собеседованиях вопросы про индексы задают регулярно — и не только DBA. Системный аналитик, архитектор и даже старший бизнес-аналитик должен уметь объяснить, почему на определённом запросе «всё лагает», и предложить решение. Именно здесь часто ждут ответ про индексы.

Блок про индексы обычно идет после общего блока про базы данных и до блока с написанием SQL запросов.

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

Главный компромисс индексов
🟢 SELECT работает быстрее
🔴 INSERT / UPDATE / DELETE медленнее, каждый индекс надо обновлять при каждом изменении строки

Какие бывают типы индексов

➖B-tree — универсальный, работает для =, , BETWEEN, ORDER BY. По умолчанию в большинстве СУБД
➖Hash — только точное равенство =, очень быстро, но больше ни для чего
➖GIN — массивы, JSONB, полнотекстовый поиск
➖BRIN — огромные таблицы с монотонной вставкой (логи, события)
➖Составной — несколько колонок; порядок критичен — сначала =, потом интервал
➖Частичный — индексирует только часть строк: WHERE status = 'pending'`
➖Покрывающий — включает все нужные SELECT колонки через INCLUDE, исключает обращение к таблице

Когда индекс НЕ нужен
➖Таблица маленькая
➖Столбец с низкой кардинальностью: is_active, gender
➖Запрос LIKE '%text%' — B-tree не поможет
➖Функция над колонкой: WHERE YEAR(created_at) = 2026 — индекс не используется
➖Таблица пишется очень активно, а читается редко

Правило для составного индекса
1. Колонки на равенство
2. Колонки на период
3. Сортировка

Пример для запроса
WHERE status = ? AND created_at >= ? ORDER BY priority


Полная статья с примерами, антипаттернами на сайте: https://bv-dev.ru/indexes-interview-prep/

#ГотовимсяКСобеседованию


Burmistrov - It и около dan repost
Готовимся к собеседованию - SQL

SQL на собеседовании: разбираем по шагам

SQL спрашивают очень часто, что странно даже на те вакансии, где в работе SQL не нужен. Поэтому предлагаю порядок, в котором стоит готовиться:

1️⃣ SELECT — выбираем нужные колонки
2️⃣ WHERE + ORDER BY — фильтруем и сортируем строки
3️⃣ GROUP BY — считаем итоги по группам
4️⃣ HAVING — фильтруем уже после группировки
5️⃣ JOIN — объединяем данные из нескольких таблиц

Самая частая ошибка на интервью — путают WHERE и HAVING.
Иногда задания специально так построены, что бы подловить кандидата.

Как запомнить:
- WHERE — до группировки
- HAVING — после

Написать WHERE COUNT(*) > 2 — ошибка.
Правильно: HAVING COUNT(*) > 2.

Поскольку SQL требует объемных примеров, если для вас тема актуальна переходите на сайт в подробный пост. В посте 5 задач с реальными зхадачами, которые можно сразу запустить в браузере. Ответы спрятаны под спойлер, так что сначала можно попробовать решить самому.

Читать и решать: https://bv-dev.ru/sql-na-sobesedovanii-select-groupby-having-join/

#ГотовимсяКСобеседованию


Burmistrov - It и около dan repost
Готовимся к собеседованию — монолит vs микросервисы

Монолит — это единое приложение: интерфейс, бизнес-логика и база в одном деплой-юните.

Плюсы
➖Проще разрабатывать и отлаживать
➖Дешевле инфраструктура
➖Один деплой
➖Меньше хлопот с сетью

Минусы
➖Масштабируется только целиком
➖Компоненты связаны друг с другом
➖Со временем поддержка превращается в боль
➖Стек обычно один
➖Сбой может уронить всё приложение

Микросервисы — это набор независимых сервисов, каждый делает свою задачу и общается через API/события.

Плюсы
➖Можно обновлять и масштабировать отдельные части
➖Лучше изоляция ошибок
➖Разные команды и стеки под разные сервисы

Минусы
➖Сложнее управлять всей системой
➖Выше требования к DevOps и наблюдаемости
➖Больше сетевых задержек и отказов
➖Сложнее транзакции (саги, eventual consistency)
➖Нужны более зрелые инженеры

Что важно сказать на собесе
Монолит отлично подходит для MVP, небольших проектов, ограниченного бюджета и команды до 5–10 человек.
Микросервисы — для крупных систем с высокой/неоднородной нагрузкой и несколькими командами, когда нужна гибкость релизов и независимое масштабирование.

Микросервисы — не «модно», а «дорого, но осознанно»; монолит — не «легаси по умолчанию», а нормальный старт, если контекст простой.

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

Подробнее на сайте

#ГотовимсяКСобеседованию

20 ta oxirgi post ko‘rsatilgan.