Самый первый интерфейс для пельменных вендинговых аппаратов делали на языке PHP. Но данный язык программирования слишком узконаправленный, используется в основном для веба. А нам нужна не только веб-страница с бэкендами автоматов, личными кабинетами пользователей, магазином и подобным. Наша задача - организовать различные сервисы, в том числе, не связанные с вебом, например, сервис для управления камерой, автоподключение VPN, автоперезагрузка автомата и многое другое.
Почему именно Python?
В сравнении с PHP язык программирования Python + фронтенд на JavaScript с реактивным фреймворком - наилучшее решение для решения наших задач. Python подходит для широкого спектра задач и хорош для Backend, а Frontend на JS в вебе - это более универсально, не нужно качать приложение.
Для Python реализовано множество фреймворков под самые различные задачи. Например, у нас есть сервис для взаимодействия с Modbus - управление механизмами автоматов, а для него используется фреймворк от Python. А также у нас есть сервис для Vendista, который тоже управляется с Python. Но и это еще не все, на Python реализован сервис с прямым управлением соусным аппаратом. Конечно, сначала рассматривали другой вариант - Arduino, но Python значительно выигрывает по своей функциональности.
У Python есть большая сила - он супер-универсальный, на нем решается множество задач, в нем уже встроены математические функции и множество библиотек. Неспроста Python любят математики и программисты, которые занимаются Big Data, ML и подобным.
А также данный язык программирования используют для приложений, Machine Learning, Data Science, для компьютерного зрения. В том числе программисты делают десктопные приложения под Windows, но можно и под Linux или другие операционные системы. Python даже используют в написании мобильных приложений.
Немного про реализацию интерфейса
Интерфейс мы делали на Python Django с дополнительным использованием JavaScript - но решение временное. Когда количество вендинговых аппаратов значительно увеличится - интерфейс может не справиться с такой нагрузкой, как многочисленное формирование страниц для клиентов.
Поэтому в команде поступило предложение использовать в админке, магазине и на автоматах отдельно Frontend и также отдельно Backend. Таким образом снимается значительная часть нагрузки с сервера и передается на устройство клиента, который зашел в админку или в магазин. Дополнительно к Frontend используется реактивная библиотека Vue.js для большего снижения нагрузки - страницы не перезагружаются, а обновляются только необходимые разделы (например, футер, хеадер и прочие используются одни и те же на все страницы).
Backend теперь будет не на простом Django, а на Django REST Framework, который не будет отдавать целые страницы, перегружая сервер и прогоняемый трафик данных, а отправлять только небольшие JSON-данные, например, с заказами, данными пользователей, информацией о компаниях и прочим.
Backend - самая сложная и важная часть управления вендинговыми аппаратами , но при этом самая неинтересная и не очевидная для обычных пользователей, ведь они ее не видят. Работа Backend происходит под "капотом", где заложены главные расчеты, работа с системой и сервисами управления и многим другим. А пользователь видит только наш интерфейс, который создан на Vue.js 3.
До того, как мы выбрали Python
Один из вариантов, который мы изначально рассматривали - Android + Java. Такая система реализации интерфейса вендинговых аппаратов могла обеспечить нам эффективное управление и быстрый отклик. На Java можно писать и бэкенд, и приложения на Android.
Но! Есть весомые минусы - здесь мы не можем организовать:
- Личный кабинет для заказов;
- Личный кабинет курьера;
- Модуль для технического персонала;
- Полный удаленный доступ;
- Нужен разработчик Java.
Сама связка более узконаправленная и она значительно ограничивала диапазон наших возможностей.
Мы могли бы использовать Android + Java в одном варианте: нам пришлось бы стыковать системы написанные на разных языках - а это в свою очередь может как привести к техническим конфликтам, так и вызовет потребность в разработчиках с разными квалификациями по каждому направлению. А нам оно не надо))
Возможно, если в проекте не требуется удаленное управление вендинговыми аппаратами и достаточно реализации интерфейса, то Android + Java будет хорошим решением.
Наши задачи, с которыми справился Python
- Дистанционное подключение к вендинговому аппарату и, соответственно, отладка различных команд в режиме реального времени;
- Личные кабинеты для разных ролей пользователей;
- Прямое взаимодействие личного кабинета с каждым вендинговым автоматом;
- Интернет-магазин для заказа товаров в вендинговом аппарате со своего телефона;
- И многие другие детали.
Также на данный момент уже внедрили для развертывания системы управления сетью вендинговых аппаратов Pel-Meni:
- Ведение документации сервисов
- Ведение Docstrings - описание методов, функций, их переменных, возвращаемых данных
- Аннотация типов данных - это явное указание типа ожидаемых данных при объявлении переменных, классов и функций. Для функций и методов можно указывать, какой тип данных принимают их переменный и какой возвращают. Это позволяет получить преимущества низкоуровневых языков, упрощает понимание для разработчиков, где что должно хранится и как использоваться - разработка становится проще, можно включить в тесты, что позволит избежать попадания не валидного кода в Продакшн среду.
- Реализовали локальную среду разработки - теперь любой разработчик может запустить проекты в Dev режиме - то есть тестировать, дебажить: backend, frontend, монолиты и микросервисы вендингового аппарата, онлайн магазина, админки, ЛК и т.д. прямо у себя на ПК, без опасения сломать что-то в Prod среде. Так же реализована удалëнная среда разработки, тестирования предпродакшн версии на отдельной системе.
- RESTfull API и OpenAPI - формализованная спецификация и экосистема множества инструментов, предоставляющая интерфейс между front-end системами, кодом библиотек низкого уровня и коммерческими решениями в виде API. Вместе с тем, cпецификация построена таким образом, что не зависит от языков программирования, и удобна в использовании как человеком, так и машиной. Если просто - упрощает взаимодействие между Frontend и Backend разработчиками - для Frontend разработчика предоставляется сгенерированная документация с полным описанием API, какие типы данных принимаются, как, какие ограничения (например максимальная длина текста, максимальное число, как нужно оформить дату, сколько знаков можно указать после плавающей точки для чисел с десятичными и т.д., много всего), бэкендер просто отдаёт её фронтендеру и не тратит много времени на объяснение как валидировать данные, что нужно отправлять и т.д.
- Docker compose - предназначено для решения задач, связанных с упрощением развёртывания проектов, легко переехать на другую машину или сервер и быстро развернуться, так же легко остановить любой из сервисов, пробросить сеть между ними и для других задач.
- PostgeSQL - вместо SQLite. SQLite - это легкая безсерверная однопоточная файловая база данных, предназначенная для небольших приложений, которым требуется простота и непринужденность в использовании, в то время как PostgreSQL - это мощная клиент-серверная база данных, предназначенная для высокопроизводительных крупномасштабных развертываний, требующих сложных запросов и типов данных. Если просто SQLite уже не выдерживал и не обеспечивал нам нужную производительность и функциональность, поэтому заменили её на мощный PostgeSQL
Итак, наш окончательный вывод: Python для нашей компании pel-meni.ru оказался незаменим, на нем можно организовать абсолютно все:)!