Pull to refresh
30
0
Фофанов Илья @EngineerSpock

Ответственный программист

PostgreSQL Antipatterns: ударим словарем по тяжелому JOIN

Reading time 6 min
Views 19K
Продолжаем серию статей, посвященных исследованию малоизвестных способов улучшения производительности «вроде бы простых» запросов на PostgreSQL:


Не подумайте, что я так сильно не люблю JOIN… :)

Но зачастую без него запрос получается ощутимо производительнее, чем с ним. Поэтому сегодня попробуем вообще избавиться от ресурсоемкого JOIN — с помощью словаря.


Читать дальше →
Total votes 10: ↑9 and ↓1 +8
Comments 14

Основы CQRS

Reading time 14 min
Views 84K
Данная статья основана на материале из различных статей по CQRS, а также проектов, где применялся такой подход.

Системы управления предприятиями, проектами, сотрудниками давно вошли в нашу жизнь. И пользователи таких enterprise приложений все более требовательны: возрастают требования к масштабируемости, сложность бизнес-логики, требования к системам меняются быстро, да и отчетность требуется в реальном времени.

Поэтому при разработке зачастую можно наблюдать одни и те же проблемы в организации кода и архитектуры, а также в их усложнении. При неправильном подходе к проектированию рано или поздно может наступить момент, когда код становится настолько сложным и запутанным, что каждое внесение изменений требует все больше времени и ресурсов.
Читать дальше →
Total votes 16: ↑16 and ↓0 +16
Comments 88

Каковы перспективы у «немодной» платформы .NET — мнения экспертов

Reading time 9 min
Views 46K


Платформа .NET появилась в начале 2000-х годов. Она объединяла «под одной крышей» несколько языков программирования, что было в новинку для того времени. Но разработчики платформы утверждали, что это новшество несет несомненную пользу: программисты начали создавать свои приложения на тех языках, которые знали лучше всего, которые лучше подходили для решения своих задач.

Еще одним новшеством платформы .NET была технология активных серверных страниц ASP.NET (Active Server Page). С её помощью можно было относительно быстро разработать веб-приложения, взаимодействующие с базами данных. Важной особенностью ASP.NET считалась возможность использования всей мощи объектно-ориентированного программирования для веб-разработки. Приложения, написанные с использованием этой технологии, обладают лучшей производительностью и защитой. По крайней мере, в это верили инженеры Microsoft.
Читать дальше →
Total votes 51: ↑42 and ↓9 +33
Comments 127

Готовим Xamarin.Forms: настройка окружения и первые шаги

Reading time 7 min
Views 22K


Друзья! Мы продолжаем колонку на тему разработки мобильных приложений на Xamarin. И
после небольшого перерыва готовы вернуться к рассмотрению особенностей использования Xamarin.Forms при разработке бизнес-приложений для iOS и Android. Все статьи из колонки можно будет найти и прочитать по ссылке #xamarincolumn

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

Правильные пчелы


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

Начнем мы с компьютеров, на которых будет идти разработка.
Читать дальше →
Total votes 22: ↑21 and ↓1 +20
Comments 22

Устранение дублирования Where Expressions в приложении

Reading time 4 min
Views 21K
Допустим, у вас есть товары и категории. В какой-то момент клиент сообщает, что для категорий с рейтингом > 50 необходимо использовать другие бизнес-процессы. У вас достаточно опыта и вы понимаете, что где сегодня 50 завтра будет 127.37 и хотите избежать появления магических чисел в коде, поэтому делаете так:

    public class Category : HasIdBase<int>
    {
        public static readonly Expression<Func<Category, bool>> NiceRating = x => x.Rating > 50;

       //...
    }

    var niceCategories = db.Query<Category>.Where(Category.NiceRating);

К сожалению, этот номер не пройдет, если вы хотите выбрать продукты из соответствующих категорий, потому что NiceRating имеет тип Expression<Func<Category, bool>>, а в случае с Product нам потребуется Expression<Func<Product, bool>>. То есть, необходимо осуществить преобразование Expression<Func<Category, bool>> => Expression<Func<Product, bool>>.

    public class Product: HasIdBase<int>
    {
        public virtual Category Category { get; set; }

       //...
    }

    var niceProductsCompilationError = db.Query<Product>.Where(Category.NiceRating); // так нельзя!

К счастью, осуществить это довольно просто!
Код под катом
Total votes 22: ↑18 and ↓4 +14
Comments 82

Применение FitNesse для .Net приложений

Reading time 7 min
Views 8.6K
Привет, хабр.

Я думаю, многие из вас слышали про такую штуку, как FitNesse. Это одна из технологий тестирования, где тесты создаются как wiki-разметка (т.е. каждый тест — это web страница), и потом запускаются на определенной технологии (Java, .Net, PowerShell и пр.)

В этой статье я расскажу про пример использования FitNesse для тестирования .Net приложения. И заодно покажу несколько приемов и трюков, чтобы сократить Ваше время разработки. Кстати, все эти технологии абсолютно бесплатны.
Поехали
Total votes 5: ↑4 and ↓1 +3
Comments 32

Как мы попробовали DDD, CQRS и Event Sourcing и какие выводы сделали

Reading time 9 min
Views 74K
Вот уже около трех лет я использую в работе принципы Spec By Example, Domain Driven Design и CQRS. За это время накопился опыт практического применения этих практик на платформе .NET. В статье я хочу поделиться нашим опытом и выводами, которые могут быть полезными командам, желающим использовать эти подходы в разработке.

Факты, цифры, код
Total votes 39: ↑39 and ↓0 +39
Comments 45

Как выбрать момент для отправки письма

Reading time 3 min
Views 71K
Знаете ли вы, что письмо потенциальному клиенту с коммерческим предложением лучше всего отправлять с полудня и до трёх часов дня, лучший день для приглашения на вечеринку — пятница, а рекламные рассылки интернет-магазинов лучше всего делать с 19 и до 22 часов?

Наверняка многим знакома ситуация, когда ломаешь голову над тем, когда лучше отправить рассылку с оповещением, например, о новой акции или коммерческое предложение потенциальному клиенту. Если отправить в пятницу вечером — прочитают ли? Или подождать до утра понедельника? Что лучше — писать в канун праздника или в праздники, в разгар рабочего дня или вечером? К счастью, на эту тему накоплена огромная статистическая база и в этой статье мы поделимся с вами простыми правилами эффективного email маркетинга — в какой день и в какое время писать важные письма в зависимости от их темы.

Начнём с того, как выбрать день для отправки вашего письма.



Под катом — расшифровка данных и материал о выборе времени для отправки в течение дня.

Читать дальше →
Total votes 47: ↑42 and ↓5 +37
Comments 9

Закат Stack Overflow

Reading time 12 min
Views 78K
Как тролли захватили ваш любимый сайт вопросов и ответов по программированию

Сайт Stack Overflow был создан в 2008 году Джеффом Этвудом и Джоэлем Спольским как более открытая альтернатива возникшим ранее аналогичным сайтам, таким как, например, Experts-Exchange. Название для сайта было выбрано голосованием в апреле 2008 года читателями популярного блога по программированию Coding Horror, который вёл Этвуд.

Многие годы сайт Stack Overflow был одним из самых популярных ресурсов для программистов, пытающихся решить какую-то проблему. Поскольку вопросы, размещавшиеся на Stack Overflow, часто оказывались среди первых, которые выдавал Google в каком-либо поиске, относившемся к программированию, то пользователи массово приходили на сайт и начинали задавать свои собственные вопросы.

На июль 2015 года у Stack Overflow было более 4 млн. зарегистрированных пользователей и почти 10 млн. вопросов (без учёта удалённых пользователей и вопросов). Однако в исследовании 2013 года было выявлено, что 77% пользователей задают только один вопрос, 65% отвечают только на один вопрос и лишь 8% пользователей дают ответы на более чем 5 вопросов. В настоящей статье я хотел бы рассмотреть возможные причины такого чрезвычайно низкого процента.
Читать дальше →
Total votes 109: ↑93 and ↓16 +77
Comments 386

Скринкаст: монада Maybe на языке C#

Reading time 1 min
Views 20K
Небольшая иллюстрация того, как на языке C# реализовать монаду Maybe и зачем это вообще нужно. Смотреть видео рекоммендуется в разрешении 720p.



Сопутствующую статью можно найти тут (англ. яз.). Комментарии приветствуются!
Total votes 54: ↑44 and ↓10 +34
Comments 41

Событийная модель на основе async и await

Reading time 7 min
Views 25K
В далеком 2012, когда цена на нефть еще была трехзначной, а трава зеленее, майкрософтом был выпущен .NET 4.5, а с ним и конструкция async/await. Про неё написано уже довольно много статей (Async в C#), а большинство разработчиков C# хорошо её изучили. Но все ли варианты использования были рассмотрены, можно ли выжать из await немного больше?

Самым очевидным вариантом использованием этой конструкции является ожидание завершения некой асинхронной операции. Первое, что приходит на ум — это ожидание ввода-вывода. Например, мы послали запрос клиенту и ожидаем ответа, тогда используя await мы сможем продолжить выполнение кода после получения ответа, а сам код при этом будет выглядеть синхронным. Но что если во время ожидания возникнет необходимость прервать выполнение этой операции? Тогда нам придется использовать CancellationToken, причем если таких операций несколько, то токены необходимо будет линковать или использовать один общий токен. При этом причина отмены будет скрыта от кода, использующего этот CancellationToken. Кроме отмены, код должен поддерживать обработку потери соединения, таймаута, возвращаемых ошибок и т.д.

В классическом варианте это выльется в использование CancellationToken для обработки отмены, try catch для обработки разрыва соединения и код анализа возвращенных данных, для оценки результата запроса. Но можно ли уместить всё это в единой парадигме? В этот статье я предлагаю рассмотреть альтернативный подход, основанный на событийной модели с использованием синтаксического сахара async/await.
Читать дальше →
Total votes 24: ↑23 and ↓1 +22
Comments 23

MugenMvvmToolkit — кроссплатформенный MVVM фреймворк

Reading time 18 min
Views 28K

MugenMvvmToolkit


Введение


Паттерн MVVM хорошо известен, о нем написано много статей, наверное каждый NET-разработчик сталкивался или слышал об этом паттерне. Цель этой статьи – рассказать о собственной реализации этого паттерна.
MugenMvvmToolkit — является кроссплатформенной реализацией паттерна MVVM и на текущий момент поддерживает следующие платформы:
  • WinForms
  • WPF
  • Silverlight 5
  • Silverlight for WP7.1, WP8, WP8.1
  • Xamarin.Android
  • Xamarin.iOS
  • Xamarin.Forms
  • WinRT XAML framework for Windows 8 Store apps

Читать дальше →
Total votes 38: ↑36 and ↓2 +34
Comments 16

The dangers of not looking ahead

Reading time 3 min
Views 23K
На первый взгляд, dynamic в C# — просто object с поддержкой машинерии компилятора. Но не совсем.

Ядром времени выполнения является DLR (Dynamic Language Runtime) — подсистема/фреймворк для поддержки динамических языков программирования. Существует реализация под собственно C#, который идет в поставке с .NET, и отдельная для Iron-языков.

Когда мы работаем с обобщениями (generics), то CLR имеет свои оптимизации на предмет специализации оных. В тот момент, когда CLR+DLR должны работать с generics вместе, поведение написанного кода может стать непредсказуемым.
Читать дальше →
Total votes 35: ↑33 and ↓2 +31
Comments 13

Пять советов тому кто публикует свой .Net проект на GitHub

Reading time 2 min
Views 15K
GitHub Octocat Professor

Статья рассчитана в первую очередь на новичков и тех кто только собирается опубликовать свой первый проект на GitHub. Те у кого уже есть опубликованные проекты также могут почерпнуть что-то полезное и написать свои лучшие практики в комментариях. В статье представлены пять простых советов как улучшить ваш GitHub проект.

Читать дальше →
Total votes 28: ↑16 and ↓12 +4
Comments 13

Как обойтись почти без исключений, заменив их уведомлениями

Reading time 14 min
Views 26K
Здравствуйте, Хабр.

Иногда попадаются статьи, которые хочется перевести просто за имя. Еще интереснее, когда такая статья может пригодиться специалистам по разным языкам, но содержит примеры на Java. Совсем скоро надеемся поделиться с вами нашей новейшей идеей по поводу издания большой книги о Java, а пока предлагаем ознакомиться с публикацией Мартина Фаулера от декабря 2014, которая до сих пор не была переведена на русский язык. Перевод сделан с небольшими сокращениями.
Читать дальше →
Total votes 20: ↑20 and ↓0 +20
Comments 37

Замена выброса исключений уведомлениями

Reading time 10 min
Views 18K
Предлагаю вашему вниманию перевод статьи "Replace Throw With Notification" Мартина Фаулера. Примеры адаптированы под .NET.

Если мы валидируем данные, обычно мы не должны использовать исключения, чтобы известить о валидационных ошибках. Здесь я опишу как отрефакторить такой код с использованием паттерна «Уведомление» («Notification»).



Недавно я смотрел на код, который делал базовую валидацию входящих JSON сообщений. Это выглядело примерно так…
Читать дальше →
Total votes 19: ↑14 and ↓5 +9
Comments 34

Видеозаписи семинара CLRium #2

Reading time 1 min
Views 11K
Добрый день! Не так давно прошла серия семинаров CLRium по новейшим технологиям и редко-раскрываемым темам CLRium #2. Мы собрали у себя в залах около 740 человек, что для нас является — фантастическим результатом. Сегодня хотелось представить вам свежие видеозаписи семинара и ссылки на репозитории спикеров:

День 1:

Ссылки с привязкой ко времени:

Читать дальше →
Total votes 33: ↑31 and ↓2 +29
Comments 11

Подходы к проектированию RESTful API

Reading time 17 min
Views 136K

Автор: Вячеслав Михайлов, Solutions Architect.

В этой статье я поделюсь опытом проектирования RESTful API — на конкретных примерах покажу, как делать хотя бы простые сервисы красиво. Также мы поговорим, что такое API и зачем он нужен, поговорим об основах REST — обсудим, на чем его можно реализовывать; коснемся основных веб-практик, которые зависят и не зависят от этой технологии. Также узнаем, как составлять хорошую документацию, затрачивая на это минимум усилий, и посмотрим, какие существуют способы нумерации версий для RESTful API.

Часть 1. Теория


Итак, как мы все знаем, API — application programming interface (интерфейс программирования приложений), набор правил и механизмов, с помощью которых одно приложение или компонент взаимодействует с другими

Почему хороший API — это важно?

  • Простота использования и поддержки. Хороший API просто использовать и поддерживать.
  • Хорошая конверсия в среде разработчиков. Если всем нравится ваш API, к вам приходят новые клиенты и пользователи.
  • Выше популярность вашего сервиса. Чем больше пользователей API, тем выше популярность вашего сервиса.
  • Лучше изоляция компонентов. Чем лучше структура API, тем лучше изоляция компонентов.
  • Хорошее впечатление о продукте. API — это как бы UI разработчиков; это то, на что разработчики обращают внимание в первую очередь при встрече с продуктом. Если API кривой, вы как технический эксперт не будете рекомендовать компаниям использовать такой продукт, приобретая что-то стороннее.


Теперь посмотрим, какие бывают виды API.

Виды API по способу реализации:
  • Web service APIs
    • XML-RPC and JSON-RPC
    • SOAP
    • REST

  • WebSockets APIs
  • Library-based APIs
    • Java Script

  • Class-based APIs
    • C# API
    • Java



Виды API по категориям применения:

  • OS function and routines
    • Access to file system
    • Access to user interface

  • Object remoting APIs
    • CORBA
    • .Net remoting

  • Hardware APIs
    • Video acceleration (OpenCL…)
    • Hard disk drives
    • PCI bus



Читать дальше →
Total votes 26: ↑24 and ↓2 +22
Comments 37

Реализация потокобезопастного алгоритма round-robin на Java

Reading time 2 min
Views 7.7K
Доброго времени суток, уважаемый хабрачитатель.
В один прекрасный рабочий день начальство поставило задачу добавить в разрабатываемую нами систему возможность использовать несколько серверов для повышения производительности. Разворачивать кластер и осуществлять балансировку за счет специализированных средств возможности не было. Поэтому пришлось придумывать свою реализацию, используя алгоритм round-robin.
Читать дальше →
Total votes 8: ↑4 and ↓4 0
Comments 16

О приложениях UWP для разработчиков WPF

Reading time 8 min
Views 54K

Хотел бы закодировать разработчиков WPF от боязни чего-то нового, рассказав про отличия, которые ожидают их при разработке приложений под универсальную платформу Windows. Так что ставьте банки перед монитором, я начинаю давать установку.

Какие-то изменения в языках программирования и платформах происходят постоянно. Представьте себе на минуту, что выйдет C# версии 10 и все. Это последняя версия. Представили? Я представил. И в моем представлении если это и случится когда-нибудь, то эта последняя версия языка будет регулярно обновляться.

Были «чудесные» времена, когда у меня немного разбегались глаза от различий в коде (даже в коде XAML): WPF, Silverlight, Windows Phone, потом WinRT, а теперь еще и UWP. Сколько разработчиков никогда не путаются? Я думаю, что большинство разработчиков не держат все в памяти. Достаточно держать в памяти основные концепты работы. Когда дело касается кодирования, то используются вспомогательные инструменты вроде IntelliSense, Blend и т.п. Никуда не уйти и от использования сниппетов.
Читать дальше →
Total votes 23: ↑17 and ↓6 +11
Comments 2

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity