Как стать автором
Обновить
10
0
Евгений Котоврасов @skifford

Пользователь

Отправить сообщение

Record vs struct — когда кто кого

Время на прочтение13 мин
Количество просмотров28K

В .Net, помимо типов class и struct, с недавних пор есть еще и типы record и record struct. Появление двух новых типов могло внести запутанность по поводу того, в чем их сходства и различия, и в каких случаях стоит их применять. В этой статье мы разберем, в каких ситуациях использовать class, record, struct, и какие преимущества даёт тот или иной тип в различных ситуациях. В конце мы приведем шпаргалку, которая поможет быстро определиться, какой из видов типов лучше подходит в том или ином случае.

Читать далее
Всего голосов 19: ↑18 и ↓1+20
Комментарии8

.NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 2

Время на прочтение13 мин
Количество просмотров81K
Публикую на Хабр оригинал статьи, перевод которой размещен в блоге Codingsight.

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

Содержание



Читать дальше →
Всего голосов 10: ↑10 и ↓0+10
Комментарии6

.NET: Инструменты для работы с многопоточностью и асинхронностью. Часть 1

Время на прочтение18 мин
Количество просмотров72K
Публикую на Хабр оригинал статьи, перевод которой размещен в блоге Codingsight.
Вторая часть доступна здесь

Необходимость делать что-то асинхронно, не дожидаясь результат здесь и сейчас, или разделять большую работу между несколькими выполняющими ее единицами была и до появления компьютеров. С их появлением такая необходимость стала очень ощутимой. Сейчас, в 2019, набирая эту статью на ноутбуке с 8 ядерным процессором Intel Core, на котором параллельно этому работает не одна сотня процессов, а потоков и того больше. Рядом, лежит уже немного потрепанный, купленный пару лет назад телефон, у него на борту 8 ядерный процессор. На тематических ресурсах полно статей и видео, где их авторы восхищаются флагманскими смартфонами этого года куда ставят 16ти-ядерные процессоры. MS Azure предоставляет менее чем за 20$/час виртуальную машину со 128 ядерным процессором и 2 TB RAM. К сожалению невозможно извлечь максимум и обуздать эту мощь не умея управлять взаимодействием потоков.
Читать дальше →
Всего голосов 34: ↑34 и ↓0+34
Комментарии5

Алгоритм поиска «одинаковых» геометрий

Время на прочтение5 мин
Количество просмотров2.7K

Привет! Меня зовут Мацкевич Евгений, я бекэнд-разработчик 3D-движка компании «Бимейстер». Хоть это и не очевидно на первый взгляд, но элементы загружаемых пользователями 3D-моделей зачастую повторяются, имея при этом различные положение в пространстве, масштабирование и вращение. Я расскажу о том, как мы научили нашу систему распознавать такие элементы как «одинаковые», выделять из них уникальный, а для остальных – вычислять матрицы трансформации. Это дало возможность однократно загружать уникальный элемент, а вместо прочих одинаковых – их матрицы, что сократило трафик и объем занимаемой оперативной памяти.

Читать далее
Всего голосов 20: ↑20 и ↓0+20
Комментарии0

Оптимизация производительности .NET (C#) приложений

Время на прочтение11 мин
Количество просмотров41K
image

Статей с подобным заголовком достаточно много, поэтому постараюсь избежать банальных тем. Надеюсь, что даже опытный разработчик найдёт здесь что-то полезное для себя. В данной статье будут рассмотрены только простые механизмы и подходы оптимизации, которые позволят применить их, затратив минимум усилий. И эти изменения не увеличат энтропию вашего кода. В статье не будет уделено внимания, что и когда нужно оптимизировать, эта статья скорее о подходе к написанию кода в целом.
Читать дальше →
Всего голосов 48: ↑44 и ↓4+40
Комментарии51

Индексы в PostgreSQL — 1

Время на прочтение17 мин
Количество просмотров436K

Предисловие


В этой серии статей речь пойдет об индексах в PostgreSQL.

Любой вопрос можно рассматривать с разных точек зрения. Мы будем говорить о том, что должно интересовать прикладного разработчика, использующего СУБД: какие индексы существуют, почему в PostgreSQL их так много разных, и как их использовать для ускорения запросов. Пожалуй, тему можно было бы раскрыть и меньшим числом слов, но мы втайне надеемся на любознательного разработчика, которому также интересны и подробности внутреннего устройства, тем более, что понимание таких подробностей позволяет не только прислушиваться к чужому мнению, но и делать собственные выводы.

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

В этой части мы поговорим про разделение сфер ответственности между общим механизмом индексирования, относящимся к ядру СУБД, и отдельными методами индексного доступа, которые в PostgreSQL можно добавлять как расширения. В следующей части мы рассмотрим интерфейс метода доступа и такие важные понятия, как классы и семейства операторов. После такого длинного, но необходимого введения мы подробно рассмотрим устройство и применение различных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.
Читать дальше →
Всего голосов 104: ↑103 и ↓1+102
Комментарии59

Continuous Testing в CI/CD: что это, зачем нужно и как работает

Время на прочтение7 мин
Количество просмотров21K

Тестирование — один из процессов, который может быть автоматизирован в рамках CI/CD. Надёжное и тщательное автоматизированное тестирование позволяет быть уверенным в новых сборках, снижает затраты на производство и повышает качество продукта. Но даже в крупных компаниях на больших проектах оно есть не всегда. 

Обычно в тестирование начинают вкладываться, когда багов становится слишком много, недовольство клиентов растёт, и начинают «гореть» деньги бизнеса. Вместе с Александром Довнаром, Lead DevOps в Naviteq, мы разобрали, что такое непрерывное тестирование и какую роль оно занимает в CI/CD. А ещё рассмотрели кейс, как компании приходят к его внедрению, и что это внедрение даёт. 

Читать далее
Всего голосов 12: ↑11 и ↓1+13
Комментарии1

Изолируем микросервисы с помощью Feature toggles в ASP.NET Core. Теория и подготовка

Время на прочтение12 мин
Количество просмотров11K

Привет, Хабр! Если вы работаете с микросервисами, то знаете, что они имеют свойство образовывать некоторую связанность. Хорошо, когда связи между микросервисами однонаправленные, но всё становится сложнее, если возникают циклические зависимости.

Такие зависимости приводят к сложностям развертывания, которые можно преодолеть по-разному — например, используя docker compose. Но на локальном компьютере обычно не возникает необходимости поднятия всей инфраструктуры, потому что разработчика для выполнения задачи обычно интересует какая-нибудь конкретная её часть. В этом случае пригодятся средства изоляции микросервисов.

Меня зовут ​​Сергей Прохоров, я техлид бэкенд-разработки в Ak Bars Digital, и давайте вместе рассмотрим, как реализовать такую изоляцию на примере микросервиса веб-API ASP.NET Core. Метод изоляции основан на использовании feature toggles, или переключателей функциональности, о которых и пойдёт речь в двух частях статьи.

Читать далее
Всего голосов 10: ↑8 и ↓2+7
Комментарии5

Когда и как переходить с монолита на микросервисы. 7 миграционных паттернов

Время на прочтение6 мин
Количество просмотров9.9K

В серии из трех статей рассказываем о переходе с монолитной на микросервисную архитектуру. Разбираемся, когда и кому это действительно нужно, рассматриваем 7 миграционных шаблонов и самый больной вопрос: «Как быть с данными?».

Читать далее
Всего голосов 10: ↑8 и ↓2+7
Комментарии7

Антипаттерны тестирования ПО

Время на прочтение31 мин
Количество просмотров93K

Введение


Есть несколько статей об антипаттернах разработки ПО. Но большинство из них говорят о деталях на уровне кода и фокусируются на конкретной технологии или языке программирования.

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

Терминология


К сожалению, в тестировании пока не выработали общую терминологию. Если спросить сотню разработчиков, в чём разница между интеграционным, сквозным и компонентным тестом, то получите сто разных ответов. Для этой статьи ограничимся такой пирамидой тестов:


Если не видели пирамиду тестов, настоятельно рекомендую ознакомиться с ней. Вот некоторые хорошие статьи для начала:

Читать дальше →
Всего голосов 48: ↑48 и ↓0+48
Комментарии31

Как приручить автотесты

Время на прочтение5 мин
Количество просмотров13K
Додо сказал:
— Правильность формы несущественна! А потом расставил всех без всякого порядка по кругу. Никто не подавал команды — все побежали, когда захотели.

Л.Кэрролл, «Приключения Алисы в стране чудес»


Развивая автоматизацию тестирования, можно найти много мест, куда приложить силы. Распыляя усилия и преследуя ложные цели мы не только потратим время и ресурсы впустую, но и нанесем разработке вред.

image

Если знать, на каком уровне развития находится автоматизация тестирования проекта сейчас и куда в такой ситуации инвестировать, можно не просто добиться большей отдачи, но и улучшить разработку в целом. Основные принципы инвестирования ресурсов можно попробовать сформулировать в виде короткого манифеста.
Читать дальше →
Всего голосов 24: ↑21 и ↓3+18
Комментарии12

Юнит-тесты переоценены

Время на прочтение36 мин
Количество просмотров32K
Предлагаем вам перевод поста «Unit Testing is Overrated» от Alex Golub, чтобы подискутировать на тему юнит-тестов. Действительно ли они переоценены, как считает автор, или же являются отличным подспорьем в работе? Опрос — в конце поста


Результаты использования юнит-тестов: отчаяние, мучения, гнев

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

В процессе развития отрасли разработки ПО совершенствовались и методики тестирования. Они постепенно сдвигались в сторону автоматизации и повлияли на саму структуру ПО, порождая такие «мантры», как «разработка через тестирование» (test-driven development), делая упор на такие паттерны, как инверсия зависимостей (dependency inversion), и популяризируя построенные на их основе высокоуровневые архитектуры.

Сегодня автоматизированное тестирование настолько глубоко связано в нашем сознании с разработкой ПО, что одно сложно представить без другого. И поскольку оно, в конечном итоге, позволяет нам быстро создавать ПО, не жертвуя при этом его качеством, то трудно спорить о полезности тестирования.

Однако, несмотря на существование различных подходов, современные «best practices» в основном подталкивают разработчиков к использованию конкретно юнит-тестирования. Тесты, область контроля которых находится в пирамиде Майка Кона выше, или пишутся как часть более масштабного проекта (часто совершенно другими людьми), или полностью игнорируются.

Преимущество такого подхода часть поддерживается следующим аргументом: юнит-тесты обеспечивают в процессе разработки наибольшую полезность, потому что способны быстро отслеживать ошибки и помогают применять упрощающие модульность паттерны разработки.
Читать дальше →
Всего голосов 47: ↑40 и ↓7+49
Комментарии302

Создание тестового DB-контекста в тестах с использованием xUnit

Время на прочтение5 мин
Количество просмотров10K
В случаях, когда ваше приложение имеет нетривиальную схему данных (люди, продукты, заказы, цены, объемы, состояния, зависящие от кучи параметров и т.д.) бывает проще иметь некоторый дамп данных, воссозданный на тестовом окружении, или взятый с продакшна, и использовать его для тестов. В этом случае, может понадобиться несколько дампов данных, для каждого из случаев, которые автоматические тесты должны уметь накатывать и откатывать на тестовое окружение. В этой статье я попытаюсь показать, как это можно сделать, используя fixtures и collections фреймворка xUnit. Все решение построена на базе xUnit версии 2.0 от 16 марта 2015 года.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии0

Упрощаем юнит-тесты с помощью связки AutoFixture и xUnit

Время на прочтение7 мин
Количество просмотров47K
Все мы знаем, что юнит-тесты — это классно, что только коду, который так или иначе покрыт тестами, можно доверять и что если какой-нибудь неопытный senior developer старший программист что-нибудь сломает, тесты это сразу же покажут.

Тем не менее, написание тестов сложно назвать увлекательным процессом. Инициализация тестовых данных, инициализация моков, создание объекта тестирования… Пока доберешься до вызова метода, который ты собственно хотел проверить, тестировать уже и не хочется ничего. Я конечно утрирую, юнит-тест по своей природе не должен брать на себя слишком много и содержать пару сотен десятков строк инициализации (хотя и такое бывает), однако писать один и тот же код быстро надоедает. И вот уже появляются фабрики тестовых объектов, иерархия базовых классов для тестов и прочие ООП примочки, призванные «упростить» создание теста. Приводит это как правило к тому, что шансов быстро понять, что же делает тест, не путешествуя по этим самым объектам, практически не остается.

Собственно, инструмент, о котором я хочу рассказать, как раз и призван упростить, а в некоторых случаях и полностью убрать фазу инициализации или Arrange фазу теста.
Читать дальше →
Всего голосов 14: ↑14 и ↓0+14
Комментарии3

Введение в написание тестов и знакомство с xUnit

Время на прочтение3 мин
Количество просмотров47K
Идея статьи возникла после нескольких лекций о том, как писать тесты и как использовать xUnit. Обо всём можно по отдельности почитать подробно. Здесь же я собрал общую информацию о том, как удачно на практике всё это применяется и сопроводил ссылками, для дальнейшего ознакомления. Обзор делался по версии 2.0.
Читать дальше →
Всего голосов 9: ↑7 и ↓2+5
Комментарии5

Когда использовать mocks в юнит-тестировании

Время на прочтение13 мин
Количество просмотров80K

Эта статья является переводом материала «When to Mock».

Использование моков в модульном тестировании является спорной темой. Автор оригинала заметил, что на протяжении всей своей карьеры в программировании он сначала перешел от «моков почти для каждой зависимости» к политике «без моков», а затем к «только моки для внешних зависимостей».

Ни одна из этих практик не является достаточно хорошей. В этой статье Владимир Хориков покажет, какие зависимости следует мокать, а какие использовать как есть в тестах.

Читать далее
Всего голосов 16: ↑16 и ↓0+16
Комментарии6

Применение паттерна CRTP в C#

Время на прочтение3 мин
Количество просмотров18K
CRTP (Curiously recurring template pattern) — идиома, ведущая свои корни из C++. Суть CRTP заключается в наследовании от шаблонного (generic) класса, шаблонным параметром которого является сам класс-наследник.

В коде это выглядит достаточно просто:
public class Base<T> where T : Base<T>
{ /* ... */ }
public class Derived : Base<Derived>
{ /* ... */ }

Такой подход позволяет оперировать типом класса-наследника (T) в коде базового класса, например, явно приводить this к типу T.

Рассмотрим пару вариантов практического применения.
Читать дальше →
Всего голосов 31: ↑30 и ↓1+29
Комментарии9

Новые возможности C#10: атрибут CallerArgumentExpression

Время на прочтение6 мин
Количество просмотров12K
Об атрибуте CallerArgumentExpression говорят уже много лет. Предполагалось, что он станет частью C# 8.0, но его внедрение в язык отложили. А в этом месяце он, наконец, появился — вместе с C# 10 и .NET 6.


Читать дальше →
Всего голосов 38: ↑38 и ↓0+38
Комментарии10

Тестирование приложений на Canvas: рецепты на примере тестирования API Яндекс.Карт

Время на прочтение6 мин
Количество просмотров21K
Несмотря на то, что HTML5 всё ещё находится в процессе разработки, он уже появляется в веб-интерфейсах. Одним из основных нововведений этой версии HTML стал элемент Canvas, который используется для отрисовки двухмерной графики. Например, всё, что вы видите и с чем взаимодействуете в игре MMORPG от компании Mozilla или старом-добром Command and Conquer, отрисовывается и обрабатывается с помощью Canvas. Самые изощрённые умы даже реализуют полноценные формы на Canvas. Или интерактивную модель солнечной системы.

Фреймворки для работы с этим элементом растут как грибы после дождя; про то, как начать программировать, используя Canvas, написано огромное количество статей. Но есть один пункт, о котором, по-видимому, из-за узкой специфики говорят редко и мало. Речь идёт о тестировании приложений на Canvas. В каком-то смысле оно становится проблемой для инженера по тестированию, который привык обращаться к элементам на странице по их css или xpath селекторам, а затем выполнять с объектом какие-то действия. С Canvas такой подход не работает, ведь DOM элемент один, а объектов в нём — много.



Под катом на примере автоматизации тестирования API Яндекс.Карт я расскажу вам о том, как мы решили эту проблему в Яндексе.
Читать дальше →
Всего голосов 54: ↑49 и ↓5+44
Комментарии16
2

Информация

В рейтинге
Не участвует
Откуда
Москва и Московская обл., Россия
Работает в
Зарегистрирован
Активность

Специализация

Backend Developer, Software Development Engineer in Test
Middle
C#
ASP.NET Web API
Python
OOP
PostgreSQL
RabbitMQ
Docker
Selenium