С живой защитой проекта вы можете ознакомиться в этом видео:
Описание проблемы
Исходная задача
A large hotel reservation company wants to build the next generation hotel reservation and management system specifically tailored to high-end resorts and spas where guests can view and reserve specific rooms.
- Users: Guests (hundreds), hotel staff (less than 20)
- Requirements:
- Registration can be made via web, mobile, phone call, or walk-in.
- Guests have the ability to either book a type of room (standard, deluxe, or suite) or choose a specific room to stay in by viewing pictures of each room and its location in the hotel.
- The system must be able to maintain room status (booked, available, ready to clean, etc.) as well as when the room will be needed next.
- It must also have state-of-the-art housekeeping management functionality so that cleaning and maintenance staff can be directed to various rooms based on priority and reservation need using proprietary devices supplied by the reservation company attached to the cleaning carts.
- Standard reservation functionality (e.g., payments, registration info, etc.) will be done by leveraging the existing reservations system.
- The system will be web-based and hosted by the reservation company.
- Additional Context:
- ‘Peak season is quickly approaching, so the system must be ready quickly or we have to wait until next year!’
- Company is also investing heavily in cutting edge technology like smart room locks that open via a cell phone
- Only interested in the high-end market
- Sales people have tremendous clout in the organization; people often scramble to make their promises true
Контекст
Заказчик — крупная компания, с сильным отделом продаж, инвестирующая в такие передовых технологии как интернет вещей, связанный с отелями.
Основной бизнес заказчика — это бронирование номеров в отелях.
Компания уже эксплуатирует систему бронирования отелей, покрывающая стандартные функции, например: работа с оплатой, предоставление информации по регистрациям.
Заказчик намерен построить систему бронирования и управления отелями следующего поколения, ориентированную на элитные курорты и СПА. Будущие гости отелей перед бронированием могут визуально ознакомиться с номерным фондом и расположением отдельных номеров.
У заказчика должна быть полная картина о занятости и статусе каждого номера.
Система должна поддержать автоматизацию управления уборкой в номерном фонде.
Будущая система должна быть с веб-интерфейсом и размещаться у заказчика.
Проект должен быть запущен в сжатые сроки, так как близок сезон активного использования системы.
В пик нагрузки система должна беспроблемно обслуживать сотни гостей и не более 20 сотрудников отеля для каждого отеля, подключенного к системе.
Ожидается, что система позволит осуществлять регистрацию онлайн через веб, смартфон, заявки по телефону и без предварительной записи.
Бизнес-цели
Компания намерена:
- в сжатые сроки увеличить продажи услуг за счёт охвата рынка элитных курортов и спа, а также посредством инвестируемых передовых технологий,
- повысить эффективность существующего функционала системы в части своевременного отслеживания ЖЦ всего продаваемого номерного фонда,
- увеличить воронку продажи устройств для эффективного управления персоналом по уборке номеров, через добавление функций автоматизации процессов уборкой номерного фонда,
- увеличить продажи умных устройств, например «умные» замки для номеров.
Архитектурные драйверы
Исходя из задачи и бизнес-целей основными драйверами являются:
- текущая система резервирования отелей не отвечает требованиям к функционалу для сотрудничества с элитными курортами и спа,
- отсутствует синергия между продажами услуг резервирования и передовыми разработками, в которые компания активно инвестирует (например, устройства для автоматизации управления уборкой и «умные» замки, управляемые через смартфон).
Ограничения технологические и бизнесовые
- регистрация в системе может быть осуществлена через веб, смартфон и телефонный звонок,
- система резервирования уже существует, и к самой системе претензий нет,
- система должна иметь веб-интерфейс,
- система должна размещаться у заказчика (on premise),
- срок запуска системы ограничен 1 годом,
- система должна иметь опцию использования сопряжения с устройствами для персонала отвечающего за уборку номерного фонда и смартфонами гостей.
Описание требований
Стейкхолдеры
SH1: Гости отелей (доступность, производительность, масштабируемость, отказоустойчивость, удобство использования):
- с помощью системы должны быть способны найти подходящий для себя номер, визуально оценить, зарезервировать и оплатить его удобным для себя способом
- опционально, в случае если отель оборудован умными устройствами от заказчика, используют собственный смартфон с предустановленным приложением управлять доступными, в номерах и отеле, «умными» устройствами.
SH2: Штатные сотрудники отеля (доступность, производительность, масштабируемость, отказоустойчивость, безопасность):
- должны быть способны поддерживать в актуальном состоянии ЖЦ номерного фонда,
- должны быть способны поддерживать, в актуальном состоянии визуальную и не визуальную информацию о номерах отеля,
- должны быть способны бронировать номера.
SH3: Служба уборки в номерах (доступность, масштабируемость, отказоустойчивость, безопасность):
- опционально, при условии, что служба уборки номеров снабжена специальными устройствами, привязанными к тележкам для уборки, должны быть способны своевременно, в соответствии с приоритетами выполнять задания на уборку
Пользовательские сценарии
UC1: Работа с информации об отеле:
- штатный сотрудник, управляет состоянием номерного фонда доступных отелей (SH2),
- штатный сотрудник, управляет визуальной и не визуальной информацией о номерах отеля (SH2),
- штатный сотрудник, производит поиск свободных номеров в соответствии с условиями гостя (SH2)
- штатный сотрудник, осуществляет бронь/отмену брони по телефону, по запросу на стойке регистрации (SH2)
UC2: Резервирование номеров:
- гость, производит поиск свободных номеров в соответствии с критериями отбор (SH1)
- гость, бронирует/отменяет бронь через веб интерфейс (SH1)
- гость, бронирует/отменяет бронь через смартфон (SH1)
- гость, бронирует/отменяет бронь через заявку по телефону (SH1)
UC3: Уборка в номере:
- служба уборки в номерах получает задачу на уборку в номере (SH3),
- сотрудник службы уборки берёт задачу в работу (SH3),
- сотрудник службы уборки начинает выполнение задачи (SH3)
- сотрудник службы уборки завершает задачу по уборке (SH3)
- сотрудник службы уборки уведомляет о проблемах (SH3)
UC4: Управление устройствами номера:
- гость, штатный сотрудник, специалист службы уборки в номерах, открывает/закрывает номер, с помощью собственного смартфона (SH1)
Сценарии для атрибутов качества
QA1: доступность (UC1, UC2, UC3, UC4)
- управление состояние номерного фонда, должно иметь максимальный уровень доступности, так как это может критично сказаться на корректном резервировании номерного фонда,
- недоступность системы при публикации актуальной визуальной/ не визуальной информации о номерах отеля может стать причиной рекламаций со стороны требовательных гостей,
- несвоевременное подтверждение заявок может сказаться на продажах номерного фонда,
- гости элитных курортов и спа не должны сталкиваться с какими-либо проблемами доступа к системе, при поиске номеров или во время выбора номеров и бронирования,
- недоступность системы, для службы уборки в номерах, напрямую влияет на качества и своевременность сервиса,
- сервисы управления умными устройствами в номере должно иметь высокий уровень доступности для гостей.
Полагаем что, система относится к уровню Business critical системам.
QA2: производительность (UC1, UC2, UC3)
- реакция системы на управление номерным фондом, в пик нагрузки, для отеля, не должна превышать 3 с (при условии замеров на границе publiс-DMZ),
- реакция системы на доставку единицы визуальной информации о номерном фонде, для отеля, не должна превышать 8 сек (при условии замеров на границе publiс-DMZ),
- реакция система на бронь по телефону номера/номеров не должна превышать 3 с (при условии замеров на границе publiс-DMZ),
- реакция система на бронь по веб номера/номеров, не должна превышать 3 с (при условии замеров на границе publiс-DMZ),
- реакция система на бронь через смартфон, не должна превышать 3 с (при условии замеров на границе publiс-DMZ и соблюдения нефункциональных требований к мобильному устройству),
- реакция системы на поиск подходящего отеля и номера/номеров не должна превышать 5 с (при условии замеров на границе publiс-DMZ).
QA3: масштабируемость (UC1, UC2, UC3, UC4)
- максимальное число штатных сотрудников отеля в смену 20,
- максимальное число гостей отеля 1000.
QA4: отказоустойчивость (UC1, UC2, UC3, UC4)
- штатные сотрудники должны беспрепятственно и любых проблем поддерживать в актуальном состоянии номерной фонд. Любые коллизии, связанные с резервированием, могут сказаться на рейтингах отеля или курорта,
- для гостей, система должна работать стабильно. Любая поломка/сбой может привести к потере гостей,
- любые сбои в службе уборки номеров могут повлиять на своевременные приём гостей и смещении в графике уборки номерного фонда,
- поломка/сбой «умного» замка может привести к снижению рейтинга отеля.
QA5: удобство использования (UC2, UC4)
- для всех случаев делается ставка, на удобство клиентов при резервировании номеров и управлением умными замками
QA6: безопасность (UC1, UC3, UC4)
- штатные сотрудники работают с персональными данными гостей, система должна быть защищена от НСД,
- доступ к данным службы уборки номеров должен иметь авторизованным, в соответствии с графиком дежурства персонала,
- умные замки должны управляться только авторизованными гостями и только на время пребывания в отеле
QA7: расширяемость (UC1, UC2, UC3, UC4)
- число отелей, подключаемых к системе, может увеличиваться,
- функционал для сотрудников может расширяться,
- функционал для гостей может расширяться,
- число умных устройств, которыми могут управлять гости отеля может быть расширен.
Ограничения
- CON1: для гостей, система должна поддерживать доступ к резервированию через вэб или смартфон,
- CON2: вэб интерфейс должен быть совместим с крайней версией браузера Google Chrome (110.0.5481.*),
- CON3: вэб интерфейс должен беспроблемно работать в разрешениями экранов 1366×768 и 1920×1080,
- CON4: мобильное приложение должно работать под управлением, минимум, начиная с 12 версии ОС Android,
- CON5: мобильное приложение должно работать под управлением, минимум, начиная с 14 версии ОС iOS,
- CON6: новая система должна быть размещена в ЦОД-ах заказчика,
- CON7: новая система должна «развитием» существующую систему резервирования и дополнять её.
Предположения
- ASM1: эксплуатируемая система имеет программные интерфейсы для работы с регистрационными действиями и приёмом оплаты,
- ASM2: эксплуатируемая система имеет собственные сервисы аутентификации и авторизации (включая one time password),
- ASM3: эксплуатируемая система имеет АПИ для интеграции с внешними системами (синхрон/асинхрон)
- ASM4: заказчик является совладельцем компании по производству умных замков,
- ASM5: все отели, оборудованные умными замками, рассчитывают на наличие у клиентов собственного смартфона. При отсутствии смартфона у клиента, отель имеет резерв «умных» ключей, которые клиент может взять во временное пользование. Но это вне границ текущей задачи,
- ASM6: первичной визуализации номеров всех отелей уже была проведена, банк изображений в необходимом формате сделана и наполнение системы было произведено,
Описание решения
Контекстная диаграмма
Диаграмма контейнеров
Рисунок. Схема высокоуровневой архитектуры решения.
Как показано на схеме, выбрана сервис-ориентированная архитектура, и, в частности, микросервисный подход см. «Лог архитектурных решений», ADR1.
Решение покрывает 2 основных домена:
- домен осуществления поиска по номерному фонду,
- домен управления номерным фондом.
Решение предполагает создание 2 мультиплатформенных мобильных приложений на базе Flutter, см. «Лог архитектурных решений», ADR4.
Диаграммы последовательности для пользовательских сценариев
Порядок загрузки визуальной информации о номере (UC1)
Предполагаем, что актуальные панорамы номеров уже сделаны см. «Лог архитектурных решений», ADR2 и ADR3.
Рисунок. Диаграмма последовательности для случая публикации визуальных данных о номере.
Порядок поиска номера и загрузки визуальных данных (UC1, UC2)
Рисунок. Диаграмма последовательности для случая поиска номера с выводом визуальных данных
Порядок бронирования номера (UC1, UC2)
Рисунок. Диаграмма последовательности для случая бронирования номера штатным сотрудником
Порядок применения правил доступа для «умного» замка (UC1)
Рисунок. Диаграмма последовательности для случая публикации правил доступа.
Порядок открытия/закрытия «умного» замка (UC2, UC3)
Рисунок. Диаграмма последовательности для случая
Порядок получения задания «уборщиком» (UC3)
Рисунок. Диаграмма последовательности для случая
Диаграмма развертывания
Рисунок. Диаграмма развёртывания
Лог архитектурных решений (ADL, ADR)
ADR1: Выбор общей архитектуры решения
Статус
Предложение
Контекст
Текущее решение не отвечает требованиям системы следующего поколения, так как аудитория элитных курортов и отелей требовательная и любой отказ системы или длительные ответы могут сказаться на спросе и отзывах.
Нагрузка на системы резервирования могут иметь высокую амплитуду нагрузки в зависимости от сезона и «маркетинговых мероприятий».
Решение
Предлагаю построить распределённую систему, разделённую на 2 домена:
- поиск и предоставление информации о доступном номерном фонде,
который должен будет иметь высокую доступность, производительность и отказоустойчивость,
- управление номерным фондом, не должно оказывать влияние на архитектурные атрибуты качества поиска номеров и требует дополнительных мер безопасности.
Для решения задачи следует использовать микросервисный архитектурный стиль.
Последствия
- каждый домен должен обладать собственным, автономным хранилищем данных и набором сервисов,
- для хранения визуальной информации данных о номерном фонде, вероятно понадобится отдельный способ хранения данных
ADR2: Определение формата визуализации номерного фонда
Статус
Предложение
Контекст
Для удобства гостей, система должна предоставлять пользователю возможность оценить номер визуально, перед тем как принять решение.
Решение
Предлагаю использовать уже популярную технологию визуализации номерного фонда, известную как VR 360.
Технология позволяет с помощью специализированной камеры создать панорамную съёмку в уже привычных графических форматах TIFF, JPEG, PNG и т.п.
Для отображения созданной панорамы могут использоваться широкий спектр библиотек как для мобильного приложения, так и для клиентских библиотек ReactJS или Angular.
Последствия
- для достаточной доступности визуализации номером для клиентов, необходимо использовать content delivery network. При этому необходимо организовать своевременную публикацию панорам.
- требуется организовать отдельное хранилище графических изображений.
ADR3: Определение места хранения для визуального представления номерного фонда
Статус
Предложение
Контекст
Для организации банка изображений номерного фонда необходимо организовать отдельное хранилище.
Решение
Использовать объектное хранилище MinIO.
Данный продукт позволяет организовать высокодоступное и отказоустойчивое решение, позволяющие масштабировать хранение графических изображений.
Последствия
- покупка коммерческой лицензии на MinIO, так как бесплатный вариант распространяется под лицензией AGPL 3.0.
ADR4: Определение архитектуры решения для работы на мобильных устройствах.
Статус
Предложение
Контекст
Система предполагает управления умными «замками».
Пользователями «умных» замков являются не только гости, но и штатные сотрудники отеля, а также специалисты службы уборки в номерах.
Заказчику хотелось бы иметь универсальные мобильные приложения, для каждой группы пользователей.
Решение
Целесообразно разработать и реализовать 2 приложения:
- гостевое, с публичным доступом к АПИ поиска и бронирования номеров,
- для внутреннего использования, с закрытым АПИ для штатных сотрудников и службы уборки в номерах.
Для максимального охвата гостевой аудитории и возможности масштабирования решения на новые отели, необходимо чтобы с одной стороны приложение было мультиплатформенным, с другой стороны было бы простым в реализации и развитии.
Помимо вышеописанного, приложение потребует использование нативных возможностей мобильных устройств, таких как сопряжение с «умными» замками отеля с использованием Bluetooth Low Energy стандарта.
В качестве решения предлагаю использовать Flutter, см. https://flutter.dev/ совместно с SDK производителя/поставщика «умных» замков.
Все мобильное приложения, предварительно, должны состоять из 2х модулей:
- модуль работы с АПИ системы,
- модуль управления «умным» замком.
Последствия
- потребуется команда для разработки, развития и поддержки мобильных приложений,
- потребуется найти способ и место публикации мобильных приложений,
- провести R&D работы по интеграции МП с замками.
ADR5: Определение решения для управления «умными» замками
Статус
Предложение
Контекст
Как было описано в постановке задачи, компания инвестирует в развитие IoT технологий. Для получения синергетического эффекта от вложений, при внедрении новой системы требуется учесть в архитектуре системы использование «умных замков», которыми могут быть оборудованы элитные курорты и отели.
Решение
Предлагаю, в качестве решения использовать подход ACaaS (access control as service) для «умных устройств». Это вариация технологии «программное обеспечение как услуга» (SaaS). Другими словами размещена, так же, в облаке. В тоже время, все оборудование для контроля доступа остается на месте, а программное обеспечение и серверы размещаются в дата-центрах.
Рисунок. Высокоуровневая схема решения.
Основные тезисы:
- партнёрская компания вместе с «умными замками», обеспечивает доступ к облачному решению контроля доступа,
- на основе специализированного SDK мобильное приложение гостей отеля, штатных сотрудников и службы уборки в номерах интегрируется с облаком провайдера, либо напрямую/либо опосредованно через разрабатываемую систему резервирования. Интеграция необходима прежде всего для ротации кодов авторизации «умных» замков и централизованного аудита всех умных устройств,
- пока, «абстрактное», мобильное приложение должно иметь функционал аутентификации и отправки авторизованных команд открытия/закрытия,
- мобильное приложение взаимодействует с «умными» замками по протоколу BLE (Bluetooth Low Energy),
- все «умные замки» обладают встроенным безопасным BLE сервисом и локальным хранилищем правил доступа, которое может управляться напрямую из системы резервирования,
- для обеспечения безопасности, должно быть разработано МП: для гостя, штатного сотрудника и службы уборки в номерах (получение временного доступа к замку, открытие/закрытие).
Рисунок. Топология сегментов решения применительно к проработке.
Последствие
- потребует учесть в новой системе, при регистрации/освобождении номеров, централизованное управление правилами и синхронизацию правил доступа с «замками»,
- понадобится разработать отдельные, мультиплатформенные мобильные приложения и осуществлять их поддержку,
- для каждого отеля необходимо организовать сеть умных устройств, подключенную по VPN с системой резервирования и управления.
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Проектная работа студента Евгения Яцуры по теме: «Room with a view» OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="По онлайн-курсу OTUS "Software Architect" С живой защитой проекта вы можете ознакомиться в этом видео: Описание проблемы Исходная задача A large hotel reservation company wants to build the next generation hotel reservation and management system specifically tailored to high-end resorts and spas where guests can view and reserve specific rooms. Users: Guests (hundreds), hotel staff" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#article","name":"\u041f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430 \u0415\u0432\u0433\u0435\u043d\u0438\u044f \u042f\u0446\u0443\u0440\u044b \u043f\u043e \u0442\u0435\u043c\u0435: \u00abRoom with a view\u00bb OTUS","headline":"\u041f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430 \u0415\u0432\u0433\u0435\u043d\u0438\u044f \u042f\u0446\u0443\u0440\u044b \u043f\u043e \u0442\u0435\u043c\u0435: «Room with a view»","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2023\/07\/oj-1080x72096-1.jpg","width":2245,"height":1587},"datePublished":"2023-07-30T10:17:26+00:00","dateModified":"2023-09-01T09:20:09+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, software architect, \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#listItem","position":2,"name":"\u041f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430 \u0415\u0432\u0433\u0435\u043d\u0438\u044f \u042f\u0446\u0443\u0440\u044b \u043f\u043e \u0442\u0435\u043c\u0435: \"Room with a view\"","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#webpage","url":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/","name":"\u041f\u0440\u043e\u0435\u043a\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430 \u0415\u0432\u0433\u0435\u043d\u0438\u044f \u042f\u0446\u0443\u0440\u044b \u043f\u043e \u0442\u0435\u043c\u0435: \u00abRoom with a view\u00bb OTUS","description":"\u041f\u043e \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441\u0443 OTUS \"Software Architect\" \u0421 \u0436\u0438\u0432\u043e\u0439 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e: \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 A large hotel reservation company wants to build the next generation hotel reservation and management system specifically tailored to high-end resorts and spas where guests can view and reserve specific rooms. Users: Guests (hundreds), hotel staff","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2023\/07\/oj-1080x72096-1.jpg","@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/#mainImage"},"datePublished":"2023-07-30T10:17:26+00:00","dateModified":"2023-09-01T09:20:09+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/7062" /><link rel='shortlink' href='https://otus.ru/journal/?p=7062' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fproektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fproektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-7062 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-7062" class="the-post post-7062 post type-post status-publish format-standard has-post-thumbnail category-polza tag-software-architect tag-proekt tag-proektnaya-rabota">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Проектная работа студента Евгения Яцуры по теме: «Room with a view»
</h1>
<a href="https://otus.ru/journal/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect/" class="date-link" data-wpel-link="internal"><time class="post-date">30 июля, 2023</time></a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9F%D0%BE_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D1%83%D1%80%D1%81%D1%83_OTUS_%C2%ABSoftware_Architect%C2%BB" title="По онлайн-курсу OTUS «Software Architect»">По онлайн-курсу OTUS «Software Architect»</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B" title="Описание проблемы">Описание проблемы</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0" title="Исходная задача">Исходная задача</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82" title="Контекст">Контекст</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%91%D0%B8%D0%B7%D0%BD%D0%B5%D1%81-%D1%86%D0%B5%D0%BB%D0%B8" title="Бизнес-цели">Бизнес-цели</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D1%8B" title="Архитектурные драйверы">Архитектурные драйверы</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B8_%D0%B1%D0%B8%D0%B7%D0%BD%D0%B5%D1%81%D0%BE%D0%B2%D1%8B%D0%B5" title="Ограничения технологические и бизнесовые">Ограничения технологические и бизнесовые</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9" title="Описание требований">Описание требований</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%A1%D1%82%D0%B5%D0%B9%D0%BA%D1%85%D0%BE%D0%BB%D0%B4%D0%B5%D1%80%D1%8B" title="Стейкхолдеры">Стейкхолдеры</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B8" title="Пользовательские сценарии">Пользовательские сценарии</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%A1%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%BE%D0%B2_%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0" title="Сценарии для атрибутов качества">Сценарии для атрибутов качества</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F" title="Ограничения">Ограничения</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%9F%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F" title="Предположения">Предположения</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F" title="Описание решения">Описание решения</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BD%D0%B0%D1%8F_%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0" title="Контекстная диаграмма">Контекстная диаграмма</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%BE%D0%B2" title="Диаграмма контейнеров">Диаграмма контейнеров</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D1%85_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B5%D0%B2" title="Диаграммы последовательности для пользовательских сценариев">Диаграммы последовательности для пользовательских сценариев</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-18" href="#%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8_%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B5_UC1" title="Порядок загрузки визуальной информации о номере (UC1)">Порядок загрузки визуальной информации о номере (UC1)</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-19" href="#%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%B8_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_UC1_UC2" title="Порядок поиска номера и загрузки визуальных данных (UC1, UC2)">Порядок поиска номера и загрузки визуальных данных (UC1, UC2)</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-20" href="#%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D1%80%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_UC1_UC2" title="Порядок бронирования номера (UC1, UC2)">Порядок бронирования номера (UC1, UC2)</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-21" href="#i" title=" "> </a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-22" href="#%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%B4%D0%BB%D1%8F_%C2%AB%D1%83%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%C2%BB_%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0_UC1" title="Порядок применения правил доступа для «умного» замка (UC1)">Порядок применения правил доступа для «умного» замка (UC1)</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-23" href="#%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D1%8F%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D1%8F_%C2%AB%D1%83%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%C2%BB_%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0_UC2_UC3" title="Порядок открытия/закрытия «умного» замка (UC2, UC3)">Порядок открытия/закрытия «умного» замка (UC2, UC3)</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-24" href="#%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%C2%AB%D1%83%D0%B1%D0%BE%D1%80%D1%89%D0%B8%D0%BA%D0%BE%D0%BC%C2%BB_UC3" title="Порядок получения задания «уборщиком» (UC3)">Порядок получения задания «уборщиком» (UC3)</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-25" href="#%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Диаграмма развертывания">Диаграмма развертывания</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-26" href="#%D0%9B%D0%BE%D0%B3_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D1%85_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_ADL_ADR" title="Лог архитектурных решений (ADL, ADR)">Лог архитектурных решений (ADL, ADR)</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-27" href="#ADR1_%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%BE%D0%B1%D1%89%D0%B5%D0%B9_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F" title="ADR1: Выбор общей архитектуры решения">ADR1: Выбор общей архитектуры решения</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-28" href="#%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81" title="Статус">Статус</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-29" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-2" title="Контекст">Контекст</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-30" href="#%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5" title="Решение">Решение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-31" href="#%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F" title="Последствия">Последствия</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-32" href="#ADR2_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%BE%D0%BD%D0%B4%D0%B0" title="ADR2: Определение формата визуализации номерного фонда">ADR2: Определение формата визуализации номерного фонда</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-33" href="#%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-2" title="Статус">Статус</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-34" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-3" title="Контекст">Контекст</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-35" href="#%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-2" title="Решение">Решение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-36" href="#%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F-2" title="Последствия">Последствия</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-37" href="#ADR3_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%81%D1%82%D0%B0_%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%BE%D0%BD%D0%B4%D0%B0" title="ADR3: Определение места хранения для визуального представления номерного фонда">ADR3: Определение места хранения для визуального представления номерного фонда</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-38" href="#%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-3" title="Статус">Статус</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-39" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-4" title="Контекст">Контекст</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-40" href="#%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-3" title="Решение">Решение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-41" href="#%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F-3" title="Последствия">Последствия</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-42" href="#ADR4_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BD%D0%B0_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D1%85" title="ADR4: Определение архитектуры решения для работы на мобильных устройствах.">ADR4: Определение архитектуры решения для работы на мобильных устройствах.</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-43" href="#%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-4" title="Статус">Статус</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-44" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-5" title="Контекст">Контекст</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-45" href="#i-2" title=" "> </a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-46" href="#%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-4" title="Решение">Решение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-47" href="#%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F-4" title="Последствия">Последствия</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-48" href="#ADR5_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%C2%AB%D1%83%D0%BC%D0%BD%D1%8B%D0%BC%D0%B8%C2%BB_%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0%D0%BC%D0%B8" title="ADR5: Определение решения для управления «умными» замками">ADR5: Определение решения для управления «умными» замками</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-49" href="#%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-5" title="Статус">Статус</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-50" href="#i-3" title=" "> </a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-51" href="#%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-6" title="Контекст">Контекст</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-52" href="#%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-5" title="Решение">Решение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-53" href="#%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D0%B5" title="Последствие">Последствие</a></li></ul></li></ul></li></ul></nav></div>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D1%83%D1%80%D1%81%D1%83_OTUS_%C2%ABSoftware_Architect%C2%BB"></span>По онлайн-курсу OTUS <a href="https://otus.ru/lessons/software-architect/?utm_source=oj&utm_medium=affilate&utm_campaign=arch-soft&mxm=[[hash_metrika]]&relogin=True&token=[[token]]" target="_blank" rel="noopener nofollow external noreferrer" title=""Software Architect"" data-wpel-link="external" class="wpel-icon-right">«Software Architect»<span class="wpel-icon wpel-image wpel-icon-6"></span></a><span class="ez-toc-section-end"></span></h2>
<p>С живой защитой проекта вы можете ознакомиться в этом видео:</p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Защита проекта // Курс «Software architect»" width="770" height="578" src="https://www.youtube.com/embed/F57UeNTdkkA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</div></figure>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B"></span>Описание проблемы<span class="ez-toc-section-end"></span></h2>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0"></span>Исходная задача<span class="ez-toc-section-end"></span></h3>
<p>A large hotel reservation company wants to build the next generation hotel reservation and management system specifically tailored to high-end resorts and spas where guests can view and reserve specific rooms.</p>
<ul>
<li>Users: Guests (hundreds), hotel staff (less than 20)</li>
<li>Requirements:<ul><li>Registration can be made via web, mobile, phone call, or walk-in.</li></ul><ul><li>Guests have the ability to either book a type of room (standard, deluxe, or suite) or choose a specific room to stay in by viewing pictures of each room and its location in the hotel.</li></ul><ul><li>The system must be able to maintain room status (booked, available, ready to clean, etc.) as well as when the room will be needed next.</li></ul><ul><li>It must also have state-of-the-art housekeeping management functionality so that cleaning and maintenance staff can be directed to various rooms based on priority and reservation need using proprietary devices supplied by the reservation company attached to the cleaning carts.</li></ul><ul><li>Standard reservation functionality (e.g., payments, registration info, etc.) will be done by leveraging the existing reservations system.</li></ul>
<ul>
<li>The system will be web-based and hosted by the reservation company.</li>
</ul>
</li>
<li>Additional Context:<ul><li>‘Peak season is quickly approaching, so the system must be ready quickly or we have to wait until next year!’</li></ul><ul><li>Company is also investing heavily in cutting edge technology like smart room locks that open via a cell phone</li></ul><ul><li>Only interested in the high-end market</li></ul>
<ul>
<li>Sales people have tremendous clout in the organization; people often scramble to make their promises true</li>
</ul>
</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82"></span>Контекст<span class="ez-toc-section-end"></span></h3>
<p>Заказчик — крупная компания, с сильным отделом продаж, инвестирующая в такие передовых технологии как интернет вещей, связанный с отелями.</p>
<p>Основной бизнес заказчика — это бронирование номеров в отелях.</p>
<p>Компания уже эксплуатирует систему бронирования отелей, покрывающая стандартные функции, например: работа с оплатой, предоставление информации по регистрациям.</p>
<p>Заказчик намерен построить систему бронирования и управления отелями следующего поколения, ориентированную на элитные курорты и СПА. Будущие гости отелей перед бронированием могут визуально ознакомиться с номерным фондом и расположением отдельных номеров.</p>
<p>У заказчика должна быть полная картина о занятости и статусе каждого номера.</p>
<p>Система должна поддержать автоматизацию управления уборкой в номерном фонде.</p>
<p>Будущая система должна быть с веб-интерфейсом и размещаться у заказчика.</p>
<p>Проект должен быть запущен в сжатые сроки, так как близок сезон активного использования системы.</p>
<p>В пик нагрузки система должна беспроблемно обслуживать сотни гостей и не более 20 сотрудников отеля для каждого отеля, подключенного к системе.</p>
<p>Ожидается, что система позволит осуществлять регистрацию онлайн через веб, смартфон, заявки по телефону и без предварительной записи.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%91%D0%B8%D0%B7%D0%BD%D0%B5%D1%81-%D1%86%D0%B5%D0%BB%D0%B8"></span>Бизнес-цели<span class="ez-toc-section-end"></span></h3>
<p>Компания намерена:</p>
<ul>
<li>в сжатые сроки увеличить продажи услуг за счёт охвата рынка элитных курортов и спа, а также посредством инвестируемых передовых технологий,</li>
<li>повысить эффективность существующего функционала системы в части своевременного отслеживания ЖЦ всего продаваемого номерного фонда,</li>
<li>увеличить воронку продажи устройств для эффективного управления персоналом по уборке номеров, через добавление функций автоматизации процессов уборкой номерного фонда,</li>
<li>увеличить продажи умных устройств, например «умные» замки для номеров.</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D1%8B"></span>Архитектурные драйверы<span class="ez-toc-section-end"></span></h3>
<p>Исходя из задачи и бизнес-целей основными драйверами являются:</p>
<ul>
<li>текущая система резервирования отелей не отвечает требованиям к функционалу для сотрудничества с элитными курортами и спа,</li>
<li>отсутствует синергия между продажами услуг резервирования и передовыми разработками, в которые компания активно инвестирует (например, устройства для автоматизации управления уборкой и «умные» замки, управляемые через смартфон).</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%B8_%D0%B1%D0%B8%D0%B7%D0%BD%D0%B5%D1%81%D0%BE%D0%B2%D1%8B%D0%B5"></span>Ограничения технологические и бизнесовые<span class="ez-toc-section-end"></span></h3>
<ul>
<li>регистрация в системе может быть осуществлена через веб, смартфон и телефонный звонок,</li>
<li>система резервирования уже существует, и к самой системе претензий нет,</li>
<li>система должна иметь веб-интерфейс,</li>
<li>система должна размещаться у заказчика (on premise),</li>
<li>срок запуска системы ограничен 1 годом,</li>
<li>система должна иметь опцию использования сопряжения с устройствами для персонала отвечающего за уборку номерного фонда и смартфонами гостей.</li>
</ul>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B9"></span>Описание требований<span class="ez-toc-section-end"></span></h2>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%B5%D0%B9%D0%BA%D1%85%D0%BE%D0%BB%D0%B4%D0%B5%D1%80%D1%8B"></span>Стейкхолдеры<span class="ez-toc-section-end"></span></h3>
<p>SH1: Гости отелей (доступность, производительность, масштабируемость, отказоустойчивость, удобство использования):</p>
<ul>
<li>с помощью системы должны быть способны найти подходящий для себя номер, визуально оценить, зарезервировать и оплатить его удобным для себя способом</li>
<li>опционально, в случае если отель оборудован умными устройствами от заказчика, используют собственный смартфон с предустановленным приложением управлять доступными, в номерах и отеле, «умными» устройствами.</li>
</ul>
<p>SH2: Штатные сотрудники отеля (доступность, производительность, масштабируемость, отказоустойчивость, безопасность):</p>
<ul>
<li>должны быть способны поддерживать в актуальном состоянии ЖЦ номерного фонда,</li>
<li>должны быть способны поддерживать, в актуальном состоянии визуальную и не визуальную информацию о номерах отеля,</li>
<li>должны быть способны бронировать номера.</li>
</ul>
<p>SH3: Служба уборки в номерах (доступность, масштабируемость, отказоустойчивость, безопасность):</p>
<ul>
<li>опционально, при условии, что служба уборки номеров снабжена специальными устройствами, привязанными к тележкам для уборки, должны быть способны своевременно, в соответствии с приоритетами выполнять задания на уборку</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B5_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B8"></span>Пользовательские сценарии<span class="ez-toc-section-end"></span></h3>
<p>UC1: Работа с информации об отеле:</p>
<ul>
<li>штатный сотрудник, управляет состоянием номерного фонда доступных отелей (SH2),</li>
<li>штатный сотрудник, управляет визуальной и не визуальной информацией о номерах отеля (SH2),</li>
<li>штатный сотрудник, производит поиск свободных номеров в соответствии с условиями гостя (SH2)</li>
<li>штатный сотрудник, осуществляет бронь/отмену брони по телефону, по запросу на стойке регистрации (SH2)</li>
</ul>
<p>UC2: Резервирование номеров:</p>
<ul>
<li>гость, производит поиск свободных номеров в соответствии с критериями отбор (SH1)</li>
<li>гость, бронирует/отменяет бронь через веб интерфейс (SH1)</li>
<li>гость, бронирует/отменяет бронь через смартфон (SH1)</li>
<li>гость, бронирует/отменяет бронь через заявку по телефону (SH1)</li>
</ul>
<p>UC3: Уборка в номере:</p>
<ul>
<li>служба уборки в номерах получает задачу на уборку в номере (SH3),</li>
<li>сотрудник службы уборки берёт задачу в работу (SH3),</li>
<li>сотрудник службы уборки начинает выполнение задачи (SH3)</li>
<li>сотрудник службы уборки завершает задачу по уборке (SH3)</li>
<li>сотрудник службы уборки уведомляет о проблемах (SH3)</li>
</ul>
<p>UC4: Управление устройствами номера:</p>
<ul>
<li>гость, штатный сотрудник, специалист службы уборки в номерах, открывает/закрывает номер, с помощью собственного смартфона (SH1)</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D0%BE%D0%B2_%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B0"></span>Сценарии для атрибутов качества<span class="ez-toc-section-end"></span></h3>
<p>QA1: доступность (UC1, UC2, UC3, UC4)</p>
<ul>
<li>управление состояние номерного фонда, должно иметь максимальный уровень доступности, так как это может критично сказаться на корректном резервировании номерного фонда,</li>
<li>недоступность системы при публикации актуальной визуальной/ не визуальной информации о номерах отеля может стать причиной рекламаций со стороны требовательных гостей,</li>
<li>несвоевременное подтверждение заявок может сказаться на продажах номерного фонда,</li>
<li>гости элитных курортов и спа не должны сталкиваться с какими-либо проблемами доступа к системе, при поиске номеров или во время выбора номеров и бронирования,</li>
<li>недоступность системы, для службы уборки в номерах, напрямую влияет на качества и своевременность сервиса,</li>
<li>сервисы управления умными устройствами в номере должно иметь высокий уровень доступности для гостей.</li>
</ul>
<p>Полагаем что, система относится к уровню Business critical системам.</p>
<p>QA2: производительность (UC1, UC2, UC3)</p>
<ul>
<li>реакция системы на управление номерным фондом, в пик нагрузки, для отеля, не должна превышать 3 с (при условии замеров на границе publiс-DMZ),</li>
<li>реакция системы на доставку единицы визуальной информации о номерном фонде, для отеля, не должна превышать 8 сек (при условии замеров на границе publiс-DMZ),</li>
<li>реакция система на бронь по телефону номера/номеров не должна превышать 3 с (при условии замеров на границе publiс-DMZ),</li>
<li>реакция система на бронь по веб номера/номеров, не должна превышать 3 с (при условии замеров на границе publiс-DMZ),</li>
<li>реакция система на бронь через смартфон, не должна превышать 3 с (при условии замеров на границе publiс-DMZ и соблюдения нефункциональных требований к мобильному устройству),</li>
<li>реакция системы на поиск подходящего отеля и номера/номеров не должна превышать 5 с (при условии замеров на границе publiс-DMZ).</li>
</ul>
<p>QA3: масштабируемость (UC1, UC2, UC3, UC4)</p>
<ul>
<li>максимальное число штатных сотрудников отеля в смену 20,</li>
<li>максимальное число гостей отеля 1000.</li>
</ul>
<p>QA4: отказоустойчивость (UC1, UC2, UC3, UC4)</p>
<ul>
<li>штатные сотрудники должны беспрепятственно и любых проблем поддерживать в актуальном состоянии номерной фонд. Любые коллизии, связанные с резервированием, могут сказаться на рейтингах отеля или курорта,</li>
<li>для гостей, система должна работать стабильно. Любая поломка/сбой может привести к потере гостей,</li>
<li>любые сбои в службе уборки номеров могут повлиять на своевременные приём гостей и смещении в графике уборки номерного фонда,</li>
<li>поломка/сбой «умного» замка может привести к снижению рейтинга отеля.</li>
</ul>
<p>QA5: удобство использования (UC2, UC4)</p>
<ul>
<li>для всех случаев делается ставка, на удобство клиентов при резервировании номеров и управлением умными замками</li>
</ul>
<p>QA6: безопасность (UC1, UC3, UC4)</p>
<ul>
<li>штатные сотрудники работают с персональными данными гостей, система должна быть защищена от НСД,</li>
<li>доступ к данным службы уборки номеров должен иметь авторизованным, в соответствии с графиком дежурства персонала,</li>
<li>умные замки должны управляться только авторизованными гостями и только на время пребывания в отеле</li>
</ul>
<p>QA7: расширяемость (UC1, UC2, UC3, UC4)</p>
<ul>
<li>число отелей, подключаемых к системе, может увеличиваться,</li>
<li>функционал для сотрудников может расширяться,</li>
<li>функционал для гостей может расширяться,</li>
<li>число умных устройств, которыми могут управлять гости отеля может быть расширен.</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%B3%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"></span>Ограничения<span class="ez-toc-section-end"></span></h3>
<ul>
<li>CON1: для гостей, система должна поддерживать доступ к резервированию через вэб или смартфон,</li>
<li>CON2: вэб интерфейс должен быть совместим с крайней версией браузера Google Chrome (110.0.5481.*),</li>
<li>CON3: вэб интерфейс должен беспроблемно работать в разрешениями экранов <strong>1366×768 и 1920×1080,</strong></li>
<li>CON4: мобильное приложение должно работать под управлением, минимум, начиная с 12 версии ОС Android,</li>
<li>CON5: мобильное приложение должно работать под управлением, минимум, начиная с 14 версии ОС iOS,</li>
<li>CON6: новая система должна быть размещена в ЦОД-ах заказчика,</li>
<li>CON7: новая система должна «развитием» существующую систему резервирования и дополнять её.</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F"></span>Предположения<span class="ez-toc-section-end"></span></h3>
<ul>
<li>ASM1: эксплуатируемая система имеет программные интерфейсы для работы с регистрационными действиями и приёмом оплаты,</li>
<li>ASM2: эксплуатируемая система имеет собственные сервисы аутентификации и авторизации (включая one time password),</li>
<li>ASM3: эксплуатируемая система имеет АПИ для интеграции с внешними системами (синхрон/асинхрон)</li>
<li>ASM4: заказчик является совладельцем компании по производству умных замков,</li>
<li>ASM5: все отели, оборудованные умными замками, рассчитывают на наличие у клиентов собственного смартфона. При отсутствии смартфона у клиента, отель имеет резерв «умных» ключей, которые клиент может взять во временное пользование. Но это вне границ текущей задачи,</li>
<li>ASM6: первичной визуализации номеров всех отелей уже была проведена, банк изображений в необходимом формате сделана и наполнение системы было произведено,</li>
</ul>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F"></span>Описание решения<span class="ez-toc-section-end"></span></h2>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%BD%D0%B0%D1%8F_%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0"></span>Контекстная диаграмма<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image1-1.png" data-wpel-link="internal"><img fetchpriority="high" decoding="async" width="1024" height="600" src="https://otus.ru/journal/wp-content/uploads/2023/07/image1-1-1024x600.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7110" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image1-1-1024x600.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image1-1-300x176.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image1-1-150x88.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image1-1-768x450.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image1-1.png 1428w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D0%BE%D0%B2"></span>Диаграмма контейнеров<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image2-1.png" data-wpel-link="internal"><img decoding="async" width="1024" height="810" src="https://otus.ru/journal/wp-content/uploads/2023/07/image2-1-1024x810.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7112" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image2-1-1024x810.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image2-1-300x237.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image2-1-150x119.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image2-1-768x607.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image2-1.png 1429w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Схема высокоуровневой архитектуры решения.</p>
<p>Как показано на схеме, выбрана сервис-ориентированная архитектура, и, в частности, микросервисный подход см. «Лог архитектурных решений», ADR1.</p>
<p>Решение покрывает 2 основных домена:</p>
<ul>
<li>домен осуществления поиска по номерному фонду,</li>
<li>домен управления номерным фондом.</li>
</ul>
<p>Решение предполагает создание 2 мультиплатформенных мобильных приложений на базе Flutter, см. «Лог архитектурных решений», ADR4.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D1%85_%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B5%D0%B2"></span>Диаграммы последовательности для пользовательских сценариев<span class="ez-toc-section-end"></span></h2>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8_%D0%BE_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B5_UC1"></span>Порядок загрузки визуальной информации о номере (UC1)<span class="ez-toc-section-end"></span></h3>
<p>Предполагаем, что актуальные панорамы номеров уже сделаны см. «Лог архитектурных решений», ADR2 и ADR3.</p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image3-1.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="805" src="https://otus.ru/journal/wp-content/uploads/2023/07/image3-1-1024x805.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7113" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image3-1-1024x805.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image3-1-300x236.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image3-1-150x118.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image3-1-768x604.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image3-1-87x67.png 87w, https://otus.ru/journal/wp-content/uploads/2023/07/image3-1.png 1264w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Диаграмма последовательности для случая публикации визуальных данных о номере.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_%D0%B8_%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_UC1_UC2"></span>Порядок поиска номера и загрузки визуальных данных (UC1, UC2)<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-full"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image4-1.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="984" height="575" src="https://otus.ru/journal/wp-content/uploads/2023/07/image4-1.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7114" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image4-1.png 984w, https://otus.ru/journal/wp-content/uploads/2023/07/image4-1-300x175.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image4-1-150x88.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image4-1-768x449.png 768w" sizes="(max-width: 984px) 100vw, 984px" /></a></figure>
<p>Рисунок. Диаграмма последовательности для случая поиска номера с выводом визуальных данных</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D1%80%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%B0_UC1_UC2"></span>Порядок бронирования номера (UC1, UC2)<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image5-1-1024x468.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="468" src="https://otus.ru/journal/wp-content/uploads/2023/07/image5-1-1024x468.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7115" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image5-1-1024x468.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image5-1-300x137.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image5-1-150x69.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image5-1-768x351.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image5-1.png 1313w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Диаграмма последовательности для случая бронирования номера штатным сотрудником</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="i"></span> <span class="ez-toc-section-end"></span></h3>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%B4%D0%BB%D1%8F_%C2%AB%D1%83%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%C2%BB_%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0_UC1"></span>Порядок применения правил доступа для «умного» замка (UC1)<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-full"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image6-1.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="558" height="328" src="https://otus.ru/journal/wp-content/uploads/2023/07/image6-1.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7116" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image6-1.png 558w, https://otus.ru/journal/wp-content/uploads/2023/07/image6-1-300x176.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image6-1-150x88.png 150w" sizes="(max-width: 558px) 100vw, 558px" /></a></figure>
<p>Рисунок. Диаграмма последовательности для случая публикации правил доступа.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BE%D1%82%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D1%8F%D0%B7%D0%B0%D0%BA%D1%80%D1%8B%D1%82%D0%B8%D1%8F_%C2%AB%D1%83%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%C2%BB_%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0_UC2_UC3"></span>Порядок открытия/закрытия «умного» замка (UC2, UC3)<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image7-1024x592.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="592" src="https://otus.ru/journal/wp-content/uploads/2023/07/image7-1024x592.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7103" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image7-1024x592.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image7-300x173.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image7-150x87.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image7-768x444.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image7.png 1461w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Диаграмма последовательности для случая</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F_%C2%AB%D1%83%D0%B1%D0%BE%D1%80%D1%89%D0%B8%D0%BA%D0%BE%D0%BC%C2%BB_UC3"></span>Порядок получения задания «уборщиком» (UC3)<span class="ez-toc-section-end"></span></h3>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image8-1024x526.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="526" src="https://otus.ru/journal/wp-content/uploads/2023/07/image8-1024x526.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7104" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image8-1024x526.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image8-300x154.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image8-150x77.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image8-768x395.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image8.png 1082w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Диаграмма последовательности для случая</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%94%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></span>Диаграмма развертывания<span class="ez-toc-section-end"></span></h2>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image9-1024x823.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="823" src="https://otus.ru/journal/wp-content/uploads/2023/07/image9-1024x823.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7105" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image9-1024x823.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image9-300x241.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image9-150x121.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image9-768x617.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image9.png 1429w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Диаграмма развёртывания</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9B%D0%BE%D0%B3_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D1%85_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_ADL_ADR"></span>Лог архитектурных решений (ADL, ADR)<span class="ez-toc-section-end"></span></h2>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="ADR1_%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%BE%D0%B1%D1%89%D0%B5%D0%B9_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F"></span>ADR1: Выбор общей архитектуры решения<span class="ez-toc-section-end"></span></h3>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81"></span>Статус<span class="ez-toc-section-end"></span></h4>
<p>Предложение</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-2"></span>Контекст<span class="ez-toc-section-end"></span></h4>
<p>Текущее решение не отвечает требованиям системы следующего поколения, так как аудитория элитных курортов и отелей требовательная и любой отказ системы или длительные ответы могут сказаться на спросе и отзывах.</p>
<p>Нагрузка на системы резервирования могут иметь высокую амплитуду нагрузки в зависимости от сезона и «маркетинговых мероприятий».</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5"></span>Решение<span class="ez-toc-section-end"></span></h4>
<p>Предлагаю построить распределённую систему, разделённую на 2 домена:</p>
<ul>
<li>поиск и предоставление информации о доступном номерном фонде,</li>
</ul>
<p>который должен будет иметь высокую доступность, производительность и отказоустойчивость,</p>
<ul>
<li>управление номерным фондом, не должно оказывать влияние на архитектурные атрибуты качества поиска номеров и требует дополнительных мер безопасности.</li>
</ul>
<p>Для решения задачи следует использовать микросервисный архитектурный стиль.</p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image10-1024x799.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="799" src="https://otus.ru/journal/wp-content/uploads/2023/07/image10-1024x799.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7106" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image10-1024x799.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image10-300x234.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image10-150x117.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image10-768x599.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image10-87x67.png 87w, https://otus.ru/journal/wp-content/uploads/2023/07/image10.png 1426w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F"></span>Последствия<span class="ez-toc-section-end"></span></h4>
<ul>
<li>каждый домен должен обладать собственным, автономным хранилищем данных и набором сервисов,</li>
<li>для хранения визуальной информации данных о номерном фонде, вероятно понадобится отдельный способ хранения данных</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="ADR2_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B0_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%BE%D0%BD%D0%B4%D0%B0"></span>ADR2: Определение формата визуализации номерного фонда<span class="ez-toc-section-end"></span></h3>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-2"></span>Статус<span class="ez-toc-section-end"></span></h4>
<p>Предложение</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-3"></span>Контекст<span class="ez-toc-section-end"></span></h4>
<p>Для удобства гостей, система должна предоставлять пользователю возможность оценить номер визуально, перед тем как принять решение.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-2"></span>Решение<span class="ez-toc-section-end"></span></h4>
<p>Предлагаю использовать уже популярную технологию визуализации номерного фонда, известную как VR 360.</p>
<p>Технология позволяет с помощью специализированной камеры создать панорамную съёмку в уже привычных графических форматах TIFF, JPEG, PNG и т.п.</p>
<p>Для отображения созданной панорамы могут использоваться широкий спектр библиотек как для мобильного приложения, так и для клиентских библиотек ReactJS или Angular.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F-2"></span>Последствия<span class="ez-toc-section-end"></span></h4>
<ul>
<li>для достаточной доступности визуализации номером для клиентов, необходимо использовать content delivery network. При этому необходимо организовать своевременную публикацию панорам.</li>
<li>требуется организовать отдельное хранилище графических изображений.</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="ADR3_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%81%D1%82%D0%B0_%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B3%D0%BE_%D1%84%D0%BE%D0%BD%D0%B4%D0%B0"></span>ADR3: Определение места хранения для визуального представления номерного фонда<span class="ez-toc-section-end"></span></h3>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-3"></span>Статус<span class="ez-toc-section-end"></span></h4>
<p>Предложение</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-4"></span>Контекст<span class="ez-toc-section-end"></span></h4>
<p>Для организации банка изображений номерного фонда необходимо организовать отдельное хранилище.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-3"></span>Решение<span class="ez-toc-section-end"></span></h4>
<p>Использовать объектное хранилище MinIO.</p>
<p>Данный продукт позволяет организовать высокодоступное и отказоустойчивое решение, позволяющие масштабировать хранение графических изображений.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F-3"></span>Последствия<span class="ez-toc-section-end"></span></h4>
<ul>
<li>покупка коммерческой лицензии на MinIO, так как бесплатный вариант распространяется под лицензией AGPL 3.0.</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="ADR4_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D1%8B_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%BD%D0%B0_%D0%BC%D0%BE%D0%B1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0%D1%85"></span>ADR4: Определение архитектуры решения для работы на мобильных устройствах.<span class="ez-toc-section-end"></span></h3>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-4"></span>Статус<span class="ez-toc-section-end"></span></h4>
<p>Предложение</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-5"></span>Контекст<span class="ez-toc-section-end"></span></h4>
<p>Система предполагает управления умными «замками».</p>
<p>Пользователями «умных» замков являются не только гости, но и штатные сотрудники отеля, а также специалисты службы уборки в номерах.</p>
<p>Заказчику хотелось бы иметь универсальные мобильные приложения, для каждой группы пользователей.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="i-2"></span> <span class="ez-toc-section-end"></span></h4>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-4"></span>Решение<span class="ez-toc-section-end"></span></h4>
<p>Целесообразно разработать и реализовать 2 приложения:</p>
<ul>
<li>гостевое, с публичным доступом к АПИ поиска и бронирования номеров,</li>
<li>для внутреннего использования, с закрытым АПИ для штатных сотрудников и службы уборки в номерах. </li>
</ul>
<p>Для максимального охвата гостевой аудитории и возможности масштабирования решения на новые отели, необходимо чтобы с одной стороны приложение было мультиплатформенным, с другой стороны было бы простым в реализации и развитии.</p>
<p>Помимо вышеописанного, приложение потребует использование нативных возможностей мобильных устройств, таких как сопряжение с «умными» замками отеля с использованием Bluetooth Low Energy стандарта.</p>
<p>В качестве решения предлагаю использовать Flutter, см. https://flutter.dev/ совместно с SDK производителя/поставщика «умных» замков.</p>
<p>Все мобильное приложения, предварительно, должны состоять из 2х модулей:</p>
<ul>
<li>модуль работы с АПИ системы,</li>
<li>модуль управления «умным» замком.</li>
</ul>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D1%8F-4"></span>Последствия<span class="ez-toc-section-end"></span></h4>
<ul>
<li>потребуется команда для разработки, развития и поддержки мобильных приложений,</li>
<li>потребуется найти способ и место публикации мобильных приложений,</li>
<li>провести R&D работы по интеграции МП с замками.</li>
</ul>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="ADR5_%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BB%D1%8F_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%C2%AB%D1%83%D0%BC%D0%BD%D1%8B%D0%BC%D0%B8%C2%BB_%D0%B7%D0%B0%D0%BC%D0%BA%D0%B0%D0%BC%D0%B8"></span>ADR5: Определение решения для управления «умными» замками<span class="ez-toc-section-end"></span></h3>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%82%D0%B0%D1%82%D1%83%D1%81-5"></span>Статус<span class="ez-toc-section-end"></span></h4>
<p>Предложение</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="i-3"></span> <span class="ez-toc-section-end"></span></h4>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82-6"></span>Контекст<span class="ez-toc-section-end"></span></h4>
<p>Как было описано в постановке задачи, компания инвестирует в развитие IoT технологий. Для получения синергетического эффекта от вложений, при внедрении новой системы требуется учесть в архитектуре системы использование «умных замков», которыми могут быть оборудованы элитные курорты и отели.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-5"></span>Решение<span class="ez-toc-section-end"></span></h4>
<p>Предлагаю, в качестве решения использовать подход ACaaS (access control as service) для «умных устройств». Это вариация технологии «программное обеспечение как услуга» (SaaS). Другими словами размещена, так же, в облаке. В тоже время, все оборудование для контроля доступа остается на месте, а программное обеспечение и серверы размещаются в дата-центрах.</p>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image11-1024x371.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="371" src="https://otus.ru/journal/wp-content/uploads/2023/07/image11-1024x371.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7107" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image11-1024x371.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image11-300x109.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image11-150x54.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image11-768x278.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image11.png 1429w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Высокоуровневая схема решения.</p>
<p>Основные тезисы:</p>
<ul>
<li>партнёрская компания вместе с «умными замками», обеспечивает доступ к облачному решению контроля доступа,</li>
<li>на основе специализированного SDK мобильное приложение гостей отеля, штатных сотрудников и службы уборки в номерах интегрируется с облаком провайдера, либо напрямую/либо опосредованно через разрабатываемую систему резервирования. Интеграция необходима прежде всего для ротации кодов авторизации «умных» замков и централизованного аудита всех умных устройств,</li>
<li>пока, «абстрактное», мобильное приложение должно иметь функционал аутентификации и отправки авторизованных команд открытия/закрытия,</li>
<li>мобильное приложение взаимодействует с «умными» замками по протоколу BLE (Bluetooth Low Energy),</li>
<li>все «умные замки» обладают встроенным безопасным BLE сервисом и локальным хранилищем правил доступа, которое может управляться напрямую из системы резервирования,</li>
<li>для обеспечения безопасности, должно быть разработано МП: для гостя, штатного сотрудника и службы уборки в номерах (получение временного доступа к замку, открытие/закрытие).</li>
</ul>
<figure class="wp-block-image size-large"><a href="https://otus.ru/journal/wp-content/uploads/2023/07/image12-1024x424.png" data-wpel-link="internal"><img loading="lazy" decoding="async" width="1024" height="424" src="https://otus.ru/journal/wp-content/uploads/2023/07/image12-1024x424.png" alt="Проектная работа студента Евгения Яцуры по теме: "Room with a view"" class="wp-image-7108" srcset="https://otus.ru/journal/wp-content/uploads/2023/07/image12-1024x424.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/image12-300x124.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/image12-150x62.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/image12-768x318.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/image12.png 1430w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
<p>Рисунок. Топология сегментов решения применительно к проработке.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D1%81%D1%82%D0%B2%D0%B8%D0%B5"></span>Последствие<span class="ez-toc-section-end"></span></h4>
<ul>
<li>потребует учесть в новой системе, при регистрации/освобождении номеров, централизованное управление правилами и синхронизацию правил доступа с «замками»,</li>
<li>понадобится разработать отдельные, мультиплатформенные мобильные приложения и осуществлять их поддержку,</li>
<li>для каждого отеля необходимо организовать сеть умных устройств, подключенную по VPN с системой резервирования и управления.</li>
</ul>
<p>Автор — <a href="https://www.linkedin.com/in/eugene-yatsura-b5587895/" title="" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><strong>Евгений Яцура</strong><span class="wpel-icon wpel-image wpel-icon-6"></span></a>.<br><br><em>Хотите знать больше о проектировании архитектуры программных приложений? Добро пожаловать на <a href="https://otus.ru/lessons/software-architect/?utm_source=oj&utm_medium=affilate&utm_campaign=architec_po" title="" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">курс «Software architect»<span class="wpel-icon wpel-image wpel-icon-6"></span></a> в Otus!</em></p>
<p></p>
<p></p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/software-architect/" rel="tag" data-wpel-link="internal">software architect</a><a href="https://otus.ru/journal/tag/proekt/" rel="tag" data-wpel-link="internal">проект</a><a href="https://otus.ru/journal/tag/proektnaya-rabota/" rel="tag" data-wpel-link="internal">проектная работа</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fproektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fproektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect%2F&text=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%B0%20%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%AF%D1%86%D1%83%D1%80%D1%8B%20%D0%BF%D0%BE%20%D1%82%D0%B5%D0%BC%D0%B5%3A%20%22Room%20with%20a%20view%22" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fproektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fproektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2023%2F07%2Foj-1080x72096-1.jpg&description=%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BD%D0%B0%D1%8F%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%D1%82%D1%83%D0%B4%D0%B5%D0%BD%D1%82%D0%B0%20%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%AF%D1%86%D1%83%D1%80%D1%8B%20%D0%BF%D0%BE%20%D1%82%D0%B5%D0%BC%D0%B5%3A%20%22Room%20with%20a%20view%22" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/goret-no-ne-sgorat-top-5-lajfhakov-dlya-rukovoditelya-v-it/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/goret-no-ne-sgorat-top-5-lajfhakov-dlya-rukovoditelya-v-it/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Гореть, но не сгорать. Топ-5 лайфхаков для руководителя в IT" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/07/oj-1080x720-kopiya-9-150x106.png 150w, https://otus.ru/journal/wp-content/uploads/2023/07/oj-1080x720-kopiya-9-300x212.png 300w, https://otus.ru/journal/wp-content/uploads/2023/07/oj-1080x720-kopiya-9-1024x724.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/07/oj-1080x720-kopiya-9-768x543.png 768w, https://otus.ru/journal/wp-content/uploads/2023/07/oj-1080x720-kopiya-9-1536x1086.png 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/07/oj-1080x720-kopiya-9-150x106.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Гореть, но не сгорать. Топ-5 лайфхаков для руководителя в IT" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/goret-no-ne-sgorat-top-5-lajfhakov-dlya-rukovoditelya-v-it/" data-wpel-link="internal">Гореть, но не сгорать. Топ-5 лайфхаков для руководителя в IT</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/goret-no-ne-sgorat-top-5-lajfhakov-dlya-rukovoditelya-v-it/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-07-28T16:34:42+00:00">28 июля, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">1 Min Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/kod-na-si-i-kommentarii/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kod-na-si-i-kommentarii/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Код на СИ и комментарии" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/08/oj-1080x72020-1-150x106.png 150w, https://otus.ru/journal/wp-content/uploads/2023/08/oj-1080x72020-1-300x212.png 300w, https://otus.ru/journal/wp-content/uploads/2023/08/oj-1080x72020-1-1024x724.png 1024w, https://otus.ru/journal/wp-content/uploads/2023/08/oj-1080x72020-1-768x543.png 768w, https://otus.ru/journal/wp-content/uploads/2023/08/oj-1080x72020-1-1536x1086.png 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/08/oj-1080x72020-1-150x106.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Код на СИ и комментарии" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kod-na-si-i-kommentarii/" data-wpel-link="internal">Код на СИ и комментарии</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kod-na-si-i-kommentarii/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-08-08T20:40:34+00:00">8 августа, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">4 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/proektnaya-rabota-studenta-evgeniya-yacury-po-teme-room-with-a-view-po-kursu-software-architect\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Mon, 09 Mar 2026 15:38:24 GMT -->