Система информирования жителей об авариях на системах ЖКХ

Основные сценарии использования сервиса. Создание приложения, закрывающего пропасть взаимодействия между гражданами и администрацией. Выбор инструментов и технологий. Создание виртуального окружения посредством программы docker. Алгоритм работы парсера.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 18.07.2020
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное государственное автономное образовательное учреждение высшего образования

Национальный исследовательский университет

Высшая школа экономики

Факультет информатики, математики и компьютерных наук

Программа подготовки бакалавров по направлению

09.03.04 Программная инженерия

Выпускная квалификационная работа

Система информирования жителей об авариях на системах ЖКХ

Ковалев Василий Александрович

Нижний Новгород, 2020

Содержание

Введение

1. Постановка задачи

1.1 Основные сценарии использования сервиса

1.2 Выбор инструментов и технологий

2. Архитектура серверной части приложения

3. Стратегия интеграции

4. Тестирование программного продукта

Список литературы

Введение

Эволюция программного обеспечения не стоит на месте и то, что в конце 20-го века казалось чем-то фантастическим, сейчас плотно вошло в повседневную жизнь каждого человека. Совсем недавно, для того чтобы отправиться в поездку на такси, нужно было ловить машину на улице. Затем, когда мобильная связь стала общедоступной - достаточно было лишь позвонить в компанию занимающейся предоставлением такого вида услуг. А в наше время, машина приезжает уже после нескольких нажатий на экран смартфона, тем самым, экономя время и клиента, и водителя. Ведь убирается ненужный посредник - оператор. Выгода очевидна: не нужно тратить денег на содержание кол-центров, ведь достаточно лишь команды программистов для поддержки и развития приложения.

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

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

1. Постановка задачи

Описание

Население при отсутствии какой-либо услуги ЖКХ (вода, тепло, газ, электричество и т.д.) должно иметь возможность зайти на сайт "Аварии на системах ЖКХ" (или мобильное приложение на Android). На этом сайте должна отображаться карта населенного пункта, на которой будут видны здания и сооружения, оставшиеся без коммунальной услуги, а также будет присутствовать отметка с описанием аварийной ситуации или плановом отключении. В отметке об аварии указывается: место аварии, количество затронутых жителей, характеристики аварии, планируемые сроки ликвидации аварии. Отметки различаются по цвету в зависимости от вида услуги:

· Отопление - красный;

· Электроснабжение - зеленый;

· Водоснабжение - синий;

· Водоотведение - коричневый;

· Газоснабжение - оранжевый.

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

1.1 Основные сценарии использования сервиса

Использование сервиса гражданами включает следующие этапы:

· Гражданин переходит на сайт "Аварии на системах ЖКХ", где на карте (при приближении карты должны отображаться здания и сооружения, оставшиеся без коммунальной услуги) видит отметку с описанием аварийной ситуации или плановом отключении.

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

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

· Гражданин ждет появления на карте отметки, далее ждет устранения аварии в соответствии с указанным временем ликвидации аварии.

Использование сервиса оператором диспетчерской службы включает следующие этапы:

· Оператор принимает сообщение от населения об отсутствии коммунальной услуги (через сайт, по системе 112, по телефонному номеру ДДС или ЕДДС);

· Диспетчер направляет силы и средства (аварийные бригады) на устранение аварии.

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

· Оператор подтверждает заявку, и она начинает отображаться на карте.

· Аварийная бригада устраняет аварию.

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

· Диспетчер снимает отметку об аварии с карты после ее устранения.

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

Обзор существующих решений

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

antisnegnn.ru

Одним из ярких представителей в Нижегородской области является проект antisnegnn.ru (Рис.1).

Рисунок 1 - Портал antisnegnn.ru

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

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

вамрешать.рф

Следующее интересное решение - сайт вамрешать.рф (Рис. 2). Этот портал был запущен на территории Нижегородской области, и в данный момент, он позволяет без заполнения большого количества бумаг и поиска ответственных организаций, решать возникающие проблемы.

Рисунок 2 - Портал вамрешать.рф

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

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

Это отличный инструмент для взаимодействия человека с государством. Однако, если проблема требует более быстрого решения и реагирования со стороны ресурсоснабжающих организаций, данный сервис окажется менее полезен. Как раз для решения данной проблемы, которая требует немедленных действий, был разработан сервис "Аварии на системах ЖКХ".

1.2 Выбор инструментов и технологий

Исходя из опыта разработки серверных приложений, PostgreSQL была выбрана как СУБД и этот выбор обоснован несколькими факторами. Одно из ее преимуществ - она бесплатная и кроме того, она является одной из первых СУБД, поэтому достаточно хорошо развита, у нее богатое сообщество и доступная документация. PostgreSQL способна обрабатывать большое количество данных, что немаловажно при дальнейшем масштабировании проекта. Третье, в PostgreSQL можно хранить как структурированные данные, так и слабо структурированные (Panchenko, 2015), что облегчит работу взаимодействия с пользовательским интерфейсом. Для управления базой данных на сервере был развернут веб-интерфейс pgAdmin.

Вся разработка велась на языке Python с FastApi, как основным фреймворком. FastAPI - это фреймворк для создания лаконичных и довольно быстрых HTTP API-серверов со встроенными валидацией, сериализацией и асинхронностью. Он выделяется среди многих других фреймворков по следующим причинам:

· Скорость: высокопроизводительный, на одном уровне с NodeJS и Go (благодаря Starlette и Pydantic). Один из самых быстрых фреймворков, доступных на питоне.

· Быстрое написание кода: увеличенная скорость разработки фич от 200% до 300% (Features - FastAPI, 2020).

· Меньше ошибок: на 40% уменьшена вероятность ошибок человека.

· Интуитивный: хорошая поддержка различных редакторов кода. Меньше времени на отладку.

· Простой: спроектирован быть простым в изучении и применении. А также меньше времени уходит на чтение документации.

· Короткий код: минимизировано дублирование кода.

· Устойчивый: готовый к использованию код, а также автоматическая документация - Swagger (API Documentation & Design Tools for Teams | Swagger, 2020).

Так как одной из поставленных задач является развертывание сервиса на сервере, то единственным решением такой задачи являлось создание виртуального окружения посредством программы docker. Так же, как и виртуальная машина, docker запускает свои процессы в собственной, заранее настроенной операционной системе. Однако все процессы докера работают на физическом сервере деля все процессоры и всю доступную память со всеми другими процессами, запущенными в системе. Подход, используемый docker находится посередине между запуском всего на физическом сервере и полной виртуализацией, предлагаемой виртуальными машинами. Этот подход называется контейнеризацией. Для управления виртуальными окружениями был выбран Portainer. Portainer - это веб-интерфейс, позволяющий управлять запущенными контейнерами как на локальном компьютере, так и на удаленном сервере.

2. Архитектура серверной части приложения

Перед тем, как начать активную разработку того или иного программного решения, любой программист или группа программистов должны продумать архитектуру (McConnell, 2014). Есть две общепринятые методики разработки архитектуры:

1) Top-to-Down - сначала продумываются сущности, их количество, их взаимодействие. И только потом, постепенно делается переход к реализации этих сущностей, к коду и низкоуровневым вещам.

2) Down-to-Top - сначала будут разрабатываться классы, их конкретная и, возможно, сложная реализация. И только потом, эти классы будут включены в другие классы или сущности, и постепенно, будет сделан переход на более высокий уровень абстракции.

Обычно, вторую методику принято использовать в разработке встроенных систем, где большинство кода работает на очень низком уровне. И в большинстве случаев, именно от него (от реализации), зависит вся архитектура приложения. Для серверной части системы информирования жителей об авариях на системах ЖКХ, была выбрана методика Top-To-Down и перед началом разработки была проделана работа по выделению основных сущностей и понятий. Схема взаимодействия объектов реализации представлена на Рисунке 3.

Рисунок 3 - Архитектура серверной части

Пользователи сервиса, могут взаимодействовать с ним через мобильное приложение и сайт, они посылают запросы на балансировщик, пользуясь предоставленным REST API, который, в свою очередь принимает решение куда их перенаправить (отличное решение, если в будущем будет потребность в масштабировании проекта). Запросы от балансировщика приходят на серверную часть и начинается их обработка соответствующей функцией. В зависимости от запроса, идет либо обращение к базе данных, для удаления, добавления или поиска заявок, или к парсеру. Парсер должен уметь принимать на вход файл в формате excel и возвращать плановые отключения, которые он смог из него извлечь.

Теперь, когда у нас есть понимание того, как должны взаимодействовать сущности между собой, можно приступать к непосредственной разработке программного продукта.

Балансировщик

В качестве балансера был выбран Nginx, как самое популярное и зарекомендовавшее себя решение. Nginx используется более чем в 479 миллионов сайтов, по данным Netcraft на декабрь 2019 года.

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

Кроме того, балансер будет отвечать за максимальный размер передаваемого файла с плановыми отключениями (100 мб), а также за кэширование запросов.

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

Серверная часть

Серверная часть представляет из себя сервер, написанный на языке Python, с использованием фреймворка FastApi и поддерживающий общение с пользовательским интерфейсом по протоколу REST API.

Однако, перед тем как писать обработчики для POST, GET и прочих запросов, нужно определиться с тем, над какими объектами мы собираемся работать. Единственной сущностью, которой оперирует сервис, является событие или заявка (event). Для того, чтобы иметь возможность сохранять заявки в базу данных, а также упростить работу с ними из кода, нужно было создать модель данных.

Модель данных - это класс, который хранит в себе поля, идентичные полям, которые будут содержаться в базе данных. Так, аварийное событие, содержит в себе поля:

· ID - уникальный идентификатор события

· Created_at - время, когда событие было создано

· Description - описание, не длиннее, чем 250 символов

· Type - тип события: газ, вода, электричество и пр.

· Priority - приоритет, который выставляется оператором, при обработке заявления. Может быть: очень низким, низким, средним, высоким и критическим.

· Status - в обработке, отложена, ведутся работы, выполняется оценка, выполнена, отклонена

· Deadline - крайний срок выполнения заявки (проставляется оператором)

· Start time - когда фактически начались работа

· Resolved_at - когда фактически закончились работы

· User id - идентификатор пользователя, создавшего заявку

· Position - координаты происшествия

· Rating - какое количество людей пострадало из-за происшествия

· Is system - является ли отключение плановым или нет

· Rejected reason - причина отклонения заявки. В случае отклонения заявки, это поле обязательно к заполнению

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

Как только на сервер приходит запрос на создание нового события от пользователя, нужно проверить, не заведена ли уже задача на эту аварию. Для этого нужно сделать поиск по базе данных и попытаться найти похожую аварию. Критерием их схожести является тип и географическая близость. Например, заявка на отсутствие горячей воды по адресу улица Краснофлотская, 11в и сообщение об отсутствии воды по тому же адресу, будут объединены в одну заявку, несмотря на различные описания проблемы. И таким образом, рейтинг заявки будет увеличен. Если же заявка создается впервые, то нужно проверить, что пользователь с переданным в заголовке ID существует и если это так - то мы должны создать новую заявку и выставить ей статус - находится в обработке, де факто, ждет подтверждения от оператора и не видна обычным гражданам. Листинг можно увидеть на Рисунке 4.

Рисунок 4 - Листинг POST-обработчика для событий

Следующим пунктом стоит получение заявки от серверной части приложения. У пользовательского интерфейса есть два варианта: получить все заявки, либо получить конкретную заявку, указав ее ID.

В первом случае, пользовательский интерфейс может выбрать следующие параметры:

i. Получить все заявки

ii. Получить только актуальные (не закрытые)

iii. Получить только ждущие подтверждения

По умолчанию, возвращаются только актуальные заявки. Если клиент хочет получить заявки только одного конкретного пользователя, то есть возможность передать пользовательский ID, то по нему также будут доступны опции, перечисленные выше. Также, на стороне серверной части реализована функция пагинации. Пагинация дает возможность запрашивать не все заявки сразу, а постранично. С учетом масштабирования проекта и длительного его существования, их может быть больше миллиона. Сначала, например, первые 20, затем следующие 20 и так далее (Рис. 5). Клиент может передать на серверную часть интервал заявок, которые он хочет запросить. Однако, есть ограничения на количество одновременно запрашиваемых заявок. Этот параметр хранится в конфигурационном файле и может быть изменен по желанию локального администратора. Пагинация также работает с упомянутым ранее функционалом.

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

Рисунок 5 - Листинг GET-обработчика для событий

Последний пункт в работе с заявкой - это возможность ее изменить. Если клиенту необходимо сменить статус заявки или снизить приоритет, для этого он может воспользоваться PATCH запросом (Рис. 6). При этом, будут произведены проверки на ID заявки и пользователя. Для упрощения работы оператора и повышения производительности сервиса в целом, реализовано изменение нескольких полей заявки за один запрос. Также, если оператор будет менять статус заявления на "отклонено", но забудет указать причину, то такой запрос просто не пройдет, а пользовательскому интерфейсу вернется ошибка.

Рисунок 6 - Листинг PATСH-обработчика для событий

Парсер

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

Парсер умеет выделять заявки из файлов с расширением xls и xlsx. Не играет никакой роли, в каком формате хранятся данные в таблице. Единственное что он требует для своей работы, это составить словарь, по которому будут выделяться нужные столбцы. Например:

config = {

'start_time': ['created_at', 'с', 'начало'],

'resolved_at': ['resolved_at', 'до', 'конец'],

'description': ['описание', 'description'],

'address': ['address', 'адрес'],

}

Допустим, мы хотим загрузить файл с содержимым как на Рисунке 7.

Рисунок 7 - Файл с плановыми отключениями

Алгоритм работы парсера следующий:

1. Загружаем в программу файл, который нам нужно обработать.

2. Выбираем страницу (sheet) с которым будет вестись работа. В данном случае - это первая страница.

3. Определяем количество строк и столбцов, шесть и четыре соответственно.

4. Выделяем заголовки - "с", "до", "описание" и "адрес".

5. Мы проходим по всем строкам и создаем список элементов - словарей.

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

Пример работы программы:

{'с': '2019-02-02 15:00:34.460238', 'до': '2024-02-02 15:00:34.460238', 'описание': 1, 'адрес': 'Нижний Новгород, Невзоровых, 49'}

{'с': '2020-02-02 15:00:34.460238', 'до': '2025-02-02 15:00:34.460238', 'описание': 2, 'адрес': 'Нижний Новгород, Невзоровых, 12'}

{'с': '2021-02-02 15:00:34.460238', 'до': '2026-02-02 15:00:34.460238', 'описание': 3, 'адрес': 'Нижний Новгород, Невзоровых, 9'}

{'с': '2022-02-02 15:00:34.460238', 'до': '2027-02-02 15:00:34.460238', 'описание': 4, 'адрес': 'Нижний Новгород, Невзоровых, 29'}

{'с': '2023-02-02 15:00:34.460238', 'до': '2028-02-02 15:00:34.460238', 'описание': 5, 'адрес': 'Нижний Новгород, Невзоровых, 4'}

Листинг парсера представлен на Рисунке 8.

После работы парсера, сервис получает минимально возможный набор данных, необходимых для создания событий (Рис. 9). Для всех событий существует признак is_system, который является индикатором планового отключения. Наличие такого признака позволяет визуально различать плановые события на карте. парсер программа сервис

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

В ходе разработки данного функционала возник вопрос о том, какой статус должен быть присвоен событиям, помеченным как плановые отключения. До этого момента, существовал механизм, согласно которому пользовательский интерфейс отображал события на карте, исходя из статуса заявки. Так, например, заявки, отмеченные как выполненные удалялись с карты, а заявки, взятые в работу, отображались. Одним из возможных решений было выставление плановым отключениям статуса "в работе" и отображение их на карте, но тогда требовалось бы написать дополнительный сервис, который должен был бы следить за актуальностью плановых отключений и закрывать их по прошествии времени. Однако такое решение бы увеличило потребление ресурсов системы. И тогда был разработан следующий алгоритм, призванный разрешить данную проблему. Все плановые отключения начали помечаться как "завершенные", однако изменился сам подход к выбору активных заявок. Теперь фильтр активных заявок проверял не только их статус, но и время их закрытия и, если оно было больше, чем текущая дата - помечал заявку как активную и позволял отображать на карте.

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

Рисунок 8 - Листинг парсера

Рисунок 9 - Листинг функции, создающей плановые отключения

База данных

Для хранения данных в проекте используется СУБД PostgreSQL. Помимо преимуществ, описанных в главе 4. Выбор инструментов и технологий, стоит отметить хорошую интеграцию PostgreSQL с языком Python.

Чтобы не писать из кода запросы на SQL, можно воспользоваться различными библиотеками-обертками. Для этого сервиса была выбрана sqlalchemy (SQLAlchemy - The Database Toolkit for Python, 2020). Это самая популярная ORM для языка Python. Object-Relational Mapping - технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая "виртуальную объектную базу данных". Sqlalchemy позволяет писать более продвинутые конструкции, чем другие библиотеки, но за это приходится платить сложностью и объемом кода. Для данной задачи важна гибкость, производительность и скорость. Дополнительно sqlalchemy позволяет, в особо сложных случаях, самому писать SQL-запрос, если программист не уверен в том, какой запрос будет сгенерирован после выполнения написанного им кода.

Также, не стоит забывать, что любому проекту, работающему с базой данных, также нужен инструмент для создания и контроля миграций. Если в будущем схема данных (таблиц) должна будет измениться, то единственным решением, если не настроен инструмент для миграций, будет либо удаление таблицы и создание новой, либо ручной перенос данных. Оба эти варианта приводят или могут привести к частичной или полной потере данных. Поэтому было принято решение использовать менеджер миграций alembic, который способен создавать миграции в автоматическом режиме, что дает возможность редактировать и просматривать код миграции при необходимости. При этом, также генерируется код для процесса, обратного апгрейду базы данных.

Для того, чтобы иметь возможность хранить географические данные в базе данных PostgreSQl, было принято решение установить расширение PostGIS (PostGIS, 2020), которое расширяет возможности PostgreSQL с точки зрения хранения пространственных данных, запросов к ним и управления ими.

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

Процесс работы с географическими данными можно условно разделить на два этапа:

1) Телефоном предоставляются географические данные в формате координат.

2) При создании заявки и попытке записать ее в базу данных, координаты отдаются как аргументы в конструктор поля Point.

Благодаря расширению PostGIS мы можем автоматически высчитывать расстояния между точками, а также возвращать клиенту текстовое представление адреса.

3. Стратегия интеграции

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

Возникает вопрос, с какой частотой нужно проводить интеграции, которые так полезны проекту? Выделяют два основных подхода - это постепенный и фазовый. Фазовый подход предполагает, что вы уже дошли до самого конца разработки, все классы написаны, каждый кусочек кода протестирован и теперь команда готова соединить вместе все работающие в изоляции части всего продукта. Долгое время, такой подход считался оптимальным (McConnell, 2014).

Однако, этот выбор не является оптимальным, и поэтому большинство компаний пользуется "инкрементной интеграцией", она также называется "последовательной". Программист декомпозирует программу на небольшие части, и постепенно начинает их разрабатывать, одну за одной и добавлять к основному каркасу программы. Это позволяет получить преимущества перед обычной фазовой моделью, ведь теперь ошибки гораздо проще отыскать. Если что-то пошло не так при интеграции очередной функциональности, становится сразу понятно, где следует искать ошибку. С такой моделью, программисты раньше начинают видеть результат своей работы, а также, становится легче определять готовность проекта в процентах. И самое главное, используя такую модуль - улучшается отношение с заказчиком, так как он сразу может видеть прогресс, а не через несколько месяцев разработки.

В рамках одной "инкрементальной" модели существует несколько стратегий, как нужно соединять сущности между собой и в какой последовательности.

· Top-Down Integration (Рис. 10), предполагает, что разработка начинается с написания основных абстракций, а затем, постепенно двигаясь сверху вниз, команда постепенно углубляется в детали реализации. Основной плюс - главная логика работы программы будет протестирована более внимательно на более ранних этапах разработки. Кроме того, такая модель позволяет начать писать код раньше, чем будут до конца выяснены низкоуровневые детали реализации. Однако, есть и свои минусы. Например, если архитектура несовершенна или имеются проблемы с производительностью, все это станет ясно только на самых поздних этапах разработки, когда все низкоуровневые вещи будут дописаны.

Рисунок 10 - Top-Down Integration

· Bottom-Up Integration (Рис. 11) - это подход, при которым программисты начинают разработку системы с реализации наиболее мелких ее частей и постепенно, двигаетесь вверх, объединяют их в целую систему. К сожалению, у такого подхода есть свои недостатки. Нужно завершить разработку архитектуры всего приложения до начала написания кода. А также, если имеются какие-то проблемы с верхнеуровневым дизайном - они будут выявлены только на самом последнем этапе разработки.

Рисунок 11 - Bottom-Up Integration

· Sandwich Integration (Рис. 12) предполагает, что сначала разработчики реализуют и интегрируют между собой высокоуровневые интерфейсы и бизнес-логику, затем перейдут к реализации низкоуровневых деталей реализации (может быть, платформо-зависимых частей) и только потом перейдут к классам и сущностям, находящимся между этими двумя уровнями абстракций. Таким образом, верхний и нижний уровни образуют "сендвич". Этот подход комбинирует предыдущие два.

Рисунок 12 - Sandwich Integration

· Risk-Oriented Integration (Рис. 13) пытается также как и Sandwich Integration минимизировать недостатки двух предыдущих методов, но делает это немного другим способом. При данном подходе, программисты оставляют реализацию среднего уровня абстракций на последний момент, но начинают реализацию классов высокоуровневых и низкоуровневых абстракций в зависимости от сложности их написания. То есть, самые сложные классы реализовываются в первую очередь, а самые простые в последнюю очередь.

Рисунок 13 - Risk-Oriented Integration

· T-Shaped Integration (Рис. 14) - это подход, при котором выбирается какая-то одна функциональность, чтобы проверить гипотезы об производительности системы, и реализуется сверху вниз. Это позволяет на ранних стадиях разработки понять какие идеи дизайна приложения были верны, а какие оказались не самыми удачными.

Рисунок 14 - T-Shaped Integration

· Feature-oriented Integration (Рис. 15) обязывает разделить весь проект на отдельные фичи - функциональности и интегрировать их в общий проект по одной. У данной стратегии есть три основных плюса:

i) Не нужно такое большое количество, так называемых, строительных лесов, чтобы замокать (создать фальшивые объекты, которые не готовы) поведение всех объектов системы. Ведь работа ведется только с одной функциональностью за раз, и она самодостаточна.

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

iii) Этот подход очень хорошо ложится на принцип Объектно-ориентированного программирования, так как каждая функциональность здесь предстает как отдельная иерархия классов.

Рисунок 15 - Feature-oriented Integration

Feature-oriented Integration стратегия разработки и интегрирования была выбрана для создания сервиса. Например, необходим был функционал отображения информации об авариях на карте происшествий, как у оператора в Едином Диспетчерском Центре, так и у обычных пользователей на экранах мобильных телефонов. Следуя данной стратегии, отдельная команда разработчиков сначала разработали интерфейс для отображения таких происшествий для телефона и веб-интерфейса оператора, а затем, данная функциональность была реализована на серверной стороне (Рис. 16). Таким образом, спустя одну такую итерацию, сервис уже имел ограниченный, но в тоже время, работающий функционал. С использованием Feature-oriented Integration подхода и был написан весь сервис для информирования граждан об авариях.

Рисунок 16 - отображение заявок

4. Тестирование программного продукта

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

· Юнит-тестирование (Unit testing) - когда объектом тестирования становится один класс, функция или небольшая программа в изоляции от всей системы.

· Функциональное тестирование - процесс тестирования какой-то завершенной части продукта для проверки его соответствия функциональным требованиям.

· Интеграционное тестирование - совмещенное выполнение одного или двух классов, подсистем или компонентов системы, с целью выяснить насколько хорошо они работают вместе.

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

· Тестирование системы - это тестирование всего программного продукта в его финальной конфигурации, как единое и неделимое целое.

Здесь же, стоит отметить, что существуют два разных подхода к тестированию - тестирование программы как белого (white box) или как черного ящика (black box). Тестирование программы, как черного ящика, предполагает абсолютное незнание того, что происходит внутри программы или класса, а тест базируется только на входных и предполагаемых выходных параметрах. В то время, когда техника тестирования программы, как белого ящика, предполагает абсолютное знание и понимание того, что происходит внутри программы и известно ее поведение на те или иные входные параметры. Естественно, данный подход никак нельзя применить, когда программист сам пишет тесты для своего кода. Поэтому данный программный продукт будет тестироваться как белый ящик.

Также, необходимо было определиться с целями тестирования и определиться с тем, сколько времени должно быть потрачено от общего проекта.

Некоторые профессионалы рекомендуют потратить примерно половину имеющегося времени на тестирование, но, основываясь на исследованиях, приведенных в книге Code Complete (McConnell, 2014) тестирование должно занимать от 8 до 25 процентов. Было решено, что 15 процентов должно хватить, чтобы достигнуть покрытия в районе 90 процентов и выявить основное количество ошибок в программном коде.

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

В своей работе Boris Beizer (Johnson, 1994) описал, что программисты обычно очень оптимистичны насчет подсчета кода, покрытого тестами. Обычные программисты верят, что их код покрыт на 95 процентов (так как 100 процентное покрытие в общем случае невозможно), но на самом деле имеют лишь 80 процентов в лучшем случае и 30 процентов в худшем случае. Ну а в среднем, код покрыт на 50-60 процентов.

Если говорить о нашем продукте, он должен быть максимально отказоустойчив, так как речь идет об информировании граждан об авариях на системах ЖКХ. И для достижения такой цели, была поставлена задача в 90 процентов покрытия кода тестами. Для автоматизации подсчета тестового покрытия была использована программа pytest.

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

Настройка работы сборочной линии

Независимо от выбора стратегий интеграции и тестирования важную роль в процессе тестирования играет настройка ежедневной сборки и написания смоук тестов (smoke tests). Основная задача здесь - это проверить что продукт действительно "дымит", все тесты проходят, каждый файл интерпретируется правильно и не возникает никаких ошибок.

Основываясь на книге Rapid Development (McConnell, 1996) можно сделать вывод, что основная польза проекту заключается в том, что команда видит, что проект собирается, а тесты проходят, что положительно влияет на их продуктивность. Кроме того, в случае неудачной сборки можно будет установить, в какой именно момент времени был добавлен код, приведший к ошибке. Также, автор рекоммендует ввести систему штрафов за поломанный билд.

В текущем проекте реализована система запуска построения проекта, запуск тестов и статического анализатора на базе gitlab, посредством написания конфигурационного файла на языке YAML (Рис. 18). При добавлении нового кода в проект, на каждое изменение, запускается сборочная линия и выполняется ряд задач по проверке кода. В случае, если хотя бы одна из задач оказываются невыполненной, то gitlab запрещает добавление такого кода в главную ветку проекта.

Пример работы сборочной линии на Рисунке 17.

Рисунок 17 - Пример работы сборочной линии

Рисунок 18 - Конфигурационный файл сборочной линии

Разворачивание решения на сервере

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

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

Для того чтобы создать контейнер для сервиса на питоне, нужно взять базовый контейнер с python3, далее необходимо скопировать код сервиса из локальной директории с приложением в контейнер. В этой же локальной директории создается виртуальное окружение python для запуска проекта. Здесь же прописывается путь к скрипту, который устанавливает все зависимости, делает миграции и прочее. Здесь же прописывается порт, по которому будет доступен контейнер.

Второй контейнер необходим для базы данных.

Третий контейнер - это балансер с nginx. Здесь тоже все просто - указываем директорию для хранения кэша.

И далее следует самый ответственный момент - написание docker-compose файла. Docker-compose файл содержит имена контейнеров, которые он должен запустить и пути к их docker файлам. Тут же прописываются правила перезапуска контейнера, в случае возникновения ошибок. Прописываются порты, по которым будут доступны база данных и nginx. И теперь после того, как написаны предыдущие файлы, мы можем запустить сервис, введя одну команду в консоль: docker-compose up. И теперь приложение доступно по spacehub.su/api. Конкретно по этому адресу будет доступен swagger с описанием всех доступных запросов.

Результаты

Целью данной работы являлось создание веб-сайта и мобильного приложения, которые бы помогли закрыть пропасть в взаимодействии между обычными гражданами и сотрудниками ЖКХ.

Такой тип компьютеризации таких процессов как создание, обработка и решения заявления об аварии сохранит очень много времени для граждан и для сотрудников экстренных служб и ЖКХ. Потому что теперь нет смысла в звонках и потере ценного времени, а сотрудники соответствующих служб могут сразу приступить к работе над проблемой. И теперь, для граждан будет чист и понятен весь процесс обработки их заявок на устранение проблем.

На текущий момент, для пользователей нашего серверного приложения доступен следующий функционал:

a. Получение списка заявлений с фильтром по их актуальности.

b. Получение одного происшествия по его уникальному ID.

c. Создание события. Если такое событие уже существует (анализ проводится на основе географической близости событий), то у него автоматически увеличивается рейтинг заинтересованности граждан в его решении.

d. Редактирование заявления, есть возможность обновить все поля за один запрос.

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

Кроме того, была решена проблема разворачивания решения на сервере, посредством использования утилиты docker-compose. Были написаны функциональные тесты, с покрытием кода в 82%, а также настроена сборочная линия на платформе gitlab (Continuous Integration), не позволяющая вносить изменения в код, если какой-то из тестов завершился с ошибками.

Дальнейшее развитие

Следующий шаг в развитии сервиса - это улучшение его производительности, чистоты кода и увеличение тестового покрытия c 82% до 95. Кроме того, необходимо добавить фильтрацию заявлений об авариях на основе содержания описания, и реализовать возможность авторизации пользователей приложения через портал ГосУслуги.

Список литературы

1. Panchenko, I., 2015. Postgresql: Вчера, Сегодня, Завтра. [online] Издательство "Открытые системы". Available at: <https://www.osp.ru/os/2015/03/13046900/> [Accessed 17 May 2020].

2. Fastapi.tiangolo.com. 2020. Features - Fastapi. [online] Available at: <https://fastapi.tiangolo.com/features/> [Accessed 17 May 2020].

3. Fastapi.tiangolo.com. 2020. Fastapi. [online] Available at: <https://fastapi.tiangolo.com/> [Accessed 17 May 2020].

4. Swagger.io. 2020. API Documentation & Design Tools For Teams | Swagger. [online] Available at: <https://swagger.io/> [Accessed 17 May 2020].

5. McConnell, S., 2014. Code Complete. 2nd ed.

6. Sqlalchemy.org. 2020. Sqlalchemy - The Database Toolkit For Python. [online] Available at: <https://www.sqlalchemy.org/> [Accessed 17 May 2020].

7. Ru.wikipedia.org. 2020. Postgis. [online] Available at: <https://ru.wikipedia.org/wiki/PostGIS> [Accessed 17 May 2020].

8. McConnell, S., 1996. Rapid Development

9. Gaлl, T., 2020. A Beginner'S Guide To Docker?--?How To Create A Client/Server Side With Docker-Compose. [online] freeCodeCamp.org. Available at: <https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-a-client-server-side-with-docker-compose-12c8cf0ae0aa/> [Accessed 17 May 2020].

Размещено на Allbest.ru

...

Подобные документы

  • Создание системы, осуществляющей запуск программы по расписанию, которое хранится в реестре. Методы и средства взаимодействия с аппаратными и программными средствами, типы интерфейсов. Алгоритм работы и листинг программы, проверка ее работоспособности.

    курсовая работа [78,6 K], добавлен 13.11.2009

  • Анализ создания виртуального окружения для разработки. Установка фреймворка Flask. Особенность настройки аутентификации и привилегий. Создание Python-файла и написание в нем простого веб-приложения. Запуск и проверка работоспособности приложения.

    лабораторная работа [2,1 M], добавлен 28.11.2021

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

    реферат [32,2 K], добавлен 03.10.2010

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

    курсовая работа [632,0 K], добавлен 21.10.2015

  • Использование программы Outlook Express для работы с электронной почтой. Рабочее окно программы. Выбор режима работы, назначение панелей инструментов. Настройка программы для совместного использования. Создание, отправка и удаление электронного письма.

    курсовая работа [18,7 K], добавлен 21.06.2011

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

    курсовая работа [27,9 K], добавлен 26.07.2014

  • Разработка информационной системы административного управления. Выбор языка и среды программирования. Структура взаимодействия информации. Требования к программно-аппаратному окружению. Создание программы в Delphi и связывание ее с базой данных.

    курсовая работа [1010,9 K], добавлен 08.10.2015

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

    дипломная работа [3,0 M], добавлен 13.10.2016

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

    курсовая работа [6,3 M], добавлен 10.12.2013

  • Информационное обеспечение автоматизированной системы, создаваемой для устранения ошибок при внесении различных данных о всех услугах. Создание таблиц. Описание автоматизируемых функций приложения. Укрупнённый алгоритм программы, логика работы модулей.

    курсовая работа [931,5 K], добавлен 27.09.2012

  • Компоненты приложения и технологии, используемые для связи между ними. Обзор программных средств и технологий, используемых в ходе работы. Трансляция кода JSP страницы в код сервлета. Создание структуры базы данных c применением фреймворка Hibernate.

    курсовая работа [1,1 M], добавлен 16.07.2016

  • Анализ существующих систем организации аудиосвязи. Протоколы аудиопереачи. Архитектура сетевого взаимодействия. Алгоритм серверного приложения. Структура клиентского приложения. Выбор языка программирования и средств разработки. Требования к системе.

    курсовая работа [1,2 M], добавлен 28.04.2014

  • Обзор программ для сшивания фотопанорам. Создание фотопанорам для виртуального тура. Выбор и загрузка изображений. Автоматическое склеивание снимков. Указание дополнительных контрольных точек. Объединение панорам в виртуальный тур, его реализация.

    курсовая работа [3,5 M], добавлен 22.01.2016

  • Создание и использование динамически загружаемых библиотек в Delphi. Преимущества использования, создание простейшей DLL. Статическая и динамическая загрузка DLL, обмен данными с ней. Создание программы, работающей с базой данных клиентов кардиоцентра.

    курсовая работа [425,2 K], добавлен 07.07.2012

  • Общие сведения о языке ассемблера. Назначение команды прерывания INT число. Описание логической структуры программы: алгоритм работы, используемые методы, входные и выходные данные. Структура и тестирование программы. Руководство оператора программы.

    курсовая работа [90,0 K], добавлен 01.12.2009

  • Создание диаграммы варианта использования для информационной системы. Моделирование взаимодействия объектов во времени в языке UML. Главная особенность диаграммы кооперации. Физическое представление программной системы, семантическая связь между классами.

    курсовая работа [3,9 M], добавлен 09.01.2014

  • Создание Windows-приложения для проведения обучения и тестирования студентов по информационной безопасности. Алгоритм решения задачи, блок-схема работы программы, выбор языка программирования Delphi. Охрана труда программиста, обязанности пользователя.

    дипломная работа [4,8 M], добавлен 04.06.2013

  • Изучение основных методов разработки программ для операционных систем семейства Windows с применением технологий .NET. Анализ возможностей интегрированной среды разработки Microsoft Visual Studio, языка C# и создание приложения "пункт видеопроката".

    курсовая работа [1014,7 K], добавлен 28.06.2011

  • Создание блок-схемы алгоритма и реализующей его программы, снабженных пояснениями, для решения задач. Реализация программы в среде Delphi как проекта консольного приложения. Основные алгоритмические структуры, соответствующие операторы для их реализации.

    контрольная работа [447,4 K], добавлен 08.10.2012

  • Разработка программного решения по созданию мобильного приложения. Изучение технологий для разработки приложений. Анализ работы торговых агентов. Обоснование выбора языка программирования. Проектирование интерфейса структуры и верстка, листинг программы.

    дипломная работа [2,2 M], добавлен 08.06.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.