День 1048. #ЗаметкиНаПолях #ExploringNET6
Исследуем .NET 6. Часть 2
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
WebApplicationBuilder
В .NET появился новый способ «по умолчанию» для создания приложений, используя
Для начала рассмотрим
1. Добавление конфигурации с помощью
2. Добавление сервисов с помощью
3. Аналогично для журнала с помощью
WebApplication
После того, как вы настроили всё необходимое в
-
-
-
Два последних пункта во многом связаны. В ASP.NET Core 3.x и 5
Подробнее перевод статьи с примерами кода размещён на Хабре.
Источник: https://andrewlock.net/exploring-dotnet-6-part-2-comparing-webapplicationbuilder-to-the-generic-host/
Исследуем .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);WebApplicationBuilder
builder.Services.AddRazorPages();
var app = builder.Build();
app.UseStaticFiles();
app.MapGet("/", () => "Hello World!");
app.MapRazorPages();
app.Run();
Для начала рассмотрим
WebApplicationBuilder
.var builder = WebApplication.CreateBuilder(args);Он отвечает за 4 основные вещи:
builder.Services.AddRazorPages();
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();Это явно намного проще, хотя немного обманчиво, поскольку различие между промежуточным ПО и конечными точками гораздо менее очевидно, чем в .NET 5.x. Вероятно, это просто дело вкуса, но такой подход несколько размывает концепцию важности порядка настройки (которая относится к промежуточному ПО, но не к конечным точкам).
app.MapRazorPages();
Подробнее перевод статьи с примерами кода размещён на Хабре.
Источник: https://andrewlock.net/exploring-dotnet-6-part-2-comparing-webapplicationbuilder-to-the-generic-host/
День 1049. #ВопросыНаСобеседовании
Сегодня поделюсь с вами шикарным, на мой взгляд, видео из двух частей с конференции DotNext, которая прошла в конце октября. Однако, это не обычный доклад, как мы все привыкли, а более неформальное общение или, как назвали авторы, реалити-шоу, «Собеседование».
Александр Кугушев из EPAM и Артём Акуляков из OCS.Lab играют в реальное собеседование. Артём задаёт вопросы, Александр отвечает, затем они обсуждают, почему такие вопросы задаются, какие ответы получаются, и что ответ может сказать о кандидате.
Тут всё, что мы любим:
- Какая у вас была самая сложная/интересная задача?
- SOLID
- Сборка мусора
- Параллельный и асинхронный код
- Ссылочные и значимые типы
- Коллекции
- Сложность алгоритмов
- Код ревью
Часть 1
Часть 2
Сегодня поделюсь с вами шикарным, на мой взгляд, видео из двух частей с конференции DotNext, которая прошла в конце октября. Однако, это не обычный доклад, как мы все привыкли, а более неформальное общение или, как назвали авторы, реалити-шоу, «Собеседование».
Александр Кугушев из EPAM и Артём Акуляков из OCS.Lab играют в реальное собеседование. Артём задаёт вопросы, Александр отвечает, затем они обсуждают, почему такие вопросы задаются, какие ответы получаются, и что ответ может сказать о кандидате.
Тут всё, что мы любим:
- Какая у вас была самая сложная/интересная задача?
- SOLID
- Сборка мусора
- Параллельный и асинхронный код
- Ссылочные и значимые типы
- Коллекции
- Сложность алгоритмов
- Код ревью
Часть 1
Часть 2
День 1050. #ЗаметкиНаПолях #AsyncTips
Асинхронные потоки и отмена
Создание асинхронных потоков
Потребление асинхронных потоков
Использование LINQ с асинхронными потоками
Задача: требуется механизм отмены асинхронных потоков.
Решение
Не всем асинхронным потокам необходима отмена. Перечисление может быть просто остановлено при достижении условия. Если это единственная разновидность «отмены», реально необходимая в программе, то полноценная отмена не нужна, как показывает следующий пример (см. код метода GetAsyncRange здесь):
Часто бывает полезно отменять сами асинхронные потоки, передав маркер отмены потоку-источнику. Async метод, возвращающий
В этом примере
Возможны и другие сценарии, когда маркер отмены применяется к перечислителю. Это нетипичный, но важный сценарий использования. По этой причине асинхронные потоки поддерживают метод расширения WithCancellation, который может использоваться для присоединения маркера отмены к конкретной итерации асинхронного потока:
Примечания:
1. Заметьте, что
2. В нынешнем виде отменённое перечисление выбрасывает
3. Метод расширения
…
Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 3.
Асинхронные потоки и отмена
Создание асинхронных потоков
Потребление асинхронных потоков
Использование 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.
День 1051. #ЧтоНовенького
Быстрое Обновление Проектов с Помощью .NET Upgrade Assistant
Инструмент Upgrade Assistant предлагает пошаговые инструкции для обновления проектов и решений до .NET 6.
Установка
Здесь и далее предполагаем, что на вашем компьютере уже установлен пакет SDK для .NET 6 и среда выполнения. Выполните команду:
Если вы выполните команду
Инструкции включают в себя:
- Какую целевую платформу (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 отсутствуют в приведённом выше списке. Они входят в дорожную карту проекта вместе со многими другими функциями!
Источник: https://consultwithgriff.com/rapid-project-upgrades-with-dotnet-upgrade-assistant/
Быстрое Обновление Проектов с Помощью .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 отсутствуют в приведённом выше списке. Они входят в дорожную карту проекта вместе со многими другими функциями!
Источник: https://consultwithgriff.com/rapid-project-upgrades-with-dotnet-upgrade-assistant/
День 1052. #ЗаметкиНаПолях #ExploringNET6
Исследуем .NET 6. Часть 3
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Рассматриваем код WebApplicationBuilder
Напомню стандартный шаблон нового минимального API приложения ASP.NET Core:
Многие из этих свойств используют стандартные типы из предыдущих версий:
- IWebHostEnvironment – используется для получения имени среды, пути к корню контента и подобных значений.
- IServiceCollection – используется для регистрации сервисов в контейнере DI. Обратите внимание, что это альтернатива методу
- ConfigurationManager – используется как для добавления новой конфигурации, так и для получения значений конфигурации. См. первый пост в серии, где обсуждается этот вопрос.
- ILoggingBuilder – используется для регистрации дополнительных поставщиков журналов, как и в случае с методом
- Свойства WebHost и Host интересны тем, что они предоставлены новыми типами
Приватные члены класса содержат:
- вспомогательный класс BootstrapHostBuilder, который «запоминает» переданные ему делегаты конфигурации для последующего их вызова в правильном порядке при построении хоста. Кроме того, он вызывает знакомые нам по .NET 3.x/5 методы расширения
- HostBuilder – экземпляр универсального хоста, который является «внутренним» хостом в
См. рисунок ниже.
В методе Build() вся конфигурация, сделанная по умолчанию, а также добавленная пользователем в файле
Источник: https://andrewlock.net/exploring-dotnet-6-part-3-exploring-the-code-behind-webapplicationbuilder/
Исследуем .NET 6. Часть 3
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Рассматриваем код WebApplicationBuilder
Напомню стандартный шаблон нового минимального API приложения ASP.NET Core:
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);Первым шагом является создание экземпляра
// добавляем конфигурацию
builder.Configuration.AddJsonFile("sharedsettings.json");
// добавляем сервисы
builder.Services.AddSingleton<MyTestService>();
builder.Services.AddRazorPages();
// добавляем ведение журнала
builder.Logging.AddFile();
// строим!
WebApplication app = builder.Build();
app.UseStaticFiles();
// добавляем конечные точки
app.MapGet("/", () => "Hello World!");
app.MapRazorPages();
// запускаем!
app.Run();
WebApplicationBuilder
с использованием статического метода класса WebApplication
:WebApplicationBuilder builder = WebApplication.CreateBuilder(args);Ниже приведены приватные и публичные члены класса
WebApplicationBuilder
:public sealed class WebApplicationBuilderПубличный API состоит из набора свойств только для чтения, и метода
{
private readonly HostBuilder _hostBuilder = new();
private readonly BootstrapHostBuilder _bootstrapHostBuilder;
private readonly WebApplicationServiceCollection _services = new();
public IWebHostEnvironment Environment { get; }
public IServiceCollection Services { get; }
public ConfigurationManager Configuration { get; }
public ILoggingBuilder Logging { get; }
public ConfigureWebHostBuilder WebHost { get; }
public ConfigureHostBuilder Host { get; }
public WebApplication Build()
}
Build()
, который создаёт WebApplication
.Многие из этих свойств используют стандартные типы из предыдущих версий:
- IWebHostEnvironment – используется для получения имени среды, пути к корню контента и подобных значений.
- IServiceCollection – используется для регистрации сервисов в контейнере DI. Обратите внимание, что это альтернатива методу
ConfigureServices()
, используемому универсальным хостом для достижения того же результата.- ConfigurationManager – используется как для добавления новой конфигурации, так и для получения значений конфигурации. См. первый пост в серии, где обсуждается этот вопрос.
- ILoggingBuilder – используется для регистрации дополнительных поставщиков журналов, как и в случае с методом
ConfigureLogging()
в универсальном хосте.- Свойства WebHost и Host интересны тем, что они предоставлены новыми типами
ConfigureWebHostBuilder
и ConfigureHostBuilder
. Эти типы реализуют IWebHostBuilder
и IHostBuilder
соответственно и в основном представлены как замена для используемых ранее методов расширения.Приватные члены класса содержат:
- вспомогательный класс BootstrapHostBuilder, который «запоминает» переданные ему делегаты конфигурации для последующего их вызова в правильном порядке при построении хоста. Кроме того, он вызывает знакомые нам по .NET 3.x/5 методы расширения
CreateDefaultBuilder
и ConfigureWebHostDefaults
.- HostBuilder – экземпляр универсального хоста, который является «внутренним» хостом в
WebApplicationBuilder
. WebApplicationBuilder
действует как «адаптер» для универсального хоста _hostBuilder
, предоставляя императивный API и сохраняя при этом ту же функциональность, что и универсальный хост.См. рисунок ниже.
В методе Build() вся конфигурация, сделанная по умолчанию, а также добавленная пользователем в файле
Program.cs
, передаётся в _hostBuilder
в правильном порядке, и возвращается новый экземпляр WebApplication
, в конструктор которого передаётся построенный «внутренний» хост:_builtApplication = new WebApplication(_hostBuilder.Build());Подробнее перевод статьи с примерами кода размещён на Хабре.
…
return _builtApplication;
Источник: https://andrewlock.net/exploring-dotnet-6-part-3-exploring-the-code-behind-webapplicationbuilder/
День 1054. #Карьера
Чему Можно Научиться из Книг «Программист-прагматик» и «Идеальный программист». Часть 4
Часть 1
Часть 2
Часть 3
6. Как справляться с давлением
Этот совет поможет вам и вне разработки программного обеспечения. Рано или поздно вы окажетесь под давлением, и лучший способ справиться с этим - избегать таких ситуаций, когда это возможно, и выдерживать давление, когда его невозможно избежать.
Лучший способ сохранять спокойствие под давлением - избегать ситуаций, вызывающих давление.
— Идеальный программист
В основном вы можете избежать этого, соблюдая обязательства, соблюдая чистоту и следуя правилам. Лучший способ справиться с обязательствами — отказаться от сроков, если вы не уверены, что сможете в них уложиться. Соблюдение чистоты, по сути, означает, что у вас нет беспорядка в ваших системах, коде и дизайне.
Чтобы двигаться быстро и не нарушать сроков, в коде необходимо сохранять чистоту. Профессионал не поддаётся искушению устроить грязь в коде, чтобы быстро двигаться вперед. Грязно — всегда значит медленно!
— Идеальный программист
Следуйте правилам, в которые вы действительно верите, и придерживайтесь их всё время, независимо от ситуации. Придут кризисные времена, и тогда вам нужно будет обратить внимание на то, как вы себя ведёте. Если вы продолжите следовать своим правилам, это означает, что вы уверены в них. Если вы измените своё поведение и не будете следовать своим правилам, это будет означать, что вы на самом деле не верите в свои правила, и вам придётся их изменить, чтобы стать лучше.
Если вы следуете методологии разработки через тестирование в обычное время, но отказываетесь от неё во время кризиса, значит вы не верите в полезность TDD. Если ваш код остаётся чистым в обычное время, а в кризис вы разводите в нем грязь, значит вы не верите, что грязь замедляет вашу работу. Если вы используете парное программирование во время кризиса, но не в обычной ситуации, значит вы полагаете, что парное программирование эффективнее индивидуального.
— Идеальный программист
Но не всегда удается избежать давления, поэтому нужно научиться с ним справляться. Вы можете выдержать его, сохраняя спокойствие, общаясь, следуя своим правилам и прося о помощи. Возьмите свой стресс под контроль. Бессонные ночи не помогут выполнить работу быстрее. Конфликты тоже не помогут. Но худшее, что вы можете сделать, — это спешить! Боритесь с этим искушением любой ценой. Спешка только затянет вас ещё глубже на дно. Наоборот, притормозите и продумайте задачу. Проложите курс к лучшему из возможных решений, а затем двигайтесь по этому курсу в раз-
умном, стабильном темпе. Убедитесь, что вы постоянно общаетесь со своей командой и начальством, и сообщаете им, когда у вас возникают проблемы, чтобы вы могли получать отзывы и рекомендации. Так в итоге ни для кого возможные проблемы не станут сюрпризом.
Избегайте сюрпризов. Ничто не делает людей более злыми и менее рациональными, чем сюрпризы. Сюрпризы умножают давление на десять.
— Идеальный программист
Совет по общению включает в себя обращение за помощью к товарищам по команде, к начальству или к интернет-сайтам и форумам. Но и не забывайте помогать другим, когда они находятся под давлением и нуждаются в помощи.
Продолжение следует…
Источник: https://www.freecodecamp.org/news/lessons-learned-from-the-pragmatic-programmer-and-the-clean-coder/
Чему Можно Научиться из Книг «Программист-прагматик» и «Идеальный программист». Часть 4
Часть 1
Часть 2
Часть 3
6. Как справляться с давлением
Этот совет поможет вам и вне разработки программного обеспечения. Рано или поздно вы окажетесь под давлением, и лучший способ справиться с этим - избегать таких ситуаций, когда это возможно, и выдерживать давление, когда его невозможно избежать.
Лучший способ сохранять спокойствие под давлением - избегать ситуаций, вызывающих давление.
— Идеальный программист
В основном вы можете избежать этого, соблюдая обязательства, соблюдая чистоту и следуя правилам. Лучший способ справиться с обязательствами — отказаться от сроков, если вы не уверены, что сможете в них уложиться. Соблюдение чистоты, по сути, означает, что у вас нет беспорядка в ваших системах, коде и дизайне.
Чтобы двигаться быстро и не нарушать сроков, в коде необходимо сохранять чистоту. Профессионал не поддаётся искушению устроить грязь в коде, чтобы быстро двигаться вперед. Грязно — всегда значит медленно!
— Идеальный программист
Следуйте правилам, в которые вы действительно верите, и придерживайтесь их всё время, независимо от ситуации. Придут кризисные времена, и тогда вам нужно будет обратить внимание на то, как вы себя ведёте. Если вы продолжите следовать своим правилам, это означает, что вы уверены в них. Если вы измените своё поведение и не будете следовать своим правилам, это будет означать, что вы на самом деле не верите в свои правила, и вам придётся их изменить, чтобы стать лучше.
Если вы следуете методологии разработки через тестирование в обычное время, но отказываетесь от неё во время кризиса, значит вы не верите в полезность TDD. Если ваш код остаётся чистым в обычное время, а в кризис вы разводите в нем грязь, значит вы не верите, что грязь замедляет вашу работу. Если вы используете парное программирование во время кризиса, но не в обычной ситуации, значит вы полагаете, что парное программирование эффективнее индивидуального.
— Идеальный программист
Но не всегда удается избежать давления, поэтому нужно научиться с ним справляться. Вы можете выдержать его, сохраняя спокойствие, общаясь, следуя своим правилам и прося о помощи. Возьмите свой стресс под контроль. Бессонные ночи не помогут выполнить работу быстрее. Конфликты тоже не помогут. Но худшее, что вы можете сделать, — это спешить! Боритесь с этим искушением любой ценой. Спешка только затянет вас ещё глубже на дно. Наоборот, притормозите и продумайте задачу. Проложите курс к лучшему из возможных решений, а затем двигайтесь по этому курсу в раз-
умном, стабильном темпе. Убедитесь, что вы постоянно общаетесь со своей командой и начальством, и сообщаете им, когда у вас возникают проблемы, чтобы вы могли получать отзывы и рекомендации. Так в итоге ни для кого возможные проблемы не станут сюрпризом.
Избегайте сюрпризов. Ничто не делает людей более злыми и менее рациональными, чем сюрпризы. Сюрпризы умножают давление на десять.
— Идеальный программист
Совет по общению включает в себя обращение за помощью к товарищам по команде, к начальству или к интернет-сайтам и форумам. Но и не забывайте помогать другим, когда они находятся под давлением и нуждаются в помощи.
Продолжение следует…
Источник: https://www.freecodecamp.org/news/lessons-learned-from-the-pragmatic-programmer-and-the-clean-coder/
День 1055. #ЗаметкиНаПолях
Следует ли Абстрагироваться от Базы Данных?
Мнение, что, имея слой абстракции, можно легко переключиться с одной БД на другую широко распространено среди многих программистов. Но даже при том, что оно довольно популярно, оно неверно. Это явление называется ложным мифом об абстрагировании от базы данных.
Давайте проанализируем его и посмотрим, что именно тут не так.
Привязка к поставщику
Основное преимущество абстрагирования вашей БД — это избежание привязки к поставщику. Другими словами, если по какой-либо причине вы захотите отказаться от текущей СУБД, вы легко сможете это сделать. Чтобы сделать возможным такой переход, вы должны спроектировать свой уровень доступа к данным так, чтобы он поддерживал несколько реализаций базы данных. Для этого вы вводите интерфейс, вроде
Видимое и невидимое
Поначалу это звучит разумно, но, принимая решение, вы должны учитывать обе стороны:
- Желаемые результаты, которые являются видимой частью уравнения.
- Непредвиденные последствия, невидимая часть.
В контексте абстрагирования от базы данных:
- Видимая часть — это преимущества, которые даёт вам абстракция.
- Невидимая часть — это (часто скрытая) стоимость этой абстракции.
Какова же стоимость этой абстракции?
Стоимость — это всё время, которое потребовалось вам для реализации этой возможности. Вот почему абстрагирование от базы данных — это антипаттерн. Люди часто ценят преимущества этой абстракции, потому что они очевидны: тот факт, что переключиться легко, очевиден для всех.
Но они редко учитывают его недостатки, потому что недостатки невидимы. Как только вы вводите дополнительную сложность для абстрагирования от базы данных, вы воспринимаете это как данность. Вам просто не с чем сравнивать, поэтому дополнительное время, которое вам потребовалось для поддержания этой абстракции, остаётся незамеченным.
Но это дополнительное время огромно. Как говорится, «недели программирования могут сэкономить вам часы планирования». Именно это получается, когда кто-то хвастается, что сэкономил 2 дня при переходе на другую базу данных. Вероятно, им потребовалось несколько недель дополнительного времени, чтобы сделать это возможным. И в будущем это будет стоить дороже! Внедрение абстракции — не просто одноразовое действие, вам придётся поддерживать её на протяжении всего проекта, даже если больше никогда не придётся переключаться снова.
Наименьший общий делитель
Другая проблема заключается в том, что вы не сможете использовать расширенные функции, имеющиеся в вашей текущей СУБД. Вы привязаны к наименьшему общему делителю — функциональности, которая присутствует во всех реляционных базах данных, что означает, что вы не можете полностью раскрыть потенциал своей базы данных.
Это не сработает, и вы обнаружите это слишком поздно
Основная проблема заключается в том, что как бы вы ни старались, между разными СУБД будут возникать мелкие, а то и не очень мелкие различия, которые могут кардинально повлиять на то, как будет работать ваше приложение.
Что же делать?
Просто следуйте YAGNI и работайте со своей текущей базой данных, как будто вы никогда не собираетесь отказываться от нее. Скорее всего, вы никогда этого не сделаете, и все ваши абстракции в любом случае пропадут зря.
А если вам всё же нужно переключиться, подходите к процессу переключения не просто как к отказу от одной реализации
Главный инструмент, который поможет добиться успеха при портировании, —качественные интеграционные тесты, т.е. тесты, которые не имитируют вашу базу данных, а реально обращаются к ней.
Источник: https://enterprisecraftsmanship.com/posts/should-you-abstract-database/
Следует ли Абстрагироваться от Базы Данных?
Мнение, что, имея слой абстракции, можно легко переключиться с одной БД на другую широко распространено среди многих программистов. Но даже при том, что оно довольно популярно, оно неверно. Это явление называется ложным мифом об абстрагировании от базы данных.
Давайте проанализируем его и посмотрим, что именно тут не так.
Привязка к поставщику
Основное преимущество абстрагирования вашей БД — это избежание привязки к поставщику. Другими словами, если по какой-либо причине вы захотите отказаться от текущей СУБД, вы легко сможете это сделать. Чтобы сделать возможным такой переход, вы должны спроектировать свой уровень доступа к данным так, чтобы он поддерживал несколько реализаций базы данных. Для этого вы вводите интерфейс, вроде
IDataAccess
, а затем предлагаете реализацию для вашей текущей СУБД.Видимое и невидимое
Поначалу это звучит разумно, но, принимая решение, вы должны учитывать обе стороны:
- Желаемые результаты, которые являются видимой частью уравнения.
- Непредвиденные последствия, невидимая часть.
В контексте абстрагирования от базы данных:
- Видимая часть — это преимущества, которые даёт вам абстракция.
- Невидимая часть — это (часто скрытая) стоимость этой абстракции.
Какова же стоимость этой абстракции?
Стоимость — это всё время, которое потребовалось вам для реализации этой возможности. Вот почему абстрагирование от базы данных — это антипаттерн. Люди часто ценят преимущества этой абстракции, потому что они очевидны: тот факт, что переключиться легко, очевиден для всех.
Но они редко учитывают его недостатки, потому что недостатки невидимы. Как только вы вводите дополнительную сложность для абстрагирования от базы данных, вы воспринимаете это как данность. Вам просто не с чем сравнивать, поэтому дополнительное время, которое вам потребовалось для поддержания этой абстракции, остаётся незамеченным.
Но это дополнительное время огромно. Как говорится, «недели программирования могут сэкономить вам часы планирования». Именно это получается, когда кто-то хвастается, что сэкономил 2 дня при переходе на другую базу данных. Вероятно, им потребовалось несколько недель дополнительного времени, чтобы сделать это возможным. И в будущем это будет стоить дороже! Внедрение абстракции — не просто одноразовое действие, вам придётся поддерживать её на протяжении всего проекта, даже если больше никогда не придётся переключаться снова.
Наименьший общий делитель
Другая проблема заключается в том, что вы не сможете использовать расширенные функции, имеющиеся в вашей текущей СУБД. Вы привязаны к наименьшему общему делителю — функциональности, которая присутствует во всех реляционных базах данных, что означает, что вы не можете полностью раскрыть потенциал своей базы данных.
Это не сработает, и вы обнаружите это слишком поздно
Основная проблема заключается в том, что как бы вы ни старались, между разными СУБД будут возникать мелкие, а то и не очень мелкие различия, которые могут кардинально повлиять на то, как будет работать ваше приложение.
Что же делать?
Просто следуйте YAGNI и работайте со своей текущей базой данных, как будто вы никогда не собираетесь отказываться от нее. Скорее всего, вы никогда этого не сделаете, и все ваши абстракции в любом случае пропадут зря.
А если вам всё же нужно переключиться, подходите к процессу переключения не просто как к отказу от одной реализации
IDataAccess
в пользу другой, а как к портированию: вы портируете своё приложение с одной СУБД на другую.Главный инструмент, который поможет добиться успеха при портировании, —качественные интеграционные тесты, т.е. тесты, которые не имитируют вашу базу данных, а реально обращаются к ней.
Источник: https://enterprisecraftsmanship.com/posts/should-you-abstract-database/
Вам приходилось менять СУБД в производственном проекте?
Anonymous Poll
14%
Да (была подготовлена абстракция)
9%
Да (без слоя абстракции)
10%
Пока нет, но готовим/готов слой абстракции
66%
Нет
День 1056. #ЗаметкиНаПолях
Удалите Эти Бесполезные Вызовы File.Exists
Часть можно встретить код, который использует
- Файл может быть удалён другим приложением (в том числе антивирусом).
- Может отключиться диск или сеть
- и т.п.
Кроме того, даже если файл существует, возможно, вы не сможете его открыть:
- Что там с разрешениями?
- Может файл только для чтения/скрытый?
- Что делать, если файл заблокирован (в общем доступе)?
- Что, если на диске есть ошибка?
Вместо того, чтобы проверять, существует ли файл/каталог перед выполнением действия, просто добавьте обработку ошибок:
Итого
Источник: https://www.meziantou.net/is-file-exist-path-useless.htm
Удалите Эти Бесполезные Вызовы File.Exists
Часть можно встретить код, который использует
File.Exists(path)
перед открытием/записью файла. Этот шаблон очень подозрительный и может привести к неожиданным ошибкам. Рассмотрим следующий код:if (File.Exists(path))Есть несколько причин отказаться от этого подхода. На самом деле, другие приложения, работающие на машине, могут изменить файл между проверкой и вызовом
{
// Это безопасно?
using var stream =
File.Open(path, FileMode.Open);
// …
}
File.Open
:- Файл может быть удалён другим приложением (в том числе антивирусом).
- Может отключиться диск или сеть
- и т.п.
Кроме того, даже если файл существует, возможно, вы не сможете его открыть:
- Что там с разрешениями?
- Может файл только для чтения/скрытый?
- Что делать, если файл заблокирован (в общем доступе)?
- Что, если на диске есть ошибка?
File.Exists
указывает, существует ли указанный файл на момент его проверки. Возвращённое значение устаревает, как только метод возвращается. Если метод возвращает true
, это не означает, что файл всё ещё будет существовать, когда вы попытаетесь его открыть.Вместо того, чтобы проверять, существует ли файл/каталог перед выполнением действия, просто добавьте обработку ошибок:
tryТо же касается проверки папок. Вместо:
{
using var stream = File.Open(path, FileMode.Open);
// …
}
catch (FileNotFoundException)
{
// …
}
catch (DirectoryNotFoundException)
{
// …
}
catch (UnauthorizedAccessException)
{
// …
}
catch (Exception)
{
// …
}
if (!Directory.Exists(path))Должно быть:
{
Directory.CreateDirectory(path);
}
Directory.CreateDirectory(path);Вместо:
if (Directory.Exists(path))Должно быть:
{
Directory.Delete(path);
}
tryЗаметьте, что это применимо к любому методу доступа к файловой системе: открытие/удаление файла или каталога, перечисление содержимого каталога и т.п.
{
Directory.Delete(path);
}
catch(DirectoryNotFoundException)
{
// ОК
}
catch(Exception ex)
{
// …
}
Итого
File.Exists
/Directory.Exists
следует использовать только в том случае, если вы хотите знать, существует ли файл/каталог на момент проверки. Например, чтобы избежать каких-либо действий, если файл уже существует. Когда метод возвращается, информация становится устаревшей. Действительно, файл мог быть создан/удалён сразу же другим приложением. Метод File.Exists
бесполезен, если вы хотите читать/записывать в этот файл. В этом случае просто выполните необходимую операцию и обработайте исключения. Даже если файл существует, вы можете получить исключения по многим другим причинам.Источник: https://www.meziantou.net/is-file-exist-path-useless.htm
👍1
День 1057. #Книги
Наконец осилил 600-страничную книгу «Внедрение зависимостей на платформе .NET» (Симан, ван Дерсен, 2-е издание. — СПб.: Питер, 2021).
Что? 600 страниц про внедрение зависимостей? Да! Более того, я смело ставлю её в ряд «мастрид» не только для .NET, но и для всех ООП разработчиков. Туда вот, рядом с Рихтером и «Совершенным кодом».
Вы купили одну книгу, а получили три: потрясающее введение в DI на .NET, отличный курс по основам ООП и уникальную книгу по дизайну ПО.
— Миккель Арентефт, Danske Bank
От многих опытных программистов можно услышать, что главная буква в SOLID – буква D. И эта книга в подробностях описывает, почему. Эта книга - в первую очередь отличное руководство по написанию лучшего программного обеспечения. Это достигается за счёт сосредоточения внимания на важности управления зависимостями, и поэтому она охватывает различные подходы к этому, в первую очередь DI.
Все мы знаем, что хорошо, когда код слабо связан, что объекты верхнего уровня не должны зависеть от объектов более низких уровней, а должны зависеть от абстракций, вот это всё. Однако 99% нашего опыта по внедрению зависимостей заключается в выделении интерфейса, внедрении его – в лучшем случае через конструктор - и регистрации зависимости в контейнере DI. Так вот, до контейнеров в книге дело доходит только в последней четверти книги.
В первых трёх четвертях на реальных практических примерах разбирается предназначение всех принципов SOLID и множества паттернов проектирования (декоратор, предохранитель, адаптер, компоновщик и т.д.). Их теоретические определения тоже приводятся (после подробного обоснования, зачем оно тут вообще надо), так что не переживайте. Также рассматриваются популярные антипаттерны, такие как «Диктатор», «Локатор сервисов», «Окружающий контекст» и «Ограниченная конструкция». Описываются проблемные подходы («запахи кода»), вроде избыточного внедрения через конструктор, зацикленных зависимостей и внедрения абстрактных фабрик. А, главное, почему они проблемные. Вводится понятие корня композиции (места, где собирается граф объектов, выполняющих всю работу в приложении, и где должны разрешаться все зависимости). Объясняется, в чём различия во времени жизни зависимостей. И многое, многое, многое другое.
И только после этого дело доходит до контейнеров DI, начиная с написания собственного примитивного контейнера, а потом рассказа о трёх популярных контейнерах: Autofac, Simple Injector и встроенном в .NET Core Microsoft.Extensions.DependencyInjection.
В общем, как написал выше, книга обязательна к прочтению всем.
Эта книга – настоящий шедевр. Удивительная и фундаментальная, она нужна каждому разработчику ПО, который хочет написать надёжный и правильный код.
— Эмануэле Ориджи, Funambol
Одно замечание. В книге очень много примеров про еду, поэтому не рекомендую читать её на пустой желудок.
Ну а поскольку в конце описывались DI контейнеры, и авторы горячо хейтили встроенный MS.DI, парочка опросов для вас ниже.
Наконец осилил 600-страничную книгу «Внедрение зависимостей на платформе .NET» (Симан, ван Дерсен, 2-е издание. — СПб.: Питер, 2021).
Что? 600 страниц про внедрение зависимостей? Да! Более того, я смело ставлю её в ряд «мастрид» не только для .NET, но и для всех ООП разработчиков. Туда вот, рядом с Рихтером и «Совершенным кодом».
Вы купили одну книгу, а получили три: потрясающее введение в DI на .NET, отличный курс по основам ООП и уникальную книгу по дизайну ПО.
— Миккель Арентефт, Danske Bank
От многих опытных программистов можно услышать, что главная буква в SOLID – буква D. И эта книга в подробностях описывает, почему. Эта книга - в первую очередь отличное руководство по написанию лучшего программного обеспечения. Это достигается за счёт сосредоточения внимания на важности управления зависимостями, и поэтому она охватывает различные подходы к этому, в первую очередь DI.
Все мы знаем, что хорошо, когда код слабо связан, что объекты верхнего уровня не должны зависеть от объектов более низких уровней, а должны зависеть от абстракций, вот это всё. Однако 99% нашего опыта по внедрению зависимостей заключается в выделении интерфейса, внедрении его – в лучшем случае через конструктор - и регистрации зависимости в контейнере DI. Так вот, до контейнеров в книге дело доходит только в последней четверти книги.
В первых трёх четвертях на реальных практических примерах разбирается предназначение всех принципов SOLID и множества паттернов проектирования (декоратор, предохранитель, адаптер, компоновщик и т.д.). Их теоретические определения тоже приводятся (после подробного обоснования, зачем оно тут вообще надо), так что не переживайте. Также рассматриваются популярные антипаттерны, такие как «Диктатор», «Локатор сервисов», «Окружающий контекст» и «Ограниченная конструкция». Описываются проблемные подходы («запахи кода»), вроде избыточного внедрения через конструктор, зацикленных зависимостей и внедрения абстрактных фабрик. А, главное, почему они проблемные. Вводится понятие корня композиции (места, где собирается граф объектов, выполняющих всю работу в приложении, и где должны разрешаться все зависимости). Объясняется, в чём различия во времени жизни зависимостей. И многое, многое, многое другое.
И только после этого дело доходит до контейнеров DI, начиная с написания собственного примитивного контейнера, а потом рассказа о трёх популярных контейнерах: Autofac, Simple Injector и встроенном в .NET Core Microsoft.Extensions.DependencyInjection.
В общем, как написал выше, книга обязательна к прочтению всем.
Эта книга – настоящий шедевр. Удивительная и фундаментальная, она нужна каждому разработчику ПО, который хочет написать надёжный и правильный код.
— Эмануэле Ориджи, Funambol
Одно замечание. В книге очень много примеров про еду, поэтому не рекомендую читать её на пустой желудок.
Ну а поскольку в конце описывались DI контейнеры, и авторы горячо хейтили встроенный MS.DI, парочка опросов для вас ниже.
👍5
Какими контейнерами DI вам приходилось пользоваться в своей практике?
Anonymous Poll
40%
Autofac
11%
Castle Windsor
1%
Lamar
2%
LightInject
78%
MS.DI (встроенный)
23%
Ninject
9%
SimpleInjector
2%
19%
Unity
6%
Другими
Какой контейнер DI вы считаете лучшим, с которым вам приходилось работать?
Anonymous Poll
16%
Autofac
2%
Castle Windsor
1%
Lamar
1%
LightInject
60%
MS.DI (встроенный)
5%
Ninject
3%
SimpleInjector
1%
4%
Unity
7%
Другой
День 1058. #ЗаметкиНаПолях #ExploringNET6
Исследуем .NET 6. Часть 4
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Часть 3
Рассматриваем код WebApplication
Сегодня мы немного рассмотрим код, лежащий в основе
В предыдущем посте мы остановились на том, на
1. Сохранить предоставленный хост в поле
2. Создать новый список
3. Создать новый экземпляр
4. Установить свойство
Конвейер промежуточного ПО в WebApplication
Одно из серьёзных отличий
Рассмотрим простой пример приложения:
1.
2.
3.
4.
5. Конвейер
-
Добавление конечной точки с помощью
-
-
Подробнее перевод статьи с примерами кода размещён на Хабре.
Источник: https://andrewlock.net/exploring-dotnet-6-part-4-building-a-middleware-pipeline-with-webapplication/
Исследуем .NET 6. Часть 4
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Часть 3
Рассматриваем код WebApplication
Сегодня мы немного рассмотрим код, лежащий в основе
WebApplication
, и сосредоточимся на настройке промежуточного ПО и конечных точек.В предыдущем посте мы остановились на том, на
WebApplicationBuilder
вызывался метод Build()
, который создавал WebApplication
, передавая в его конструктор построенный хост:_builtApplication = new WebApplication(_hostBuilder.Build());Класс WebApplication
…
return _builtApplication;
public sealed class WebApplication : IHost, IApplicationBuilder, IEndpointRouteBuilder, IAsyncDisposableПо сравнению с конструктором
{
}
WebApplicationBuilder
, конструктор WebApplication
относительно прост. Конструктор и инициализаторы полей выполняют 4 основные задачи:1. Сохранить предоставленный хост в поле
_host
. Это тот же тип хоста, что и при прямом использовании универсального хоста, как в ASP.NET Core 3.x/5.2. Создать новый список
EndpointDataSource
. Источники конечных точек используются для настройки конечных точек в приложении, включая Razor Pages, контроллеры, конечные точки API и новые «минимальные» API.3. Создать новый экземпляр
ApplicationBuilder
. Он используется для создания конвейера промежуточного ПО.4. Установить свойство
__GlobalEndpointRouteBuilder
в ApplicationBuilder
. Это свойство используется для «сообщения» другому промежуточному ПО, что мы используем новый WebApplication
, у которого немного другие значения по умолчанию.WebApplication
в основном делегирует реализацию IHost
, IApplicationBuilder
и IEndpointRouteBuilder
своим приватным свойствам и реализует эти интерфейсы явно.Конвейер промежуточного ПО в WebApplication
Одно из серьёзных отличий
WebApplication
от универсального хоста заключается в том, что WebApplication
по умолчанию устанавливает различное промежуточное ПО.Рассмотрим простой пример приложения:
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);Здесь создаётся следующее промежуточное ПО (см. рисунок ниже):
WebApplication app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.MapGet("/", () => "Hello World!");
app.Run();
1.
HostFilteringMiddleware
– добавляется благодаря скрытому вызову ConfigureWebHostDefaults()
, как и в универсальном хосте в предыдущих версиях.2.
ForwardedHeadersMiddleware
– добавляется там же, если для переменной среды ASPNETCORE_FORWARDEDHEADERS_ENABLED
задано значение true (не в нашем случае).3.
DeveloperExceptionPageMiddleware
– теперь добавляется автоматически, когда вы работаете в среде разработки (Development):app.UseDeveloperExceptionPage()
.4.
EndpointRoutingMiddleware
(также известное как RoutingMiddleware
) – теперь автоматически добавляется в конвейер промежуточного ПО до начала конвейера в Program.cs
, а EndpointMiddleware
автоматически добавляется в конвейер в конце.5. Конвейер
WebApplication.ApplicationBuilder
, содержащий всё промежуточное ПО, определённое в Program.cs
:-
HttpsRedirectionMiddleware
- StaticFilesMiddleware
6. EndpointMiddleware
– теперь автоматически добавляется в конвейер в конце.Добавление конечной точки с помощью
MapGet()
добавляет запись в коллекцию EndpointDataSource
объекта WebApplication
, что приводит к автоматическому добавлению промежуточного ПО конечных точек:-
EndpointRoutingMiddleware
выбирает конечную точку, -
EndpointMiddleware
исполняет конечную точку.EndpointMiddleware
обычно добавляется в конвейер в конце путем вызова UseEndpoints()
, но здесь оно добавляется автоматически.Подробнее перевод статьи с примерами кода размещён на Хабре.
Источник: https://andrewlock.net/exploring-dotnet-6-part-4-building-a-middleware-pipeline-with-webapplication/
День 1059. #Карьера
Станьте Сверхпродуктивным Разработчиком за Неделю
Впереди последняя неделя года. Самое время поработать в ударном темпе. Чем вы продуктивнее, тем лучше для всех, кто участвует в вашем проекте. Мы рассмотрим некоторые советы, которые помогут вам добиться успеха.
1. Определите свой самый слабый навык и сосредоточьтесь на его улучшении
Бороться со всеми слабостями сразу - не лучший способ. Вместо этого лучше сосредоточиться на одном навыке, прежде чем переходить к другому. Убедитесь, что это навык, который может существенно повлиять на вашу производительность.
- Выясните задачи, которые отнимают у вас много времени, и что вы обычно гуглите, прежде чем выполнить.
- Выпишите все технологии, которые кажутся вам трудными, и начните выделять небольшие промежутки времени для решения небольших задач.
- Начните с простых задач, чтобы лучше понять концепции, и продолжайте повышать уровень каждый день.
Так вы обретёте уверенность и сможете выполнять повседневные задачи намного быстрее.
2. Составьте список дел на неделю с конкретными задачами и целями
Лучше, если он будет доступен на какой-либо общедоступной платформе, например Trello или Evernote. Затем разбейте каждую задачу на подзадачи, над которыми вы сможете работать. Главное, чтобы список был кратким, чтобы ни одна из задач не казалась слишком сложной или пугающей.
Вычёркивайте задачи из списка, как только они выполнены. Это поможет набрать обороты и уверенность, облегчая выполнение большего количества задач за меньшее время.
3. Научитесь управлять временем
Расставьте задачи в порядке важности и работайте над ними по очереди. Если вы работаете над чем-то, что не является приоритетом, завершите дело быстро, чтобы вернуться к тому, что имеет значение. Постарайтесь установить конкретные цели на день или неделю, чтобы сохранять мотивацию и сосредоточенность.
- Выделяйте время на задачи в зависимости от их влияния на проект, команду и ваш прогресс. Это поможет быстрее завершить работу с высоким приоритетом.
- Периодически изменяйте тактику тайм-менеджмента. Экспериментирование со своим расписанием и стилем работы может улучшить ваши навыки управления временем. Почитайте статьи или пройдите курс по тайм-менеджменту.
4. Ставьте ежедневные цели
Если вы установите ежедневные цели, большая задача будет казаться более реалистичной и достижимой. Например, если задача – реализация новой функциональности в проекте, ежедневные цели вроде «закончить прототип» или «завершить черновик документации для текущего выпуска», помогут работать над большой задачей, не ощущая подавленности от её объёма.
- Планируйте свои ежедневные цели на следующий день. Это избавит от лишних хлопот по утрам, и вы сможете сразу приступить к работе.
- Регулярно делайте перерывы. Это поможет оставаться спокойным и свободным от стресса.
- Проверьте, какие задачи вы можете делегировать, и сконцентрируйтесь на важной работе, которая может принести максимальные результаты.
5. Сделайте работу интересной
- Сохраняйте мотивацию и энтузиазм, визуализируя успех и слушая веселую музыку во время работы.
- Попробуйте объединиться с коллегой, чтобы мотивировать друг друга.
- Поговорите с коллегами на интересные темы. Это снимает стресс и помогает работать с большим удовольствием и концентрацией.
- Отмечайте все маленькие победы вместе со своей командой. Это помогает сохранять оптимизм и сосредоточиться на работе.
6. Не забывайте отдыхать и восстанавливаться
Выделите время перерывов в течение дня, чтобы восстановиться перед тем, как вернуться к работе. Сходите на небольшую прогулку, поговорите с коллегой и выпейте кофе, чтобы быстрее зарядиться энергией. Если вы любите читать, прочтите пару страниц любимой книги. Отдых и восстановление энергии имеют решающее значение для повышения производительности, поэтому делайте регулярные перерывы для творческой или физической работы.
Итого
Разработка ПО может быть интересной и продуктивной; вы должны работать над этим. И помните, что всегда есть возможности для совершенствования, если вы хотите развивать свои навыки и знания.
Источник
Станьте Сверхпродуктивным Разработчиком за Неделю
Впереди последняя неделя года. Самое время поработать в ударном темпе. Чем вы продуктивнее, тем лучше для всех, кто участвует в вашем проекте. Мы рассмотрим некоторые советы, которые помогут вам добиться успеха.
1. Определите свой самый слабый навык и сосредоточьтесь на его улучшении
Бороться со всеми слабостями сразу - не лучший способ. Вместо этого лучше сосредоточиться на одном навыке, прежде чем переходить к другому. Убедитесь, что это навык, который может существенно повлиять на вашу производительность.
- Выясните задачи, которые отнимают у вас много времени, и что вы обычно гуглите, прежде чем выполнить.
- Выпишите все технологии, которые кажутся вам трудными, и начните выделять небольшие промежутки времени для решения небольших задач.
- Начните с простых задач, чтобы лучше понять концепции, и продолжайте повышать уровень каждый день.
Так вы обретёте уверенность и сможете выполнять повседневные задачи намного быстрее.
2. Составьте список дел на неделю с конкретными задачами и целями
Лучше, если он будет доступен на какой-либо общедоступной платформе, например Trello или Evernote. Затем разбейте каждую задачу на подзадачи, над которыми вы сможете работать. Главное, чтобы список был кратким, чтобы ни одна из задач не казалась слишком сложной или пугающей.
Вычёркивайте задачи из списка, как только они выполнены. Это поможет набрать обороты и уверенность, облегчая выполнение большего количества задач за меньшее время.
3. Научитесь управлять временем
Расставьте задачи в порядке важности и работайте над ними по очереди. Если вы работаете над чем-то, что не является приоритетом, завершите дело быстро, чтобы вернуться к тому, что имеет значение. Постарайтесь установить конкретные цели на день или неделю, чтобы сохранять мотивацию и сосредоточенность.
- Выделяйте время на задачи в зависимости от их влияния на проект, команду и ваш прогресс. Это поможет быстрее завершить работу с высоким приоритетом.
- Периодически изменяйте тактику тайм-менеджмента. Экспериментирование со своим расписанием и стилем работы может улучшить ваши навыки управления временем. Почитайте статьи или пройдите курс по тайм-менеджменту.
4. Ставьте ежедневные цели
Если вы установите ежедневные цели, большая задача будет казаться более реалистичной и достижимой. Например, если задача – реализация новой функциональности в проекте, ежедневные цели вроде «закончить прототип» или «завершить черновик документации для текущего выпуска», помогут работать над большой задачей, не ощущая подавленности от её объёма.
- Планируйте свои ежедневные цели на следующий день. Это избавит от лишних хлопот по утрам, и вы сможете сразу приступить к работе.
- Регулярно делайте перерывы. Это поможет оставаться спокойным и свободным от стресса.
- Проверьте, какие задачи вы можете делегировать, и сконцентрируйтесь на важной работе, которая может принести максимальные результаты.
5. Сделайте работу интересной
- Сохраняйте мотивацию и энтузиазм, визуализируя успех и слушая веселую музыку во время работы.
- Попробуйте объединиться с коллегой, чтобы мотивировать друг друга.
- Поговорите с коллегами на интересные темы. Это снимает стресс и помогает работать с большим удовольствием и концентрацией.
- Отмечайте все маленькие победы вместе со своей командой. Это помогает сохранять оптимизм и сосредоточиться на работе.
6. Не забывайте отдыхать и восстанавливаться
Выделите время перерывов в течение дня, чтобы восстановиться перед тем, как вернуться к работе. Сходите на небольшую прогулку, поговорите с коллегой и выпейте кофе, чтобы быстрее зарядиться энергией. Если вы любите читать, прочтите пару страниц любимой книги. Отдых и восстановление энергии имеют решающее значение для повышения производительности, поэтому делайте регулярные перерывы для творческой или физической работы.
Итого
Разработка ПО может быть интересной и продуктивной; вы должны работать над этим. И помните, что всегда есть возможности для совершенствования, если вы хотите развивать свои навыки и знания.
Источник
👍3