Как стать автором
Обновить
23
0
Aleksandr Goida @ETman

Software Developer

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

Создание Data Lake и Warehouse на GCP

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

Эта статья не будет технически глубокой. Мы поговорим о Data Lake и Data Warehouse, важных принципах, которые следует учитывать, и о том, какие сервисы GCP можно использовать для создания такой системы. Мы коснёмся каждого из GCP сервисов и поймём почему они будут полезны при создании Data Lake и Warehouse.

Прежде чем перейти к своей версии Data Lake и Data Warehouse, я хотел бы привести несколько известных архитектур, с которыми вы, возможно, уже знакомы, если интересуетесь этой темой. Архитектура, которую я бы предложил, будет более общей, чем эти: Cloud Storage as a data lake и Architecture: Marketing Data Warehouse.

В своей более общей версии Data Lake и Data Warehouse я расскажу о таких сервисах GCP, как Data Transfer Service, Dataproc, Cloud Storage, Cloud Scheduler, BigQuery, и Cloud SQL.

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

Создание автоматической системы борьбы с злоумышленниками на сайте (фродом)

Время на прочтение7 мин
Количество просмотров1.6K
Последние примерно полгода я занимался созданием системы борьбы с фродом (fraudulent activity, fraud, etc.) без какой-либо начальной инфраструктуры для этого. Сегодняшние идеи, которые мы нашли и реализовали в нашей системе, помогают нам обнаруживать множество мошеннических действий и анализировать их. В этой статье я хотел бы рассказать о принципах, которым мы следовали, и о том, что мы сделали для достижения текущего состояния нашей системы, не углубляясь в техническую часть.
Читать дальше →
Рейтинг0
Комментарии0

Аутентификация в .NET Core gRpc с помощью JWT

Время на прочтение6 мин
Количество просмотров13K
В этой статье я расскажу об особенностях аутентификации API в gRpc сервисах с помощью JWT. Я предполагаю, что вы знакомы с JWT и заголовками HTTP, с их использованием в .NET Core WebAPI, поэтому не буду обсуждать эти детали. Когда я пытался реализовать аутентификацию в gRpc, я столкнулся с тем, что большинство примеров написаны с использованием консольных приложений. Это слишком далеко от реальности, в которой, на мой взгляд, живут разработчики. Например, я не хочу создавать канал каждый раз, когда я хочу вызвать метод сервиса. Еще я не хочу заботиться об отправке токена и пользовательской информации с каждым запросом. Вместо этого я хочу иметь инфраструктурный уровень, который будет заботиться обо всём этом за меня. Если эта тема вам интересна, то под катом будет больше. Все примеры в статье справедливы для .NET Core 3.1.
Читать дальше →
Всего голосов 8: ↑8 и ↓0+8
Комментарии0

Развертывание в Docker и Kubernetes образа StatsD+Grafana

Время на прочтение7 мин
Количество просмотров6.6K
В начале моего изучения Docker и Kubernetes мне нехватало простого и понятного примера, с которым можно было бы «поиграться», изучая особенности этой среды. Этой статьей хотелось бы закрыть этот пробел. Здесь я расскажу об интеграции .NET Core приложения с Telegraf и Grafana, о том, как шлются метрики и как деплоить в Docker и Kubernetes. Примеры в статье расчитаны на тех, кто начинает изучать данную область, но базовыми понятиями желательно обладать, чтобы полностью понять статью. В ней описано, как развернуть контейнер, в котором есть StatsD, InfluxDB и Grafana, а также, как отправлять метрики различных типов из приложения.
Читать дальше →
Всего голосов 9: ↑9 и ↓0+9
Комментарии8

Полем грядки вовремя, или 5 признаков скрытых проблем в команде

Время на прочтение6 мин
Количество просмотров9.9K
Проблем в коммуникациях очень много и их решение всегда очень специфично для каждого случая. Сложность с некоторыми проблемами состоит в том, что они скрыты и дают о себе явно знать, когда уже слишком трудно, или поздно, что-то исправлять. Я вспомнил пять случаев, с которыми лично сталкивался. Не все получилось решить, не все решал осознано. Под катом найдёте пять историй, иллюстрирующие пять признаков проблем. Каждую историю я дополнил очень сухой подсказкой об исправлении потому, что реальное решение очень субъективно.
Читать дальше →
Всего голосов 27: ↑26 и ↓1+25
Комментарии14

Тёмные стороны деятельного человека

Время на прочтение5 мин
Количество просмотров12K
Если в большинстве случаев, когда вы получаете новую задачу, вы больше думаете о возможностях сделать её любой ценой, вместо того, чтобы искать препятствия и причины, почему она не может быть выполнена, то вы, в моем понимании, деятельный человек. Пока другие думают, что это невозможно, вы всё еще ищете возможности и находите их. Но на пути поиска и воплощения решения в жизнь вы можете создавать напряжение между людьми. И об этом следует помнить, преследуя цели. И речь идет не о преодолении стены, а о поиске компромиссов, работающих решений и синхронизации с другими людьми. Существует такой набор черт, которые могут создать напряженность и об этом под катом.
Читать дальше →
Всего голосов 18: ↑17 и ↓1+16
Комментарии14

Несколько простых рекомендаций работы в команде

Время на прочтение2 мин
Количество просмотров4.7K
Несколько рекомендаций работы в команде, которые могут сохранить нервные клетки всех в сложные моменты. Бывает, работы так много, что некоторые моменты забываются. Поэтому важно создать некоторый чек-лист, хотя бы для себя, чтобы иметь возможность быстро вернуть себя в эффективное состояние хорошего Team Player. Под катом рекомендации, которые вывел для себя.
Читать дальше →
Всего голосов 27: ↑14 и ↓13+1
Комментарии34

Когда тестирование через public-метод начинает вонять (пример)

Время на прочтение4 мин
Количество просмотров6.6K
В статье про тестирование public-методов коснулся юнит-тестирования приватной логики классов. Думаю, мне стоило бы переделать тезис, так как большинство, на мой взгляд, восприняло, что речь идет о тестировании именно private-методов, хотя речь шла о приватной логике. В этой статье хочу проиллюстрировать практическим примером главный тезис. Под катом пример с небольшим анализом.
Читать дальше →
Всего голосов 23: ↑15 и ↓8+7
Комментарии35

Тестировать только через public-методы плохо

Время на прочтение4 мин
Количество просмотров6.5K
В программировании и в TDD, в частности, есть хорошие принципы, которых полезно придерживаться: DRY и тестирование через public-методы. Они неоднократно оправдали себя на практике, но в проектах с большим legacy-кодом могут иметь «тёмную сторону». Например, ты можешь писать код, руководствуясь этими принципами, а потом обнаружить себя разбирающим тесты, охватывающие связку из 20+ абстракций с конфигурацией, несоизмеримо превосходящей по объему тестируемую логику. Эта «тёмная сторона» пугает людей и тормозит использование TDD в проектах. Под катом я рассуждаю, почему тестировать через public-методы плохо и как можно уменьшить проблемы, возникающие из-за этого принципа.
Читать дальше →
Всего голосов 26: ↑13 и ↓130
Комментарии29

Стратегия Bottom-Up по внедрению изменений в организации

Время на прочтение4 мин
Количество просмотров3.8K
Я точно не первый, кто сталкивался с препятствиями при внедрении изменений в организации снизу-вверх, и не последний. Хочу поделиться некоторыми наблюдениями, выводами и ошибками, которые я сделал на этом пути. Возможно, кто-то был в похожей ситуации, сталкивался с похожими препятствиями и ему удалось их преодолеть. Было бы интересно услышать их опыт.

Упрощенно история выглядит следующим образом. Есть потребность в специалистах Data Science. Есть некоторое видение топ-менеджмента о том, как это должно быть и оно игнорирует людей, которые интересуются данным направлением и уже являются сотрудниками компании. Некоторые из них изучают DS самостоятельно. Чтобы ускорить обучение в этом направлении и сделать его более релевантным для нужд компании я решил организовать группу и заручиться поддержкой архитекторов и глав департаментов. Тут начинается самое интересное в этой истории. Под катом стратегия и мои выводы.
Читать дальше →
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Еще про внедрение таймзон в долгоживущий проект

Время на прочтение5 мин
Количество просмотров9.1K
Некоторое время назад начали адаптировать систему под требования нового рынка, где поддержка таймзон обязательна. Начальные изыскания описывал в предыдущей статье. Сейчас подход немного эволюционировал под влиянием реалий. Под катом описание проблем, с которыми пришлось столкнуться в ходе обсуждений, и окончательное решение, которое воплощается в жизнь.
Читать дальше →
Всего голосов 14: ↑10 и ↓4+6
Комментарии62

Переход от DateTime к DateTimeOffset

Время на прочтение6 мин
Количество просмотров22K
Представим, что вы хотите преобразовать свою систему из одного состояния в другое. Начальное состояние — это когда DateTime используется везде, в C# коде и в БД. Конечное состояние — когда везде используется DateTimeOffset. Вы хотите сделать переход плавно и внести как можно меньше изменений. Это описание может быть началом очень интересной задачи с тупиком в конце.
Читать дальше →
Всего голосов 24: ↑24 и ↓0+24
Комментарии39

Цели обмена знаниями в IT компании

Время на прочтение5 мин
Количество просмотров7.6K
«Знание есть сила», и я считаю, что компании должны поощрять культуру обмена знаниями между разработчиками. Удержание информации сотрудниками не является правильным путем по карьерной лестнице и не сделает никого ключевой персоной в долгосрочной перспективе. Ряд активностей, объединенных общим названием, напоминает win-win игру, в которой выигрывают обе стороны. За счет увеличения эффективности каждого отдельного разработчика, компании достигает более высоких целей наиболее эффективным образом. Основной трудностью, которая мешает продвижению этих активностей в компаниях, является отсутствие прямой связи между инвестициями в них и отдачи. Я не встречал четкой системы оценки прогресса этих мероприятий. Поэтому для себя расписал, как цели обмена знаниями связаны с реальными процессами в компании.
Читать дальше →
Всего голосов 15: ↑10 и ↓5+5
Комментарии7

Настройка Swashbuckle (Swagger) для WebAPI

Время на прочтение9 мин
Количество просмотров56K
Кто хоть раз тестировал свой WebAPI знает такие инструемнты, как Postman или Advanced REST (экстеншены для Chrome). Эти инструемнты всем удобны, кроме того, что не умеют сами узнавать какие модели принимает API, какие отдает и не предоставляет информацию обо всех возможных эндпоинтах. Это неудобство решает пакет Swashbuckle, который встраивает в проект генерацию Swagger спецификации и UI. Под катом коротко о том, как его прикрутить к проекту и некоторые детали относительно авторизации и работы с «перегруженными» эндпоинтами.
Читать дальше →
Всего голосов 12: ↑10 и ↓2+8
Комментарии11

Заменяем тестирование алгоритмов тестированием вносимых эффектов

Время на прочтение3 мин
Количество просмотров9.5K
Как и ожидал, правило 8 о том, что не тестируем алгоритм методов в статье "Правила внедрения TDD в старом проекте" вызвало больше всего вопросов «как» и «зачем». В момент составления прошлой статьи мне показалось это очевидным, поэтому не остановился детальнее на этом моменте. Но т.к. вопросов возникло много, хочу описать своё видение. Поэтому под катом будет небольшой пример кода и два примера того, как его можно было бы протестировать.
Читать дальше →
Всего голосов 23: ↑21 и ↓2+19
Комментарии29

Правила внедрения TDD в старом проекте

Время на прочтение12 мин
Количество просмотров21K
Статья «Скользящая ответственность паттерна Репозиторий» подняла несколько вопросов, на которые очень сложно дать ответ. Нужен ли репозиторий, если абстрагироваться от технических деталей полностью невозможно? На сколько сложным репозиторий может быть, чтобы его написание оставалось целесообразным? Ответ на эти вопросы различается в зависимости от акцента, который делается при разработке систем. Наверно, самый сложный вопрос: нужен ли, вообще, репозиторий? Проблема «текучей абстракции» и рост сложности кодирования с увеличением уровня абстракции не позволяют найти решение, которое удовлетворяло бы оба лагеря. Например, в репортинге intention design приводит к созданию большого числа методов для каждого фильтра и сортировки, а generic решение создает большой оверхед по кодированию. Продолжать можно бесконечно…

Для более полного представления я взглянул на проблему абстракций со стороны применения их в уже готовом коде, в legacy code. Репозиторий, в таком случае, нас интересует только, как инструмент для достижения качественного и безбажного кода. Конечно, этот паттерн — не единственное, что необходимо для применения TDD практик. Наевшись «невкусной еды» в нескольких больших проектах и наблюдая за тем, что работает, а что нет, я вывел для себя несколько правил, которые мне помогают следовать TDD практикам. С удовольствием выслушаю конструтктивную критику и иные приёмы внедрения TDD.
Читать дальше →
Всего голосов 29: ↑27 и ↓2+25
Комментарии86

Скользящая ответственность паттерна Репозиторий

Время на прочтение2 мин
Количество просмотров13K
В ходе многих дискуссий о применимости паттерна Repository я заметил, что люди разделены на два лагеря. В рамках этого текста я, условно, их назову абстракционистами и конкретистами. Разница между ними заключается в том, как они относятся к значению паттерна. Первые считают, что репозиторй стоит иметь, т.к. он позволяет абстрагироваться от деталей хранения данных. Вторые считают, что мы не можем полностью абстрагироваться от этих деталей, поэтому сама идея репозитория бессмыслена, а его использование пустая трата времени. Спор между ними обычно превращается в холивар.

Что не так с репозиторием? Очевидно, что с самим паттерном все нормально, но разница в его понимании разработчиками. Я попробовал исследовать это и наткнулся на два основных момента, которые, на мой взгляд, являются причиной разного к нему отношения. Одним из них является «скользящая» ответственность репозитория, а другой связан с недооценкой unit testing. Под катом я объясню первый.
Читать дальше →
Всего голосов 12: ↑9 и ↓3+6
Комментарии161

Сравнение конфигураций Dependency Injection фреймворков

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

Много раз я спрашивал себя, что какой IoC контейнер подойдет для того или иного проекта. Их производительность — это только одна сторона медали. Полное сравнение производительности можно найти здесь. Другая сторона медали — простота и скорость обучения. Так что я решил сравнить несколько контейнеров с этой точки зрения и взял Autofac, Simple Injector, StructureMap, Ninject, Unity, Castle Windsor. На мой взгляд, это наиболее популярные IoC контейнеры. Вы можете найти некоторые из них в списке 20 лучших пакетов NuGet и также я добавил другие по своим предпочтениям. Лично мне очень нравится Autofac и во время работы над этой статьей я еще больше утвердился, что это лучший выбор в большинстве случаев.


Здесь описываются основы IoC контейнеров, таких как конфигурация и регистрации компонентов. Есть мысль так же провести сравнение управления lifetime scope и продвинутых фитч. Примеры кода можно найти в репозитории LifetimeScopesExamples GitHub.

Читать дальше →
Всего голосов 23: ↑20 и ↓3+17
Комментарии15

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

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

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

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

Информация

В рейтинге
Не участвует
Откуда
Lozenets, Sofiya, Болгария
Дата рождения
Зарегистрирован
Активность