От редакции:
В рубрике DOU Проекторвсе желающие могут презентовать свой продукт (как стартап, так и ламповый pet-проект). Если вам есть о чем рассказать — приглашаем поучаствовать. Если нет — возможно, серия вдохновит на создание собственного made in Ukraine продукта. Вопросы и заявки на участие присылайте на valentina@dou.ua.
Начало
В далеких
Идея разработки собственного продукта не оставляла нас и начала обрастать конкретикой — каким хочется видеть продукт, какая функциональность, какие технологии будут использоваться, наброски архитектуры, кусочки кода. Работая с другими платформами, мы пониманили, что большая часть из них либо слишком тяжелые, например WebSphere Commerce, либо весьма специфические, как Apache ofbiz, либо просто очень медленные, как Magento. Поэтому хотелось создать продукт, по возможности лишенный недостатков, на проверенных технологиях, масштабируемый и легко адаптируемый под конкретные нужды.
Так получилась платформа YesCart, она решает свои задачи и вполне заслуживает на свое «место под солнцем».
Реализация
Наш опыт позволил нам достаточно быстро разрабатывать доменную модель и бизнес сервисы. Все прекрасно «ложилось» на стандартный стек технологий Java — Spring, Hibernate, использование Hibernate Search давало прекрасные возможности для поиска и фильтрации товаров по некоторым атрибутам. Например, выбор продуктов из одной или нескольких категорий, определенного производителя, в указанном диапазоне цен и обладающих набором определенных характеристик представляет собой пару строк по сравнению с громоздкими SQL запросами.
Некоторые части системы были весьма нетривиальны в разработке. Однако кажущаяся изначальная простота при глубоком изучении вопроса превращалась в сотни килобайт кода и десятки раз больше кода для тестирования. Так, например, модуль управления жизненным циклом заказа содержит около 18 тыс. строк кода.
Интеграция с платежными системами также была полна сюрпризов, особенно одной из самых трудоемких стала интеграция с paypal express была — явно не express. А интеграция с google checkout была вообще остановлена по нескольким причинам: «корпорация добра» мало того, что требовала фактически все информацию о клиенте и его корзине, но еще и предоставляла ужасно неудобный API (позже Google закрыл этот проект).
Что касается UI магазина и административных прложений, при всем богатстве выбора приходилось выбирать между не очень хорошими и плохими вариантами.
Магазин.Первым серьезным вопросом стал выбор web технологии магазина. В наличии имелись требования по multistore и желание получить от web framework реальное сокращение трудозатрат. Использовать action based framework типа spring mvc не очень хотелось, на фоне рассвета component based framework-ов, HTML5 был весьма сырой. Поэтому мы испробовали четыре варианта — JSF Mojarra RI, Primefaces, Tapestry и Wicket.
Mojarra RI отпала по причине нарушения SOLID принципов, что вело к невозможности глубокой кастомизации framework. Primefaces содержали кучу ошибок при работе с data grid. А Tapestry не поддерживали backward compatibility, что было неприемлемо.
Выбор пал на Wicket, который задумывался как достаточно абстрактный framework, который теоретически мог работать как для desktop приложений на различных платформах, так и для web. Также у него хорошо проработанная архитектура, которая позволяет при минимуме затрат изменять поведение. Плюс данный framework имеет действительное разделение представления от данных и запрет на использование скриплетов на разметке страниц. С одной стороны, этот факт заставляет писать качественно, а с другой стороны, приводит к невозможности быстрого изменения страниц.
Административное приложение.Делать административное приложение как desktop приложение на Swing или Eclipse RCP не хотелось, Java Applets уже были мертвыми а Java FX версии 1 и вовсе представлял собой печальное зрелище.
После некоторых изысканий было принято решение использовать Flex, хотя понимание того, что рано или поздно Flash и Flex умрут, несколько омрачало картину. Писать на Flex было просто и быстро, даже без глубоких знаний Flex, Flash & Action Script. Плюс Adobe предлагал Blaze DS — библиотеку для интеграции со Spring.
Демо-каталог.Перед релизом платформы команде пришлось решать проблему, которая лежала вне плоскости разработки ПО — отсутствие каталога продуктов для демонстрационного магазина. Также без каталога невозможно произвести нагрузочное тестирование системы целиком. Создавать такой каталог, собирая информацию о продуктах — огромная потеря времени и демотивирующая работа. Сначала попробовали обратиться к cnet.comс просьбой о доступе к части их каталога товаров, но переговоры были не успешными. После долгих поисков в сети наткнулись на icecat.com.uaи получив от них разрешение на использование данных написали на groovy утилиту для импорта в Yes Cart.
Продукт.Первый релиз мы выпустили 26 Мая 2013 — 180 тыс. строк кода на Java, Action Script, HTML, Java script, etc и 60 тыс. строк комментариев. Это был полноценный коробочный вариант платформы, на основании ранних версий которого уже были запущенны магазины. На данный момент количество строк кода — около 300 тыс.
Поддержка responsive design обеспечивает покрытие практически любых устройств, на которых браузер поддерживает HTML5. В дополнение Yes Cat имеет REST API, который может использован для обеспечение покупок внутри приложений любого типа.
Еще хочу отметить такой функционал, как multi-shop — одно приложение обслуживает множество магазинов под разными доменными именами, каждый из которых может иметь свой собственный каталог, тему оформления, администраторов и прайс листы. Склады могут использоваться как общие, так и отдельные. То есть управление множеством магазинов может производится из одного административного приложения. Эта функциональность дает возможность развернуть новый магазин в течении нескольких минут. Например, это может быть полезно для организации сезонных, брендовых или продуктовых распродаж. Либо для проведения a/b тестирования.
Также мы создали и платную версию продукта, в которой магазин написан на groovy, расширена поддержка почтовых уведомление, редактирование шаблонов не выходя из административного приложения.
Для активного продвижения продукта мы пока усилиий не прилагали, были сосредоточенны на разработке.
Сторонние проекты.Во время работы над проектом некоторая разработанная функциональность обрела собственную жизнь как отдельные продукты. Например, стало понятно, что использование персистентных доменных объектов на UI является анти-паттерном. Поэтому Денис создал превосходный Object Mapper — GeDa, который заслуживает отдельной статьи.
Дальнейшие планы
На данный момент избавляемся от тяжкого наследия — Flex, что позволит в ближайшем будущем обновить версии Spring & Hibernate.
С появлением нового административного приложения появится возможность редактировать страницы магазина онлайн, не выходя из приложения. Но, скорее всего, этот функционал будет доступен только для платной версии.
Выученные уроки, или чтобы я сделал не так:
— Недооценили масштаб проекта и его объем;
— Полностью выпали из оценки по документированию проекта;
— Осознанное решение об использовании Flex принесло выигрыш только на первых этапах. Надо было использовать web-services вместо amf протокола;
— Отказ от Spring MVC и использование Apache Wicket— весьма неудачное решение. Привело в повышению «входного порога» для потенциальных пользователей;
— Даже для ОСС проектов необходим PR менеджер или человек, который будет активно продвигать решение;
— Изначальное не продумали модель монетизации. Писать открытый проект — замечательно, но получать прибыль тоже полезно и приятно.
Посмотреть примеры работы платформы можно здесь: abc-style.com.ua/yes-shop, multimediastore.ch, demo.yes-cart.org/yes-shop.