Integration Patterns: Репликация и очередь сообщений

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

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

Сложность была в том, чтобы достаточно быстро обрабатывать большие объемы данных. База данных проекта размером порядка 700 ГБ, среднее количество записей в основных таблицах около 100 млн.

Определение провала IT-проекта

Из всех монстров, которыми наполнены кошмары нашего фольклора, самыми страшными являются оборотни, поскольку нас пугает неожиданное превращение того, что нам хорошо знакомо, в нечто ужасное. Мы ищем серебряные пули, которые могли бы волшебным образом уложить оборотней наповал.
Хорошо знакомый программный проект напоминает таких оборотней (по крайней мере, в представлении менеджеров, не являющихся техническими специалистами) тем, что, будучи простым и невинным на вид, он может стать чудищем проваленных графиков работы, раздувшихся бюджетов и неработающих продуктов.
"Мифический человеко-месяц", Ф.Брукс

Хочу поделиться обобщением историй от заказчиков IT-проектов, с которыми мне удалось пообщаться и поработать. Эти истории очень похожи, а значит на их примере можно научиться, сделав нужные выводы.

Так получается, что в мою компанию приходят проекты со сложной историей: прошел первый deadline, прошел второй, релиза нет, инвесторы в отчаянии, проект готовы выкинуть и признать провальным. Мы вытащили не один такой проект и сделали успешный релиз.

Проекты моей компании

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

  • Высоконагруженные приложения
  • Облачная инфраструктура (AWS, Azure)
  • Data mining

Основные технологии:

  • .NET Framework
  • JavaScript (SPA)

Integration Patterns: актуальные инструменты и решения

Корпоративные системы состоят из множества подсистем, которые написаны на разных языках и платформах. Используются общие БД, репликации, обмен сообщениями и другие средства интеграции.

Большие возможности для маленькой компании

С этим докладом я выступал в IT-парке Казани и на Дне программиста в Ульяновске.

Подборка манифестов из мира IT

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

В статье описаны:

  1. Manifesto for Agile Software Development
  2. Agile Manifesto - IBM version
  3. MoreAgile Manifesto
  4. Agile Manifesto 2.1
  5. Manifesto for Half-Arsed Agile Software Development
  6. Declaration of Interdependence
  7. Programming, Motherfucker
  8. Software Craftsmanship Мanifesto
  9. DevOps Manifesto

7-я конференция .NET разработчиков

Уже по традиции собираться раз в полгода, мы устраиваем 7-ю конференцию .NET разработчиков. Пройдет она 22 сентября в Челябинске.

История и принципы бережливого производства ПО

Немного предыстории как я попал в Казань с докладом про Lean.

Предыстория: ulcamp 2013

Месяц назад я был в Ульяновске на ulcamp 2013. Это уникальная конференция под открытым небом с палатками. Два дня мы купались в Волге, загорали и ходили от доклада к докладу. Я неожиданно для себя выступил с докладом про Domain Driven Design. Чтобы прочувствовать формат конференции, посмотрите на "площадку" моего выступления:

Летняя школа программистов в Челябинске

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

Темы семинаров, по которым шло обучение:

  1. Continuous Delivery
  2. Принципы проектирования приложений
  3. Шаблоны проектирования
  4. Тестирование приложений
  5. Проектирование масштабируемых высоконагруженных приложений
  6. Чистый код, рефакторинг

SignalR как средство коммуникации в .NET приложениях

Пользователи веб-приложений (а значит и заказчики) всё больше любят SPA с богатой логикой и всё меньше любят, когда страницы перегружаются. До определенного времени большинство сценариев можно было сделать с помощью Ajax и pull-технологий, но сейчас этого уже мало.

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

Техническое задание как база знаний о проекте

Разработка ПО - это процесс создания знания. Общая идея продукта, прототипы дизайна и концепция архитекутры могут появиться до начала разработки, но их правильность или неправильность будет проверена только в ходе работы над проектом.

Эволюция управления зависимостями в коде

На последней конференции .NET разработчиков, которая прошла 28 апреля в Челябинске, я проводил мастер-класс по управлению зависимостями в коде. Моей целью было показать, как эволюционировал подход к управлению на протяжении времени и какие идеи актуальны в данный момент.

Continuous Integration: Рефакторинг Config-файлов

Скачать исходный код

XML-код в config-файлах, как и любой другой код, может излучать плохой запах. Мы должны следить за тем, чтобы код оставался чистым, например, давать хорошие названия свойствам и нодам, устранять дублирование. В статье рассмотрим способы, с помощью которых можно избежать дублирования.

До того, как наш релиз попадет на боевой сервер, он обычно разворачивается сначала на окружении для разработки, потом на staging или preproduction, а уже потом идет на сервер с конечными пользователями. Для каждого из этих окружений нужно выставить свои настройки подключения к БД, SMTP-сервера, пути в файловой системе и т.п.

В примерах я буду писать про App.config, но всё описанное будет применимо и для Web.config, и для любого config-файла, основаного на XML.

Continuous Integration: Трансформация App.config

Скачать исходный код

При работе с корпоративными проектами нужно создавать приложения разного рода. Например, проект может содержать несколько веб-сайтов, WCF-сервисы, Silverlight-приложения, Windows-сервисы или консольные утилиты. Все эти приложения нужно будет включить в Continuous Integration, чтобы выпуск версий для тестового сервера и боевого производился в автоматическом режиме. У всех этих приложений есть файлы настроек, которые обычно хранятся в App.config или других XML-подобных файлах. Для разных версий приложений мы должны хранить свои строки подключения к БД, ссылки к сторонним сервисам, SMTP-хостам, задавать разные уровни логирования и т.п.

Мы уже рассмотрели, как работать с Web.config, как писать для него трансформацию, что такое трансформация и как она встраивается в процесс сборки проекта. Продолжим эту тему рассмотрением работы с App.config.

Проекты моей компании: Проект Pandorama

15 мая 2013 г.

Недавно я писал о том, что компании ByndyuSoft исполнился 1 год. Хочется больше описывать то, что мы делаем, но проекты довольно долго разрабатываются и не все лежат в публичном доступе.

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

Проект: http://pandorama.com

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

Сервис обрабатывает сотни тысяч статей ежедневно. Всё это сделано с хорошей балансировкой нагрузки и оптимизацией алгоритмов сбора и анализа информации. Из основных технологий back-end'а можно выделить: ASP.NET MVC, RabbitMq, MSSQL + MongoDB.

Делать проект такого уровня очень интересно. Сюда входят и новые технологии, и новые платформы разработки. К тому же это одностраничное приложение с богатой логикой на JavaScript, самое трендовое направление в веб-разработке. Всё реализовано под различные браузеры, мобильные устройства и ОС.

При разработке команда и Product Owner переходили от Scrum к Kanban, адаптируя методы гибкой разработки под требования проекта.

В данный момент проект запущен на американском рынке и продолжает развиваться.

Continuous Integration: Создание собственной конфигурации

Скачать исходный код

Конфигурации сборки (build configurations) обеспечивают хранение нескольких версий настроек для солюшена и проектов. Создание новой конфигурации будет необходимым шагом для работы с несколькими окружениями и версиями релиза.

Для начала рассмотрим, что такое конфигурация сборки на уровне проекта и на уровне солюшена. Потом создадим свою конфигурацию и config-файлы для нее.

Continuous Integration: Процесс сборки проекта и трансформации Config-файлов

Скачать исходный код

Мы рассмотрели основы трансформации Web.config. Теперь стоит углубится в тему сборки проекта и рассмотреть детально, когда и как делается трансформация файлов конфигурации.

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

Continuous Integration: Трансформация Web.config

Скачать исходный код

Начнем рассмотрение работы с config-файлами с самой простой темы. Создадим приложение ASP.NET MVC 4. По-умолчанию в созданном проекте уже есть 2 конфигурации (Debug, Release) и 3 config-файла (Web.config, Web.Debug.config, Web.Release.config):

Continuous Integration: Работа с Config-файлами

Скачать исходный код

Сборку проекта и выпуск артефактов для релиза уже давно никто не осуществляет вручную. Весь процесс интеграции и Deploy довольно просто автоматизируется с помощью TeamCity, Cruise Control.NET или Team Foundation Server.

Dotnetconf #6: мастер-классы

Открыта регистрация на 6-ю конференцию .NET разработчиков.
Дата проведения — 28 апреля 2013
Место проведения — г. Челябинск, Отель ParkCity
Вход бесплатный после регистрации, количество мест ограничено.
Бесплатные обеды и подарки от спонсоров.
Регистрация на сайте http://www.dotnetconf.ru/Registration

Моей компании 1 год

Ровно год назад 6 апреля я сделал первый коммит в первый репозиторий первого проекта своей компании. Тогда за час с небольшим я смог объяснить представителю заказчика прелесть работы по Agile. Его начальник нам не поверил и сел писать техническое задание. Мы же каждый день делали релиз и получали обратную связь. К концу первой итерации, когда заказчик дописал ТЗ, мы дали ему готовый продукт. Так началась компания ByndyuSoft.

Dapper + QueryObject, как замена ORM

Не так давно я утверждал, что нужно использовать высокоуровневую ORM и даже делал опрос на эту тему. Как показал опрос, не многие пишут SQL-запросы руками.

Проблематика

Для работы с типовыми проектами действительно не надо углубляться в вопросы специфики SQL. Но сейчас я веду проект, где без этого просто не обойтись. Речь про базы данных по 700ГБ и требования к отклику на UI менее 1 секунды. При этом происходит много разных расчетов, строятся графики и т.п.

Для начала я по привычке использовал NHibernate. Уже через пару итераций оказалось, что эта ORM мне не подойдет (не говоря уже про EntityFramework) по следующим причинам:

  • Скорость: создание сессии, маппинг и другие сопутствующие вещи отнимали до 200 мс. В моем случае это 20% времени, которое тратилось впустую;
  • Гибкость запросов: сначала я писал запросы на Linq, потом понял, что трудно сделать хитрые запросы и добавлять хинты через высокоуровневые интерфейсы типа Linq, QueryOver или Criteria. Из всех возможностей NHibernate я начал использовать только функцию ExecuteSql, но скорость маппинга была слишком низкой;
  • Утечки памяти: увы, но в NHibernate есть утечки памяти. Когда в вашей системе делается много запросов, это становится критичным. Сервисы через 20-30 часов работы падали с OutOfMemoryException и MemProfiler указал на NHibernate;
  • Много чтения, мало записи: в проекте мне надо считывать очень много данных, получается такой cRRRRud, поэтому UoW от NHibernate оказался тоже не нужен.

ALT.NET наносит ответный удар

3 марта 2013 г.

В конце апреля 2013 произойдет нечто большое для сообщества ALT.NET. Две конференции на русском dotnetconf.ru и английском dotnetconf.net.

Мы со Cкоттом Хансельманом решили устроить большую тусовку по продвижению лучших практик разработки ПО в мире .NET, это будет значимое событие.

Что планируется в русскоязычной части:

  • Мастер-классы, которые разделены на 2 потока: начинающие, опытные. Есть множество студентов, которые не могут сходить на конференцию, потому что темы слишком сложные. Мы хотим предложить им темы для начинающих;
  • Видео трансляция + хотелось бы увидеть мастер-классы из разных городов в полностью онлайн режиме.

Темы должны быть сопряжены с топовыми практиками и инструментами разработки. Для студентов это будет трек с введением в топовые практики и инструменты.

Друзья, я буду рад, если вы примете в этом участие:

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

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

Материалы семинара для студентов: Карьера в IT + Тренды в разработке ПО

Сегодня прошел семинар для студентов ЮУрГУ, который я недавно анонсировал. Ниже я выкладываю слайды и некоторые комментарии по выступлению.

Обновление инфраструктуры до версии 1.0.13

21 февраля 2013 г.

Недавно я писал о том, что наша компания открыла исходники инфраструктуры, на которой мы строим свои проекты.

Исходники инфраструктуры на GitHub

Пример на ASP.NET MVC и NHibernate

Над версией 1.0.13 потрудился Тимур, основные изменения описаны в changelog'е.

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

Желательно, чтобы он обрастал вашими примерами в папке Samples.

Семинар для студентов: Карьера в IT + Тренды в разработке ПО

27 февраля 2013 с 11.30 до 13.30
ЮУрГУ, ауд. 205/3г
Вход бесплатный

На семинаре я рассмотрю две темы, которые я считаю актуальными и полезными для студентов.

Первая - вопросы, которые касаются будущей карьеры. Студенты должны отлично представлять какие первые шаги нужно сделать, чтобы стать успешными в IT.

Вторая - что сейчас происходит в сфере разработки ПО в целом? Какие вещи являются модными? Что используют? От чего отказываются?

Комментарий к коммиту до коммита

Вы встречались с проблемой, когда вы пишите много кода, нажимаете коммит и не знаете как сформулировать комментарий? Такое случается, когда во время кодинга было сделано несколько подзадач, еще рефакторинг, еще code cleanup небольшой и т.п. Приходится писать либо очень большой комментарий, либо опустить руки и написать «fixes» или «big changes» или подобный комментарий, который ничего не значит. При работе в команде такие комментарии наносят большой вред, т.к. становится сложно понять, что происходит с кодом:

Моя книга «Антихрупкость в IT»

Как достигать результатов в IT-проектах в условиях неопределённости. Подробнее...