Организованное программирование | Кирилл Мокевнин
13.9K subscribers
88 photos
362 links
Делюсь опытом и обучаю. И ИИ? И ИИ. Ютуб https://youtube.com/@mokevnin Хекслет AI Клуб @hexletclub. Реклама на канале https://telega.in/c/orgprog Для предложений в личку канала
Download Telegram
Впечатления от конфы и первого выступления

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

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

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

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

Во второй день конфы в 10 утра был и мой мастер-класс на два часа, который во многом являлся компиляцией из курса "ии для разработчиков". Честно говоря я довольно сильно переживал из-за того, что до сих пор не умею и не совсем понимаю как показывать людям агентный кодинг так чтобы это было интересно, но вроде кто подходил после, говорили что им понравилось. Кстати когда я спросил, сколько людей в аудитории полностью пишет код агентами, руки подняло процентов 20-30%.

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

Собственно, 4-5 июля в Москве будет аж двухдневный воркшоп с утра до вечера, где участники под моим присмотром и с моими рекомендациями будут создавать проект через агентов, прокачивая себя в том как это делать максимально эффективно. Билеты на это добро в открытом доступе с возможностью платить от компании. Если что заходите на огонек.

p.s. придется еще недельку потерпеть, пока все это не закончится 🙂

Telegram | YouTube | AI Клуб
1🔥37👍157👎3😁2🤔1💩1👨‍💻1👀1
T-shaped снова в моде?

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

В обиход входит слово tiny teams. По представлениям сбера (это их инициатива), это компактные команды в несколько человек с большой степенью автономности находящиеся внутри ai sdlc, где все процессы изменены, где все знания доступны агентам и так далее. В общем ai native организации, вместо (зачеркни ненужное) бирюзовых, agile и других слов.

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

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

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

Через 5 лет мы будем оглядываться назад и говорить о том, как все было очевидно, вот это работает, а вот это бы не заработало никогда. Как говорится, знал бы прикуп жил бы в Омске

Telegram | YouTube | AI Клуб
1👍7426🤔9🔥5💯4👎2👀1
Придумал термин "Преждевременная спецификация", когда агенту сразу говорят как нужно решить задачу с техническими деталями, вместо того, чтобы исследовать, собирать контекст и задавать открытые вопросы в духе "Как обычно решают подобную задачу?", "Какие есть лучшие практики?"

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

Telegram | YouTube | AI Клуб
73👍43🔥19😁3💯3🤔1🤡1👀1
Архитектурные практики

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

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

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

Наверное главное, за чем я слежу и что прорабатываю глубоко это онтология проекта: сущности, свяжи между ними и границы ответственности. Причем речь не идет о том, чтобы попытаться полностью повторить реальный мир, наоборот, идет попытка создать систему, с одной стороны, простой, с другой нужно учесть все необходимые требования от нормализации до поддержки историчности при изменениях (там где это надо). Связь m2m сложнее o2m, это будет проявляться и в запросах и в коде. Можно ли не усложнять? А если мы работаем с иерархией сущностей, надо ли делать одну таблицу с полями сразу для всего, но чтобы каждый тип использовал свое подмножество или нам надо создавать разные таблицы? А как потом их объединять? Денормализация или внешний поиск? И обязательно инварианты. Какие состояния в системе вообще допустимы? Что не должно происходить никогда? Какие связи обязательны, какие опциональны.

Здесь мы имеем дело и со смыслами и с технической имплементацией на уровне хранилища и, в моем случае, ORM. Можно ли в этом случае довериться ии? Обсуждать, спрашивать совет и просить рассказать плюсы и минусы разных вариантов это прямо хорошо, но принимать решение точно надо самому, потому что слишком дорого потом придется платить за неудачно принятые решения. А они точно будут.

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

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

Я отдельно выношу обработчики http, dto и валидациями данных запроса и ответа. Все это вообще не надо писать самостоятельно, сейчас, когда легко доступен design-first, лучше пользоваться генераторами типа openapi-generator, которые создают все автоматом на базе openapi. Все что остается, это вписать в нужные места вызовы своих сервисов и правильно сформировать ответ. Даже если обходиться без генерации, ии отлично справится опираясь на существующий код, если он написан нормально.

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

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

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

Что еще упустил?

Telegram | YouTube | AI Клуб
👍4817🔥4🤔3👎1🏆1👀1
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁40😭9🌚8👍31👎1👏1😢1🖕1😎1
Отставить гусары! Я тестирую кнопку "direct messages" (чтобы туда писали по коммерческим предложениям). В телеге вообще столько всего надобавляли, надо посмотреть и потыкать (а вы блин палите и страшно что то нажимать)
37😁75🤣31🎉42🤮2👌2
Иммутабельная денормализация

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

В реальных проектах выясняется, что нормализованные данные сложно соединять и выбирать. При глубоком уровне зависимостей, чтобы добраться до внешней сущности, нужно либо соединять 5 таблиц, либо делать 5 запросов. Пример из Хекслета. У нас есть программа обучения, которая состоит из модулей, в которые входят темы которые состоят из уроков, которые состоят из юнитов (теория, практика, тесты). На это все накручено много логики по прогрессу и отображению. В такой структуре, вопросы типа "какой урок следующий по порядку?" заставляют поломать голову.

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

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

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

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

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

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

p.s. Вы денормализуете данные? Для каких задач?

Telegram | YouTube | AI Клуб
👍3014😐4🔥3👏1🤪1
Можно разок похохмить? :)
😁161🔥18🤣136👍5🌚4😱1👀1
Программирование с явно выделенным состоянием

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

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

Сейчас, в эру агентного программирования, это стало еще важнее. Агент может догадаться до правила, но ему нужно на это время и отдельный анализ. Можно конечно написать об этом в правилах, но зачем, когда можно просто поправить модель данных? Все что требуется, это введение текстового поля со статусом, которое явным образом скажет о происходящем с этой записью.

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

Telegram | YouTube | AI Клуб
👍4715🔥6💯2👎1🤔1👨‍💻1👀1