Как мы делали новую версию Выходного

Aug 27, 2011 13:27



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

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

Дизайн

Данные Гугл аналитики говорили о высоком проценте отказа (bounce rate)
предыдущей версии. Простое общение со знакомыми и друзьями дало нам
понять, что большинство просто не понимают, как этим сайтом
пользоваться, и о чём он. Длинный список из названий событий,
заведений и советов вперемешку, непонятно по какому принципу
отсортированных, сбивал с толку:



Так что первостепенная задача состояла в том, чтобы сделать интерфейс
более доступным, при этом расширив функционал. Над этим мы работали
долго и упорно. У меня ушло 20 минут на то, чтобы отобрать десяток
разных картинок из всего процесса и раскидать их в Индизайне:



Когда мы остановились на определённом варианте, я отрисовал иконки и
всякую, как выражаются в Бюро, интерфейсную фурнитуру:



И вот что у нас получилось:



Скриншоты я вставил для понта, лучше перейти на сайт и посмотреть на
всё живьём. Между разными типами записей (заведения, советы, события)
появились разделители, краткое описание стало ёмким, все заведения
обзавелись отдельными статическими страницами - короче, всё стало
понятнее и информативнее. Для того чтобы объяснить, что же это
всё-таки за сайт, мы нарисовали промо-блок, который в будущем
превратится в полноценный тур по сайту:



Вёрстка

Статья про media queries на Хабре.

Вёрстка, ясное дело, блочная, резиновая, более-менее семантичная. Всё
хорошо работает в современных браузерах и ИЕ7. Благодаря media
queries, вёрстка тянется от 320 до 1600 пикселей и сайт отлично себя
чувствует на экране широкоформатного монитора, планшетника, телефона
или в айфрейме приложения Вконтакте:



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



Джаваскрипт

Из библиотек используется jQuery для манипуляций с DOM, хороший
шаблонизатор EJS и fancybox. Дальше
самописное ядро и набор хелперов, каждый класс в своём файле; данные
берутся с сервера в json, фильтруются по параметрам, которые задаёт
пользователь (в этой версии только теги, дальше будет время работы,
плюшки типа вайфая и т.д.) и рендерятся. Очень упростил отладку мой
самописный callstack, с помощью которого я всегда вижу очередь
запущенных функций, к какому классу они принадлежат, с какими
аргументами были вызваны, и кто их вызвал:



Я далеко не профи в javascript-программировании, поэтому допустил
несколько ошибок в проектировании, которые понял достаточно поздно, так что исправлять придётся уже в следующих версиях:

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


Карта

Режим карты на сайте - наша гордость. После сравнения Google Maps с
Яндекс.Картами
, я переписал почти
готовый код, написанный под API Яндекса, под API Гугла. Я не в курсе
на счёт Яндекса, но если пользоваться последней версией API Гугла, то
карты работают под iOs и Android.

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

Что происходит на сервере?

Серверная часть написана на php с использованием Codeigniter. Помимо
основных задач, серверная часть выполняет еще много полезных вещей:

  • Типографит тексты, которые пишут наши редакторы. Лебедевский
    типограф обращается к серверу и поэтому когда он падает, падает и наш
    сайт. Было такое всего один раз, но осадок остался, поэтому мы перешли
    на типограф Евгения Муравьёва - он
    хороший, гибкий, выполняется на сервере и никуда наружу не стучится, к
    тому же он умеет делать классные штуки, например, размечать ссылки,
    обрамлять текст параграфами и следить за пробелами до и после знаков
    препинания.
  • Обрезает и шарпит картинки
  • Кроном раз в час считает лайки Вконтаке для всех записей (нужно для
    ранжирования).
  • Генерирует sitemap.xml с ссылками на статические страницы.


Оптимизация

Предыдущая версия очень медленно работала, поэтому мы сделали многое,
чтобы в этот раз всё летало:

  • Саша избавился от join'ов в запросах и это стало основным фактором
    ускорения. Время, необходимое на выдачу json'a уменьшилось
    приблизительно в 1000 раз.
  • Настроили gzip сжатие для всего, что выдаётся php. Еще не настроили
    gzip для статики.
  • Графику для сайта - в спрайты, насколько это возможно.
  • Все js- и css-файлы готовятся для продакшена с помощью
    RequireJs - остаётся всего три файла: цсс-ка,
    jquery+requireJs и все наши классы и функции в одном js-файле.


Вот и всё

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

В работе нам много помогали советами Саша Раковец и
Саша Зайцев, за что им большое спасибо =)

Хочу замечания, комментарии, напутствующие слова, возмущения - всякого =)

Permalink

| Leave a comment  »



Запись в блоге на Постероусе

rss2lj
Previous post
Up