Flexible Coding
159 subscribers
165 photos
2 files
101 links
Download Telegram
Неожиданные детали реализации структур данных

Недавно на работе делал небольшой workflow-движок. Это такой механизм, в который можно засунуть набор некоторых действий с возможностью отката и выполнить их в единый момент времени. Все эти действия складывались в очередь - и я решил использовать Prority Queue, а к действиям добавить кастомизируемый приоритет (возможность указать Priority.Last и гарантировать, что действие выполнится последним). Звучит надёжно!

Итого я построил процесс, в котором было много действий с одинаковым приоритетом и одно Last, которое выполняется последним (см схемку). Написал какие-то тесты, вроде всё работает. Использую движок в конкретном бизнес-процессе, заливаю в прод, кайфую.

Проходит время, и коллегам из соседней команды заводят баг на тему того, что что-то где-то выполняется не в том порядке и возникают кривые данные. Коллеги изучают, и внезапно в PriorityQueue НЕ ГАРАНИРУЕТСЯ ПОРЯДОК ПОЛУЧЕНИЯ ЭЛЕМЕНТОВ С ОДИНАКОВЫМ ПРИОРИТЕТОМ! В общем, действия выполнялись в рандомном порядке, и потенциально (мы так и не убедились в этом на 100%) система порождала кривые данные

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

#кейсы
Flex Code
👍7
Всем привет! Пока контент готовится, расскажу вам про ещё одну мою активность

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

Мы собрали кейсы для аналитиков, продактов и разработчиков и представили их в своих презентациях. И всё прошло отлично! В конце доклада была интересная дискуссия на темы использования ИИ в работе, от безопасности до "а что если делегируя всё ИИ ты не будешь развиваться?"

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

(а ещё у меня сегодня день рождения)

Flex Code
🎉13👍6
Всем привет!
Вспоминая недавний митап, расскажу подробнее про то, как я использую GPT на работе.

Важно понимать, что GPT (по крайней мере бесплатные версии) не сможет решать сложные/комплексные/специфичные задачи, особенно если про них мало информации в интернете. Однако базовые рутинные дела он может выполнять быстрее (и иногда лучше) чем человек. И вот примеры:
1. Маппинги объектов. Переложить 40+ полей из класса A в класс B с дополнительной логикой - тупая, но затратная задача. Однако можно просто написать в GPT "Напиши метод маппинга из класса <код> в класс <код>", и с высокой вероятностью он всё сделает как надо. А где "сомневается" - оставит коммент
2. Генерация SQL. Лично я в первую очередь использовал GPT для генерации таблиц на основе классов - мне было супер-лень писать код самостоятельно или натыкивать каждый столбец в интерфейсе СУБД. Ну а ещё он может быстро сгенерить код для пагинации или других запросов
3. Генерация DTO по документации. Скармливаем GPT json или просто описание полей из документации (иногда поля в интеграциях просто описываются списком в ворд-документе) и получаем необходимые классы

ВАЖНО!
Код от GPT надо проверять, а потом перепроверять. Он может генерировать плохой код, код с несуществующими методами или просто код, который не выполняет нужную задачу. Однако как показывает практика, лично мне проверить и добавить пару фиксов в уже готовый код гораздо проще, чем писать всё с нуля

А вот ещё пара статей про безопасность ChatGPT:
- GPT сливает персональные данные
- GPT генерирует уязвимый код
- Немного дырявый GPT
- Мысли про безопасность использования GPT

Flex Code
👍14
Итак, 2023 год подходит к концу.

Небольшие итоги:
- 7 статей для Flex Code
- 4 статьи для TimeWeb (чуть чуть попробовал себя в роли копирайтера)
- Очень много книг, однако технических стало поменьше - про 5 из них я рассказал в этом блоге
- Один завершённый пет-проект (кстати открыл исходники)
- Посетил конференцию "Стачка" в Ульяновске
- Организовал 2 митапа - в колледже и на работе

В целом считаю, что год прошёл очень хорошо, а следующий будет ещё лучше! (но можно было и не заболевать на праздники)
Всех с Наступающим!🎄🎄🎄
🎄13
Под новый год JetBrains сделали мне "подарок" - отказались продлевать учебную лицензию для своих IDE. И ради интереса я решил посмотреть, а как там VS Code?

Мой прошлый опыт с VS Code был негативным - очень плохой автокомплит, отсутствуют встроенные Tests Explorer и Solution Explorer, рабочий проект очень медленно индексируется. Однако сейчас, с новым расширением от Microsoft "C# Dev Kit" всё поменялось:
- Довольно быстро индексируется проект
- Нормальный автокомплит с автоматическими using из коробки
- Встроенные обозреватели решений и тестов довольно удобные
- Наконец-то vs code парсит файл launchSettings.json и не нужно создавать кастомные конфигурации запуска проектов

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

Подводя итоги - VS Code для меня стала лучшей бесплатной IDE под C#. Но я постараюсь вернуться в райдер)
🤷3👍1😢1🫡1
Недавно прочитал две книги про продуктивность и тайм-менеджмент:
- Джедайские техники
- Путь Джедая

Об этих книгах я слышал много, но как-то руки не доходили их прочитать. Теперь вот дошли :)

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

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

В обоих книгах полно отсылок на другие труды, такие как "Антихрупкость" Нассима Талеба или "Думай медленно - решай быстро" Канемана. Тоже очень порадовало, да и в целом читаются книги легко и приятно.

В общем, рекомендую. Даже не нашёл недостатков у этих книг :)
#книги
🔥11
Всем привет!

Сегодня расскажу про одно приложение, о котором я знал давно, но только недавно начал пользоваться

Loom - приложение для записи экрана. По сути это просто расширение для браузера, которое позволяет очень быстро записать короткое видео и сразу поделиться им

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

В бесплатной версии можно создавать до 25 видео по 5 минут, но старые неактуальные записи можно удалять. Есть ещё работа в команде в приложении, но я пока что не пользовался. Если кто-то уже затестил - пишите комментарии!

А ещё есть прикольные интеграции с разными сервисами - от GitHub до Notion. В общем, полезная штука, советую

#приложения
Flex Code
🔥8👏1👌1
Неочевидный дизайн enum в C#

Недавно столкнулся с задачей сконвертировать строковое значение в Enum. В строке может быть как нормальное строковое значение из перечисления, так и число.
Задачка тривиальная:
- Вызываем Enum.TryParse(value, out var result)
- Если распарсили - используем это значение дальше
- Если нет - выполняем логику обработки отсутствия значения в enum

И тут на вход прилетает строковое значение "333" (такого значения в enum нет). А TryParse возвращает true. Итог - некорректное поведение системы. И нет, это не баг - это стандартное поведение метода TryParse.

Лично для меня супер неочевидно то, что TryParse не проверяет соответствие числа именованной константе из enum . Теперь знаю, что такое поведение исправляется с помощью метода IsDefined. (Источник - https://github.com/microsoft/referencesource/blob/master/mscorlib/system/enum.cs#L367)

А вот пример для воспроизведения:
var value = "333";

Console.WriteLine($"Пытаемся распарсить: '{value}'");

if (Enum.TryParse<SomeEnum>(value, out var result))
{
Console.WriteLine($"Результат парсинга - '{result}'. Тип - '{result.GetType().Name}'");
}
else
{
Console.WriteLine("Распарсить значение не удалось");
}
public enum SomeEnum
{
FirstValue = 0,
SecondValue = 1
}


Что интересно: в java и kotlin такого поведения не замечено (беглым тестом в онлайн компиляторе). В typescript тоже - при парсинге из числа, которое не входит в enum мы получаем undefined. Интересно, какие причины такой реализации?

#кейсы
🤔5👏2🫡1