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

💁‍♀️ В чем суть. Есть у нас компонент Site API. В нем есть разные тесты. Юнитовые, конпонентные, интеграционные. Обычно у нас принято, что перед запуском компонентных тестов, мы запускаем docker-compose файлик, где содержатся все зависимости сервиса. В более технически зрелых проектах используются dotnet-testcontainers.

Сделал фичу, хочу запустить компонентные тесты:
Поискал глазами файлик — не нашел. Поискал dotnet-testcontainers — не нашел. Посмотрел в ридмиху. В ней нашел абстрактное объяснение, почему не будет e2e тестов на окружении, но как запустить тесты локально — не нашел. Запускаю тесты. Не проходят. Ругаются на монгу. Пробую запустить в github actions. Все проходит. Иду к коллеге с вопросами. Он предлагает понизить версию библиотеки для монги и вуаля тесты проходят. (тут я говорю: Да какого хуя, блять! 🤬)

Оказалось, что в гитхабовском воркфлоу все же запускается контейнерная версия монги и она подходит под новую версию библиотеки, а локально тесты ходят в настоящую монгу. (тут я говорю: Да почему так-то, блять! 😐)

У меня есть принцип — я никогда не ругаю чужой код, и чужие решения. Всегда стараюсь понять, почему было сделано так как было сделано. Это в разы продуктивнее ИМХО. Думаю, что ребята, которые это пилили сделали первое быстрое решение, с прицелом заменить в будущем, а затем понавалилось проектов и стало как-то не до этого, и так и осталось.

🅰️ В общем, вывод такой:
1️⃣ Лучше сразу в компонентных тестах подменяйте все зависимости изолированно. Используйте dotnet-testcontainers. На крайний случай сделайте docker-compose и в ридмихе напишите, что перед запуском тестов его нужно поднять и приобнять.
2️⃣ Если ваш проект постоянно в авралах, то не разменивайтесь на быстрые решения, и не верьте менеджерам, которые говорят, что дадут вам время на рефакторинг через три месяца после запуска проекта — это все беспардонный обман. (а по факту лютый пиздеж даже не вам, а самому себе)

Такие дела.
#опыт
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍1🌚1
👨‍🔧 Делал по коммиту каждый день в течение года и вот что из этого вышло.

Я стал мастером кликбейтных заголовков! Ладно, никто не кликает, никого они не байтят. Простите

Где-то год назад я решил, что попробую делать по одному коммиту в день в свои пет-проекты. Тому было две причины:
1️⃣ Мне нравилось делать TDD каты перед работой. Они хорошо давали размять нейронку и после них кодить было проще. Но в какой-то момент сама вот эта деятельность вхолостую наскучила, и мотивация их делать потерялась. Поэтому нужно было найти достойную замену.
2️⃣ Мне хотелось получить какой-то более-менее объективный инcтрумент, который помогал бы отслеживать уровень так называемого мыслетоплива (это термин Максима Дорофеева, автора книги "Джедайские Техники")

Установил себе несколько правил, чтобы не упарываться и не делать коммиты ради коммитов:
1️⃣ Решил, что буду уделять в день этому делу 15 минут. Но если сделаю коммит раньше и желания что-то делать дальше не будет, то можно расслабиться
2️⃣ Если возникнет желание что-то еще покоммитить, то сдерживать себя не буду.
3️⃣ Если вообще невмоготу, то и хер бы с ним — можно ничего не коммитить.

🅰️ Короче, это оказалось в 100500 раз пизже чем ебАные TDD каты!
🔘Кажется, что 15 минут — это херня. И так оно и есть! Но, если смотреть в разрезе года, то набирается аж 5475 минут или же 91.25 часов! (это как ведьмака пройти!)
🔘За это время я успел намутить себе два пет-проекта, один из которых помогает мне учить английский. TDD каты (ебАные), при всем моем уважении, такого не могут.
🔘Я научился чуть лучше декомпозировать задачи. Потому что приходится каждый раз задавать себе вопрос "что я могу тут полезного сделать за 15 минут".
🔘А еще я отследил наконец свои провалы в мыслетопливе. Вот вы их видите на скрине, с ноября по январь и с апреля по июнь. То есть это значит, что на восстановление мне нужно около 6 недель. В эти периоды нужно брать отпуска и спокойно пережидать, пока все не придет в норму. Ну или можно подумать, как оптимизировать свою работу так, чтобы сократить эти провалы.

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

🅰️ В общем, рекомендую попробовать ежедневный 15-ти минутный подход к коммитам. Может и вам зайдет, а может вы уже и сами что-то похожее делаете. В общем, если кто поделится в личке или комментах, буду мега-признателен 🥰
#личнаяэффективность
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥82👍2
💴 PCI DSS в Додо
Недавно послушал на нашем девфоруме сказ от восхитительного Матвея Григорьева о том, как Додо прошло PCI DSS сертификацию.

Это такая штука, которая нужна всем, кто принимает больше 6 миллионов платежей по карте в год. Додо принимает сильно больше — примерно 40 миллионов платежей в год.

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

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

Два основных вывода, которые я сделал для себя из этого доклада:
1️⃣ Облака — это топчик. Всем надо быть в облаках. Если кто-то сомневался, то сомневаться не нужно. Ибо львиная доля сертификации прошла тупо потому, что облачный провайдер сам когда-то прошел сертификацию.
2️⃣ Инженерная культура роляет. Просто из-за того что работающие у нас люди знают базовую гигиену, процесс сильно упрощается. Так что если вы не вкладываетесь в культуру, из-за того что эти инвестиции не окупаются, то технически это правда, а практически это покупает время и нервы.
3️⃣ Кубер — роляет. Я это и так знал, но все же, было классно услышать, о том, как гибкость, которую он дает, помогла быстро занести все нужные компоненты в удовлетворяющий всем условиям контур.

Такие дела. С крутыми людьми работаю, однако.
#опыт
🔥61👍1
⚔️ "Feature Sliced" vs "Clean Architecture"
Вот уже год слежу за этим противостоянием. И могу подвести свои промежуточные выводы.

Года четыре назад меня сильно вдохновил доклад про "Clean Architecture" (я тут спецом взял в кавычки, чтобы было понятно, что имеется в виду именно структура проекта, а не подход) от Джейсона Тейлора.

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

За последний год-два "Clean Architecture" начали много ругать. Даже мой любимый Дерек Комартен высказался против (вот же сука! но все по делу!). Основные тезисы такие:
1️⃣ Неудобные хэндлеры в медиатре, что ведет к сильной неявности вызовов.
2️⃣ Размазывание логики по слоям, что ведет к открыванию кучи файлов во время разработки новой фичи или редактирования старой. (да, вот это хуево, тут никаких споров.)

😭 Честно признаюсь, мне было удобно работать c "Clean Architecture" . У нас в компании довольно много репозиториев написано с оглядкой на эту структуру проекта. И я вообще топил за то, чтобы как можно больше сервисов было написано в этом стиле. Так было бы удобнее ходить между проектами.

Но вот недавно поработал с парочкой репозиториев сделанных в "Feature Sliced" стиле. И могу сказать, что, видимо, это действительно более удачный подход.

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

У "Clean Architecture" все же есть один плюс. Говорят его относительно легко постепенно перевести в Feature Sliced. Буду короче пробовать на пет-проектах на своих. Хотя я все еще считаю, что для своего времени Clean Architecture заебись и что медиатр топчик.

🅰️ Так что хуярьте все по Feature Sliced. Хотя бы свои пет-проекты.

Ну и это... RIP "Clean Architecture" 🪦
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👌2🤔1
🤷‍♂️ Почему принцип Парето так часто срабатывает?
Короче, это мегапушка. Прочитал тут просто НАИОХУИТЕЛЬНЕЙШУЮ статью не про программирование. Автор Эдриан Гор, основатель Discovery (не телеканал, если что, а фонд такой).

Вы вот не задумывались почему в современном мире принцип Парето такая имба? Это не такой очевидный вопрос. Почему некоторые усилия приносят 80% результата, а другие только 20%?

Автор статьи утверждает, что вообще это не всегда было так, и до определенного момента в мире доминировало Гауссово распределение. Ну то есть если переводить на понятный язык: "30% усилий вероятнее всего дадут 30% результата"

❗️ И, если подумать, то, черт возьми, да! Для современного человека, правило Парето настолько естественно, что он даже не сразу понимает насколько оно по сути абсурдно. К примеру, если вспахать 20% поля, то ты вспашешь… 20% поля. Не бывает такого, чтобы ты выбрал какие-то нужные 20% поля, а еще 60% вспахались сами по себе.

Но тем не менее правило Парето работает, и мы это видим. И дело в том, что мир стал сложнее устроен.

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

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

Мне эта гипотеза показалась довольно интересной. Я не супер-знаток теории графов, но короче, кажется что в этом что-то есть.

🅰️ Мне нравится, что в конце статьи автор делится тем, что с этим всем делать на практике.

Инновации
"Сосредоточьтесь на смелых решениях в хвосте распределения, вместо того, чтобы добиваться последовательных изменений."

Cовет про то, что при выборе сделать что-то инновационное или пофиксить баги в старой админке стоит сильно больше внимания уделить первому варианту.

Управление рисками
"Одним из многообещающих подходов является объединение экстремальных значений и правдоподобности различных будущих сценариев (теория потенциальных неожиданностей Джорджа Шекла) для принятия решения в условиях крайней неопределенности.

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

Автор рекомендует заниматься такой штукой, как Scenario Planning. То есть прикидывать варианты развития событий и присваивать им вероятности того что они произойдут. Ваще мега-полезная штука особенно в такой неопределенности как сейчас.

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

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

Вот такое чтиво сегодня!
🔥6👌2
🎢 Как я использую 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