День 1200. #Testing
Тестирование в Реальной Жизни. Окончание
Коротко о различных нестандартных типах тестов и о том, что нужно иметь в виду при их использовании.
Начало
3. Выпуск в производство
На тестовой лаборатории всё не заканчивается. При развёртывании в рабочей среде нужно следовать некоторому регламенту. Обычно есть три подхода.
При первом подходе у вас есть ещё один парк хостов того же размера. Вы развёртываете резервный парк (что может занимать много времени) и атомарно заменяете старые рабочие хосты новыми рабочими хостами (с помощью балансировщика нагрузки или других подобных средств). Это хороший способ, потому что таким же образом можно откатиться на предыдущую версию. Однако это сопряжено с несколькими рисками: вам нужно платить за вдвое больший размер парка, вы можете получить ложные проблемы (например, неисправный хост, неисправный балансировщик нагрузки, неисправный коммутатор и т. д.), при откате также могут возникнуть проблемы (из-за изменения кэшей).
Второй подход основан на поэтапном развёртывании. Вы развертываете часть рабочих хостов и даёте им «прогреться» в течение некоторого времени. Если метрики остаются неизменными, вы предполагаете, что всё сработало правильно, поэтому вы можете развернуть ещё несколько хостов. Это хорошо, потому что вы не платите за гораздо больший парк, но усложняет откат (поскольку для отката требуется время, и процесс может завершиться ошибкой), может возникнуть риск повреждения производственных данных (если на только что развёрнутом хосте в приложении с отслеживанием состояния что-то сломалось). Кроме того, может потребоваться дублирование кэшей, поскольку половина вашего парка продуктов использует старые ключи кэша, а другая половина использует новые ключи.
Третий подход заключается в использовании A/B-тестов или любых переключателей. Вы просто реализуете условие if в своем коде, которым вы можете управлять с помощью некоторого переключателя после развертывания. Таким образом, сначала парк работает только с кодом A. Затем развёртывается приложение с кодом A и B и запускается только код A, потому что переключатель выключен. После развёртывания можно выборочно включить код B на нескольких хостах. Это хорошо, потому что можно контролировать, сколько клиентов получат новое поведение, и легко откатить его. Однако, помимо недостатков предыдущего решения, это также создаёт риск возникновения ошибки в условии if. Не говоря уже о том, что, если у вас несколько переключателей, может быть сложно отследить, что происходит.
4. Повторяющиеся тесты
Имейте в виду, что после развёртывания в рабочей среде всё равно следует повторить тесты бизнес-логики. Недостаточно предположить, что если что-то работало правильно в пре-продакшне, то и в продакшене всё будет хорошо. В рабочей среде используется другая сетевая инфраструктура, другие хосты, другие базы данных, поэтому нужно повторить тесты, чтобы быть уверенным, что всё работает правильно или же откатить изменения.
5. Тесты на проникновение
Аналогичный принцип применим и к тестам на проникновение. Их нужно запускать во всех средах. Производственная среда должна быть физически отделена от среды тестирования, поэтому необходимо убедиться, что конфигурация рабочей среды безопасна и надёжна.
Источник: https://blog.adamfurmanek.pl/2022/02/19/types-and-programming-languages-part-9/
Тестирование в Реальной Жизни. Окончание
Коротко о различных нестандартных типах тестов и о том, что нужно иметь в виду при их использовании.
Начало
3. Выпуск в производство
На тестовой лаборатории всё не заканчивается. При развёртывании в рабочей среде нужно следовать некоторому регламенту. Обычно есть три подхода.
При первом подходе у вас есть ещё один парк хостов того же размера. Вы развёртываете резервный парк (что может занимать много времени) и атомарно заменяете старые рабочие хосты новыми рабочими хостами (с помощью балансировщика нагрузки или других подобных средств). Это хороший способ, потому что таким же образом можно откатиться на предыдущую версию. Однако это сопряжено с несколькими рисками: вам нужно платить за вдвое больший размер парка, вы можете получить ложные проблемы (например, неисправный хост, неисправный балансировщик нагрузки, неисправный коммутатор и т. д.), при откате также могут возникнуть проблемы (из-за изменения кэшей).
Второй подход основан на поэтапном развёртывании. Вы развертываете часть рабочих хостов и даёте им «прогреться» в течение некоторого времени. Если метрики остаются неизменными, вы предполагаете, что всё сработало правильно, поэтому вы можете развернуть ещё несколько хостов. Это хорошо, потому что вы не платите за гораздо больший парк, но усложняет откат (поскольку для отката требуется время, и процесс может завершиться ошибкой), может возникнуть риск повреждения производственных данных (если на только что развёрнутом хосте в приложении с отслеживанием состояния что-то сломалось). Кроме того, может потребоваться дублирование кэшей, поскольку половина вашего парка продуктов использует старые ключи кэша, а другая половина использует новые ключи.
Третий подход заключается в использовании A/B-тестов или любых переключателей. Вы просто реализуете условие if в своем коде, которым вы можете управлять с помощью некоторого переключателя после развертывания. Таким образом, сначала парк работает только с кодом A. Затем развёртывается приложение с кодом A и B и запускается только код A, потому что переключатель выключен. После развёртывания можно выборочно включить код B на нескольких хостах. Это хорошо, потому что можно контролировать, сколько клиентов получат новое поведение, и легко откатить его. Однако, помимо недостатков предыдущего решения, это также создаёт риск возникновения ошибки в условии if. Не говоря уже о том, что, если у вас несколько переключателей, может быть сложно отследить, что происходит.
4. Повторяющиеся тесты
Имейте в виду, что после развёртывания в рабочей среде всё равно следует повторить тесты бизнес-логики. Недостаточно предположить, что если что-то работало правильно в пре-продакшне, то и в продакшене всё будет хорошо. В рабочей среде используется другая сетевая инфраструктура, другие хосты, другие базы данных, поэтому нужно повторить тесты, чтобы быть уверенным, что всё работает правильно или же откатить изменения.
5. Тесты на проникновение
Аналогичный принцип применим и к тестам на проникновение. Их нужно запускать во всех средах. Производственная среда должна быть физически отделена от среды тестирования, поэтому необходимо убедиться, что конфигурация рабочей среды безопасна и надёжна.
Источник: https://blog.adamfurmanek.pl/2022/02/19/types-and-programming-languages-part-9/
👍4
День 1201. #Курсы
Челлендж Microsoft Build Cloud Skills
Выполните задание и получите бесплатный пропуск на сертификационный экзамен Microsoft.
На выбор доступно 8 испытаний, выберите то, что подходит именно вам. После того, как вы выполните задание, вы получите бесплатный пропуск на сертификационный экзамен Microsoft, который может быть применён для любого из следующих экзаменов:
- AI-102: Designing and Implementing a Microsoft Azure AI Solution
- AZ-204: Developing Solutions for Microsoft Azure
- AZ-220: Microsoft Azure IoT Developer
- AZ-400: Designing and Implementing Microsoft DevOps Solutions
- DP-420: Designing and Implementing Cloud - Native Applications Using Microsoft Azure Cosmos DB
- MS-600: Building Applications and Solutions
- PL-100: Microsoft Power Platform App Maker
- PL-200: Microsoft Power Platform Functional Consultant
- PL-300: Microsoft Power of BI Data Analyst
- SC-200: Microsoft Security Operations Analyst
- SC-300: Microsoft Identity and Access Administrator
Челлендж начинается 24 мая 2022 г. в 16:00 UTC и заканчивается 21 июня 2022 г. в 16:00 UTC. Убедитесь, что все модули вашего задания завершены, прежде чем истечёт время.
Если вы выполните задание до истечения срока, в вашем профиле Microsoft Learn 30 июня 2022 г появится пропуск на один сертификационный экзамен Microsoft.
Правила
- Вы можете претендовать только на один пропуск на человека, независимо от количества выполненных испытаний.
- Пропуск может быть использован для сдачи одного сертификационного экзамена Microsoft, который проводится в авторизованном центре тестирования Pearson Vue или на сайте Pearson Vue до 31 декабря 2022 г.
Подпишитесь на рассылку, чтобы получить уведомление, когда начнётся челлендж: https://www.microsoft.com/en-us/cloudskillschallenge/build/registration/2022
Челлендж Microsoft Build Cloud Skills
Выполните задание и получите бесплатный пропуск на сертификационный экзамен Microsoft.
На выбор доступно 8 испытаний, выберите то, что подходит именно вам. После того, как вы выполните задание, вы получите бесплатный пропуск на сертификационный экзамен Microsoft, который может быть применён для любого из следующих экзаменов:
- AI-102: Designing and Implementing a Microsoft Azure AI Solution
- AZ-204: Developing Solutions for Microsoft Azure
- AZ-220: Microsoft Azure IoT Developer
- AZ-400: Designing and Implementing Microsoft DevOps Solutions
- DP-420: Designing and Implementing Cloud - Native Applications Using Microsoft Azure Cosmos DB
- MS-600: Building Applications and Solutions
- PL-100: Microsoft Power Platform App Maker
- PL-200: Microsoft Power Platform Functional Consultant
- PL-300: Microsoft Power of BI Data Analyst
- SC-200: Microsoft Security Operations Analyst
- SC-300: Microsoft Identity and Access Administrator
Челлендж начинается 24 мая 2022 г. в 16:00 UTC и заканчивается 21 июня 2022 г. в 16:00 UTC. Убедитесь, что все модули вашего задания завершены, прежде чем истечёт время.
Если вы выполните задание до истечения срока, в вашем профиле Microsoft Learn 30 июня 2022 г появится пропуск на один сертификационный экзамен Microsoft.
Правила
- Вы можете претендовать только на один пропуск на человека, независимо от количества выполненных испытаний.
- Пропуск может быть использован для сдачи одного сертификационного экзамена Microsoft, который проводится в авторизованном центре тестирования Pearson Vue или на сайте Pearson Vue до 31 декабря 2022 г.
Подпишитесь на рассылку, чтобы получить уведомление, когда начнётся челлендж: https://www.microsoft.com/en-us/cloudskillschallenge/build/registration/2022
👍3
День 1202. #ЗаметкиНаПолях
Список Всех Маршрутов в ASP.NET Core
Когда ваше приложение ASP.NET Core станет достаточно большим, вам может понадобиться полное представление обо всех маршрутах. Существует несколько способов объявления маршрутов. Вы можете использовать минимальные API, контроллеры, Razor Pages, gRPC, HealthCheck и т. д. Но все они используют одну и ту же систему маршрутизации под капотом.
Коллекция маршрутов может быть указана путем извлечения коллекции
Пример для минимальных API:
Список Всех Маршрутов в ASP.NET Core
Когда ваше приложение ASP.NET Core станет достаточно большим, вам может понадобиться полное представление обо всех маршрутах. Существует несколько способов объявления маршрутов. Вы можете использовать минимальные API, контроллеры, Razor Pages, gRPC, HealthCheck и т. д. Но все они используют одну и ту же систему маршрутизации под капотом.
Коллекция маршрутов может быть указана путем извлечения коллекции
EndpointDataSource
из DI.Пример для минимальных API:
if (app.Environment.IsDevelopment())Добавление этого блока в пример приложения из документации выведет следующие маршруты:
{
app.MapGet("/debug/routes",
(IEnumerable<EndpointDataSource> sources) =>
string.Join("\n", sources.SelectMany(s => s.Endpoints)));
}
HTTP: GET /Если используются полноценные контроллеры,
HTTP: GET /todoitems
HTTP: GET /todoitems/complete
HTTP: GET /todoitems/{id}
HTTP: POST /todoitems
HTTP: PUT /todoitems/{id}
HTTP: DELETE /todoitems/{id}
HTTP: GET /debug/routes
EndpointDataSource
можно получить из сервисов. Также можно использовать различные свойства полученных маршрутов, чтобы вывести нужную информацию:public string Get([FromServices]Источник: https://www.meziantou.net/list-all-routes-in-an-asp-net-core-application.htm
IEnumerable<EndpointDataSource> sources)
{
var sb = new StringBuilder();
var endpoints =
sources.SelectMany(s => s.Endpoints);
foreach (var e in endpoints)
{
sb.AppendLine(e.DisplayName);
if (e is RouteEndpoint re)
sb.AppendLine(re.RoutePattern.RawText);
}
return sb.ToString();
}
👍22
День 1203. #ЧтоНовенького
Превью 4 Обновлений ASP.NET Core в .NET 7. Продолжение
Продолжаем рассматривать обновления ASP.NET Core в превью 4 .NET 7.
Начало
3. Возврат нескольких типов результатов из минимальных API
Новые обобщённые объединяющие типы
Объединяющие типы
4. Промежуточное ПО для ограничений
Предоставляет удобный способ задания ограничений для входящих HTTP-запросов. Например,
В этом примере используется
На данный момент
Подробнее про возможности ограничителя рассказывает Ник Чапсас в своём недавнем видео.
Реализация ограничений в превью 4 .NET 7 пока минимальна и не поддерживает раздельные конечные точки. В будущем планируется это реализовать, а также добавить дополнительные параметры конфигурации. Пока можно использовать
Источник: https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-4/
Превью 4 Обновлений ASP.NET Core в .NET 7. Продолжение
Продолжаем рассматривать обновления ASP.NET Core в превью 4 .NET 7.
Начало
3. Возврат нескольких типов результатов из минимальных API
Новые обобщённые объединяющие типы
Results<TResult1, TResult2, TResultN>
вместе с классом TypesResults
можно использовать для объявления того, что обработчик маршрута возвращает несколько конкретных типов, реализующих IResult
. Любые из этих типов, реализующие IEndpointMetadataProvider
, добавят метаданные для конечной точки, позволяя платформе автоматически добавлять описания типов HTTP-результатов для API в OpenAPI/Swagger:app.MapGet("/todos/{id}",В этом случае в описании OpenAPI/Swagger этот метод будет иметь 2 типа типов HTTP-результата:
async Results<Ok<Todo>, NotFound> (int id, TodoDb db)
{
return await db.Todos.FindAsync(id) is Todo todo
? TypedResults.Ok(todo)
: TypedResults.NotFound();
});
HTTP 200 OK
и HTTP 404 NotFound
.Объединяющие типы
Results<TResult1, TResultN>
реализуют операторы неявного приведения, чтобы компилятор мог автоматически преобразовывать типы, указанные в обобщённых аргументах, в экземпляр объединяющего типа. Это даёт дополнительное преимущество. Во время компиляции проверяется, что обработчик маршрута на самом деле возвращает только те результаты, которые он декларирует. Попытка вернуть тип, который не объявлен как один из обобщённых аргументов в Results<>
, приведет к ошибке компиляции.4. Промежуточное ПО для ограничений
Предоставляет удобный способ задания ограничений для входящих HTTP-запросов. Например,
ConcurrencyLimiter
позволяет ограничить количество одновременных входящих запросов:app.UseRateLimiter(new RateLimiterOptionsСтрока, переданная в качестве первого аргумента
{
Limiter = PartitionedRateLimiter
.Create<HttpContext, string>(resource =>
{
return RateLimitPartition
.CreateConcurrencyLimiter("MyLimiter",
_ => new ConcurrencyLimiterOptions(
2, QueueProcessingOrder.NewestFirst, 3));
})
});
CreateConcurrencyLimiter
, - это ключ, чтобы различать разные ограничители в PartitionedRateLimiter
.В этом примере используется
ConcurrencyLimiter
с ограничением в 2 одновременных доступа, параметром, указывающим, что запросы должны обрабатываться по очереди по мере поступления и параметром, задающим размер очереди в 3 запроса.На данный момент
RateLimitPartition
содержит методы для создания ConcurrencyLimiter
, TokenBucketRateLimiter
и NoopLimiter
, которые используются аналогично примеру выше.Подробнее про возможности ограничителя рассказывает Ник Чапсас в своём недавнем видео.
Реализация ограничений в превью 4 .NET 7 пока минимальна и не поддерживает раздельные конечные точки. В будущем планируется это реализовать, а также добавить дополнительные параметры конфигурации. Пока можно использовать
System.Threading.RateLimiting
для создания PartitionedRateLimiter
, который может применять различные ограничения к различным конечным точкам.Источник: https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-4/
👍4
День 1204.
В очередной раз неведомые алгоритмы ютуба подкинули мне интересное видео.
Sergei Calabonga рассказывает о собственном фреймворке Nimble Framework, предназначенном для быстрого создания микросервисов.
https://youtu.be/xijBGwMEL8E
Фреймворк предоставляет готовые шаблоны проектов для микросервисов с авторизацией через OpenIddict (бесплатной альтернативой IdentityServer). Кстати, IdentityServer также можно использовать, изменив настройки. Подойдёт тем, кому часто приходится создавать микросервисы с авторизацией и постоянно прописывать одни и те же настройки.
Недавно Сергей выпустил версию 6.1 фреймворка, о которой и рассказывает в этом видео.
Видео на русском языке, однако хочу заметить, что требуется определённый уровень знаний в разработке API, работе с ролями, клеймами, токенами и т.п. Автор не разжёвывает эти темы довольно резво прыгает по понятиям, рассказывая больше о фреймворке, чем о собственно коде. Если что вот здесь есть целый плейлист на тему авторизации.
В очередной раз неведомые алгоритмы ютуба подкинули мне интересное видео.
Sergei Calabonga рассказывает о собственном фреймворке Nimble Framework, предназначенном для быстрого создания микросервисов.
https://youtu.be/xijBGwMEL8E
Фреймворк предоставляет готовые шаблоны проектов для микросервисов с авторизацией через OpenIddict (бесплатной альтернативой IdentityServer). Кстати, IdentityServer также можно использовать, изменив настройки. Подойдёт тем, кому часто приходится создавать микросервисы с авторизацией и постоянно прописывать одни и те же настройки.
Недавно Сергей выпустил версию 6.1 фреймворка, о которой и рассказывает в этом видео.
Видео на русском языке, однако хочу заметить, что требуется определённый уровень знаний в разработке API, работе с ролями, клеймами, токенами и т.п. Автор не разжёвывает эти темы довольно резво прыгает по понятиям, рассказывая больше о фреймворке, чем о собственно коде. Если что вот здесь есть целый плейлист на тему авторизации.
YouTube
Nimble Framework v6.1
На платформе NET6 (В папке AspNetCore v6.1) можно найти новую версию Nimble Framework, который предназначен для быстрого создания микросервисной архитектуры. Nimble Framework содержит IdentityModule (AuthServer) и Module (microservice).
Новое в версии
Удален…
Новое в версии
Удален…
👍8
День 1205. #ЗаметкиНаПолях
Профессиональное Документирование Кода
Все мы (надеюсь) документируем свои классы и методы с помощью XML комментариев
1. Секция <remarks>
Добавит новый абзац текста после текста описания в summary, в котором можно указать дополнительную информацию. Кстати, можно добавить только один блок
2. Секция <exception>
Позволяет описать исключения, которые может выбросить метод:
3. Тег <inheritdoc/>
Позволяет унаследовать описание из другого элемента (класса, интерфейса или метода).
-
-
-
4. Тег <paramref/>
Позволяет в описании сослаться на параметр метода, выделив его в тексте:
5. Тег <see/>
Позволяет добавить ссылку на другой объект или внешний источник в тексте.
-
-
-
6. Тег <seealso/>
Аналогично тегу
7. Тег <include/>
Позволяет ссылаться на комментарии в отдельном файле, описывающие типы и элементы в исходном коде:
Источник: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags
Профессиональное Документирование Кода
Все мы (надеюсь) документируем свои классы и методы с помощью XML комментариев
<summary>
, которые можно добавить с помощью тройного слеша (///
) над заголовком метода/класса. Однако далеко не все используют все возможности этой документации, редко выходя за описание собственно элемента, параметров в <param>
и возврата в <returns>
. Вот некоторые полезные теги, позволяющие сделать подсказки более информативными.1. Секция <remarks>
Добавит новый абзац текста после текста описания в summary, в котором можно указать дополнительную информацию. Кстати, можно добавить только один блок
<remarks>
, остальные просто игнорируются. Однако можно разделить текст внутри <remarks>
на параграфы с помощью тега <para>
.2. Секция <exception>
Позволяет описать исключения, которые может выбросить метод:
<exception cref="класс">описание</exception>Класс исключения должен быть доступен из текущего кода при компиляции.
3. Тег <inheritdoc/>
Позволяет унаследовать описание из другого элемента (класса, интерфейса или метода).
-
<inheritdoc/>
для класса наследует все описания всех членов.-
<inheritdoc cref="сигнатура"/>
- позволяет указать, из какого члена унаследовать описание. Существующие теги на текущем члене не будут перезаписаны.-
<inheritdoc [cref=""] path="путь"/>
- позволяет указать путь XPath к тегам, которые нужно унаследовать. Таким образом можно отфильтровывать ненужные или только нужные теги.4. Тег <paramref/>
Позволяет в описании сослаться на параметр метода, выделив его в тексте:
<paramref name="параметр"/>
.5. Тег <see/>
Позволяет добавить ссылку на другой объект или внешний источник в тексте.
-
<see cref="сигнатура"/>
- ссылка на член или поле, доступное для вызова из текущей среды компиляции.-
<see href="ссылка" />
- кликабельная ссылка на указанный URL. Например, <see href="https://github.com">GitHub</see>
создаёт кликабельную ссылку с текстом GitHub, которая ссылается на https://github.com.-
<see langword="слово" />
- ключевое слово языка, например true или одно из других допустимых ключевых слов. Кроме того, правильно отображает ключевое слово в подсказке (например, true в C# и True в VB).6. Тег <seealso/>
Аналогично тегу
<see/>
позволяет добавлять кликабельные ссылки на другой объект или внешний источник в секции «См. также». Нельзя использовать внутри <summary>
.7. Тег <include/>
Позволяет ссылаться на комментарии в отдельном файле, описывающие типы и элементы в исходном коде:
<include file='путь к файлу' path='путь к элементу' />Использование внешнего файла является альтернативой размещению документации непосредственно в файле исходного кода. Это позволяет применять систему управления версиями к документации отдельно от исходного кода. Один человек может менять файл исходного кода, а другой — файл документации.
Источник: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags
👍26
День 1206. #ЗаметкиНаПолях
Упрощаем Работу с Данными
Если вы работаете с двоичными данными и используете
Замечание: Чтобы работать с классом
Допустим, у нас есть следующий объект:
Упрощаем Работу с Данными
Если вы работаете с двоичными данными и используете
byte[]
, можно упростить себе жизнь, используя класс BinaryData
, который представляет собой облегчённую абстракцию для работы с двоичными данными, поддерживающую преобразование между строкой, потоком, JSON и байтами.Замечание: Чтобы работать с классом
BinaryData
, нужно установить NuGet пакет System.Memory.Data.Допустим, у нас есть следующий объект:
record Person(string FirstName, string LastName);Преобразуем в JSON-строку:
var person = new Person("John", "Smith");
var personData = new BinaryData(person);Преобразуем JSON в объект:
Console.WriteLine(personData.ToString());
// Вывод:
// {"FirstName":"John","LastName":"Smith"}
var person2 = personData.ToObjectFromJson<Person>();Теперь рассмотрим работу со строками и двоичными данными:
Console.WriteLine(person2.ToString());
// Вывод (стандартный ToString для типа record):
// Person { FirstName = John, LastName = Smith }
var stringData = new BinaryData("Hello World!");Преобразуем строку в массив байт:
byte[] bytes = stringData.ToArray();Преобразуем массив байт в поток:
var bytesData = new BinaryData(bytes);
Stream stream = bytesData.ToStream();Читаем из потока:
var streamData = BinaryData.FromStream(stream);Источник: https://twitter.com/MarusykRoman/status/1521256457630535680
Console.WriteLine(streamData.ToString());
// Вывод:
// Hello World!
👍18
День 1207. #Карьера
Как Выработать Привычки и Сохранять Мотивацию. Начало
Вам бывало сложно работать над проектом? Бывали моменты, когда ничто не кажется захватывающим? В этом посте обсудим, что делать, когда у вас нет мотивации, и как справиться с прокрастинацией.
Мотивация проявляется по-разному. То как тяга что-то создавать, то как желание заняться спортом, то как просто рвение работать изо всех сил.
Признавайте и цените каждый вид мотивации. Пусть она охватит вас и приносит вам новые впечатления, радость и удовлетворение. Позвольте себе чувствовать себя мотивированным, потому что мотивация из одной формы перетекает в другую.
Когда ничего не мотивирует, займитесь любимым хобби. Используйте это время для снятия стресса. Не волнуйтесь о качестве того, что вы делаете, главное то, как вы себя чувствуете в данный момент. Даже если не чувствуете мотивации писать код, пусть будет мотивация рисовать или вырезать из дерева — это нормально! Попробуйте перенести это ощущение на следующий день.
Важно помнить, что мотивация мимолётна. Всплеск вдохновения обычно длится 1-3 недели. Полагаясь только на мотивацию для осуществления своих мечтаний и целей, вы долго не протянете. Здесь нужна дисциплина и система привычек. Система привычек поддерживает вас изо дня в день и становится частью вашей повседневной жизни, даже когда мотивация иссякает.
Что такое система привычек и как её создать?
Это тщательно продуманный ежедневный набор привычек, которые приближают вас к цели. Что вам нужно сделать, как долго вам нужно это делать, какую атмосферу вы хотите создать, прежде чем делать то, что вам нужно сделать, и как вы приведёте себя в правильный ментальный настрой.
Как разработчик, подумайте, какие цели вы перед собой поставили? Например:
- На этой неделе: создать функционал для проекта.
- В этом месяце: изучить Blazor.
- В этом квартале: релиз проекта.
- В этом году: овладеть MAUI, выступить на конференции и писать в блог по одному посту каждый месяц.
Теперь подумайте, как разбить эти цели на задачи и к какому сроку вы надеетесь их выполнить. Двигаясь назад от этого дедлайна, посмотрите, какие задачи вы можете выполнить в краткосрочной перспективе для достижения этой цели.
Например:
Цель: создать функционал для проекта.
Срок: 1 неделя с сегодняшнего дня.
Шаги:
1. Исследовать, что необходимо: зависимости, активы, вовлечённые люди.
2. Разбить создание функционала на этапы.
3. Какие есть нерешённые вопросы?
4. Кто может помочь?
График:
День 1: Исследования
Дни 2-3: Разработка + тестирование
День 4: Сквозное тестирование + исправление ошибок.
День 5: Развёртывание в тестовой среде и подготовка к презентации.
Следующий шаг — «выделить» время для выполнения этих шагов в своём календаре. Посмотрите в свой календарь и выделите «периоды концентрации». Это время, когда вы будете выполнять эти задачи.
Далее создайте систему «настройки вашего ментального состояния». Изучите, что вам помогает концентрироваться на выполнении работы и делайте это перед необходимым «периодом концентрации».
Окончание следует…
Источник: https://www.freecodecamp.org/news/create-a-habit-system-and-stay-motivated-as-a-developer/
Автор оригинала: Shruti Kapoor
Как Выработать Привычки и Сохранять Мотивацию. Начало
Вам бывало сложно работать над проектом? Бывали моменты, когда ничто не кажется захватывающим? В этом посте обсудим, что делать, когда у вас нет мотивации, и как справиться с прокрастинацией.
Мотивация проявляется по-разному. То как тяга что-то создавать, то как желание заняться спортом, то как просто рвение работать изо всех сил.
Признавайте и цените каждый вид мотивации. Пусть она охватит вас и приносит вам новые впечатления, радость и удовлетворение. Позвольте себе чувствовать себя мотивированным, потому что мотивация из одной формы перетекает в другую.
Когда ничего не мотивирует, займитесь любимым хобби. Используйте это время для снятия стресса. Не волнуйтесь о качестве того, что вы делаете, главное то, как вы себя чувствуете в данный момент. Даже если не чувствуете мотивации писать код, пусть будет мотивация рисовать или вырезать из дерева — это нормально! Попробуйте перенести это ощущение на следующий день.
Важно помнить, что мотивация мимолётна. Всплеск вдохновения обычно длится 1-3 недели. Полагаясь только на мотивацию для осуществления своих мечтаний и целей, вы долго не протянете. Здесь нужна дисциплина и система привычек. Система привычек поддерживает вас изо дня в день и становится частью вашей повседневной жизни, даже когда мотивация иссякает.
Что такое система привычек и как её создать?
Это тщательно продуманный ежедневный набор привычек, которые приближают вас к цели. Что вам нужно сделать, как долго вам нужно это делать, какую атмосферу вы хотите создать, прежде чем делать то, что вам нужно сделать, и как вы приведёте себя в правильный ментальный настрой.
Как разработчик, подумайте, какие цели вы перед собой поставили? Например:
- На этой неделе: создать функционал для проекта.
- В этом месяце: изучить Blazor.
- В этом квартале: релиз проекта.
- В этом году: овладеть MAUI, выступить на конференции и писать в блог по одному посту каждый месяц.
Теперь подумайте, как разбить эти цели на задачи и к какому сроку вы надеетесь их выполнить. Двигаясь назад от этого дедлайна, посмотрите, какие задачи вы можете выполнить в краткосрочной перспективе для достижения этой цели.
Например:
Цель: создать функционал для проекта.
Срок: 1 неделя с сегодняшнего дня.
Шаги:
1. Исследовать, что необходимо: зависимости, активы, вовлечённые люди.
2. Разбить создание функционала на этапы.
3. Какие есть нерешённые вопросы?
4. Кто может помочь?
График:
День 1: Исследования
Дни 2-3: Разработка + тестирование
День 4: Сквозное тестирование + исправление ошибок.
День 5: Развёртывание в тестовой среде и подготовка к презентации.
Следующий шаг — «выделить» время для выполнения этих шагов в своём календаре. Посмотрите в свой календарь и выделите «периоды концентрации». Это время, когда вы будете выполнять эти задачи.
Далее создайте систему «настройки вашего ментального состояния». Изучите, что вам помогает концентрироваться на выполнении работы и делайте это перед необходимым «периодом концентрации».
Окончание следует…
Источник: https://www.freecodecamp.org/news/create-a-habit-system-and-stay-motivated-as-a-developer/
Автор оригинала: Shruti Kapoor
👍7
День 1208. #Карьера
Как Выработать Привычки и Сохранять Мотивацию. Продолжение
Начало
Как найти идеи
Часто я не чувствую вдохновения что-либо делать, потому что мне нечем заняться. У меня может быть много незавершённых дел, но я не задумывалась ни об одном из них, и потому они не кажутся интересными. Поэтому я просматриваю список дел и смотрю, не вдохновит ли меня что-то преодолеть прокрастинацию. Если нет, заглядываю в блоги по программированию в поисках интересных статей, которые вдохновят на работу. Если нет, ищу интересные треды в твиттере, курсы или обучающие видео на YouTube. Если ничего из этого не работает, это сигнал о том, что нужно расслабиться и уделить время себе. Сделать «творческую» паузу: погулять и послушать подкаст. Если во время перерыва что-то вдохновит на творчество, я запишу это.
Как строить график работы
Как только я выбираю дело, которое меня больше всего вдохновляет, я ставлю себе мягкий срок – часто две недели. Затем, двигаясь в обратную сторону от этого дедлайна, я отмечаю время в своём календаре для работы над ним. Я обычно расставляю в календаре интервалы в 1 час, если график плотный, и больше, если у меня есть больше времени. Как только график уложится в календаре, в выделенные часы я заставляю себя сесть и усердно потрудиться.
Как создать настроение
Создайте рабочую атмосферу, которая лучше подойдёт для вас. Здесь важно всё: звуки, запахи, вид.
Звук: звуки офиса, природы, фоновая музыка для работы или любимый плейлист.
Запах: согласитесь, запах еды не очень мотивирует к работе (хотя, кому как, наверное). Поэтому откройте окно, установите ароматизатор воздуха с любимым запахом и т.п. Найдите, что работает в вашем случае.
Вид: я чувствую мотивацию, когда кто-то ещё работает рядом или когда я на природе. Поэтому мой рабочий стол обращён к окну, из которого видны деревья, слышно шелест листьев и щебетание птиц. Либо на YouTube есть видео, где парень тоже работает, что вдохновляет меня на работу. Как вариант, можно пойти в кафе или парк.
Как избавиться от отвлекающих факторов
Это очень важно, потому что у меня концентрация золотой рыбки. Если есть шанс, я с удовольствием отвлекаюсь на твиттер, мессенджер или инстаграм. Поэтому, когда нужно сконцентрироваться, я отключаю звук на телефоне, закрываю почтовые приложения и все соцсети. Говорю себе, что следующие 45 минут я не буду смотреть в телефон, отвечать на emailы, заглядывать в твиттер и т.п.
Как добиться успеха
Если хотите, используйте «помидорный график». Когда всё готово, ставим таймер и начинаем печатать. Печатаем всё, что приходит в голову. Главное не красота контента или кода с первой попытки. Главное для начала – сдвинуть с мёртвой точки, привести всё в движение, заставить ваш разум выплеснуть идеи на страницу (на экран).
Не забывайте делать перерывы
Как только время таймера истекает, время сделать перерыв. Я заставляю себя встать, прогуляться, выйти на улицу, заварить новую чашку чая, выполнить поручение — что угодно, лишь бы это не было бездумным листанием твиттера или инстаграма. Это время, чтобы дать себе перерыв. Иногда, ближе к концу перерыва, можно проверить сообщения. Если вы никому не нужны :(, можно возвращаться к работе.
Итого
Чтобы сохранять мотивацию от сессии к сессии, важно знать, чего вы добились, на чём застряли и что нужно делать дальше. Для этого делайте заметки в конце сессий, как правило, пересматривая составленный ранее план: что сделано, какие есть открытые вопросы, что нужно сделать в следующей сессии, к кому можно обратиться за помощью.
И так цикл повторяется.
Источник: https://www.freecodecamp.org/news/create-a-habit-system-and-stay-motivated-as-a-developer/
Автор оригинала: Shruti Kapoor
Как Выработать Привычки и Сохранять Мотивацию. Продолжение
Начало
Как найти идеи
Часто я не чувствую вдохновения что-либо делать, потому что мне нечем заняться. У меня может быть много незавершённых дел, но я не задумывалась ни об одном из них, и потому они не кажутся интересными. Поэтому я просматриваю список дел и смотрю, не вдохновит ли меня что-то преодолеть прокрастинацию. Если нет, заглядываю в блоги по программированию в поисках интересных статей, которые вдохновят на работу. Если нет, ищу интересные треды в твиттере, курсы или обучающие видео на YouTube. Если ничего из этого не работает, это сигнал о том, что нужно расслабиться и уделить время себе. Сделать «творческую» паузу: погулять и послушать подкаст. Если во время перерыва что-то вдохновит на творчество, я запишу это.
Как строить график работы
Как только я выбираю дело, которое меня больше всего вдохновляет, я ставлю себе мягкий срок – часто две недели. Затем, двигаясь в обратную сторону от этого дедлайна, я отмечаю время в своём календаре для работы над ним. Я обычно расставляю в календаре интервалы в 1 час, если график плотный, и больше, если у меня есть больше времени. Как только график уложится в календаре, в выделенные часы я заставляю себя сесть и усердно потрудиться.
Как создать настроение
Создайте рабочую атмосферу, которая лучше подойдёт для вас. Здесь важно всё: звуки, запахи, вид.
Звук: звуки офиса, природы, фоновая музыка для работы или любимый плейлист.
Запах: согласитесь, запах еды не очень мотивирует к работе (хотя, кому как, наверное). Поэтому откройте окно, установите ароматизатор воздуха с любимым запахом и т.п. Найдите, что работает в вашем случае.
Вид: я чувствую мотивацию, когда кто-то ещё работает рядом или когда я на природе. Поэтому мой рабочий стол обращён к окну, из которого видны деревья, слышно шелест листьев и щебетание птиц. Либо на YouTube есть видео, где парень тоже работает, что вдохновляет меня на работу. Как вариант, можно пойти в кафе или парк.
Как избавиться от отвлекающих факторов
Это очень важно, потому что у меня концентрация золотой рыбки. Если есть шанс, я с удовольствием отвлекаюсь на твиттер, мессенджер или инстаграм. Поэтому, когда нужно сконцентрироваться, я отключаю звук на телефоне, закрываю почтовые приложения и все соцсети. Говорю себе, что следующие 45 минут я не буду смотреть в телефон, отвечать на emailы, заглядывать в твиттер и т.п.
Как добиться успеха
Если хотите, используйте «помидорный график». Когда всё готово, ставим таймер и начинаем печатать. Печатаем всё, что приходит в голову. Главное не красота контента или кода с первой попытки. Главное для начала – сдвинуть с мёртвой точки, привести всё в движение, заставить ваш разум выплеснуть идеи на страницу (на экран).
Не забывайте делать перерывы
Как только время таймера истекает, время сделать перерыв. Я заставляю себя встать, прогуляться, выйти на улицу, заварить новую чашку чая, выполнить поручение — что угодно, лишь бы это не было бездумным листанием твиттера или инстаграма. Это время, чтобы дать себе перерыв. Иногда, ближе к концу перерыва, можно проверить сообщения. Если вы никому не нужны :(, можно возвращаться к работе.
Итого
Чтобы сохранять мотивацию от сессии к сессии, важно знать, чего вы добились, на чём застряли и что нужно делать дальше. Для этого делайте заметки в конце сессий, как правило, пересматривая составленный ранее план: что сделано, какие есть открытые вопросы, что нужно сделать в следующей сессии, к кому можно обратиться за помощью.
И так цикл повторяется.
Источник: https://www.freecodecamp.org/news/create-a-habit-system-and-stay-motivated-as-a-developer/
Автор оригинала: Shruti Kapoor
👍8
День 1209. #ЗаметкиНаПолях
Полиморфизм в C#: Override и New
В чём разница между созданием виртуального/переопределяемого метода и простым сокрытием метода с помощью ключевого слова new в C#?
Во-первых, в отличие от переопределения, при использовании ключевого слова new вы можете изменить тип возвращаемого значения. Однако, это ещё не всё.
Допустим, у нас есть родительский класс и два потомка. Один потомок использует
Когда вы используете ключевое слово new, вы говорите, что эти два метода никак не связаны между собой. И что ваш новый метод существует только в дочернем классе, но не в родительском. Между ними нет «связи». Поэтому при приведении к родительскому классу переопределённый метод известен, а «новый» метод — нет.
Ключевое слово new полезно в некоторых исключительных случаях, например, для переопределения (скрытия) методов сторонних библиотек. Однако, в своей иерархии наследования его использовать не стоит. Мало того, что для этого очень мало причин, так ещё и нарушается принцип подстановки Лисков.
Источник: https://dotnetcoretutorials.com/2022/05/13/override-vs-new-polymorphism-in-c-net/
Полиморфизм в C#: Override и New
В чём разница между созданием виртуального/переопределяемого метода и простым сокрытием метода с помощью ключевого слова new в C#?
Во-первых, в отличие от переопределения, при использовании ключевого слова new вы можете изменить тип возвращаемого значения. Однако, это ещё не всё.
Допустим, у нас есть родительский класс и два потомка. Один потомок использует
override
, другой – new
:class ParentТогда что выведет следующий код?
{
public virtual void WhoAmI() =>
Console.WriteLine("Parent");
}
class Child : Parent
{
public override void WhoAmI() =>
Console.WriteLine("Child");
}
class ChildNew : Parent
{
public new void WhoAmI() =>
Console.WriteLine("ChildNew");
}
Parent child = new Child();На первый взгляд кажется, что в обоих случаях случае он выведет одно и то же. В конце концов, в обоих случаях производный тип приводится к родительскому. При таком кастинге важно учитывать, что объект «всегда помнит, кто он». То есть
child.WhoAmI();
Parent childNew = new ChildNew();
childNew.WhoAmI();
Child
можно привести к Parent или даже к object
, и он всё равно помнит, что он Child
. Так что же выведет код выше?ChildИтак,
Parent
Child
с переопределённым методом запомнил, кто он есть, и, следовательно, был вызван тот же метод WhoAmI()
, но переопределённый. В случае с ChildNew
… это не совсем так. На самом деле, если подумать, объяснение довольно простое. Когда вы используете ключевое слово override
, оно переопределяет базовый класс, и между двумя методами существует своего рода «связь». То есть известно, что дочерний член является переопределением базового.Когда вы используете ключевое слово new, вы говорите, что эти два метода никак не связаны между собой. И что ваш новый метод существует только в дочернем классе, но не в родительском. Между ними нет «связи». Поэтому при приведении к родительскому классу переопределённый метод известен, а «новый» метод — нет.
Ключевое слово new полезно в некоторых исключительных случаях, например, для переопределения (скрытия) методов сторонних библиотек. Однако, в своей иерархии наследования его использовать не стоит. Мало того, что для этого очень мало причин, так ещё и нарушается принцип подстановки Лисков.
Источник: https://dotnetcoretutorials.com/2022/05/13/override-vs-new-polymorphism-in-c-net/
👍16
День 1210. #ЧтоНовенького
Централизованное Управление Пакетами
Управление зависимостями — основная функция NuGet. В одном проекте это может быть просто, а в многопроектных решениях могут возникать трудности. Если вы управляете общими зависимостями для нескольких различных проектов, теперь можно использовать функции централизованного управления пакетами NuGet.
Исторически зависимости пакетов NuGet управлялись в двух основных местах:
-
-
Начиная с NuGet 6.2, вы можете централизованно управлять своими зависимостями в своих проектах, добавив файл
Создайте файл
Предупреждение
При использовании централизованного управления пакетами вы увидите предупреждение
Замечание
В Visual Studio 2022 возникает проблема при обновлении пакетов через NuGet Package Manager. После обновления меняется версия пакета в файле
Источник: https://devblogs.microsoft.com/nuget/introducing-central-package-management/
Централизованное Управление Пакетами
Управление зависимостями — основная функция NuGet. В одном проекте это может быть просто, а в многопроектных решениях могут возникать трудности. Если вы управляете общими зависимостями для нескольких различных проектов, теперь можно использовать функции централизованного управления пакетами NuGet.
Исторически зависимости пакетов NuGet управлялись в двух основных местах:
-
packages.config
– XML-файл, используемый в старых типах проектов для хранения списка пакетов, на которые ссылается проект,-
<PackageReference />
— элемент XML, используемый в новых типах проектов, который управляет зависимостями NuGet непосредственно в файлах проекта.Начиная с NuGet 6.2, вы можете централизованно управлять своими зависимостями в своих проектах, добавив файл
Directory.Packages.props
. Функционал доступен во всех последних версиях инструментов разработки. Создайте файл
Directory.Packages.props
в корне решения и установите ManagePackageVersionsCentrally
в true
. Далее вы можете определять версии пакетов, необходимых для вашего решения:<Project>В проектах решения используйте тот же синтаксис
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
</Project>
<PackageReference />
для ссылок на пакеты, но без атрибута Version (можно переопределить версию в конкретном проекте с помощью атрибута VersionOverride
):<Project Sdk="Microsoft.NET.Sdk">Для простоты для каждого проекта оценивается только один файл
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>
</Project>
Directory.Packages.props
. Если в вашем репозитории их несколько, будет выбран файл, ближайший к каталогу вашего проекта.Предупреждение
При использовании централизованного управления пакетами вы увидите предупреждение
NU1507
, если в вашей конфигурации определено более одного источника пакетов. Чтобы это исправить, добавьте файл nuget.config
в корень проекта с сопоставлением источников пакетов:<?xml version="1.0" encoding="utf-8"?>Можно добавить дополнительные источники и конфигурацию при необходимости. См. подробнее тут
<configuration>
<packageSources>
<clear />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
</packageSources>
<packageSourceMapping>
<packageSource key="nuget.org">
<package pattern="*" />
</packageSource>
</packageSourceMapping>
</configuration>
Замечание
В Visual Studio 2022 возникает проблема при обновлении пакетов через NuGet Package Manager. После обновления меняется версия пакета в файле
.csproj
проекта (добавляется атрибут Version="…"
, вместо обновления его в файле Directory.Packages.props
), что приводит к ошибке компиляции. Приходится исправлять это, вручную редактируя оба файла. Надеюсь, в будущем это исправят. Ишью им отправил :)Источник: https://devblogs.microsoft.com/nuget/introducing-central-package-management/
👍19
День 1211. #ЗаметкиНаПолях
SQL Последовательности для Создания Уникальных Значений
Для создания уникального номера, например заказа в системе продаж, вы можете:
- использовать автогенерацию первичного ключа из базы данных,
- выбирать максимальный номер заказа из базы и добавлять единицу,
- использовать свой код, генерирующий уникальные числа.
– использовать SQL-последовательность.
Последовательность (sequence) - простой и эффективный способ создания уникальных упорядоченных значений потокобезопасным способом.
SQL код для создания очень прост:
Выбрать следующее значение можно так:
При принятии решения об использовании последовательностей, необходимо иметь в виду некоторые их ограничения:
1. Когда вы запрашиваете число, независимо от того, что происходит с этого момента, последовательность увеличивается. Последовательности не являются частью транзакций. Если вы откатите транзакцию с выбранным числом последовательности, это число «потеряется».
2. Последовательности не могут быть «разделены» каким-либо образом. Если вам требуется генерировать уникальные номера в течение года, а с 1 января «сбрасывать» нумерацию, вы не сможете создать заказ «задним числом». 1 января последовательность сбросится, и получить номер для заказа от 31 декабря прошлого года не удастся. Вариант решения – иметь несколько последовательностей на текущий год и несколько предыдущих, в которых ещё требуется продолжать нумерацию.
3. Аналогично если нескольким потребителям требуется отдельная нумерация, для каждого придётся создать свою последовательность.
Итого
Последовательности хороши, когда вам нужно приращение на одно и то же число для вашей базы данных с одним потребителем. Для более сложного функционала придётся придумывать что-то нестандартное или иметь дело с управлением несколькими последовательностями одновременно и выбором правильной в нужное время с помощью бизнес-логики.
Источник: https://dotnetcoretutorials.com/2022/03/22/using-sql-server-sequences-to-generate-unique-values/
SQL Последовательности для Создания Уникальных Значений
Для создания уникального номера, например заказа в системе продаж, вы можете:
- использовать автогенерацию первичного ключа из базы данных,
- выбирать максимальный номер заказа из базы и добавлять единицу,
- использовать свой код, генерирующий уникальные числа.
– использовать SQL-последовательность.
Последовательность (sequence) - простой и эффективный способ создания уникальных упорядоченных значений потокобезопасным способом.
SQL код для создания очень прост:
CREATE SEQUENCE TestSeqНачальный номер и число инкремента могут быть любыми.
START WITH 1
INCREMENT BY 1
Выбрать следующее значение можно так:
SELECT NEXT VALUE FOR TestSeqEntity Framework также поддерживает последовательности… ну, более-менее. Создать последовательность можно в
OnModelCreating
вашего DbContext
:protected override void OnModelCreating(ModelBuilder mb)А вот простого метода получения следующего значения нет. Большинство документации сводится к использованию значения по умолчанию через вот такую конструкцию:
{
mb.HasSequence("TestSeq",
x => x.StartsAt(1000).IncrementsBy(2));
…
mb.Entity<Order>()Ограничения
.Property(o => o.OrderNo)
.HasDefaultValueSql("NEXT VALUE FOR TestSeq");
При принятии решения об использовании последовательностей, необходимо иметь в виду некоторые их ограничения:
1. Когда вы запрашиваете число, независимо от того, что происходит с этого момента, последовательность увеличивается. Последовательности не являются частью транзакций. Если вы откатите транзакцию с выбранным числом последовательности, это число «потеряется».
2. Последовательности не могут быть «разделены» каким-либо образом. Если вам требуется генерировать уникальные номера в течение года, а с 1 января «сбрасывать» нумерацию, вы не сможете создать заказ «задним числом». 1 января последовательность сбросится, и получить номер для заказа от 31 декабря прошлого года не удастся. Вариант решения – иметь несколько последовательностей на текущий год и несколько предыдущих, в которых ещё требуется продолжать нумерацию.
3. Аналогично если нескольким потребителям требуется отдельная нумерация, для каждого придётся создать свою последовательность.
Итого
Последовательности хороши, когда вам нужно приращение на одно и то же число для вашей базы данных с одним потребителем. Для более сложного функционала придётся придумывать что-то нестандартное или иметь дело с управлением несколькими последовательностями одновременно и выбором правильной в нужное время с помощью бизнес-логики.
Источник: https://dotnetcoretutorials.com/2022/03/22/using-sql-server-sequences-to-generate-unique-values/
👍6
Выберите корректный синтаксис для получения второго элемента из словаря Dictionary<string, Vendor> vendors:
#Quiz #CSharp
#Quiz #CSharp
Anonymous Quiz
1%
vendors[0]
55%
vendors[1]
4%
vendors[2]
40%
vendors["XYZ Inc"]
День 1212. #ЗаметкиНаПолях #AsyncTips
Потокобезопасные словари
Задача
Имеется коллекция «ключ/значение» (например, кэш в памяти), которая должна поддерживаться в синхронизированном состоянии, даже если несколько потоков выполняют с ней операции чтения и записи.
Решение
Тип
Запись
Чтобы задать значение для ключа, используйте метод
Аргументы:
- ключ,
- делегат, преобразующий ключ (в данном случае
- делегат, преобразующий ключ (
Чтобы конкурентный словарь работал правильно, может оказаться, что метод
Добавить значение в словарь можно и через индекс:
Чтение
Помните, что в конкурентном словаре несколько потоков могут заниматься чтением, обновлением, добавлением и удалением значений; во многих ситуациях бывает трудно проверить, существует ключ или нет до того, как вы попытаетесь прочитать его.
Удаление
Аналогично чтению:
Если обновления относительно редки, возможно, ImmutableDictionary<TKey, TValue> будет более подходящим вариантом.
Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 9.
Потокобезопасные словари
Задача
Имеется коллекция «ключ/значение» (например, кэш в памяти), которая должна поддерживаться в синхронизированном состоянии, даже если несколько потоков выполняют с ней операции чтения и записи.
Решение
Тип
ConcurrentDictionary<TKey, TValue>
является потокобезопасным гарантирует быстрый доступ в подавляющем большинстве сценариев. Его API сильно отличается от стандартного типа Dictionary<TKey, TValue>
, поскольку он должен иметь дело с конкурентным доступом из многих потоков. Запись
Чтобы задать значение для ключа, используйте метод
AddOrUpdate
:var d = new ConcurrentDictionary<int, string>();Метод
string newValue = d.AddOrUpdate(
0,
key => "Zero",
(key, oldValue) => "Zero"
);
AddOrUpdate
выглядит сложно, так как должен делать несколько вещей в зависимости от текущего содержимого словаря.Аргументы:
- ключ,
- делегат, преобразующий ключ (в данном случае
0
) в значение, которое будет добавлено в словарь (в данном случае "Zero"
). Вызывается, только если ключа не существует в словаре.- делегат, преобразующий ключ (
0
) и старое значение в обновлённое значение, которое должно быть сохранено в словаре ("Zero"
). Вызывается, если ключ уже существует в словаре.AddOrUpdate
возвращает новое значение для этого ключа (значение, которое было возвращено одним из делегатов).Чтобы конкурентный словарь работал правильно, может оказаться, что метод
AddOrUpdate
должен вызвать один (или оба) делегата несколько раз. Такое бывает очень редко, но это возможно. А значит, делегаты должны быть простыми и быстрыми и не должны иметь побочных эффектов, т.е. должны только создавать значение, не изменяя никакие другие переменные в приложении.Добавить значение в словарь можно и через индекс:
// Добавляет (или обновляет) ключ 0,Этот синтаксис не предоставляет возможности обновления значений на основании существующего значения. Но он проще и нормально работает, если известно значение, которое требуется сохранить в словаре.
// связывая с ним значение "Zero".
d[0] = "Zero";
Чтение
bool keyExists = d.TryGetValue(0, out string current);
TryGetValue
вернёт true
и задаст значение current
, если ключ был найден в словаре. Если ключ не найден, TryGetValue
вернет false
. Прочитать значение можно и через индекс, но при отсутствии ключа будет выдано исключение. Помните, что в конкурентном словаре несколько потоков могут заниматься чтением, обновлением, добавлением и удалением значений; во многих ситуациях бывает трудно проверить, существует ключ или нет до того, как вы попытаетесь прочитать его.
Удаление
Аналогично чтению:
bool keyExisted = d.TryRemove(0, out string removed);Хотя
ConcurrentDictionary<TKey, TValue>
является потокобезопасным, это не означает атомарности его операций. Если несколько потоков вызывают AddOrUpdate
конкурентно, может оказаться, что два потока обнаружат отсутствие ключа, а затем оба одновременно выполнят своего делегата, создающего новое значение.ConcurrentDictionary<TKey, TValue>
хорошо работает при чтении и записи со стороны нескольких потоков в общую коллекцию.Если обновления относительно редки, возможно, ImmutableDictionary<TKey, TValue> будет более подходящим вариантом.
Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 9.
👍5
День 1213. #Карьера
7 Полезных Негласных Правил Собеседования
Кандидат после окончания собеседования часто остаётся в неведении. Насколько хорошо вы справились? Что означает, если вам не отвечают после интервью? Несколько HR-специалистов раскрыли известные им негласные правила собеседования, которые должен знать каждый.
1. Интервьюеры хотят саммари, а не список всего, что вы делали
Кандидатов гарантированно спросят «Рассказать о себе» и «Почему вас интересует наша компания?». Возникает соблазн просто повторить, что написано в резюме. Но интервьюеры ожидают, что вы кратко расскажете о своей карьере.
Вопрос «Расскажите нам о времени, когда…?» - о вашей компетентности: «Выполняли ли вы подобную работу раньше?» и «Есть ли у вас голова на плечах?»
Вопрос «Есть ли у вас какие-либо вопросы?» - о серьёзности ваших намерений: «Так ли вам нужно это место, что вы поискали информацию о компании, и имеете вопросы, которых не смогли найти в Google?»
2. Нужно понимать, с кем вы беседуете
Что ответить на собеседовании будущему коллеге, будет немного отличаться от того, что нужно сказать менеджеру. Будущий коллега хочет знать сможете ли вы выполнять свою работу? Будете ли задерживать команду? Подходите ли для совместной работы?
Менеджер хочет знать, сможете ли вы выполнять свою работу без его помощи? Можно ли доверить вам принимать трудные решения? В чём вас надо поддержать?
3. Язык тела имеет большое значение
Язык тела может сказать столько же, сколько и слова, которые вы произносите. Осознайте, как вы сидите, что делаете руками, контролируйте выражение лица, держите зрительный контакт. Язык вашего тела посылает сигналы и влияет на ваш успех на собеседовании, независимо от того, знает ваш интервьюер об этом или нет. Мимические реакции и зрительный контакт покажут, что вы являетесь активным слушателем. Это маленький шаг, но он может иметь большое значение.
4. Вы должны быть готовы рассказать более одной карьерной истории
Важно подготовить и рассказать историю своей карьеры. Но если вы хотите стать более сильным кандидатом, нужно рассказать интервьюерам не одну историю. В идеале у вас должно быть три или четыре истории успеха, которые вы можете рассказывать разным интервьюерам, потому что они общаются между собой.
5. Последующие звонки не ускорят найм
Когда интервью прошло, а работодатель молчит, это неприятно. Хорошая новость, что зачастую ничего личного, и это связано с другими интервью или внутренней бюрократией.
Но не стоит перезванивать или слать email с вопросами. Это не изменит мнение интервьюеров об их решении. Никому не нравится это получать. Ещё никого не принимали после повторного email. Если прошло слишком много времени, просто примите это и двигайтесь дальше. Лучше иметь вариант в запасе.
6. Письмо с благодарностью поможет в налаживании связей, но не даст вам работы
Письма, в которых вы благодарите интервьюеров за потраченное время приняты в некоторых компаниях и культурах, но они очень редко будут иметь решающее значение при принятии вас на работу. С точки зрения менеджера это было бы очень слабым ходом, принимать решение в пользу кандидата из-за того, что тот более любезен, чем остальные.
7. Независимо от того, как прошло собеседование, посоветуйтесь с людьми, которые там работают
Никогда не соглашайтесь на работу, не поговорив с будущими коллегами. Это
даст вам гораздо более чёткое представление о корпоративной культуре, чем любой ответ менеджера на собеседовании. Никто не скажет: «Да, я ужасный менеджер.» Но если вы спросите своих потенциальных коллег, и они нелестно отзовутся о менеджере, это будет разницей между походами на работу с удовольствием и подсчитыванием дней до выходных.
Источник: https://www.huffpost.com/entry/unspoken-job-interview-rules-everyone-needs-know_l_627aaa57e4b00fbab634c2bd
7 Полезных Негласных Правил Собеседования
Кандидат после окончания собеседования часто остаётся в неведении. Насколько хорошо вы справились? Что означает, если вам не отвечают после интервью? Несколько HR-специалистов раскрыли известные им негласные правила собеседования, которые должен знать каждый.
1. Интервьюеры хотят саммари, а не список всего, что вы делали
Кандидатов гарантированно спросят «Рассказать о себе» и «Почему вас интересует наша компания?». Возникает соблазн просто повторить, что написано в резюме. Но интервьюеры ожидают, что вы кратко расскажете о своей карьере.
Вопрос «Расскажите нам о времени, когда…?» - о вашей компетентности: «Выполняли ли вы подобную работу раньше?» и «Есть ли у вас голова на плечах?»
Вопрос «Есть ли у вас какие-либо вопросы?» - о серьёзности ваших намерений: «Так ли вам нужно это место, что вы поискали информацию о компании, и имеете вопросы, которых не смогли найти в Google?»
2. Нужно понимать, с кем вы беседуете
Что ответить на собеседовании будущему коллеге, будет немного отличаться от того, что нужно сказать менеджеру. Будущий коллега хочет знать сможете ли вы выполнять свою работу? Будете ли задерживать команду? Подходите ли для совместной работы?
Менеджер хочет знать, сможете ли вы выполнять свою работу без его помощи? Можно ли доверить вам принимать трудные решения? В чём вас надо поддержать?
3. Язык тела имеет большое значение
Язык тела может сказать столько же, сколько и слова, которые вы произносите. Осознайте, как вы сидите, что делаете руками, контролируйте выражение лица, держите зрительный контакт. Язык вашего тела посылает сигналы и влияет на ваш успех на собеседовании, независимо от того, знает ваш интервьюер об этом или нет. Мимические реакции и зрительный контакт покажут, что вы являетесь активным слушателем. Это маленький шаг, но он может иметь большое значение.
4. Вы должны быть готовы рассказать более одной карьерной истории
Важно подготовить и рассказать историю своей карьеры. Но если вы хотите стать более сильным кандидатом, нужно рассказать интервьюерам не одну историю. В идеале у вас должно быть три или четыре истории успеха, которые вы можете рассказывать разным интервьюерам, потому что они общаются между собой.
5. Последующие звонки не ускорят найм
Когда интервью прошло, а работодатель молчит, это неприятно. Хорошая новость, что зачастую ничего личного, и это связано с другими интервью или внутренней бюрократией.
Но не стоит перезванивать или слать email с вопросами. Это не изменит мнение интервьюеров об их решении. Никому не нравится это получать. Ещё никого не принимали после повторного email. Если прошло слишком много времени, просто примите это и двигайтесь дальше. Лучше иметь вариант в запасе.
6. Письмо с благодарностью поможет в налаживании связей, но не даст вам работы
Письма, в которых вы благодарите интервьюеров за потраченное время приняты в некоторых компаниях и культурах, но они очень редко будут иметь решающее значение при принятии вас на работу. С точки зрения менеджера это было бы очень слабым ходом, принимать решение в пользу кандидата из-за того, что тот более любезен, чем остальные.
7. Независимо от того, как прошло собеседование, посоветуйтесь с людьми, которые там работают
Никогда не соглашайтесь на работу, не поговорив с будущими коллегами. Это
даст вам гораздо более чёткое представление о корпоративной культуре, чем любой ответ менеджера на собеседовании. Никто не скажет: «Да, я ужасный менеджер.» Но если вы спросите своих потенциальных коллег, и они нелестно отзовутся о менеджере, это будет разницей между походами на работу с удовольствием и подсчитыванием дней до выходных.
Источник: https://www.huffpost.com/entry/unspoken-job-interview-rules-everyone-needs-know_l_627aaa57e4b00fbab634c2bd
👍8
День 1214. #Юмор
10 Стереотипных Типов Программистов
Согласно стереотипам, все программисты делятся на 10 типов:
1. Техногик
Всегда в тренде. У него последний мак, огромный кривой монитор, умный дом, которым он управляет со смартфона, и он использует только самый модный на данный момент язык программирования. На его книжной полке руководства по всем бывшим модным языкам, но про них он вспоминать не любит.
2. Минималист
Наоборот считает, что технологии созданы, чтобы следить за нами, и в каждой программе есть эксплойт, просто не везде их ещё обнаружили. Он живёт на отшибе, у него кнопочный телефон, компьютер с линуксом и ружьё.
3. Интроверт
Самый распространённый тип. До сих пор живёт в родительском доме. Локдауна он не заметил, потому что его повседневная жизнь никак не изменилась. Он напишет любую программу, не гугля, зато не сможет поддержать разговор, даже если на кону будет его жизнь.
4. Брограммист
Этот вид появился сравнительно недавно. У него айтишное образование, полученное в перерывах между тусовками, куча друзей, и он душа компании. Он выдаёт тонны нетестируемого говнокода (потому что тесты для слабаков). В итоге он вырождается в вашего менеджера и достаёт команду обзорами кода и занятиями по тимбилдингу.
5. Женщина
Редкий вид, особенно учитывая, что на заре программирования женщины доминировали. Кэтлин Бут создала первый ассемблер, Грейс Хоппер – первый компилятор, а Маргарет Хемильтон возглавляла команду, написавшую код посадки Апполона на Луну. Код настолько безупречный, что некоторые приводят это как доказательство фейковости лунной миссии. Этот код был вершиной программирования, с тех пор всё полетело в …
6. Кодфлюенсер
Основное место обитания этого вида – не IDE, а соцсеть (чаще всего твиттер). После того, как кодфлюенсер узнаёт, как написать «Hello World» на PHP, его ЧСВ взлетает до небес, и он спешит поделиться с миром этим сокровенным знанием. Так он делает мир чуточку лучше. А поскольку он профи в умении себя продать, его должность лучше, а ЗП выше, чем у вас. Смиритесь.
7. Хакер
Этот чувак может через терминал забраться на любой мейнфрейм и сломать все защитные протоколы один за другим, показывая это в 3D визуализации на экране. Хотя, это голливудская версия. Настоящий хакинг однообразен и уныл, и осуществляется в основном спецслужбами.
8. 10x-Инженер
Настоящий единорог среди программистов. Умеет писать код так же быстро, как 10 обычных программистов. Многие считают, что это мифические существа, но некоторые действительно рождаются с даром к решению задач. Если вы встретите такого, вы его узнаете, потому что при общении с ними у вас сразу возникнет чувство собственной некомпетентности и жгучей зависти. Вот тут про них подробнее.
9. Ленивый Богатей
Если вы последите за его работой, то кажется, что всё, что он делает, это копирует код со Stackoverflow. На самом деле он создаёт ПО для многомилионного стартапа, чтобы выйти на пенсию к 30. А ещё у него есть подработка с ЗП в 300КК. При этом он питается дошираком и живёт в однушке с четырьмя такими же как он. Весь его гардероб – футболки с конференций, и то, что ему купила мама.
10. Усталый Старик
Его вы узнаете по седой бороде. Он пишет на C (не C++), и уж точно не использует весь этот ваш хипстерский новомодный мусор. На самом деле, он скорее всего написал компилятор для этого вашего модного игрушечного языка. Глубина его знаний выходит за границы понимания обычных приматов. С помощью психоделиков он узнал, что на самом деле мы все – одна большая сущность, разделённая на множество тел для познания вселенной. А компьютеры – инструмент, который поможет нам снова воссоединиться.
Узнали себя? Давайте посмотрим, кого среди нас больше. Только честно. Не беспокойтесь, опрос ниже анонимный.
Источник: https://youtu.be/_k-F-MMvQV4
10 Стереотипных Типов Программистов
Согласно стереотипам, все программисты делятся на 10 типов:
1. Техногик
Всегда в тренде. У него последний мак, огромный кривой монитор, умный дом, которым он управляет со смартфона, и он использует только самый модный на данный момент язык программирования. На его книжной полке руководства по всем бывшим модным языкам, но про них он вспоминать не любит.
2. Минималист
Наоборот считает, что технологии созданы, чтобы следить за нами, и в каждой программе есть эксплойт, просто не везде их ещё обнаружили. Он живёт на отшибе, у него кнопочный телефон, компьютер с линуксом и ружьё.
3. Интроверт
Самый распространённый тип. До сих пор живёт в родительском доме. Локдауна он не заметил, потому что его повседневная жизнь никак не изменилась. Он напишет любую программу, не гугля, зато не сможет поддержать разговор, даже если на кону будет его жизнь.
4. Брограммист
Этот вид появился сравнительно недавно. У него айтишное образование, полученное в перерывах между тусовками, куча друзей, и он душа компании. Он выдаёт тонны нетестируемого говнокода (потому что тесты для слабаков). В итоге он вырождается в вашего менеджера и достаёт команду обзорами кода и занятиями по тимбилдингу.
5. Женщина
Редкий вид, особенно учитывая, что на заре программирования женщины доминировали. Кэтлин Бут создала первый ассемблер, Грейс Хоппер – первый компилятор, а Маргарет Хемильтон возглавляла команду, написавшую код посадки Апполона на Луну. Код настолько безупречный, что некоторые приводят это как доказательство фейковости лунной миссии. Этот код был вершиной программирования, с тех пор всё полетело в …
6. Кодфлюенсер
Основное место обитания этого вида – не IDE, а соцсеть (чаще всего твиттер). После того, как кодфлюенсер узнаёт, как написать «Hello World» на PHP, его ЧСВ взлетает до небес, и он спешит поделиться с миром этим сокровенным знанием. Так он делает мир чуточку лучше. А поскольку он профи в умении себя продать, его должность лучше, а ЗП выше, чем у вас. Смиритесь.
7. Хакер
Этот чувак может через терминал забраться на любой мейнфрейм и сломать все защитные протоколы один за другим, показывая это в 3D визуализации на экране. Хотя, это голливудская версия. Настоящий хакинг однообразен и уныл, и осуществляется в основном спецслужбами.
8. 10x-Инженер
Настоящий единорог среди программистов. Умеет писать код так же быстро, как 10 обычных программистов. Многие считают, что это мифические существа, но некоторые действительно рождаются с даром к решению задач. Если вы встретите такого, вы его узнаете, потому что при общении с ними у вас сразу возникнет чувство собственной некомпетентности и жгучей зависти. Вот тут про них подробнее.
9. Ленивый Богатей
Если вы последите за его работой, то кажется, что всё, что он делает, это копирует код со Stackoverflow. На самом деле он создаёт ПО для многомилионного стартапа, чтобы выйти на пенсию к 30. А ещё у него есть подработка с ЗП в 300КК. При этом он питается дошираком и живёт в однушке с четырьмя такими же как он. Весь его гардероб – футболки с конференций, и то, что ему купила мама.
10. Усталый Старик
Его вы узнаете по седой бороде. Он пишет на C (не C++), и уж точно не использует весь этот ваш хипстерский новомодный мусор. На самом деле, он скорее всего написал компилятор для этого вашего модного игрушечного языка. Глубина его знаний выходит за границы понимания обычных приматов. С помощью психоделиков он узнал, что на самом деле мы все – одна большая сущность, разделённая на множество тел для познания вселенной. А компьютеры – инструмент, который поможет нам снова воссоединиться.
Узнали себя? Давайте посмотрим, кого среди нас больше. Только честно. Не беспокойтесь, опрос ниже анонимный.
Источник: https://youtu.be/_k-F-MMvQV4
👍15👎4
К какому типу программистов относитесь вы?
Anonymous Poll
8%
Техногик
8%
Минималист
21%
Интроверт
14%
Брограммист
7%
Женщина
4%
Кодфлюенсер
1%
Хакер
10%
10x-Инженер
10%
Ленивый Богатей
15%
Усталый Старик
👎5👍4