Пару недель назад я прочитал на dev.by о семинаре для веб-архитекторов и сразу загорелся желанием его посетить – события подобного рода в нашей стране пока не проводилось. Семинар организовывался компанией, где я сейчас работаю, так что по ходу дела помогал организовывать сие действо на месте.
Семинар проходил в образовательном центре IBB, в котором я до этого ни разу не был и который мы с таксистом с трудом нашли :). Здание выглядит необычно, а внутри встречает приятной обстановкой и мягкими яркими диванами.
Заявленную аудиторию нашел быстро, хотя, как оказалось, ее заменили на соседнюю – чуть более просторную. Оставив вещи, пошел на вход встречать участников семинара и направлять их в нашу аудиторию. Первым пришел Володя – ведущий семинара, ну а за ним стали подтягиваться и остальные. Перед началом мероприятия каждый из участников получил бедж для распознавания друг друга и блокнот с ручкой для записывания умных мыслей. Блокнотами я обычно не пользуюсь, но в этот раз исписал его почти до половины – информационный поток просто зашкаливал!
Пару слов о Владимире Лешкевиче, ведущем семинара. У Володи за плечами 14 лет профессиональной разработки ПО; начав простым разработчиком, он прокачался до технического директора, попутно успев побыть и техлидом, и менеджером. Он занимается обучением и коучингом проектных команд по различным технологическим направлениям и процессам разработки. Проработав с Володей некоторое время на реальном проекте, я ожидал от семинара многого, и, конечно, мои надежды оправдались на все 200% - субъективно для меня это был лучший IT день за прошедшие несколько лет.
Все началось, как в первом классе – с представления себя и своего рода деятельности. Уровень участников был очень высокий – не припомню никого ниже senior software engineer. Что приятно удивило – среди участников было два человека из Могилева, специально приехавшие в Минск на семинар.
Выступления Володя проводил по четырем основным темам:
Архитектура веб-приложений;
Сервисно-ориентированные архитектуры;
Объекты-значения в DDD;
Производительность и масштабируемость веб-приложений.
Для каждой из тем была заготовлена презентация с основными моментами – но кто ходит на выступления читать презентации?! Володя это прекрасно понимал, потому самое вкусное рассказывал и рисовал на доске.
Архитектура веб-приложений
Первой рассмотренной темой была «Архитектура веб-приложений» - наверное, самое простое, что было обсуждено в этот день. Выступление началось с опроса – что интересует участников? Основные интересующие моменты таковы:
Как и где проводить границу между Model, View и Controller в паттерне MVC?
Как разделять серверную и клиентскую части приложения?
Как бороться с разрастанием веб-приложений?
Для начала Володя рассказал о возникновении паттерна MVC и о его первоначальном значении, которое было заложено в языке SmallTalk. Для наглядности был продемонстрирован маленький пример на том же SmallTalk, в котором изящно связывались данные с представлениями – лично меня эта кодинг-сессия приятно удивила и вызвала интерес к продемонстрированному языку. Как оказалось, большинство современных MVC фреймворков (ASP.NET MVC, Ruby on Rails, etc.) очень удалились от оригинальной концепции и выдают за MVC то ли MVP, то ли еще что другое.
Затем Володя представил основные проблемы веб-приложений, исходящие из модели Request-Response, заложенной в основу Веба. Существуют решения этих проблем, например, AJAX, но и они не всегда удовлетворяют требованиям и не до конца прячут низлежащий уровень от программиста и пользователя – во многом из-за проблем совместимости браузеров.
Далее была представлена эволюция паттерна MVC:
Оригинальная концепция
MVC model 1: Page = View + Controller, где были тесно связаны View и Controller
MVC model 2: архитектура с Front Controller, Filter Chain и кучей Actions для обработки запросов.
MVCS – MVC на сервисах
Для решения возникающих из-за модели Request-Response проблем стали создаваться различные фреймворки, такие как JSP, ASP. Для имитации десктопного программирования появились компонентные фреймворки ASP.NET, JSF, Tapestry, Wicket. Однако все эти фреймворки в полном соответствии с законом протекающих абстракций не давали полной изоляции и в случае проблем приводили к появлению непонятных ошибок с тяжелыми последствиями.
Проблему модели Request/Response попытались решить созданием отдельного класса приложений с «тяжелым» клиентом – Rich Internet Applications. Модель Request/Response была явно выделена в качестве отдельного компонента для связи с сервером и облегчения создания пользовательских интерфейсов. (Кстати, следует отметить один из принципов Володи – “Be Explicit!”. По нему любая неявно выраженная логика/абстракция/понятие скорее всего приведет к проблеме, которой можно было бы избежать, явно выделяя неявную концепцию.)
На данный момент популярными являются следующие RIA фреймворки:
Flex/Flash
Silverlight
Java FX
GWT – здесь, кстати, опять выскакивает закон протекающих абстракций: Java код компилируется в JavaScript, что может привести к необычным ошибкам, которые Java сама по себе вызвать не могла.
Одним из важнейших критериев качества UI фреймворков Володя считает testability – возможность тестирования написанного кода. Чаще всего для тестирования систем используются unit тесты и интеграционные тесты. На стороне unit тестов стоят скорость выполнения, простота написания и покрытия. На стороне интеграционных тестов – польза тестирования нескольких компонентов сразу, за что, правда, приходится расплачиваться значительно возрастающей сложностью тестов. Эту сложность можно преодолеть с помощью инструментов интеграционного тестирования:
Selenium
Fit
HttpUnit
(Было интересно узнать, что некоторые участники используют эти инструменты ежедневно для автоматического тестирования новых версий приложений.)
Как оказалось, и в стане RIA фреймворков не все так просто – вышеупомянутый оригинальный MVC нигде не встречается, везде идут лишь местные замены. К чему это приводит программиста? К необходимости постоянно дописывать свои каркасы на основе базовых классов фреймворков. Часто в качестве замены MVC используется паттерн MVP (Model – View – Presenter) – главное его отличие от MVC заключается в том, что в MVP презентер может давать команды View, а не передавать команды лишь через модель, как в оригинальном MVC.
Далее Володя продемонстрировал очередную кодинг-сессию. На этот раз мы увидели реализацию паттерна MVP на языке Java: маленькое консольное приложение действительно отлично работало и исправно конвертировало переданные ей на вход валюты :)
Кофе-пауза
Сразу после первого выступления мы устроили себе перерыв и разбились по кучкам с чашками свежего кофе и вкусным печеньем. Что порадовало – люди легко шли на контакт и с удовольствием обсуждали архитектурные проблемы и их решения. И надо сказать, момент такой неформальной коммуникации между специалистами различных компаний очень приятен и вызывает желание провести подобный семинар хотя бы ради него.
Сервисно-ориентированная архитектура
Второй темой выступления была «Сервисно-ориентированная архитектура». Для старта мы рассмотрели основные критерии сервиса:
Автономный;
Имеет явные границы;
Имеет явный контракт для взаимодействия;
Исторически наши приложения работают с базами данных, причем в большинстве случаев с монолитным куском данных. Сервисы же позволяют разбить этот кусок на несколько зон с различными ответственностями и зависимостями.
Сервисы, как и паттерн MVC, оказались богаты на историю:
RPC – Remote Procedure Call – наверное, первое, что использовалось для подобных целей
XML-RPC – формализация RPC, использующая XML в качестве основного формата передачи данных
Web Services – SOAP формат на основе XML.
REST – Representational State Transfer
SOA – сервисно-ориентированные архитектуры
Далее Володя представил плюсы и минусы SOAP Web Services. Плюсы:
Открытые стандарты и протоколы
Четко выверенный и разделенный интерфейс
Service discovery
Богатый набор инструментов
Минусы:
Сложность и протекающие абстракции
Несовместимость
Производительность
Альтернативой SOAP WS являются REST WS:
У каждого ресурса есть свой URI, по которому они доступны
Представления – то, что идет вовне и видно всем
Переходы состояний:
GET – получить
POST – создать
PUT – обновить
DELETE – удалить
Плюсы:
Простота запросов и действий
Малый порог вхождения – все очень просто
Масштабируемость простым копированием
Минусы:
Oчень узкий интерфейс для всего многообразия действий
Не очень легко настроить
Затем Володя представил сформулированные своими коллегами принципы фронт-енд архитектур для сервисно-ориентированных систем (SOFEA – Service Oriented Front-End Architecture). Следует отметить, что этот вопрос не очень хорошо проработан и что эти принципы действительно чуть ли не в первый раз показывались публике.
Для начала – минусы традиционного «тонкого клиента»:
Обмен неструктурированными данными
Связь presentation flow и обмена данными
Проблема с кнопкой Back (о нет, не напоминайте...)
Request/Response цикл
Нет прямого взаимодействия двух клиентов
Принципы SOFEA:
Разделение Application Download, Presentation Flow, Data Interchange
Различные варианты Application Download (тонкий/толстый клиенты)
Presentation Flow определяется только клиентом, не должно проходить никаких Request/Response циклов для смены экрана
Обмен данными не должен быть слабым звеном
B Presentation должен использоваться MVC
Технологии, которые можно использовать для SOFEA:
DHTML/AJAX:
JS
GWT
XML-based
XAML
MXML
Java
JavaFX
Java WebStart
Adobe Flex
Кофе-брейк
На этом кофе-брейке образовательный центр IBB порадовал нас не только печеньем, но и бутербродами :) Опять все те же группки, уже более активные обсуждения – людям явно нравилось все происходящее.
Value objects in DDD
Тема DDD очень обширная, поэтому в данном выступлении Володя лишь провел обзор DDD и углубился именно в объекты-значения.
Для начала мы рассмотрели взаимосвязь домена заказчика и доменной модели нашего приложения, обсудили вопросы создания доменного языка, с помощью которого можно единым образом описывать все происходящие в системе процессы.
DDD характеризуется:
Связью с бизнес-доменом
Явно выделенной доменной моделью приложения
Ubiquitous language – четко определенный язык
Model-Driven Design – MDD – развитие приложения «от модели»
Особенности реализации DDD:
ООП – нативное представление естественных концепций
Многослойная архитектура
Entities – сущности
Value Objects – объекты-значения
Доменные сервисы
Bounding contexts - граничные контексты
В DDD сущности несут в себе несколько основных концепций, в частности, роли в системе, ответственности в системе и identity – способность быть распознанной среди других сущностей. Объекты-значения отличаются от сущностей отсутствующей identity. Доменные сервисы объединяют ту логику, которую нельзя явно отнести ни к одной сущности. Bounding contexts используется для деления домена на поддомены.
Мы затронули очень часто встречающийся антипаттерн – Anemic Domain Model. Этот антипаттерн характеризует такое состояние доменной модели, когда:
Действие делает не модель, а его делают над моделью
Сущности просто несут данные без какой-либо логики
Володя показал несколько примеров Anemic Domain Model, для каждого из которых привел пример рефакторингов, которые оживили ее и придали ей смысл.
Основной причиной для введения объектов-значений является необходимость представлять какие-либо данные и при этом явно держать свой контекст. В качестве примера можно привести SocialSecurityNumber вместо простого String или Identifier вместо привычного Integer. Подобный подход напоминает нам про подход «Be Explicit!», который решает многие проблемы.
Особенности объектов-значений:
Явное представление контекста домена
Центры гравитации для поведения – концентрируют логику
Явно определяют свой интерфейс
Они всегда корректны – валидация происходит в момент создания объекта-значения и уже созданный объект-значение всегда корректен
Тестируемость
Локальность
Когерентность – обладают высоким уровнем внутренней согласованности, как FirstName и LastName, а не FirstName и CarBestseller
Объекты значения это не объекты для хранения данных! VO = DO + поведение. Data objects нужны только для передачи данных между различными bounding contexts, внутри доменного контекства использовать data objects нельзя. Еще одной отличительной особенностью объектов для хранения данных является полная несогласованность хранящихся в них данных. В качестве техник для активизации объектов-значений на проекте Володя привел рефакторинг и инкапсуляцию.
Заключительный кофе-брейк
К моменту окончания третьего выступления мы уже вышли за ранее предполагавшиеся рамки мероприятия, однако никто не утратил запала и мы вышли на финишную прямую.
Web application performance. Scalability.
Для начала мы определились с терминологией:
Производительность (performance) – количество действий в единицу времени
Масштабируемость (scalability) – способность функционировать при увеличении доступных ресурсов
Доступность (availability) – способность работать в заданных интервалах времени
Определив необходимые термины, Володя привел подходы к улучшению производительности:
Определить требования к производительности приложения
Обосновать выбор технологии
Тестировать репрезентативно в реальных условиях
Тестировать постоянно, чем раньше, тем лучше
Наблюдай и диагностируй
Измеряй, не гадай
Введи счетчики производительности
Используй средства диагностики
Оптимизируй только то, что действительно надо оптимизировать
Три правила оптимизации:
Не оптимизируй
Еще не оптимизируй
Профайли и смотри, где надо оптимизировать
Определи, изолируй, диагностируй, улучши, проверь
Разделяй ответственность за производительность со всей командой
Далее Володя подчеркнул основные моменты клиентской производительности:
Рендер страницы может быть медленным (до 80% времени загрузки страницы)
Правила:
Минимизируй количество HTTP запросов
Используй Content Delivery Networks
Используй кеш браузера и прокси
Используй GZip
Размещай стили вверху, а скрипты внизу
Минимизируй количество DNS lookups
Вынеси JS и CSS из HTML
Уменьшай JS & CSS
Инструменты
YSlow
Google PageSpeed
Основные аспекты доступности:
Выбор: доступность или масштабируемость
Измерение доступности – количество девяток. Идеал – компания Ericsson с их 99.999999% доступностью в году
Уровень доступности приложения, явно указанный в контракте – допустим, не меньше 99.9999%
Основные аспекты масштабируемости:
Типы:
Горизонтальная – увеличиваем количество серверов
Вертикальная – увеличиваем мощность серверов
Техники:
Load balancing
Кеширование
Кластеризирование
Инфраструктура масштабируемости:
Load balancing
Stateful
Sticky sessions
Caching
Write policy
Appication caching
Web caching
Distributed caching (memcached)
Clustering
Grid-схема
Database
NOSQL подход – Not Only SQL
In-memory – базы данных в памяти
Distributed базы данных
Еще мы слегка затронули отдельные моменты систем cloud computing:
Распределенные вычисления на серверах другой компании
Типы cloud computing:
Веб-сервисы: Saleforce.com, Google maps
Сервисные платформы: Google App Engine, Amazon EC2, S3
Ну и напоследок Володя рассказал нам про принципы построения масштабируемых систем:
Четко определенные требования по масштабируемости
Анализ поведения пользователей – они больше сохраняют данные или просматривают их
Динамика контента – общий или персональный, часто или не часто меняется
Держать в уме устаревание данных – у вас всегда устаревшие данные! Следует учесть, что уровень устаревания данных определяется не вами, а вашим заказчиком и его бизнес-требованиями
Придерживаться принципа subscribe/publish вместо традиционного request/response – на такой подход недавно перешли такие многомиллионные сервисы, как Twitter и Facebook
Использовать Command-Query Separation
Использовать Actors – независимые асинхронные модули выполнения логики, изначально появились в языке Erlang и с тех пор обеспечивают компании Ericsson заветные 99.999999% доступности в году.
Впечатления от семинара остались чрезвычайно позитивные, лишние часы прошли незамеченными, а мелкие неудобства просто не замечались! Дух обсуждений, возможность пообщаться с коллегами поддерживали интерес к мероприятию на протяжении всего дня.
Громадное спасибо Владимиру Лешкевичу и компании Intetics, которые организовали этот праздник IT-счастья!
Где изучать Scala тем, кто уже что-то знает. Собрали множество курсов и платформ (июнь, 2023)
Язык программирования Scala — один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.
10 способов научиться программировать самостоятельно
Хотите научиться кодить и освоить алгоритмы? Собрали десять советов с чего начать изучение программирования для тех, кто только начинает своё путешествие в мир программирования и снабдили все это полезными ссылками на курсы для начинающих программистов.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.