C# Short Posts 🔞 – Telegram
C# Short Posts 🔞
250 subscribers
111 photos
4 videos
151 links
Здесь я, Дима Афонченко @Undermove1, публикую короткие заметки о разработке (и около). Я не претендую на правильность высказываний и открыт к дискуссиям, исправлениям и конструктивной критике. С любыми деструктивными вещами можно приходить в комменты)
Download Telegram
🎢 Как я использую Chat GPT
С удивлением узнал от коллег, что у нас не все еще юзают ChatGPT на постоянку. ( Да как так-то ⁉️) Во многом потому, что не вполне понимают, чем им этот инструмент может помочь (считают слишком тупой эту штуку, если по-честному)

Короче, я посчитал, что просто обязан теперь всем пропагандировать работу с чатом ГПТ. Посему, решил показать, как я сам пользуюсь этой штукой, и как она мне помогает на примерах:
1️⃣ Проверяю смысл иностранных слов. К примеру у меня был выбор названия классов между Location и Coordinates. В чем разница? Оказалось, что Location более абстрактная структура данных, и может содержать в себе Coordinates, но вдобавок содержит в себе скорость, направление и прочие штуки.
2️⃣ Строю SQL запросы. Описываю свои таблицы и взаимоотношения между ними, индексы, которые там есть и прошу построить оптимальный запрос. Если что-то не выходит, то уточняю запрос.
3️⃣ Пишу всякие yml для Github Actions и прочего. Мне всегда лень это делать, а эта штука сильно ускоряет процесс. Просто говоришь, что тебе нужно и какие есть параметры и на выходе получаешь готовое решение.
4️⃣ Формирую Regex'ы. Вот это самое облегчающее мою жизнь действо. Если помните, то были даже всякие конструкторы для Regex'ов. Вот они теперь нахер не нужны. Даешь пару шаблонов, говоришь, какую последовательность нужно вытащить и получаешь рабочий Regex. Да а еще XPath'ы идут в ту же копилку.
5️⃣ Пишу бойлерплейт. К примеру код хэндлера просто генерирую в этой штуке. В идеале хочу прийти к AI aided testing, чтобы писать сразу тесты и код промптом. Но это подходит только для хорошо организованного проекта со стандартной структурой. Если там какой-то лютый велосипед, то все идет прахом.
6️⃣ Если учитывать копилот, который я себе недавно поставил, то он пока не приносит такого удовольствия, как я ожидал. То, что подсказывает, порой не подходит, но в целом что-то он упрощает, это да.
7️⃣ Пишу посты сюда (Да да, я сюда только матерок вставляю, а вы не знали? Ладно, это просто смехуечек. Посты здесь ручной работы!)

👍 Если подводить какой-то Rule of Thumb для использования ChatGPT в работе, то для меня он звучит примерно так "отдавать этой штуке все, что мне самому было бы скучно делать".

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

Ну и, если вы поделитесь своими кейсами использования в комментах или в личке, то я буду неимоверно вам признателен!
👍2🔥2
🍓Очень странные зависимости.
Сегодня будет странная задачка без правильного ответа. Есть вот такая регистрация сервисов:

services.AddSingleton<IDialogProcessor, TelegramDialogProcessor>();

services.AddTransient<GetUserFeatureHandler>();

services.AddScoped<ITraleDbContext>(provider=>provider.GetService<TraleDbContext>() ?? throw new InvalidOperationException());

Порядок регистрации совпадает с порядком зависимости, то есть:
⬇️ TelegramDialogProcessor(GetUserFeatureHandler handler)
⬇️ GetUserFeatureHandler(ITraleDbContext context)
⬇️ ITraleDbContext - ни от кого не зависит

Методы IDialogProcessor вызываются из кода контроллера. Вопрос. Сможет ли разрезолвиться scoped сервис ITraleDbContext при таком вызове?

Короче ответ: "квантовое да".

По идее, контроллер создаст скоуп и далее все вызовы будут идти с этим скоупом. И все должно заработать и это работатет. Но… Не в тестах с использованием TestServer!

😵 Причем не будет работать, если запускать эти тесты из консоли при помощи dotnet test. В этом случае ITraleDbContext не резолвится с жалобами на потерянный скоуп: "Cannot resolve scoped service 'Application.Common.ITraleDbContext' from root provider."

А сейчас вообще странное — при запуске тестов из Test Explorer райдера всё работает! Как и почему? Я вот сейчас пытаюсь понять.

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

Наткнулся вот недавно в своем тралеботе, интересно было бы докопаться до сути.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4👀2
🔬Мелкая декомпозиция, как она ускоряет разработку в разы?

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

Если честно, я был убежден, что в Додо это очевидно всем, но недавно меня спросили: "А в чем плюс мелкого дробления задач?" Я рассказал на пальцах. Но меня еще раз спросили. Я снова рассказал. Но МЕНЯ ЕЩЕ РАЗ СПРОСИЛИ СЕГОДНЯ. Решил расписать, чтобы просто кидаться ссылочкой.

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

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

👯‍♀️ Две команды делали два новых сервиса. Сервисы предельно схожи по функционалу. В обоих нужно было собирать из шины сообщения и показывать цифры на телевизоре (разумеется в красивой оболочке, чтобы было секси и все такое).

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

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

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

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

У команды номер один в момент поломки был готов и фронт и бэк, поэтому матрица диагностики состояла из трех вариантов:

1️⃣ Сломан бэк, фронт в порядке
2️⃣ Бэк в порядке, сломан фронт
3️⃣ Самый худший вариант: Сломано и то и другое.

У команды номер два матрица диагностики была такая:
1️⃣ Что-то сломано в бэке.

Чувствуете разницу? Три варианта против одного. Более того, в случае, если команда один сломала и фрон и бэк, то поиск проблемы усложняется многократно!

У команды два диагностика минимальна: "Мы выкатили коммит, где всего десять строчек. В них что-то видимо и сломалось."

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

В первом случае выкатка заняла время разработки + долгое время диагностики. (2 месяца в сумме)

Во втором случае только время разработки. (1 месяц в итоге)

И это то самое преимущество, которое дает мелкое дробление задач — устойчивость перед так называемыми Черными Лебедями. Вроде все очевидно.

И вы спросите, Димас, ну все же очевидно! Почему тогда люди не понимают, что дробить задачи нужно мелко?

Дело в том, что, если, у обеих команд все пошло бы гладко, то вся эта матрица проблем свелась бы к нулю. И тогда мелкая декомпозиция и время её выкатки не сильно отличится от времени выкатки БОЕВОГО МЕГАКОНЯ.

Тут я упомяну Канемана в суе. У него есть хорошая теория, что человеческое сознание делится на две системы Система 1 и Система 2.

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

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

Так вот. Чтобы расписать вышеприведенную матрицу надо напрячь мозги. Более того, нужно еще где-то на подкорке понимать, что может случиться ⬛️ 🦢Черный Лебедь. А это мысль неприятная, думать её тоже больно, что дополнительно толкает мозг думать проще "Выкатим все разом, ну там же ломаться нечему!"
3🔥3
🅰️ Итого, ТЛДР: Мелкая декомпозиция не помогает сделать быстрее в идеальном случае, она обеспечивает устойчивость по отношению к Черным Лебедям. Но вообще, по-честному, скажу так. В айти закон Мерфи работает всегда: "Если что-то может сломаться, то оно сломается" А это значит, что мелкая декомпозиция с ОЧЕНЬ большой вероятностью действительно ускорит разработку.

Если будут спрашивать, то расскажу, до каких пор рационально мельчить задачи, и где найти грань. Ну я по своему опыту, расскажу, конечно)))
#опыт
4🔥4
📈 Почему растут бэклоги?

Кто о чем, а я снова про бэклоги. Я их повидал много. Длинные, короткие, на несколько досок, с изгибом и без… Последнее возможно уже не про бэклоги (А ПРО ХУИ, да вот так вот в ЛОБ 😈)
 
Я уже писал свои наивные мысли, как сделать так чтобы бэклог не рос, вот тут. Но вот в новой команде снова столкнулся с длинным бэклогом, и решил чуть углубиться в этот вопрос. А именно в причины такого разрастания. Тут будет мое никому не нужное мнение, о том, почему так происходит, но может в будущем наведет на мысль как с этим можно работать.

🅰️ Погнали TOP-4 по версии Димаса:

1️⃣ Боязнь отказать. К вам приходит очень хороший человек. Вы с ним пили в баре, играли в футбол, придерживали друг другу волосы, когда справлялись с последствиями корпоративов. Короче, вы очень близки, и сказать ему "что эту задачу мы никогда не сделаем" вам просто не хватает духу. Или это ваш начальник, который грозно смотрит на вас, и требует причины отказа, а в стрессовой ситуации нормально сформулировать что-то не получается. И задача, которая не ложится в вашу стратегию попадает в бэклог, где никогда не будет сделана.

2️⃣ Конфликт интересов. У вас в команде куча синьористых рассиньоров. У каждого свои хобби — кому-то нравится фичи пилить, а кому-то байтики перекладывать. Вы пытаетесь удалить задачу на перекладывание байтиков, и обостряете конфликт между ними, потому что фича-дрочер поддерживает вас, а байтоеб в ярости. И наоборот, вы пытаетесь удалить какую-то мелкую фичу, фича-дрочер начинает негодовать, а байтоеб наливается гордостью. В итоге вы просто плюете на все, лишь бы было кому работать, а то чего доброго все поувольняются. (если что, я и фичадроеров и байтоебов уважаю, но лично мне фичи поближе)

3️⃣ Страх фатально что-то упустить. А что если мы удалим эту задачу, а она как возьмет да и стрельнет так, что вся компания развалится? Этот страх, конечно, иррациональный, потому что если у вас есть такая задача в бэклоге, то только в колонке Done или DOING ASAP.

4️⃣ Страх показаться незанятым. Приходит начальник и говорит, а что у тебя бэклог пустой в конце квартала? Ты что, Вася, не работаешь что ли? Ну и это же выливается в страх, что классическая отмазка "У нас работа всегда есть — посмотри на наш бэклог" перестанет работать, и о ужас, придется отказывать кому-то если задача не ложится в стратегию и объяснять эту самую стратегию.

А почему растут ваши бэклоги? Если по каким-то из этих причин — ебаните лайк, а если нет и у вас ДРУГОЕ — пишите мне в комменты и ставьте какашки.

Давайте дискутировать, ибо у нас тут не парламент!
#бэклог
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4
🔫 Как проверить свой сервак на базовые уязвимости?

Когда я делаю свои пет-проекты, один из страхов, который меня останавливает от выкладки на сервак — это панический страх перед школьниками. Ну типа придет какой-нибудь пЕздюк, хакнет мой криво настроенный NGINX и будет пускать через него наркотрафик до тех пор пока меня за это не посадят.

Гуляли мы тут по Баутми с коллегой по цеху Сашей Журавлевым, и он поделился со мной не только похожим страхом, но и реальной ситуацией, о том, как его сервак хакнули школьники и запустили с него ботнет.

🆙 Но Александр не лыком шит! И вообще настоящий педантичный профессионал (напоминаю, других у нас не держат), у которого я без зазрения совести учусь, подсказал сервис (покупки дешевых авиабилетов! Простите, я хотел вставить эту шутку, потом удалил, потом снова вставил. Короче вот пусть поживет тут под спойлером, пока я обдумываю свое поведение) сканирования web-серверов на уязвимости. Называется HostedScan.
 
Чекнул его на тралеботовском серваке, нашел неплохую пачку говна 💩. Все пофиксил, как смог, и, короче, доволен. Проверка в один клик буквально делается. Просто вводите адрес и получаете результат на почту.

Проверка идет через утилиты Nmap, Owasp ZAP и по протоколу OpenVAS. В целом, вы можете и сами поставить эти утилиты себе на комп и проверить вручную, просто HostedScan покрасивше выводит результаты. Табличка с уязвимостями и уровнем угрозы.

🅰️ Итого: если вы выложили свой пет-проект на сервер, и хотите проверить базовые настройки безопасности, то проверьте его через HostedScan и или через утилиты Nmap, Owasp ZAP и по протоколу OpenVAS.
#безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🙏63
🏫 Базовые настройки безопасности сервера для пет-проектов.

Короче, моя паранойя по школьникам продолжается. Решил собрать для себя список базовых действий, которые нужно предпринять, чтобы тебя не взломали:
 
1️⃣ SSH не по паролю, а по ключу.

2️⃣ Настроить VPN на сервере.

3️⃣ Настроить доступ к приложению только через Reverse Proxy NGINX. Это важно, потому что дефолтный HTTP сервер для всех языков программирования имеет свои потенциальные уязвимости. Лучше использовать

4️⃣ Закрыть все порты кроме 22,80,443,1194. То есть открытыми дложны быть только SSH, HTTP и HTTPS порты, а также OpenVPN, ну или любой другой VPN, который вы решили использовать.

👋 Проверить свой ip адрес на через HostedScan и устранить все уязвимости High или Medium.

6️⃣ Настроить Fail2ban от DDoS атак. Для перебора пароля от ssh эта штука обычно уже настроена. Но можно натравить её и на другие порты.
 
Если есть еще что-то, что я упустил, накидывайте пожалуйста. А то я по вопросам настройки инфры, ну если не полный ноль, то точно малоопытный дятел.🐔

Думаю, что список буду модифицировать и дополнять по мере того как меня будут взламывать всякие школьники.
#безопасность
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥3👍2👌1
🐌 “Думай медленно, решай быстро”⚡️

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

Зря. Книга оказалась фундаментальной. Дала ответы на кучу вопросов. Я тут однозначно прорекламирую её. Вот вам мои хайлайты, которые по моему наивному мнению должны продать вам эту книгу:

✴️ Экспертные оценки — это очень неточная штука. И в первую очередь это нужно применять к себе. То есть, когда вы говорите, что задача будет сделана за день. Имейте в виду, что правдоподобность этого прогноза невелика.

✴️ Точность самой хреновой формулы выше чем точность экспертных оценок. Полагайтесь на формулы и статистику везде, где вам нужны хоть сколько-то точные прогнозы.

✴️ Метод прижизненного эпикриза. Перед тем как начать что-то долгое, к примеру рефакторинг проекта, Задайте себе вопрос "Представьте, что все прошло как вы хотели. Вы заглянули в будущее и проект потерпел катастрофу. Опишите за 10 минут картину катастрофы." Этот метод называется методом прижизненного эпикриза. Его можно использовать для оценки любого сложного действия.

✴️ Ну и вообще не стоит недооценивать банальное везение. Это нормально, если вы все сделали правильно и проиграли. Делая правильно, вы повышаете шансы на успех, но свести к нулю возможность неудачи довольно сложно.

✴️ Иллюзия понимания. Если вам не хочется что-то записывать, потому что И ТАК ВСЕ ПОНЯТНО, то вам точно нужно все записать/нарисовать/посчитать. Мозг подбрасывает вам иллюзию понимания, чтобы облегчить себе работу и не думать. Не ведитесь.

🅰️ Ну и вообще, почему книга называется “Думай медленно решай быстро”. Думай медленно — это про то, чтобы перед тем как взять и сделать что-то, нужно сделать то, что делать не хочется — внимательно подумать и посчитать там, где не хочется считать, записать там, где лень записывать, порисовать там, где кажется, что и так все видно. А решить быстро — это про то, что в процессе первой фазы, вы уже все решите.

Короче, если вы не прочитали еще эту книгу, или хотя бы не прослушали аудиоверсию, то я настоятельно рекомендую. Большая часть из неё настолько прочно вошла в нашу жизнь, что мы пользуемся всем этим даже не задумываясь, кто автор, и почему это вообще так.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍5👌2
😁3
1️⃣ OneOf<> (aka Discriminated Unions) в ASP.NET

В программировании часто бывает так: что-то очень простое называют так сложно, что хочется плакать. Так произошло для меня с Discriminated Unions. Когда кто-то у нас на встречах рассказывал про эту штуку, упоминая при этом F#, я плакал.🔮
 
Было ничего не понятно. Ни зачем, ни что, ни как.
 
А все из-за названия, которое непонятно как перевести на русский. Вон даже гугл не справляется

Короче, на деле это оказалась очень простая и практичная штука. И её пока официально нет в шарпе, но её все ждут, а для тех, кто не дождался есть библиотечка (и я снова призываю вас въебать ей звезду как можно оперативнее), которая имплементит эту фичу.
 
Что эта штука помогает делать. Предположим у вас есть метод:
 
public Task<User> CreateUser(string userName, string email);

 
Что возвращает этот метод? Ну понятное дело юзера. Но это в лучшем случае. А что если такой пользователь уже создан? А если email не по формату? Что вернуть тогда?
 
Есть несколько вариантов.

1️⃣ Можно сделать так (вариант для джуниОров): 
<exception cref="UserExists"></exception>
<exception cref="EmailValidationException"></exception>
public Task<User> CreateUser(string userName, string email);

 
Это, конечно, мде. За логику на эксепшонах будут ругать. Но если никто не видит, то по-честному это самый удобный способ.
 
2️⃣ Второй способ заключается в том, чтобы возвращать не юзера, а некий UserCreationResult, в котором будет что-то типа такого (вариант для сениОров):
 
public class UserCreatedResult
{
public bool IsCreationSuccess { get; set; }
public User? User { get; set; }
}

 
Понятно, что IsCreationSuccess можно превратить в enum и так далее. Но этот способ неудобен, так как мы возвращаем в случае неудачи избыточное поле User. Оно, конечно, нулловое, но согласитесь, это-то и плохо.
 
Было бы удобно что-то типа такого:
 
public Task<User || UserAlreadyExists || EmailValidationFailed> CreateUser(string userName, string email);

 
Это удобный вариант, так как под каждый случай, мы вернем ровно те данные которые нужны для обработки этого случая. Так можно делать в F#, в TypeScript (ну не прям так, но типа). За что многие и любят эти язычки.
 
3️⃣ Так вот в по сути библиотечка OneOf и позволяет делать то же самое! И вот как это выглядит (вариант для чемпиОнов):
 
public Task<OneOf<User, UserAlreadyExists, EmailValidationFailed>> CreateUser(string userName, string email);


🅰️ Итого: Если метод может возвращать разные типы в результате своей деятельности – не делай енумы со статусами успешности или не делай булеановские поля типа IsSuccess, а поработай с библиотечкой OneOf. Правда пока я бы только для пет-проектов это юзал, а для рабочего прода дождался бы официальной реализации в языке. Пропозал есть, значит все сокро будет – надо только подождать.

Я не буду тут приводить примеры кода, а напишу, что попробовал на своих пет-проектах все это дело и скажу, что смог неплохо так упростить пару свитчей. Причем, что мне нравится. Код упростился как в методе, так и в обработчиках результатов.
 
Короче, супер-рекомендую обратить внимание на библиотечку OneOf, втрепать ей звезду на гитхабе, и посмотреть видос от Ника Чапсаса. Я-то думаю, что все заебись объяснил, но он там еще и по коду все это дело раскидывает.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥63👍2👌2
🪄 Хочу чтоб у всех руководителей был канал в телеге.

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

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

Или вот у нас есть канал у Димы Карпова про то, как ребята делают кассы. Несмотря на то, что у команды касс есть апдейты, я на них не успеваю ходить. А тут вечерком канальчик в телеге почитал, какой там пиздец бывает с терминалами и хоп-хоп и уже интересно, а что у них там делается? И уже такой вовлекаешься в их проблемы, думаешь, что может как-то помочь можно? Ну или просто на будущее мотаешь себе на ус, что если когда-то будешь работать с чем-то подобным, то вот какой опыт бывает.
 
У нас есть еще всякие каналы с новостями в корпоративном мессенджере. Но что-то там та же самая инфа ну прям не читается. Все пишут скучно, канцелярским тоном, без личных деталей. Оно и понятно, в корпоративном мессенджере личное чувствуются неуместно.
 
А в телеге, если уж пиздец, так пиздец, а не "незапланированное изменение сроков." Или вот захотел человек кружочек записать и отправить, ну и отправил.
 
🅰️ Короче, каналы в телеге рулят. Заводите себе канал. Особенно, если вы в какой-то степени руководитель, или просто свое мнение имеете. (А вот сторисы тут – ебаное говно. Хотя визуально сделаны грамотно, просто сам формат не нравится. Рад что их можно позаблочить все.)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥63💯3
This media is not supported in your browser
VIEW IN TELEGRAM
2
💟 Анимированный, сочный, шарпный стикерпак.

Год назад я возмутился, что в мире все еще нет нормального стикерпака для шарпа. Не какого-нибудь с конференций, с рафинированными контурами и надписями .NET на блевотно-фиолетовом кружочке, а нормального такого, со здоровой сумасшедшинкой (читай ебанцой). Чтобы был анимированный и содержал в себе основные паттерны общения, типа "спасибо", "пожалуйста" и "пошел-ка ты на хуй".
 
Короче, год назад я замутил именно такой. Сделал на питоне, что немного иронично. Но самым сложным оказалось не сделать анимации (это заняло пару часов суммарно), а выложить все это говно в телегу. Это столько геморроя, что ни в сказке сказать.

🤬 Начиная с того, что у телеги есть кастомный формат для анимаций TGA который можно скомпилить только в Adobe After Effects. И заканчивая требованиями по времени (не больше 3 секунд) и разрешении (512 на 512).
 
Но я ж программист, я попытался найти свободные кодеки для этого дела, но они в итоге работали через пень-колоду.
 
Короче, год спустя, я плюнул на все, скомпилировал все в формате webm и выложил видеостикерпак. И теперь представляю его вам!

🅰️ Шлите себе и своим корешам. С этим стикерпаком можно полноценно общаться и спорить на технические темы. Там сейчас всего 10 стикеров, которые уже позволяют спорить о том, что лучше C# или F#, говорить твердое НЕТ продакту, который принес новые фичи и ласковое спасибо корешу, который поправил вашу багулю на проде.
 
Распространите.

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

А еще можно что-то придумать, чтобы этот стикрепак обновлялся по коммиту в мастер. Это будет вообще мегакруто! Тогда у шарпа будет ваще первый программируемый стикерпак (правда на питоне, что опять же слегка иронично). У меня пока до такого руки не дошли.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥53🎉3
😎️️️️️️ Иду в отпуск. Надеюсь в этом году вовремя.

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

Но в Додо я каждый год наблюдаю, как люди на планировании последнего квартала года дают убер-оптимистичные прогнозы, берут доп. ответственность и забивают на отдых. 
- Переделать все приложение до конца декабря?
- Да, конечно успеем! Вон сколько за лето успели!
 
📆 Год назад один из наших тогдашних топов Ваня Тихов, прям во время мобилизации (ебанись какого стрессового момента, когда количество тревог о друзьях, родителях и вообще обо всем зашкаливает и провоцирует нервный думскроллинг примерно у всех) написал пост о том, что собирается ЕБОШИТЬ. Это привело к печальным последствиям, и я рад, что обошлось без кошмарных исходов для здоровья Вани. Кстати, Ваня сейчас сам рефлексирует этот опыт, и про это очень интересно читать.

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

После такого я решил, что в следующий раз возьму отпуск заранее. То есть в тот момент, когда кажется, что в отпуск еще не надо. Цель у меня такая – не пересраться со всеми в команде в период с октября по январь. И, если повезет, преодолеть шестинедельный перерыв в производительности, который случился в прошлом ноябре.
 
Потом расскажу, что получилось, и получилось ли. А может выгорю и ничего не расскажу.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83👍3
🏓 Дашборды для вашей графаны.

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

🅰️ Итого: Не нужно каждый раз настраивать дашборды в графане с нуля – как минимум, полезно воспользоваться шаблоном.

⭐️ И это, надо бы звезду репозиторию поставить. У Джеймса Ньютона Кинга этих звезд, конечно, как грязи, но не думаю, что он будет жаловаться на пару-тройку лишних.
#инструменты
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62🤩2🤔1
👽 Воркшоп от слерма.

Короче, самое главное после отпуска – не перегружать голову в первый день. Естественно, я этот момент проебал, и целый день на свежих силах проработал, а потом еще и пошел на халявный «Troubleshooting workshop для разработчиков» от Слерма. Вел его, Александр Лукьянченко руководитель юнита PaaS из Авито.

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

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

🅰️ В общем, если увидите в рассылке что-то типа «Troubleshooting workshop для разработчиков», и давно хотели потыкать кубер, ягер, графану, и киали, то не проходите мимо.

А еще там книгу интересную порекомендовали про Systems Performance от Брендана Грэгга. Из интересного, в книге обещают рассказать, почему все молятся на SLI и почему он так взлетел. Буду читать сразу после текущей. 🧐
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5🤩31
🐘 Как делать API которые не сосут по Дереку Комартену.

Приятно делать что-то, что не сосет. Если это не пылесос, конечно (честно скажу, весь пост писал только ради этой шутки). Вот Дерек Комартен тоже так считает и поэтому выпустил видос, как делать несосущие API.
 
Вот таймкоды советов и краткое описание:

UPD Примечание редакции: каждый совет в видосе снабжается припиской “Это может быть удобно, применяйте осознанно”. Так что не переживайте, если в вашем АПИ чего-то из этого нет, это не значит, что ваше АПИ сосет. Ну или чье-то АПИ сосет.

1️⃣ ID шники должны что-то значить. Ну то есть Idшник не такой 556F673F-3013-423D-8AC7-14BF1E9C316E  , а такой CA-ON-556F673F-3013-423D-8AC7-14BF1E9C316E, где CA-ON означает Canada-Ontario, ну и соответственно мы понимаем, что эта сущность как-то связана с этой локацией.

2️⃣ Не душите себя форматом вывода. Типа в ответе не отдавайте JSON массив объектов, а JSON объект с полем в виде массива. Во втором случае будет удобнее изменять ответ, если что-то понадобистся добавить в корень. Кстати, недавно у меня ровно такой случай был. Так что совет прям актуальный.

3️⃣и 4️⃣ совет. Возвращать набор действий, которые вы можете совершить с объектом и ссылки на них. То есть если у вас в ответе на запрос GetOrder пришел заказ в статусе “ожидает”, то отправьте список запросов, которые можно сделать по этому заказу. И так же отправьте ссылки на эти запросы.

5️⃣ Используйте доменные определения вместо технических. Ну то есть CancelOrder это не UpdateOrder с параметром Cancel, а это прям CancelOrder. Да, что-то будет CRUDом, но не все.
 
Для меня самым интересным с одной стороны и самым спорным стали 3 и 4 совет. Действительно круто, когда ты прям присылаешь клиенту, что можно сделать с объектом прямо сейчас, избавляя его от необходимости самому догадываться об этом:

{
orderId: CA-ON-556F673F,
status: Pending,
actions: [
{
name: "CancelOrder",
uri: "https://mylittleoregano.org/order/CA-ON-556F673F/cancel",
method: "PUT"
}
]
}

 
Почему это удобно? Если вдруг имя метода поменяется или формат параметров, то не придется версионировать АПИ и просить клиентов перейти на новую версию.

С другой стороны, я не вполне понимаю, как это защитит от ситуации, если, к примеру, заказ перестает быть возможным отменить в статусе Pending? Ну типа логику на клиенте все равно придется переписывать. Хотя это и станет удобнее, разумеется.
 
🅰️ Итого: Вы можете отправлять с бэка набора действий, которые можно совершить с объектом. Это может помочь вам избавиться от необходимости версионирования АПИ, так как вы сами контролируете формат ссылок. Также этим вы избавите клиентов от необходимости помнить, что можно и когда, так как вы будете присылать только те действия, которые можно совершить.

Если кто-то юзал такое, или юзает, вот было бы интересно узнать опыт использования и всякие подводные камни.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2🙏2🤔1
Если вы делаете поллинг, то полезно отдавать время интервала поллинга в ответах вашего АПИ.

Продолжаю привыкать к работе с мобилками. И вот наткнулся на еще одну особенность, которую хотел бы знать чуть раньше.
 
📦 Сделали курьера на карте и поняли, что координаты хочется обновлять чаще. А таймаут обновления зашит на мобилке.
 
Для вебчика, это никогда не было проблемой – захотел поменять, поменял и все тут. Какой-нибудь скрипт, который смотрит за апдейтами клиента, обновит страницу у пользователя и все.
 
Но для мобилки все не так. Там нужно ждать релиза в две недели минимум. Что делать, чтобы не ждать? Правильно, отдавать таймаут поллинга в ответах АПИшки.
 
Этот совет кажется будет полезен практически в любом случае, если вы решили делать поллинг.

🅰️ Итого: Любые таймауты поллинга для мобилки нужно присылать с бэка.

А может стоит пойти дальше? И, если в мобилке есть какие-то интервалы обновления, то возможно стоит, чтобы их можно было присылать с бэка?
 
Что думаете? Я бы с удовольствием почитал в комментах или в личке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔3🔥2
😮 Entity Framework или Dapper?

Года два назад задался вопросом. Как решить, что использоваться для взаимодействия с базкой в своем проекте ORM или миниORM?
 
Вот в Додо исконно принято использовать даппер. Хотя это и не обязательно, и в ряде проектов, к примеру в Базе знаний используется EF. Но почему-то если проект у нас критический, то там используется именно даппер.
 
В своих пет-проектах я год пользовался EF, ну а в работе понятное дело юзал даппер. И вот к каким выводам я пришел.
 
Entity Framework:
🟣Практически в любом случае проще и лучше использовать EF.
 
🟣Для старта любого проекта, на котором большая нагрузка либо не предвидится, либо пока неясно, будет ли она, лучше использовать EF.
 
Dapper:
🟠Если у вас проект, который использует какие-то особенности базы для работы, то есть у вас сложная иерархия таблиц, с индексами, вьюхами, прости Господи хранимками, и по сути часть вашей бизнес-логики лежит в базе (что я не приветствую), то лучше юзать даппер.
 
🟠Если у вас меганагруженный проект с огромным количеством (несколько сотен в секунду) чтений из базы и вы по какой-то причине не можете использовать кэширование для оптимизации, то тоже можно использовать даппер.
 
🟠Если у вас бОльшая часть команды ОЧЕНЬ глубоко знает работу какой-то конкретной базы данных и прям использует по максимуму все её фичи, то тоже даппер.
 
🅰️ Короче, я для себя пока аккуратно сделал вывод, что по дефолту буду юзать EF, а над использованием Dapper скорее буду думать, надо ли.
 

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

Такие пироги! Если что, это мнение не конечное, и я бы с удовольстием послушал ваш опыт. Было бы пиздатенько, если бы в коментах кто-то рассказл кейс, как EF что-то сломал в проекте, а Dapper даппер или что-то такое это починило. Ну или может еще накидал разных поинтов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3🤔2