Обложка канала

.NET Разработчик. Страница 31

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

  • .NET Разработчик

    День 1078. Избегайте Ненужных Программных Абстракций. Начало Разработчики ПО любят абстракции. Абстракции — ключ к эффективной разработке. Проблема возникает, когда абстракции вводятся преждевременно, т.е. до того, как они решают реальную нетеоретическую проблему. Добавление абстракций всегда происходит за счёт роста сложности и, если с ними переборщить, начинает замедлять скорость разработки и способность понимать кодовую базу. Все проблемы в информатике можно решить с помощью ещё одного уровня абстракции… За исключением проблемы слишком большого количества уровней абстракции. — Батлер Лэмпсон Мы рассмотрим, как отказ от лишних абстракций может привести к гораздо более чистой кодовой базе со значительно сниженной сложностью, а также повышенной читаемостью и удобством сопровождения. Обсуждаемые вопросы основаны на таких принципах, как «Делай Проще, Тупица» (KISS) и «Вам Этого не Понадобится» (YAGNI), что означает использование абстракции только тогда, когда это даёт значительную и реальную пользу. Давайте рассмотрим некоторые конкретные случаи преждевременных абстракций, которые часто встречаются на практике. 1. Чрезмерная детализация обязанностей Это может быть абстракция запроса к базе данных в выделенный класс репозитория, абстрагирование HTTP-вызова в сервисный класс или какая-то исключительно внутренняя логика, перемещённая в отдельный компонент. Обычно это делается для следования принципу единственной ответственности. Если мы выделим каждую крошечную часть логики в отдельный класс, тогда все классы будут иметь сверхчёткие обязанности, и, следовательно, только одну причину для изменения. Проблема в том, что все эти маленькие части, как правило, всё ещё тесно связаны и сильно зависят друг от друга. Если какая-либо коммуникация между частями изменится, часто это будет иметь каскадный эффект, требующий изменений во многих частях. Таким образом, у каждой части может быть только одна причина для изменения, но это бессмысленно, если одно изменение часто требует внесения изменений во многие части. Кроме того, часто нет реальных практических преимуществ в том, чтобы классы изменялись только по одной причине. На самом деле, внесение изменений в классы, которые выполняют несколько функций, часто предоставляет разработчику гораздо больше контекста, что значительно упрощает понимание изменений и их влияния на окружающий код. Когда же разделять обязанности? Распространённый случай — когда логику нужно использовать более, чем в одном месте. Если один и тот же HTTP-вызов или запрос к базе требуется в нескольких местах, дублирование логики снижает удобство сопровождения. Тогда будет хорошей идеей перенести код в общий и многократно используемый компонент. Главное не делать этого до того, как это потребуется. Другой допустимый случай — когда логика очень сложна и негативно влияет на читаемость окружающего кода. Если часть логики занимает 300 строк, это как раз тот случай. Но выделение всего нескольких строк в отдельный класс, скорее всего, только ухудшит читаемость и затруднит навигацию по коду. Помните, что разделение обязанностей всегда усложняет структуру кода. Продолжение следует… Источник: www.daveabrock.com/2021/12…-edition
  • .NET Разработчик

    День 1077. #NuGet 10 Лучших NuGet Пакетов для Повышения Продуктивности в 2022. Продолжение Начало 6. FluentValidation FluentValidation — это библиотека .NET для построения строго типизированных правил валидации. Она использует Fluent-интерфейс и лямбда-выражения для создания правил. Правила валидации помогают поддерживать чистоту кода домена, выделяя код проверки в отдельный блок. FluentValidation имеет множество встроенных правил, таких как проверка на null, на пустую строку, максимальную и минимальную длину и т.п. Библиотека также поддерживает пользовательские валидаторы, настраиваемые сообщения валидации на основе имён свойств, предоставляет локализованные сообщения, асинхронные проверки и т.д. Всего загрузок: 118,7 млн. 7. Noda Time Работа с датой, временем и часовыми поясами в .NET очень болезненна. Noda Time заполняет пробел в операциях с датой и временем в .NET и тем самым упрощает жизнь. Пакет предоставляет различные API для обработки UTC, местного времени и часовых поясов. Также предоставляется функционал для простого преобразования местного времени в UTC и обратно, что позволяет избежать серьёзных ошибок, которые могут допустить разработчики, реализуя эту логику самостоятельно. Всего загрузок: 46,2 млн. 8. FluentEmail FluentEmail — это библиотека .NET с открытым исходным кодом, которая позволяет внедрить функции отправки электронной почты в ваше приложение .NET за 10 минут. Помимо основных параметров электронного письма, пакет позволяет вложить файл, отправлять почту асинхронно, а также использовать Razor для разработки шаблонов писем и отправлять письма с помощью SendGrid, MailGun, SMTP и т. д. Всего загрузок: 1,8 млн. 9. Hangfire Hangfire — это платформа с открытым исходным кодом, которая позволяет создавать, обрабатывать и управлять фоновыми заданиями. Вы можете запускать фоновые задания из основного процесса вашего приложения без необходимости создания отдельного сервиса. Hangfire поддерживает широкий спектр фоновых задач: краткосрочные и долгосрочные, загружающие процессор или ввод-вывод, одноразовые и повторяющиеся. Всего загрузок: 18,8 млн. 10. LazyCache Кэширование — отличный способ повысить производительность приложения. LazyCache использует формат GetOrAdd для кэширования, когда вы запрашиваете элемент из кэша, предоставляя при этом функциональность для его добавления, если элемент отсутствует. LazyCache отлично подходит для кэширования вызовов базы данных, процедур построения сложных графов объектов и вызовов веб-сервисов, которые нужно временно сохранить для повышения производительности. Пакет позволяет кэшировать элементы в течение большего или меньшего времени, но по умолчанию он сохраняет кэшированные элементы до 20 минут. Ключевые особенности LazyCache: - Потокобезопасен и готов для использования в параллельном коде. - Совместим с асинхронным кодом: доступна ленивая однократная оценка асинхронных делегатов с использованием метода GetOrAddAsync(). Всего загрузок: 7,3 млн. Источник: www.syncfusion.com/blogs/p…aspx/amp
  • .NET Разработчик

    День 1076. #NuGet 10 Лучших NuGet Пакетов для Повышения Продуктивности в 2022. Начало Сегодня мы рассмотрим лучшие NuGet пакеты для повышения продуктивности разработчиков на C#. 1. RestSharp RestSharp — самая популярная клиентская библиотека HTTP для .NET. Используя эту библиотеку, разработчики C# могут легко вызывать удалённые ресурсы по HTTP. Кроме того она заботится о сериализации тела запроса в JSON или XML и десериализации ответа. Пакет RestSharp поддерживает: - синхронные и асинхронные запросы, - сериализацию и десериализацию, - различные методы HTTP-запросов (GET, POST, PUT и DELETE), - разнообразные способы аутентификации. Всего загрузок: 111,1 млн. 2. Json.NET Json.NET — это бесплатная библиотека с открытым исходным кодом для .NET, которую скачали более миллиарда раз. Её ключевые особенности включают в себя: - Сериализацию и десериализацию любого объекта .NET в JSON и текста JSON в объект .NET. - Преобразование между XML и JSON. - Создание, анализ, запросы и изменение JSON, используя объекты JObject, JArray и JValue. - Запросы к JSON с синтаксисом, подобным XPath. - Высокую производительность. Всего загрузок: 1,6 млрд. 3. Serilog Логи — это записи действий, исключений, информации и предупреждений. Ведение журнала — важный фактор в разработке приложений, который помогает разработчикам легко обнаруживать и устранять проблемы. Serilog — это платформа логирования, используемая в .NET. Он записывает пользовательские свойства и данные в формате JSON. В отличие от других инструментов ведения журналов, Serilog предоставляет структурированные журналы, которые позволяют производить поиск по записанным данным. Он также позволяет разработчикам легко записывать данные о событиях в консоль, в файлы и во все типы систем хранения. Всего загрузок: 365,1 млн. 4. NUnit Тестирование играет важную роль в разработке программного обеспечения для обеспечения корректности кода. NUnit — это платформа модульного тестирования с открытым исходным кодом для всех языков .NET, включая C#. С помощью NUnit вы можете легко тестировать большие приложения, разбивая их на небольшие модули. Это помогает нам находить проблемы прямо во время разработки. Всего загрузок: 153,1 млн. 5. Insight.Database Insight.Database — это микро-ORM для .NET, который преобразует объекты C# в записи базы данных и наоборот. Это набор методов расширения, упрощающих работу с базами данных в приложении C#. Основные функции Insight.Database включают в себя: - Автоматическое открытие/закрытие соединений с базой данных. - Простое выполнение хранимых процедур. - Поддержку нескольких наборов результатов. Всего загрузок: 691,0 тыс. Окончание следует… Источник: www.syncfusion.com/blogs/p…aspx/amp
  • Реклама

  • .NET Разработчик

    День 1075. #ЧтоНовенького В C #10 появился новый атрибут CallerArgumentExpression. Он позволяет записывать выражение, переданное в качестве параметра, в виде строки (см. рисунок). Как и другие атрибуты CompilerServices, он применяется к необязательному параметру. Кстати, его использует новый метод
    ArgumentNullException.ThrowIfNull(nullArg);
    
    в .NET без явной передачи имени. Если раньше нам нужно было писать что-то подобное:
    public bool DoSomething(string id, string name)
    {
      if (id is null)
        throw new ArgumentNullException(nameof(id));
      if (name is null)
        throw new ArgumentNullException(nameof(id));
      // ...
    }
    
    
    Теперь новый метод позволяет писать более чистый код:
    public bool DoSomething(string id, string name)
    {
      ArgumentNullException.ThrowIfNull(id);
      ArgumentNullException.ThrowIfNull(name);
      // ...
    }
    
    
    Источник: twitter.com/Nick_Cr…49448459
  • .NET Разработчик

    В дополнение к предыдущему посту. Вот именно поэтому нужно читать источники в оригинале. Там может ошибиться только автор, но хотя бы нет ошибок переводчика. И хотя в целом перевод Клири более менее качественный, вот вам пример, разворачивающий смысл на 180 градусов. Сам 3 раза прочитал текст, потом код, потом опять текст. Не сходилось. Хорошо, что под рукой был оригинал.
  • .NET Разработчик

    День 1074. #ЗаметкиНаПолях #AsyncTips Параллельное агрегирование Задача: требуется агрегировать результаты (суммирование значений или вычисление среднего) при завершении параллельной операции. Решение Для поддержки агрегирования класс Parallel использует концепцию локальных значений — переменных, существующих локально внутри параллельного цикла. Это означает, что тело цикла может просто обратиться к значению напрямую, без необходимости синхронизации. Когда цикл готов к агрегированию всех своих локальных результатов, он делает это с помощью делегата localFinally. Следует отметить, что делегату localFinally нужно синхронизировать доступ к переменной для хранения результата. Пример параллельного суммирования:
    int ParallelSum(IEnumerable<int> values)
    {
      int result = 0;
      Parallel.ForEach(source: values, 
        localInit: () => 0, 
        body: (item, state, localValue) => 
          localValue + item, 
        localFinally: localValue =>
          Interlocked.Add(ref result, localValue)
      ); 
      return result;
    }
    
    
    В Parallel LINQ реализована более понятная поддержка агрегирования, чем в классе Parallel:
    int ParallelSum(IEnumerable<int> values)
    { 
      return values.AsParallel().Sum();
    }
    
    
    На самом деле в PLINQ реализована встроенная поддержка многих распространённых операторов (например, Sum). Также предусмотрена обобщённая поддержка агрегирования с оператором Aggregate:
    int ParallelSum(IEnumerable<int> values)
    {
      return values.AsParallel().Aggregate( 
        seed: 0, 
        func: (sum, item) => sum + item 
      );
    }
    
    
    Если вы уже используете класс Parallel, следует использовать его поддержку агрегирования. В остальных случаях поддержка в PLINQ, как правило, более выразительна, а код получается короче. UPD: Обновил пример ParallelSum примером из документации с использованием Interlocked.Add вместо lock. Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 4.
  • .NET Разработчик

    Проверь свои знания на NIX Online Edu Testing Купить подарки, поставить елку. Чего-то не хватает в праздничном списке… Точно! Подготовиться к карьере в IT! Для этого приглашаем тебя поучаствовать в онлайн-тестировании по одной из 17-ти программ обучения. Выполни тест и узнай уровень своей подготовки. Когда: с 3 по 24 декабря Где: онлайн с любого удобного тебе гаджета Хочешь освоить самую актуальную профессию в IT? Эксперты NIX помогут тебе. В Корпоративном центре обучения NIX есть 17 учебных программ. В зависимости от направления ты будешь учиться офлайн в Харькове или онлайн. Ты получишь базовые знания по фронтенд и бэкенд-разработке, по бизнес-анализу и в сфере облачных технологий. После обучения ты сможешь уверенно начать карьеру в IT и попробовать себя на позиции Junior-специалиста в команде NIX! Отличный старт для нового года, правда? ;) Теперь дело за малым — переходи по ссылке, выбирай понравившуюся программу обучения и проходи онлайн-тестирование :) #реклама
  • .NET Разработчик

    День 1051. #ЧтоНовенького Быстрое Обновление Проектов с Помощью .NET Upgrade Assistant Инструмент Upgrade Assistant предлагает пошаговые инструкции для обновления проектов и решений до .NET 6. Установка Здесь и далее предполагаем, что на вашем компьютере уже установлен пакет SDK для .NET 6 и среда выполнения. Выполните команду:
    dotnet tool install -g upgrade-assistant
    
    
    Анализ Если вы выполните команду
    upgrade-assistant analyze
    
    вам будут предоставлены инструкции по тому, как будет выглядеть обновление. Инструкции включают в себя: - Какую целевую платформу (TFM) следует использовать для проекта? - Нужно ли обновлять какие-либо зависимости проекта? - Необходимо ли внести существенные изменения в код для обновления? - И многое другое! Во всех этих случаях помощник по обновлению скажет вам, что нужно сделать, и внесёт столько изменений, сколько сможет. Обновление Обновление похоже на анализ, за исключением того, что вам предоставляется возможность пропустить этап или выполнить действие. См. картинку ниже. Например, первым шагом является резервное копирование всех проектов. Если ваши проекты в Git, можно пропустить этот шаг. Также есть возможность предоставить более подробную информацию о каждом шаге. Если вы не уверены, будет ли этот этап дорогостоящим или вызовет нарушение работы кода, помощник по обновлению сообщит вам об этом. FAQ 1. Он работает с решениями или только с отдельными проектами? В решении помощник попросит указать точку входа для приложения. После этого он изучит все зависимости, их зависимости и наметит лучший способ выполнить обновление. Возможно, придётся повторить этот процесс для дополнительных точек входа для решения (приложение MVC, приложение функций Azure, API и т.п.). 2. Какие языки поддерживаются? C# и Visual Basic полностью поддерживаются! 3. С чем ещё может помочь инструмент? Upgrade Assistant может помочь со следующими типами проектов: - ASP.NET MVC - Windows Forms - Windows Presentation Foundation (WPF) - Консольные приложения - Библиотеки классов 4. Что насчёт других типов проектов? Вы, вероятно, заметили, что веб-формы ASP.NET отсутствуют в приведённом выше списке. Они входят в дорожную карту проекта вместе со многими другими функциями! Источник: consultwithgriff.com/rapid-p…ssistant
  • .NET Разработчик

    День 1050. #ЗаметкиНаПолях #AsyncTips Асинхронные потоки и отмена Создание асинхронных потоков Потребление асинхронных потоков Использование LINQ с асинхронными потоками Задача: требуется механизм отмены асинхронных потоков. Решение Не всем асинхронным потокам необходима отмена. Перечисление может быть просто остановлено при достижении условия. Если это единственная разновидность «отмены», реально необходимая в программе, то полноценная отмена не нужна, как показывает следующий пример (см. код метода GetAsyncRange здесь):
    await foreach (int result in GetAsyncRange())
    {
      Console.WriteLine(result);
      if (result >= 8)
        break;
    }
    
    
    Часто бывает полезно отменять сами асинхронные потоки, передав маркер отмены потоку-источнику. Async метод, возвращающий IAsyncEnumerable<T>, может получать маркер отмены, который должен быть помечен атрибутом EnumeratorCancellation. После этого маркер можно использовать естественным образом:
    async IAsyncEnumerable<int> GetAsyncRange(
    [EnumeratorCancellation] CancellationToken ct = default)
    {
      for (int i = 0; i < 10; i++)
      {
        await Task.Delay(100, ct);
        yield return i;
      }
    }
    
    using var cts = new CancellationTokenSource(500);
    CancellationToken token = cts.Token;
    await foreach (int result in GetAsyncRange(token)) {
      Console.WriteLine(result);
    }
    
    
    В этом примере CancellationToken передается непосредственно методу, возвращающему асинхронный перечислитель. Это самый распространенный вариант использования. Возможны и другие сценарии, когда маркер отмены применяется к перечислителю. Это нетипичный, но важный сценарий использования. По этой причине асинхронные потоки поддерживают метод расширения WithCancellation, который может использоваться для присоединения маркера отмены к конкретной итерации асинхронного потока:
    async Task ConsumeSequence(IAsyncEnumerable<int> items)
    {
      using var cts = new CancellationTokenSource(500);
      CancellationToken ct = cts.Token;
      await foreach (int item 
        in items.WithCancellation(ct))
      {
        Console.WriteLine(item);
      }
    }
    
    await ConsumeSequence(GetAsyncRange());
    
    
    Примечания: 1. Заметьте, что GetAsyncRange() вызывается без токена отмены. При наличии атрибута EnumeratorCancellation компилятор автоматически обеспечит передачу маркера из WithCancellation параметру метода GetAsyncRange, помеченному атрибутом EnumeratorCancellation. 2. В нынешнем виде отменённое перечисление выбрасывает TaskCanceledException, которое нужно обработать в клиентском коде. 3. Метод расширения WithCancellation не препятствует ConfigureAwait(false). Оба метода расширения могут быть объединены в цепочку: … items.WithCancellation(ct).ConfigureAwait(false))Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 3.
  • .NET Разработчик

    День 1049. #ВопросыНаСобеседовании Сегодня поделюсь с вами шикарным, на мой взгляд, видео из двух частей с конференции DotNext, которая прошла в конце октября. Однако, это не обычный доклад, как мы все привыкли, а более неформальное общение или, как назвали авторы, реалити-шоу, «Собеседование». Александр Кугушев из EPAM и Артём Акуляков из OCS.Lab играют в реальное собеседование. Артём задаёт вопросы, Александр отвечает, затем они обсуждают, почему такие вопросы задаются, какие ответы получаются, и что ответ может сказать о кандидате. Тут всё, что мы любим: - Какая у вас была самая сложная/интересная задача? - SOLID - Сборка мусора - Параллельный и асинхронный код - Ссылочные и значимые типы - Коллекции - Сложность алгоритмов - Код ревью Часть 1 Часть 2
  • .NET Разработчик

    День 1048. #ЗаметкиНаПолях #ExploringNET6 Исследуем .NET 6. Часть 2 В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6. Часть 1 WebApplicationBuilder В .NET появился новый способ «по умолчанию» для создания приложений, используя WebApplication.CreateBuilder(). Во всех предыдущих версиях ASP.NET Core конфигурация разделена на 2 файла: Program.cs и Startup.cs (см. рисунок ниже). В .NET 6 добавлено множество изменений в C#, BCL и ASP.NET Core, и теперь всё может быть в одном файле.
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    app.UseStaticFiles();
    app.MapGet("/", () => "Hello World!");
    app.MapRazorPages();
    app.Run();
    
    
    WebApplicationBuilder Для начала рассмотрим WebApplicationBuilder.
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddRazorPages();
    
    
    Он отвечает за 4 основные вещи: 1. Добавление конфигурации с помощью builder.Configuration. Он предоставляет тип ConfigurationManager для добавления новых источников конфигурации, а также для доступа к значениям конфигурации, как я описал в предыдущем посте. 2. Добавление сервисов с помощью builder.Services. Предоставляет доступ к IServiceCollection напрямую для добавления сервисов в контейнер DI. 3. Аналогично для журнала с помощью builder.Logging. Вы можете использовать, Например:
    builder.Logging.AddFile();
    
    
    4. Общая конфигурация IHostBuilder и IWebHostBuilder. Для тех точек расширения, которые напрямую зависят от IHostBuilder или IWebHostBuilder, WebApplicationBuilder предоставляет свойства Host и WebHost соответственно. Например, настройка Serilog для ASP.NET Core подключается к IHostBuilder. С помощью WebApplicationBuilder вы можете вызвать UseSerilog() на свойстве Host:
    builder.Host.UseSerilog();
    
    
    Фактически, WebApplicationBuilder – это то место, где вы выполняете всю настройку, кроме конвейера промежуточного ПО. WebApplication После того, как вы настроили всё необходимое в WebApplicationBuilder, вы вызываете Build() для создания экземпляра WebApplication:
    var app = builder.Build();
    
    
    WebApplication реализует несколько различных интерфейсов: - IHost – для запуска и остановки хоста. - IApplicationBuilder – для создания конвейера промежуточного ПО. - IEndpointRouteBuilder – для добавления конечных точек. Два последних пункта во многом связаны. В ASP.NET Core 3.x и 5 IEndpointRouteBuilder используется для добавления конечных точек путем вызова UseEndpoints() и передачи ему лямбды, например:
    public void Configure(IApplicationBuilder app)
    {
      app.UseStaticFiles();
      app.UseRouting();
      app.UseEndpoints(endpoints =>
      {
        endpoints.MapRazorPages();
      });
    }
    
    
    WebApplication значительно упрощает этот шаблон:
    app.UseStaticFiles();
    app.MapRazorPages();
    
    
    Это явно намного проще, хотя немного обманчиво, поскольку различие между промежуточным ПО и конечными точками гораздо менее очевидно, чем в .NET 5.x. Вероятно, это просто дело вкуса, но такой подход несколько размывает концепцию важности порядка настройки (которая относится к промежуточному ПО, но не к конечным точкам). Подробнее перевод статьи с примерами кода размещён на Хабре. Источник: andrewlock.net/explori…ric-host
  • .NET Разработчик

    День 1047. #Карьера Чему Можно Научиться из Книг «Программист-прагматик» и «Идеальный программист». Часть 3 Часть 1 Часть 2 5. Как оценивать Этот урок, как и большинство из обеих книг, так же важен в разработке программного обеспечения, как и в реальной жизни. Чем больше вы практикуетесь и развиваете этот навык, тем более интуитивной будет ваша способность определять выполнимость любой задачи. Во-первых, проясним, что означает оценка определением оценки из книги «Идеальный программист»: Оценка — это не число. Оценка — это распределение вероятностей успешного завершения. — Идеальный программист То есть, например, вероятность завершить задачу во 2й день – 10%, во 3й – 50%, в 4й – 20%, в 5й – 10%, в 6й – 5% и т.д, и даже в 10й – 1% (закона Мерфи ещё никто не отменял). Один из основных способов делать точные оценки — это хорошо знать, что вы оцениваете. Первой частью любого упражнения в составлении оценки является понимание сути заданного вопроса. <…> вам необходимо осознать масштаб предметной области. — Программист-прагматик Не оценивайте в одиночку, общайтесь с другими людьми, чтобы быть как можно более точными. Самый важный ресурс оценки — это люди, которые вас окружают. Они могут видеть то, что не видите вы. Они помогут вам оценить ваши задачи точнее, чем если бы вы делали это самостоятельно. — Идеальный программист Главная хитрость оценки, которая всегда даёт хорошие результаты: спросите того, кто уже делал это. — Программист-прагматик Когда вас попросят дать оценку, выберите единицы, которые лучше отражают точность, которую вы собираетесь передать. Эта шкала времени оценки из книги «Программист-прагматик» может вам помочь:
    1–15 дней   - Дни
    3–6 недель  - Недели
    8–20 недель - Месяцы
    20+ недель  - Хорошо подумайте, перед тем, как оценивать
    
    
    Хотя бизнесу нравится рассматривать оценки как обязательства, помните, что оценка — это всего лишь предположение, поэтому никаких обязательств не подразумевается. Обязательство — нечто такое, что вы обязаны сделать. Если вы обязуетесь сделать что-то к определённой дате, то к этой дате «что-то» должно быть готово. <…> Профессионалы не принимают на себя обязательств, если только они не уверены в возможности их выполнения. <…> Нарушение обязательств обернется огромным ущербом для вашей репутации; это проявление непорядочности, лишь немногим лучшее открытой лжи. — Идеальный программист Таким образом, чтобы помочь бизнесу в оценке требований и составлении соответствующих планов, вы должны устранить двусмысленность требования перед проведением оценки. А впоследствии информировать бизнес о вашем прогрессе. Чтобы свести к минимуму проблемы, связанные с отставанием, помните о двух важнейших аспектах: раннем обнаружении и прозрачности. Будьте по возможности честны в своих оценках. Оптимизму в них не место! — Идеальный программист Не изобретайте велосипед, используйте известные методики оценивания задач. Вот некоторые техники оценки, упомянутые в этих книгах: - PERT - Широкополосный дельфийский метод - Метод быстрого голосования - Покер планирования - Аффинная оценка - Анализ по трем переменным - Закон больших чисел Чем больше у вас опыта работы над тем или иным проектом, тем точнее вы оцените его задачи. Поэтому не беспокойтесь, если ваши первые оценки окажутся не такими точными, как могли бы быть. Это постепенный процесс, как и с любой долгосрочной целью, которой вы хотите достичь. Продолжение следует… Источник: www.freecodecamp.org/news/le…an-coder
  • .NET Разработчик

    День 1046. #Оффтоп Доброй субботы, дорогие подписчики. Сегодня порекомендую вам полуразвлекательное видео для просмотра холодным зимним вечером (или днём). Олимпийские игры по сортировке. Участвуют 7 наиболее популярных алгоритмов сортировки в трёх дисциплинах: - спринт (сортировка массива целых чисел от 2х до 11 элементов), - средняя дистанция (от 60 до 250 элементов), - марафон (от 100 тыс. до 200 тыс. элементов). Участники: - Сортировка выбором (Selection), - Быстрая сортировка (Quick), - Сортировка вставками (Insertion), - Пузырьковая сортировка (Bubble), - Поразрядная сортировка (Radix), - Сортировка Шелла (Shell), - Стандартная сортировка в C++ (STD) – функция sort(). Все алгоритмы обозначены разноцветными кружками, и проходят «трассу», где время, затраченное на достижение каждого следующего поворота, соответствует времени сортировки массива с определённым количеством элементов. Например, в спринте: от старта до 1го поворота – сортировка массива из 2х элементов, от 1го до 2го – из 3х элементов, и т.д., от предпоследнего до финиша – 11 элементов. В марафоне: от старта до 1го – сортировка 100тыс. элементов, от 1го до 2го – 110 тыс., от предпоследнего до финиша – 200 тыс. Довольно увлекательное «соревнование». Интриги придаёт то, что автор не раскрывает, какая сортировка каким цветом обозначена, и предлагает вам догадаться. Смотрим и «болеем»: https://youtu.be/FNAUuYmkMPE Пишите в комментариях, сколько алгоритмов вы угадали. Если покажется мало, вот серия из 3х видео, с объяснениями принципов работы алгоритмов: - Часть 1 - Часть 2 - Часть 3 (пример на C++, и замеры времени такие себе, но, думаю, основной посыл будет понятен).
  • .NET Разработчик

    День 1045. #ЧтоНовенького Сервис Azure Load Testing Недавно Microsoft анонсировали превью сервиса Azure Load Testing. Он позволяет пользователям имитировать полноценную нагрузку на приложение с помощью сценариев Apache JMeter и получать полезные сведения, позволяющие выявлять и устранять узкие места производительности. Ранее компания предлагала возможности нагрузочного тестирования в Visual Studio 2019 через функции веб-производительности и нагрузочного тестирования. Кроме того, также предлагался соответствующий облачный сервис нагрузочного тестирования в Azure DevOps. Ни то, ни другое больше не поддерживается, и теперь преемник Azure Load Testing с поддержкой Apache JMeter с открытым исходным кодом доступен в превью. Azure Load Testing позволяет пользователям создавать крупномасштабные нагрузки без необходимости управления сложной инфраструктурой. Он интегрируется с Azure Monitor, включая Application insights и Container insights, для сбора метрик из сервисов Azure (см. картинку ниже). Кроме того, пользователи могут включать нагрузочное тестирование в свои рабочие процессы непрерывной интеграции и доставки (CI/CD) и потенциально находить проблемы с производительностью до того, как они появятся в производственной среде. В Azure Marketplace пользователи могут найти сервис Azure Load Testing, который можно использовать для интеграции в конвейер CI/CD в значимых точках жизненного цикла разработки. Эти конвейеры могут быть либо GitHub Actions, либо Azure Pipelines. Впоследствии в настройках тестов можно указать правила прохождения и отказа, чтобы отловить снижение производительности. И, наконец, при запуске конвейера сервис может автоматически прерывать запуск нагрузочных тестов в случае определённых условий (ошибок), что помогает защититься от выполнения ненужных нагрузочных тестов и дополнительных расходов. Наряду с нагрузочным тестированием в Marketplace пользователи также могут создать ресурс Azure Load Testing на портале Azure в качестве централизованного места для просмотра планов и результатов тестирования и других связанных артефактов, а также для управления ими. После подготовки ресурса Azure Load Testing можно настроить роли идентификации и доступа для тестов, загрузить пользовательские сценарии JMeter и создать нагрузочные тесты. Подробности и руководство доступны на этой странице. Источник: www.infoq.com/news/20…-preview
  • .NET Разработчик

    День 1044. #ЗаметкиНаПолях #ExploringNET6 Исследуем .NET 6. Часть 1 В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6. Заглянем в ConfigurationManager ConfigurationManager был добавлен для поддержки новой модели WebApplication в ASP.NET. Однако он во многом является деталью реализации. В .NET5 двумя основными типами конфигурации: - IConfigurationBuilder - для добавления источников конфигурации. Вызов Build() считывает каждый из источников конфигурации и строит окончательную конфигурацию. - IConfigurationRoot - представляет собой окончательную «построенную» конфигурацию. Поставщики конфигурации обычно включают методы расширения (например, AddJsonFile() и AddAzureKeyVault()), которые добавляют источник конфигурации в список источников. IConfigurationRoot в свою очередь объединяет все значения из каждого источника конфигурации, чтобы дать окончательное представление всех значений. Проблема "частичной сборки конфигурации" в .NET 5 Основная проблема с этим подходом проявляется, когда вам нужно построить конфигурацию «частично». Это распространённая проблема, когда вы храните свою конфигурацию в таком сервисе, как Azure Key Vault, или в базе данных. Рекомендуемый подход состоит в следующем: - Добавить «начальные» значения конфигурации. - Создать «частичный» результат конфигурации, вызвав IConfigurationBuilder.Build() - Получить необходимые значения конфигурации из построенного IConfigurationRoot - Использовать эти значения, чтобы добавить оставшиеся источники конфигурации - Фреймворк неявно вызывает IConfigurationBuilder.Build(), генерируя окончательный IConfigurationRoot и используя его для окончательной конфигурации приложения. Таким образом конфигурация из начальных источников загружается дважды, что может негативно повлиять на производительность. Менеджер Конфигурации в .NET 6 В .NET 6 добавлен новый тип конфигурации, ConfigurationManager. Он реализует как IConfigurationBuilder, так и IConfigurationRoot, позволяя оптимизировать сценарий, описанный выше. В ConfigurationManager, когда добавляется IConfigurationSource (например, когда вы вызываете AddJsonFile()), поставщик сразу загружается, и конфигурация обновляется. Это позволяет избежать загрузки источников конфигурации более одного раза в сценарии частичной сборки. Однако ConfigurationManager оптимизирован для наиболее распространённого сценария – только добавление источников. Если какой-либо из источников изменится, ConfigurationManager должен удалить всё и начать заново, перебирая каждый из источников и перезагружая их. Стоит ли вам беспокоиться о том, используете ли вы ConfigurationManager или ConfigurationBuilder? Скорее нет. Новый WebApplicationBuilder, представленный в .NET 6, использует ConfigurationManager, оптимизированный для описанного выше случая, когда вам необходимо частично построить конфигурацию. Однако WebHostBuilder или HostBuilder, представленные в более ранних версиях ASP.NET, по-прежнему поддерживаются в .NET 6, и они по-прежнему «за кулисами» используют типы ConfigurationBuilder и ConfigurationRoot. Подробнее перевод статьи с примерами кода размещён на Хабре. Источник: andrewlock.net/explori…dotnet-6
  • Реклама

  • .NET Разработчик

    День 1043. #ЗаметкиНаПолях #AsyncTips Использование LINQ с асинхронными потоками Создание асинхронных потоков Потребление асинхронных потоков Задача: обработать асинхронный поток с использованием чётко определенных и хорошо протестированных операторов. Либо использовать LINQ, когда предикат является асинхронным, например, необходимо провести поиск каждого элемента в базе данных или API, чтобы узнать, должен ли он быть включен в итоговую последовательность. Решение Допустим, у нас есть метод, производящий асинхронную последовательность:
    async IAsyncEnumerable<int> GetAsyncRange()
    {
      for (int i = 0; i < 10; i++)
      {
        await Task.Delay(100);
        yield return i;
      }
    }
    
    
    IAsyncEnumerable<T> включает поддержку LINQ в NuGet-пакете System.Linq.Async. Заметьте, что при этом в коде нужно использовать
    using static System.Linq.AsyncEnumerable;
    
    
    Операторы LINQ можно применять к асинхронным потокам. Доступны все знакомые операторы: Where, Select, SelectMany, Join и т.д. Результат представляет собой асинхронный поток:
    IAsyncEnumerable<int> values =
      GetAsyncRange().Where(value => value % 2 == 0);
    
    await foreach (int result in values) {
      Console.WriteLine(result);
    }
    
    
    Но что, если нам нужно передать в Where асинхронный предикат? Where их не поддерживает. Но есть подходящий оператор WhereAwait:
    IAsyncEnumerable<int> values = 
      GetAsyncRange().WhereAwait(
        async value => {
         // Асинхронная работа для определения,
         // должен ли элемент быть включён в результат
         await Task.Delay(10);
         return value % 2 == 0;
      });
    
    
    Методы LINQ для асинхронных потоков можно использовать и для обычных перечисляемых объектов, вызвав ToAsyncEnumerable() для любого IEnumerable<T>. Результат можно использовать с WhereAwait, SelectAwait и другими операторами, принимающими асинхронные делегаты. Операторы LINQ для асинхронных потоков могут оканчиваться суффиксами Async и Await. Операторы, заканчивающиеся суффиксом Async, возвращают обычное значение, допускающее ожидание. Операторы с суффиксом Await получают асинхронный делегат. Т.е. Await в имени подразумевает, что они используют await внутри переданного делегата. Пример WhereAwait был приведёт выше. Суффикс Async применяется только к операторам терминации (termination operators), которые извлекают некоторое значение или выполняют некоторые вычисления и возвращают асинхронное скалярное значение. Пример такого оператора — CountAsync, версия Count для асинхронного потока, которая может подсчитать количество элементов, соответствующих некоторому предикату:
    int count = await GetAsyncRange()
      .CountAsync(value => value % 2 == 0);
    
    
    Предикат может также быть асинхронным. В этом случае используется метод CountAwaitAsync, поскольку он получает асинхронного делегата и производит одно терминальное значение:
    int count = await GetAsyncRange().CountAwaitAsync(
      async value => {
       await Task.Delay(10);
       return value % 2 == 0;
      });
    
    
    Итого - Операторы без суффиксов (Where, Select) получают синхронные делегаты и выдают асинхронную последовательность. - Операторы, которые получают асинхронные делегаты, имеют суффикс Await (WhereAwait, SelectAwait), и выдают асинхронную последовательность. - Операторы, возвращающие терминальное значение, имеют суффикс Async (CountAsync), а также могут иметь суффикс Await, если получают асинхронный делегат (CountAwaitAsync). Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 3.
  • .NET Разработчик

    День 1042. #Карьера Чему Можно Научиться из Книг «Программист-прагматик» и «Идеальный программист». Часть 2 Часть 1 3. Командная Работа – Работа Мечты Работая в команде, вы должны быть «командным игроком», часто общаться, следить за своими товарищами по команде и максимально эффективно выполнять свои обязанности. Команды должны быть небольшими, не более 10-12 человек, где все знают и доверяют друг другу. Такую командную среду сложно создать, поэтому, как только вы её получите, вам придётся заботиться о ней, изменяя проекты, над которыми работает команда, а не её участников. По мере увеличения размера команды количество каналов связи увеличивается с квадратичной скоростью. В более крупных командах общение становится неэффективным. - Программист-прагматик Формировать команды под каждый проект неверно в принципе: группы просто не успеют «притереться». Люди участвуют в проекте только короткое время и поэтому никогда не узнают, как взаимодействовать друг с другом. Команды строить сложнее, чем проекты. Слаженная команда может вести сразу несколько проектов и распределять работу в соответствии со своими предпочтениями, квалификацией и способностями участников. - Идеальный программист Более того, отличные команды будут решать проблемы вместе, и каждый из них приложит максимум усилий. Слаженная команда может творить чудеса, прикрывать и поддерживать друг друга, требовать друг от друга большего и добиваются результата. - Идеальный программист Отличные проектные команды обладают ярко выраженной индивидуальностью. Люди с нетерпением ждут встречи с ними, потому что знают, что увидят хорошо подготовленную презентацию. А документация, которую они создают, чёткая, точная и последовательная. - Программист-прагматик 4. Разработка методом трассирующих пуль Трассирующие пули отмечают пройденный путь, чтобы стрелок мог лучше прицелиться в следующий раз. Таким образом, основная цель разработки методом трассирующих пуль - «добавить» основные функции в проект и получить быструю обратную связь, чтобы лучше «нацелиться» на следующие изменения. Разработка методом трассирующих пуль согласуется идеей, что проект никогда не кончается: всегда будет потребность в изменениях и добавлении новых функций. Это — инкрементный подход. - Программист-прагматик Этот метод помогает разработчикам сосредоточиться на основных функциях, которые необходимо реализовать, чтобы можно было создавать другие. Кроме того, это служит доказательством совместимости и выполнимости архитектуры, предоставляя функциональный и демонстрируемый скелет для работы в самом начале процесса разработки. Ищите важные требования, которые определяют систему. Найдите области, в которых вы сомневаетесь, и где вы видите наибольшие риски. Затем расставьте приоритеты в разработке так, чтобы это были первые области, которые вы реализуете. - Программист-прагматик Этот подход не следует путать с прототипированием. Код прототипов не должен быть частью проекта, а код «трассирующих пуль» не выбрасывается. Он работает и улучшается с каждой итерацией. При прототипировании генерируется временный код. Код «трассирующей пули» скуден, но полноценен и составляет часть скелета окончательной системы. Думайте о прототипировании как о сборе разведданных, который происходит до того, как будет выпущена первая «трассирующая пуля». - Программист-прагматик Продолжение следует… Источник: www.freecodecamp.org/news/le…an-coder
  • .NET Разработчик

    День 1041. #ЧтоНовенького Новый редактор Razor в Visual Studio 2022 С выпуском Visual Studio 2022 версии 17.0.2 вы можете использовать новый редактор Razor. Преимущества перехода на Language Server Protocol Новый редактор Razor для проектов ASP.NET Core основан на протоколе языкового сервера (LSP). Это протокол с открытым исходным кодом, который определяет стандартный способ включения функций редактором или IDE. Модель LSP позволила добавить в Razor гораздо больше функций редактирования C# и другие функции для повышения продуктивности, специфичные для Razor. Что доступно в новом редакторе Razor? 1. В редакторе Razor теперь поддерживается наиболее часто используемый рефакторинг Add missing usings (Добавить недостающие директивы using). 2. Также добавлено несколько функций, специфичных для Razor. Например, Extract block to code behind (Извлечь блок в файл кода) позволяет вам извлечь блок кода в отдельный файл кода, если вы не хотите держать его в одном файле с разметкой. Другие добавленные функции включают: - Add usings for component (Добавить директивы using для компонента), - Fully qualify component (Полностью определить компонент), - Create component (Создать компонент). 2. Улучшена навигация. Одной из наиболее часто используемых функций навигации в Visual Studio является Go to Definition (Перейти к определению). Она помогает быстро перемещаться по файлам и лучше понимать код. Например, нажатие F12 на теге компонента теперь переместит вас прямо в код компонента. 3. Опыт горячей перезагрузки также улучшен, благодаря LSP. 4. В новом редакторе Razor обновлены цвета по умолчанию. Основным отличием является то, что код больше не подсвечивается серым фоном, как это было в предыдущих версиях. 5. Новый редактор обеспечивает улучшенное форматирование, которое лучше справляется с изменениями, помогая коду оставаться визуально согласованным. Поддерживаются более умные дополнения синтаксиса Razor, такие как завершение <text> и автозаполнение. Новый редактор также изменяет способ диагностики, чтобы гарантировать отображение только наиболее важных диагностических сообщений. 6. Razor теперь полностью поддерживает Visual Studio Live Share. Известные проблемы и дорожная карта Razor накопил большое количество запросов на добавление функций и исправлений ошибок. Решение этих проблем в устаревшем редакторе Razor было трудным и дорогостоящим. Новый редактор позволит быстрее предоставлять исправления ошибок и новые функции. Есть ещё несколько функциональных пробелов, которые необходимо устранить в следующих выпусках: - Поддержка сниппетов (с помощью Tab) - Горячая клавиша «Обернуть в div» - Shift+Alt+W - Ctrl+щелчок мыши для перехода к определению - Сворачивание кода в #region - Встроенное форматирование JavaScript - Поддержка перетаскивания файлов HTML, CSS и JavaScript - Улучшения производительности и надёжности - Поддержка горячей перезагрузки для проектов Blazor Web Assembly при отладке Следить за дорожной картой вы можете на GitHub. Если вы обнаружите, что ваша продуктивность в новом редакторе ограничена, вы можете вернуться к предыдущей версии редактора, перейдя в Tools > Options > Text Editor > HTML > Advanced (Инструменты > Параметры > Текстовый редактор > HTML > Дополнительно) и выбрав True в раскрывающемся списке рядом с пунктом Use legacy Razor editor for ASP.NET Core (Использовать устаревший редактор Razor для ASP.NET Core). Имейте в виду, что старый редактор Razor будет иметь ограниченную функциональность и не будет включать улучшения, описанные выше. Источник: devblogs.microsoft.com/visuals…dio-2022

© Telegram-site 2018-2026

Сайт про Telegram каналы(неофициальный) | Почта для связи: [email protected]