LuckyStep

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

Должность в проекте
Ведущий веб-разработчик, затем технический руководитель
Время в проекте
1 год
Статус проекта
Заморожен, ищет инвесторов
Тестовая площадка
ls.anti-soft.ru
Логины: angel, agent, company
Пароль ко всем — 1

Полученный опыт

  • Работа в команде с использованием трекинговой системы и системой управления версиями;
  • Создание профилируемого, мультиязычного веб-приложения, рассчитанного на большие нагрузки;
  • Анализ и улучшение производительности: кеширование (Memcache), уменьшение количество запросов, установка акселератора (APC), тонкая настройка php и его расширений;
  • Глубокое понимание архитектуры Yii Framework и его расширение под свои нужды;
  • Управление командой: создание отдела тестировщиков, добавление в рабочий процесс этапов тестирования и анализа, поиск разработчиков и организация собеседований, написание документаций для более лёгкого вхождения в проект для новых разработчиков;
  • Администрирование 6-ти серверов: их поддержка, написание скриптов для автоматического обновления сайта из репозитория;
  • Использование принципов ООП и паттернов проектирования: фабрика, стратегия, MVC, полиморфизм, композиция, одиночка, прототип, ленивая загрузка, DAO, DTO;
  • Проектирование частей системы: использование UML диаграмм, описание интерфейсов и бизнес логики;
  • Написание PHP-Unit тестов, реализация через тестирование;
  • Создание множества небольших библиотек и методов, облегчающих разработку, которые можно будет использовать и в других проектах.

Архитектура проекта

Проект проектировался под большие нагрузки, что делает интересным его техническую реализацию. Приложение разбито на две части: ядро (Java, отвечает за бизнес логику, общается с БД) и веб-приложение (PHP, Yii Framework, представление данных, отвечает на запросы пользователя).

Я в проекте отвечал за php часть и реализовал из неё приблизительно 75%. PHP часть основана на Yii Framework, многие классы которого были наследованы и дописаны под свои нужды. PHP не имеет доступ к БД и общается с ядром через слой доступа (Data Access Object, Data Trasfer Object, Php-Java-Bridge).

DAO имеет собственное кеширование как на уровне одного запроса, так и на уровне кеширования отдельных полей через Memcached. DAO может содержать в себе данные в виде DTO (паттерн композиция).

Yii модели могут содержать в себе DAO или DTO (так же паттерн композиция), интерфейсы модели строились по подобию Active Records — можно получать данные из DTO путём вызова $model->name и сохранять данные или отправлять запрос путём $model->save() или $model->buy().

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

Клиенская JavaScript часть

В веб-приложении много динамических механизмов: ajax запросы, модальные диалоги, фотогалереи с комментариями, динамически обновляющий список участников розыгрыша (используется механизм pooling) и т.п.

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

  1. Динамическая подгрузка JavaScript, CSS кода и файлов. Подгружая html код через App.request() автоматически загрузятся все недостающие скрипты и стили, зарегистрированные через механизмы Yii (ClientScript);
  2. Можно создавать собственные javascript компоненты и модули на базе ядра. Модули и компоненты так же могут загружать друг друга, причём они не начнут выполняться, пока не будет всё подгружено;
  3. Набор существующих компонентов: диалоги, уведомления, автодогружаемые списки, статусы загрузки и т.п.
  4. Методы для работы с адресной строкой и создания ссылок (аля Yii::createUrl());
  5. Мультиязычность (gettext);
  6. Логирование
  7. События (events)

Скриншоты

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

Окно покупки талисмана. Биллинг система сделана универсальной и позволяет быстро внердять новые элементы покупок. Диалоговое окно покупки создано с помощью клиенского веб-приложения (компонент CDialog).

Окно просмотра фотографий, сделанное так же на основе клиенского javascript приложения по аналогии с альбомами в вконтакте. Оно позволяет динамически переходить между фотографиями, альбомами и оставлять комментарии к каждой фотографии. Размер фото автоматически адаптируется под экран пользователя.

Мой вариант дизайна стартапа LuckyStep. Страница приветствия.

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