C# Short Posts 🔞 – Telegram
C# Short Posts 🔞
250 subscribers
111 photos
4 videos
151 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
🍆Kafka #1: Пояснительный дикпик (UPD: поправил консьюмеров на консьюмер-группы)
#kafka
🌚1
🙏Kafka #1: Верхнеуровненвый осмотр и сравнение с RMQ
Как я раньше и говорил, по производственной необходимости нужно изучать Кафку (с мафлом, да-да!). Пролью свет на нее в цикле постов. Цикл будет на основе видео, которое я показывал в этом посте. (Поэтому, в случае претензий, мопед не мой – я только объяву разместил.)
 
🍆 Сегодня просто посмотрим на пояснительный дикпик 👆 и разберемся, из каких основных компонентов состоит кафкианский мессаджинг.
 
Cluster – ну тут все просто – это набор кафок. То есть, если вы хотите масштабироваться горизонтально, то кластер – это то, что вы будете расширять добавляя туда побольше кафок.
Broker – это собственно инстанс кафки, который занимается полезной работой. Их может быть много, и они в себе содержат топики.
Topic – это собственно то, что хранит в себе пересылаемые данные. То есть, когда сообщение попадет к брокеру, то он положит его в нужный топик.
Producer – это тот кто пишет в топики.
Consumer Group – это группа консьюмеров которые читают из топика. Тут есть нюанс, что каждый консьюмер в группе будет читать из своей партиции, но об этом позже. И это, кстати, тоже охренеть какое отличие! (Спасибо Юре Пастушенко 🥰 за исправление. Будьте как Юра – пишите мне, если видите, что я спорол хуйню!)
 
🐇 Так как я много работал с RabbitMQ, не могу не отметить, что верхнеуровнево все выглядит один к одному! Но есть значительные различия в том, как кафка работает с топиками. Это довольно сильно отличается от кролика и вот чем:
 
1️⃣В кафкианском мире консьюмер поллит брокера, чтобы забрать данные из топика. В отличие от кролика, где брокер пушит сообщения сам. Конечно в кролике тоже можно было перевести консьюмера в режим поллинга, но это не православный подход считается.
2️⃣Сама работа топиков сильно отличается от очередей (тут важная эмоциональная ремарка: да просто охуеть как сильно отличается. Это настолько разные штуки, что я бы их даже не сравнивал!). Так как в очереди сообщение живет до тех пор, пока его разок не прочтут, после чего удаляется (я намеренно опустил детали если что). В Кафке append-only подход. Поэтому хранение там организовано иначе. Там тоже сообщения удаляются, но по истечении времени, да и то если вы сами хотите. Об этом подробнее в следующем посте.
 
Такие вот верхнеуровненвые кафкианские пироги. Stay Tuned, как говорится.
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
💪 Как выбрать Struct или Class?
Всегда на интервью спрашиваю у ребят и девчат, приходилось ли им выбирать между struct или class на практике. И в каком случае стоит применять одно, а в каком другое. (Спрашиваю, потому что сам не ебу, если честно, что там и как.Ставь лайкосик 👍, если тоже на интервью пытаешься узнать что-то новое!)
 
Это тот самый случай, когда ты теорию знаешь, но на практике вообще не ясно, как эту теорию применить. Вот сегодня, кажется, что я сформулировал довольно крепкий кейс, в котором нужно как минимум задуматься, отдать предпочтение структуре или классу.
 
Так вот, представим себе вот такой объект. Ему нужно быть структурой или классом?

public ???? TimeInterval
{
public TimeSpan From { get; set; }
public TimeSpan To { get; set; }
}

📖 Я считаю, что эта штука может стать структурой и для этого есть вполне практичный аргумент. Безо всяких там (бито-байтоёбств) оптимизаций по памяти и прочей лабуды. Рассмотрим такой тест (если лень читать, то я там сравниваю два одинаковых по наполнению TimeInterval):
 
[Test]
public void StructRef()
{
var from = new TimeSpan();
var to = new TimeSpan().Add(30.Minutes());
 
var interval1 = new TimeInterval()
{
From=from,
To=to
};
 
var interval2 = new TimeInterval()
{
From=from,
To=to
};
 
Assert.True(interval1.Equals(interval2));
}

 
Если мы сделали TimeInterval структурой, то он пройдет. Что и не удивительно, так как метод Equals проверит наши данные по значению.

Но если мы сделаем TimeInterval классом, то этот тест так просто уже не прокатит. Придется учинить оверрайдинг метода Equals для этого класса, а где оверрайдинг Equals, там и оверрайдинг GetHashCode.
 
🅰️ Теперь я приведу практический вывод, который вы можете использовать в повседневной разработке: Если вам в каком-то классе понадобилось переопределять Equals, то прежде чем это делать, задумайтесь, а не стоит ли вашему классу стать структурой?

Ну и еще нужно воспользоваться памяткой от Microsoft разумеется.

P.S.: Конечно тут можно использовать record struct а не просто struct. Надеюсь это очевидно)
#struct #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔2
😂 Компильдот.
Опятьница (опять пятница)! Ну ежкин дрын. Сегодня будет чуть больше жести, но без сношений сами знаете куда. Итак, встречаем:

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

Понравился компильдот? – Ну и куда ты пошёл? А кто лайк будет ставить? Пушкин?
Не понравился? – И что, вот так и оставишь этот компильдо безнаказанным? Вырази свое мнение там где тебя услышат – здесь! А говняшка Скрэппи всегда поможет в этом.
#компильдот
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🍌1
🍆Kafka #2: Пояснительный дикпик
#kafka
🔥1
🙏Kafka #2: Топики
Сегодня поговорим про топики. Когда я читал про них, у меня все больше и больше мыслей возникало, что они похожи на таблицы в базе данных, только с более строгими правилами записи. Вот ключевые фичи топика:
 
✴️ Топик – это контейнер для одного типа событий. (по сути, как таблица в базе данных, пояснительный дикпик выше 👆)
✴️ Данные между топиками могут дублироваться.
✴️ Топик – append-only штука (то есть удалять оттуда нельзя)
✴️ В топике есть offset, по которому мы можем искать нужные события. Это по сути смещение от начала сегмента (про сегменты чуть позже, пока можете считать, что от начала файла с событиями)
✴️ События редактировать нельзя.
✴️ Схема данных событий в топике не проверяется.
✴️ Топик делится на партиции. (про это в следующем посте)
✴️ Из одного и того же топика могут читать разные консьюмеры, но читать они будут информацию из разных партиций.

Верхнеуровненво это все еще чем-то напоминает очереди, но из-за своей имутабельной структуры у топиков иной подход к параллелизщации нагрузки – партиции. Про него я расскажу в следующем посте. Хотя очень хочется и сейчас. Но всего по-немножку! 😏

🅰️Практический вывод:
1) Когда в своей практике вы создадите топик в Кафке? Когда ваше приложение будет кидать определенный ивент, к примеру о том, что оплата прошла. Вы создадите топик с назанием PaymentAccepted и будете слать в него события.
2) О чем нужно помнить? Что если послали, то удалить посланное из истории будет невозможно.

P.S.: Если что, у этой информации есть оригинал, он тоже коротенький, так что можете ознакомиться.
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
🍆Kafka #3: Пояснительные дикпики 🍆
#kafka
🌭1
🙏Kafka #3: Как устроен Topic. Партиции.
Ок, топик мы создали, начали писать туда сообщение и вдруг поняли, что тачка не вывозит. Что делать? На помощь приходят партиции. Топик состоит из партиций (пояснительный дикпик 1).

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

Соотвественно сообщения по партициям не копируются, а распределяются!

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

Partition0: 1️⃣1️⃣1️⃣1️⃣1️⃣
Partition1: 2️⃣2️⃣2️⃣2️⃣2️⃣2️⃣

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

Как данные читаются из партиции?
Хорошо, мы научились писать в партиции, а как же из них читать? Это не так просто, ибо партиция, это по сути отдельно живущая штука. Что-то типа сетевой папки.

Из одного топика могут читать сколько угодно консьюмер-групп (пояснительный дикпик). Но вот из одной партиции может читать только один консьюмер! Один, в рамках одной консьюмер-группы, разумеется 🖼, как меня правильно поправили в комментариях. (пояснительный дикпик 3).

Из этого пункта следует два вывода:
❗️Сколько партиций, столько и консьюмеров в группе – ни больше ни меньше. Потому что, если сделаете меньше, то часть событий просто пролетит мимо вас. А если сделаете больше, то лишний консьюмер будет стоять и передергивать в сторонке. (на третьем дикпике мы как раз аидим таког третьего лишнего)

❗️Если продьюсер не указал ключ партиции, то сообщение распределится между партициями по RoundRobin'у. То есть вот так:

Partition0: 1️⃣1️⃣2️⃣1️⃣2️⃣
Partition1: 2️⃣1️⃣2️⃣2️⃣1️⃣2️⃣

И вам потом придется бегать по партициям и собирать все во что-то более менее приемлемое. Так что будьте с этим аккуратнее.

🅰️Практические выводы:
1. Когда делаете новый топик, то сразу думаете про количество партиций. Думаю, что стоит считать предполагаемую нагрузку по сообщениям. Так как добавление партиций – это нетривиальная операция. Короче, это число с бухты-барахты не выбирают. (у нас в компании вот выбрали по лунному календарю и гороскопу, но не с бухты-барахты блять!)
2. Продьюсер должен задавать ключ партиции. Иначе в партициях будет хаос из данных по разным сущностям. (но хер знает, может вы носитель хаоса, и вам так комфортнее 😉)

Дисклеймер: Вся информация здесь, это моя личная вольная интерпретация прочитанной доки по кафке, просмотренных видосов и разговоров с коллежанами. Если у вас есть возражения, то приносите их в комменты. Я очень благодарен всем, кто комментирует, лайкает и вообще проявляет активность в канале и в личке. Это супер-помогает мне не терять мотивацию!
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
👋 Как обсудить задачу, чтобы все поняли её одинаково. Метод "Дано Когда Тогда".
Возьму небольшой перерыв в кафкианской саге и расскажу тут про одну мегаполезную штуку, которая вот уже год служит нашей команде верой и правдой и помогает делать встречи короче и продуктивнее.

С самого начала работы в IT у меня крутился в голове вопрос, как же сформулировать задачу так, чтобы в конце все поняли её одинаково?
 
Заебывало знаете ли, что, бывает, сидишь на встречах, слушаешь по 30 минут, как люди спорят, куда надо подвинуть кнопку, а в итоге выясняют, что они вообще говорят о разных кнопках. И потом еще 30 минут слушаешь, как люди пытаются выяснить, кто из них бОльший долбоеб. (А потом выясняют, что говорили про разных людей, ахах!😂)
 
🅰️ Освоил простую, но эффективную технику и спустя год работы с ней, могу порекомендовать её однозначно. Она простая до того, что стыдно писать про неё пост (но я все же напишу). Называется техника "Дано, Когда, Тогда".
 
Суть простая. Когда кто-то из бизнеса описывает функционал, то проговаривает каждую фичу в формате:
"Дано: Кто-то хочет что-то"
"Когда: Этот кто-то делает действие"
"Тогда: Видит результат в таком-то формате"


К примеру, одна из наших фич с сумрачным названием:
Скопировать поп-ап управления отложек МенСмены в МенОфиса/ День

Что должно быть в результате? Хер знает. Вызываем технику Дано Когда Тогда:
 
Дано: Я как региональный управляющий могу зайти в Менеджер Офиса.
Когда: Я в интерфейсе МО на главной странице в разделе Трекинг — Отложено нажимаю мышкой на отложенные заказы
Тогда: Появляется такой же интерфейс как в Менеджере Смены при нажатии на кнопку Отложенных заказов - 0 в разделе Кухня на вкладке Главная.


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

Такое описание привело к тому, что мы начали рассматривать различные корнер-кейсы и выяснили, что к примеру не все детали интерфейса нужно будет переносить в окончательном решении:

Дано: Я как Менеджер Офиса выбираю пиццерию Сыктывкар-1. Я открываю Отложенные заказы на главной и вижу отложенные заказы из Сыктывкара-1.
Когда: Я смотрю на место, где в Менеджере Смены есть иконка принтера
Тогда: Вижу, что в Менеджере офиса ее там нет.


Конкретно этот критейрий снял головную боль по переносу функционала печати, который намертво вбит в Менеджера Смены.
 
⁉️ Тут же возникнет вопрос. Но, Дмитрий, пардон, есть же User Story Mapping, есть же доски в Miro, макеты, разве этого добра не хвататет?
 
Хватает, но User Story Mapping – формат тяжелый, как хрюкающие подсвинки сатаны. А функционал бывает не визуальным, к примеру в итоге действия должен проигрываться звук, так что фигмы никакой не будет. И еще плюсом этого формата является то, что он позволяет покрыть, как маленькие задачи, так и довольно большие.
 
User Story Mapping все еще отличный инструмент, но подходит он скорее для очень больших задач. Которых у нас не так много.

Как начать использовать Дано, Когда, Тогда? Да супер-изи!
1️⃣ Для пункта Дано, попросите продакта максимально описать пользователя, который будет производить действие. Его роль в системе, данные, которые должны быть заполнены, что он хочет сделать.
2️⃣ Для пункта Когда. Попросите сформулировать, что будет делать пользователь. Откуда он начинает своё действие, куда кликает, чтобы прийти на нужный экран или  перевести систему в нужное состояние.
3️⃣ Для пункта Тогда попросите описать конечный результат. Как поменялось состояние системы? Что увидел пользователь? Почему ему это было полезно?
 
Повторяйте до тех пор, пока не покроете все крайние случаи. Будет сложно, но через несколько PBRов навык отточится, и вы поймете насколько глубоко нужно детализировать каждый пункт и сколько таких пунктов нужно.
 
Еще можно позвать инженера по тестированию, чтобы он помог вам не сдаться на пути в бездну и помочь МАКСИМАЛЬНО детализировать крайние случаи.
#процессы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🤩1🙏1
🙏 Kafka #4: Как устроены партиции. Сегменты.
Источник пояснительного дикпика
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
🙏 Kafka #4: Как устроены партиции. Сегменты.
Хорошо, мы создали топик, разделили его на партиции. Но вдруг партиция раздулась так сильно, что ему пришла финита! А увеличивать место больше некуда по финансовым соображениям. А вы до этого читали, что из Кафки ничего не удалить! ЧТО ДЕЛОТЬ⁉️

Главное – не переживать! Дело в том, что кафка все пишет в файлы. Но делает это хитро. Когда размер файла достигает 1 Гб или возраст файла достигает недели (что быстрее наступит), брокер создает новый файл и начинает писать в него. С новым файлом произойдет то же самое, когда он увеличится до 1 Гб или проживет неделю.
 
Такие файлы называются сегМЕНТАМИ. (пояснительный дикпик выше 👆) Ну ладно просто сегментами. И партиция по сути состоит из таких сегментов. Тот файл, в который кафка пишет прямо сейчас называется активным сегментом.

И как все это самоочищается?
Вы можете настроить всё так, чтобы эти сегменты понемногу чистились автоматически. Либо, когда место на диске начинает заканчиваться, либо когда возраст сегмента достигает определенного значения. Активный сегмент хрен удалишь, по понятным причинам. (Ну точнее, вы конечно можете его удалить, но если вы так делаете, то либо вы гений, либо у меня для вас нет хороших новостей сегодня)
 
Разме сегмента можно настроить, как на уровне настроек брокера, так и на уровне настроек топика. Кто кого переопределяет, тут я ХЗ. Выглядят эти настройки вот так:
log.segment. bytes
log.segment.
ms

🅰️ Практические выводы:
1. Кафка все таки что-то удаляет, но удаляет сегментами. То есть откусывает кусочки партиции.
2. Настраивать сегменты имеет смысл, если вы понимаете, что у вас в брокере мало памяти, или же, если вы знаете, что данные в топике не нужно хранить дольше определенного срока.

В следующем посте буду разбираться с индексами и тем, как консьюмер ищет сообщения по партициям и их сегментам.
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1👏1
😅Компильдот! 💡
Самые внимательные заметили, что в прошлую пятницу обошлось без компильдота. А все почему? Потому что я отдыхаю. Отдыхать – важно, посему компильдот про отдых сегодня, товарищи!

Беседуют программист и тестировщик. Программист ноет:
- Начальство совсем оскотинилось, сколько времени можно работать без отпуска!
Тестировщик ему отвечает:
- У меня есть идея, как заработать хотя бы пару дней отдыха.
Вдруг он зацепляется ногой за трубу на потолке и висит вниз головой. Входит продакт. Хочет уже всех посадить за работу, как вдруг замечает тестировщика на потолке:
- Что это тут происходит? Что вы о себе думаете? Почему висите на потолке?
Тестировщик отвечает:
- Ничего особенного - я лампочка, освещаю комнату, почему бы мне и не висеть?
Продак в шоке:
- Знаете, что, мне кажется, вы немного переутомились, идите домой, и, чтобы на этой неделе я вас тут больше не видел!
Тестировщик собирается и уходит. Программист тоже начинает собирать вещи.
- А вы куда? - спрашивает начальник.
- Ну, я же не могу работать без света!

Так-с компильдот запостил, пора бы и ещё отдохнуть. Ставь лайк 👍, если готов лезть на потолок ради пары дополнительных дней отпуска и говняшку Скрэппи 💩, если в этот ноябрь всё еще пашешь, как трактор! 🚜
#компильдот
Please open Telegram to view this post
VIEW IN TELEGRAM
💩3🌚1
😰Постмортем на задачку.
В сентябре мы взялись за задачу, которая изначально показалась сложной, но выполнимой в предсказуемые сроки.

Для меня сроки – это супер-важная штука. Потому что сроки – это про доверие, а доверие, ну сами понимаете. Лучше его беречь в общем.

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

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

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

Что мы сделали хорошо:
🔘Изначально ограничили количество пиццерий, на которых будем тестировать фичу
🔘Изначально постарались упростить первый вариант задачи по функционалу
🔘Взяли три дня на исследование легаси
🔘Сформулировали приемочные критерии
 
🤟Что бы помогло в следующий раз снизить боль от работы.
🔘Возможно документация по этому легаси нам помогла бы хоть немного. Хотя бы понять, что мы встрянем в это дерьмо надолго. Хотя бы задуматься об этом.
 
Сейчас доделаем наконец этот функционал. Надеюсь, что на проде все будет хорошо. Пишем сценарии для тестов и покрываем ими вот это все. Дальше ждет прод и проверка фичи на одной пиццерии на проде. А потом улучшение этой фичи для раскатки на большее количество пиццерий.
 
Что делаем перед следующим этапом задачи:
🔘Позвали одного из самых охуенных наших инженеров по тестированию, чтобы он помог нам составить и требования к следующей задаче и тест-кейсы и проследил, чтобы мы не филонили в покрытии тестами.
🔘Напишем доку по тому что сделали и тому, что раскопали.
🔘Измерим нагрузку, которую создает наш функционал на нагруженную таблицу и если нужно оптимизируем запрос и работу с базой.
 
🤬А еще будем учитывать фактор осени в следующем году. Ибо осенью мозг работает в пол силы. Нужно брать что-то менее амбициозное. (Кстати, ставь лайкосик, если тоже к осени опадаешь, как кленовый лист! 🍁)
#опыт #процессы #постмортем
3
🤕 Как я случайно справился с зимней хандрой

🅰️ TLDR: Я начал работать только при дневном свете (с 8:30 до 16:00). Получилось меньше рабочих часов, но больше итоговой работы и удовольствия от неё.

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

Справиться с этим состоянием не получалось. Ничего не помогало – ни витамины, ни походы к психологам. Сначала я старался все же делать посты через силу, но в итоге решил не давить из себя раба по капле, и просто забил, сконцентрировавшись на более достижимых аспектах моей жизни – прохождении Red Dead Redemption 2.

🧈 Но вмешался случай и случайным образом я случайно нашел решение проблемы (абсолютно СЛУЧАЙНО). Делюсь с вами.

Итак, для того чтобы в зимний период избавиться от тумана в голове нужно всего лишь… Работать только при дневном свете!

Короче, я начал вставать с рассветом в 8:30, начинать работу в 9:00 и заканчивать в 16:00. По МСК это период с 8:00 до 15:00. Важно еще то, что после окончания работы у меня остается полтора часа светового дня на свои дела. То есть я не работаю от рассвета до заката прям, а немного гуляю при свете дня.

И, о чудо – продуктивность не то что выросла, а вернулась к дозимним показателям!
 
🛌 Засыпать, я, естественно, начал тоже раньше, но этот аспект я не особо контролировал – он сам пришел в норму.
 
Тут возможно меня покритикуют, что я получается меньше работаю: типа 7 часов + перерыв на обед и турнички, итого всего 6 часов. Но йопт, лучше наверное 6 часов продуктивной работы в удовольствие, чем 8 часов недовольного топтания говна в ступе?

🅰️ Итого: Если чувтсвуете, что зимой началась хандра – попробуйте работать только при дневном свете (даже если его прям мало-мало) и заканчивать работу до заката. Возможно вы как и я заметите эффект с первого дня.

П.С.: И да, напишите в комментах или мне в личку, есть ли у вас что-то похожее зимой, и как вы с этим справляетесь? Мне было бы супер-интересно узнать.
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚1🤓1
🤶🧧Думаю, что надо подвести итоги года и закончить его на высокой ноте. Последнее время мало тут активничал, но думаю с февраля восстановлю былую регулярность.

А пока итоги такие: Начал вести канал, научился более менее регулярно в него писать. Много какие знания прокачал через написание постов. И вот еще подкаст записал под конец года. Получилось вроде неплохо.

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

Но в любом случае всех с наступающим новым годом и спасибо, что читали, лайкали и просто не отписались после всех этих компильдотов!
3
Forwarded from Dodo Engineering
О пути из разработчика в лидеры, внутренней перестройке, погружении в бизнес и о том, что делает СТО в Dodo Engineering

💻 Так совпало, что три года назад наша IT-команда официально стала компанией Dodo Engineering. И сегодня мы празднуем её день рождения. В честь этого и грядущего Нового года — спецвыпуск подкаста.

🎙Гость — Павел Притчин, в роли ведущего — Дмитрий Афонченко, наш разработчик.

Паша рассказывает о том,
как выглядит Dodo Engineering со стороны СТО, как происходила его трансформация из простого разработчика в технического лидера, какие навыки и книги помогают ему в работе.

Узнаем, как Паша относится к падениям Dodo IS, когда в последний раз писал код, как фиксирует свои результаты, на каком уровне СТО (джун, мидл, сеньор) находится и откуда у него есть время на подкаст.

И куда, в конце концов, делась рубрика «монолитометр».

🎧 Где послушать:

Web
Apple Podcasts
Google Podcasts
Я.Музыка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
🤬Быстрая мысль про ChatGPT.
С новым годом, етить его на право! 🎄

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

Короче, ChatGPT можно использовать в качестве советника для составления имен для доменных сущностей. Я попробовал спросить эту штуку, как мне лучше назвать класс для составного продукта – CompoundProduct или CompositeProduct и вот что он мне ответил. (смотри на скрине)

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

ПС Понятно, что это пока все ненадежное и после каждого такого ответа нужен дополнительный анализ, но тем не менее!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
⚖️ Равновесие Нэша и конфликты в команде

Если не смотрели фильм “Игры разума” с Расселом Кроу, то обязательно посмотрите, а после просмотра обязательно погуглите про “Равновесие Нэша”.
 
Это довольно несложная теорема, которая говорит о том, что в абсолютно ЛЮБОЙ конечной игре есть такое состояние игроков, когда они не могут увеличить свой выигрыш. Более того, равновесием Нэша называется такое состояние, когда по сути весь набор игроков находится в проигрышном положении.
 
Простым языком – в любой игре может сложиться так, что все игроки будут "жрать говно", хотя если оба одновременно постараются, то могут перестать это делать.
 
Давайте на такой схеме рассмотрим. У нас есть игрок 1 и игрок 2. И они в положении 4:

1) Оба не жрут говно
2) Игрок 1 жрет, а Игрок 2 не Жрёт
3) Игрок 2 жрет а Игрок 1 не Жрёт
4) Оба жрут говно
 
Тут все будут жрать говно. Почему? Да потому что переход в состояние 1 возможен только через состояние, когда один из игроков выбрался из говна (2 или 3), а это обидно для другого игрока, и он всеми силами будет тащить второго игрока обратно.

🤔 Смекаете? Ситуация, думаю, более чем знакомая. И, как мы теперь понимаем, математически неотвратимая.
 
💩Теперь к конфликтам в команде.
Конфликт в команде, это состояние, когда все жрут говно. В чем задача талантливого лидера в таком случае? Перевести одновременно всех в состояние 1. Но знаете в чем фишка? Математику не обманешь, кто-то все равно будет жрать говно…

🅰️(UPD)Прикладное значение: Думал, писать или не писать. Но все же решил дописать.

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

(UPD2)Еще важно, что это работает только для игр “все против всех”. То есть есть еще возможность решить конфликт, попытавшись перевести игру из условия “все против всех”, в условия, “все друг другу помогают”. Тогда возможны более приятные расклады.
#процессы
🔥2👍1
🙏 Kafka #5: Сегменты и индексы. Как брокер указывает консьюмеру на своё место?
Пояснительные дикпики 1 и 2
#kafka
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1