Организованное программирование | Кирилл Мокевнин
14K subscribers
88 photos
365 links
Делюсь опытом и обучаю. И ИИ? И ИИ. Ютуб https://youtube.com/@mokevnin Хекслет AI Клуб @hexletclub. Реклама на канале https://telega.in/c/orgprog Для предложений в личку канала
Download Telegram
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁41😭9🌚8👍3👏3😢2😎21👎1🖕1
Отставить гусары! Я тестирую кнопку "direct messages" (чтобы туда писали по коммерческим предложениям). В телеге вообще столько всего надобавляли, надо посмотреть и потыкать (а вы блин палите и страшно что то нажимать)
37😁75🤣32🎉42🤮2👌2👍1🤔1😱1👀1
Please open Telegram to view this post
VIEW IN TELEGRAM
5😁42👍13🔥1🤔1😱1👀1
Иммутабельная денормализация

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

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

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

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

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

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

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

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

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

Telegram | YouTube | AI Клуб
👍3615😐5🔥3👏1🤪1
Можно разок похохмить? :)
😁170🔥19🤣136👍6🌚4😱1👀1
Новый выпуск подкаста про Agile, Scrum и ИИ трансформацию уже доступен https://youtu.be/FhthTCoR3uw?is=X5GCG6XrrFds65ws В этот раз с Асхатом Уразбаевым мы вспоминаем как это было и куда пришло. Взлеты и падения, культы карго и трансформации в компаниях. А что в конце? Дейли не нужен, вот такие пироги

Telegram | Аудио | vk
1🔥26👍136🤷‍♂1🤔1👀1
Программирование с явно выделенным состоянием

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

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

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

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

Telegram | YouTube | AI Клуб
👍5916🔥6💯31👎1🤔1👨‍💻1👀1
Как я провел лето

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

Так как прилетел с сыном, то его надо было постоянно где-то оставлять. Поэтому он у меня проводил все время в дневных лагерях. Начиная от батутов и роликов до плавания. Подтянул язык, офигел от тополей, метро и количества разного рода насекомых. У нас такого нет как будто (в майами комары почти отсутствуют например).

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

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

Значит что я заметил. Платить и проходить в метро по лицу, это конечно мощь, прямо сильная штука, я даже когда вернулся, почувствовал что уже привык и не хватает. Из негативного, цены выросли сильнее чем выросли в штатах. Местами так дорого, что аж жуть. С другой стороны, Москва и Питер как всегда красиво и масштабно. В сокольниках забахали такой парк, мама мия. Чтобы вы понимали, в штатах нет таких парков (как и культуры парков в нашем понимании).

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

Да, китайских машин в штатах нет, их сюда не пускают. Я пару лет назад в Казахстане видел все это, но до сих пор не сильно разбираюсь в моделях и названиях, хотя покатался почти на всем что было. Уровень машин впечатляет. Кстати моей тачки вообще в рф нет как будто, да и люди не знают про существование lexus tx (трехрядный), так как он появился в 2024 году. Примерно считали, что в штатах в три раза дешевле + лизинг. Так что если кто-то едет на x5 в штатах и в рф это сильно разные ценовые категории и уровень дохода.

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

И еще, стало реально заметно потепление. В Ульяновске тусил на даче, а там тебе и цикады и геконы (!!!). Даже дожди становятся тропическими. Вроде есть кондиционеры, но до штатовского +16 в помещении еще далеко 🙂 Все боятся что их продует.

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

Ну и любимый вопрос, как граница? Единственное место где мне задали пару вопросов, это в аэропорту майами по прилету. Кстати, вы знаете что у меня есть личная инста (для orgprog тоже есть)? Единственное место где не про работу, а про жизнь https://www.instagram.com/mokevnin

Telegram | YouTube | AI Клуб
1127👍58🔥22🤮5🤡4💩1
Открытие дня. Все же знают dependabot, который обновляет зависимости всего и вся на гитхабе? Причем речь не только про пакетные менеджеры всех языков, но и например github actions и даже версии образов в Dockerfile. Так вот есть такое же решение, не привязанное к вендору.

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

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


# renovate: datasource=maven packageName=org.apache.maven:maven
ARG MAVEN_VERSION=4.0.0-rc-6
# renovate: datasource=java-version packageName=java-jdk
ARG JAVA_VERSION=25


Все это расставил сам клод и написал мне такую таску:


make deps-check
images/base/Dockerfile setuptools 83.0.0 -> 84.0.0
images/java-base/Dockerfile java-jdk 25 -> 25.0.4+7.0.LTS
images/multi-language/Dockerfile java-jdk 25 -> 25.0.4+7.0.LTS



Ну и все это добро отлично подключается к ci и шлет пулреквесты с обновками. Пользуйтесь

Telegram | YouTube | AI Клуб
👍43🔥1810🤡2🙏1