Go to mobile version

Андрей Сумин ([info]andrewsumin) wrote,

Мой доклад на WebHitech

Как у нас построен процесс разработки.

Когда я только начинал делать что-то в web, в принципе не было понятия “верстальщик”. Каждый, кто делал сайты, делал весь спектр задач: от настройки базы данных до написания javascript кода.

Сейчас индустрия web настолько обширна, что узкая специализация - это норма. Например, у нас в компании есть служба эксплуатации, у них даже есть отдельный DBA. Server side программисты и Frontend программисты, однако, выделенных верстальщиков у нас нет.

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

В первой схеме есть основной workflow выполнения задачи. За техническую часть отвечает программист, server side программист. Когда для задачи нужна верстка - верстальщику отдают макет, а он программисту отдает HTML.

У этой схемы есть плюсы:
— можно сильно снизить требование к квалификации верстальщика;
— с первого взгляда задачи легко отдаются на outsource.

Но минусы этой схемы куда серьезнее плюсов:
— создает код один человек (CSS, JS, картинки), а организовывает его другой человек.
— на production баг, в макете от верстальщика все хорошо, а на сайте нет - что делать?

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

При такой схеме вы уже не верстальщик, а Frontend разработчик. Работа server side программиста заканчивается генерацией некоторого документа (XML, JSON ...), который вы превращаете во что-то, что понимает браузер. Никто лучше вас не знает client side, вам и надо полностью контролировать, что туда уходит. Вопроса “К кому идти, если в браузере что-то не так?” больше нет, виноваты всегда вы, если виноват сервер сайд - придут к вам, а вы уже разберетесь что к чему.


Frontik

Итак, с целью определились, ее надо как-то достичь..

Что нам надо:
— возможность забирать данные от программистов;
— мощный шаблонизатор;
— удобный инструмент для написания логики представления.

Вообще весь мой опыт говорит о том, что server side и frontend плюс client side - это два очень разных мира. С разными задачами, и их лучше не смешивать, а самое лучшее - технически разнести как можно дальше друг от друга. Плюс время, когда один проект живет на одном сервере, давно прошло. Сейчас сайт - это несколько программных продуктов, которые взаимодействуют между собой. Раз мы уже имеем сетевое взаимодействие, то и frontend c server side мы решили отделить друг от друга посредством http протокола.

Естественно мы не первые кто пытался решить эту задачу. Более того в 2007 году было два решения от ведущих российских компаний:
— XScript, Янндекс
— FEST, Mail.ru

Оба решения поддерживали работу по HTTP, что нас полностью устраивало.

Мы выбрали решение от Яндекса:
— оно уже тогда было c открытом коде;
— успешно работало несколько лет;
— давало вестальщикам не скудный самописный шаблонизатор, а всю мощь и силу XSLT.

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

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

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

Теперь шаблонизатор. Тут вариантов не было, однозначно XSLT.

Бонусом ко всему мы получаем полноценный язык, на котором мы можем как-то работать с данными от сервера — Python.

В остатке, frontik обеспечивает:
— диспетчеризацию урлов;
— HTTP опрос backend;
— парсинг, обработку и интеграцию ответов в xml;
— XSLT трансформацию.

Пример страницы “Hello world”.
class Page(frontik.page.PageHandler):
  @set_xsl('helloworld.xsl')
  def get_page(self, request):
    res = etree.Element('hello')
    res.text = 'world'
    self.doc.put(res)

Или пример с походом за данными
def cb(xml, response):
  nodes = xpath.Evaluate(..., xml)
  if not nodes:
    finish('Nothing found!')
  else:
    ...
self.get_url(request, cb)

Легкая вставка данных в результирующий xml документ
placeholder = self.get_url(...)
self.doc.put(placeholder)

self.get_url возвращает plaseholder, который будет заполнен данными, когда ответит сервер


Гибкость разработки

Обычно frontend очень сильно ограничен узким набором инструментов. В случае с frontik у нас в распоряжении python и мы можем себе многое позволить.

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

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

XSL трансформация - это всего-лишь одна из стадий работы frontik, и мы просто добавили еще одну стадию.

Было: XML → XSL → HTML
Стало: XML → XSL → Пост-обработка → HTML

Логика выбора переводов осталась на XSL, где ей самое и место, но оперирует она только с ключами. Пост-обработка берет HTML и заменяет в нем ключи на конечные тексты.

Заключение

Еще один из больших плюсов frontik - это сквозной python. Вы кадый день что-то пишете и дебажите на python. Если что-то не так в самом frontik или даже tornado, то вы как обычно берете и дебажите python, что вы и так делаете каждый день по много часов.

Frontik на github
http://github.com/hhru/frontik

Проект на frontik (hh api + yaru api).
http://github.com/AndrewSumin/hephaestus
Tags: webhitech

  • Post a new comment

    Error

    switch

    Your reply will be screened

  • 24 comments

[info]alshur

December 17 2010, 08:47:52 UTC 1 year ago

не слишком ли всё это.. тяжеловато?

[info]andrewsumin

December 17 2010, 08:52:08 UTC 1 year ago

Тяжеловато в каком смысле?

[info]alshur

December 17 2010, 09:34:17 UTC 1 year ago

да во всех: серверов надо больше, квалификация у разработчиков должна быть высокая и всё такое прочее

явный выигрыш не понятен

[info]andrewsumin

December 17 2010, 10:16:18 UTC 1 year ago

Можно решать сложные задачи. У нас небольшой rps, но на 300rps front живет на 2-х серверах, скажу честно на всякий случай стоит 4-ре.

[info]padlik

December 17 2010, 11:25:32 UTC 1 year ago

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

[info]enternet

December 17 2010, 10:26:34 UTC 1 year ago

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

1. Frontik is a simple xml aggregator. Смысл наличия именно отдельного xml-агрегатора мне не совсем ясен. Чем не устраивает просто xslt-функция document()? Запросил у стороннего сервера xml и готово. Есть какие-то специфические требования асинхронности? Или необходимо воспроизводимое чтение в длинной транзакции?

2. Просмотрел и презентацию, но понял ничего про пост-обработку. Какая проблема ей решается, что не в состоянии решить xslt? У питонового xslt-процессора, что, нет возможности подключить сторонние функции? Или у используемого xslt-процессора нет возможности контролировать xsl:import/xsl:include?

3. В планах развития заявлен стриминг. А зачем? И как делать собираетесь? Скрестить с xslt будет явно тяжеловато.

[info]rubaha_paren

December 17 2010, 11:27:49 UTC 1 year ago

1. он не просто конкатит документы. питоном описана логика составления динамических запросов-походов за xml.
2. есть часть логики на xslt: без постпроцессинга пришлось бы заранее, перед xslt сходить за всеми данными, которые могут понадобится.
3. фронтику иногда нужно проксировать большие документы, сейчас он их целиком загружает в память.

[info]enternet

December 17 2010, 11:46:29 UTC 1 year ago

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

[info]rubaha_paren

December 17 2010, 11:52:35 UTC 1 year ago

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

[info]enternet

December 17 2010, 11:56:02 UTC 1 year ago

Зачем же. Можно, например, так - document('/server/data.xml?id_from=1&id_to=20')

[info]rubaha_paren

December 17 2010, 12:03:59 UTC 1 year ago

они не нужны все в одном месте.
их в сумме на страницу надо много.
а в каждом конкретном месте в верстке он нужен один.

допустим, статический текст на многоязычном сайте.

[info]enternet

December 17 2010, 12:09:46 UTC 1 year ago

Мутно как-то, конкретнее можно? Статический текст на много язычном сайте в xslt хорошо реализуется через подключение entity, у Чикуенка хорошо описано. Опять-таки(!), если у процессора есть техническая возможность нужный файлик подключить.

[info]andrewsumin

December 17 2010, 12:16:52 UTC 1 year ago

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

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

[info]enternet

December 17 2010, 12:32:24 UTC 1 year ago

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

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

[info]andrewsumin

December 17 2010, 12:34:04 UTC 1 year ago

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

[info]enternet

December 17 2010, 12:00:19 UTC 1 year ago

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

[info]rubaha_paren

December 17 2010, 12:13:51 UTC 1 year ago

вроде как речь идет о проблеме, которую мы решаем постобработкой.

процессор там libxslt.

помимо приведенного примера с key-value хранилищем, есть еще момент, что для построения некоторых ссылок нам нужно очень много данных (в xml это получается ~200kb, 7k нод). Опыт показал, что держать это в xml, а потом в xslt к этому всему обращаться и формировать результат - на порядок медленнее, чем обработать эти данные на питоне.

[info]enternet

December 17 2010, 12:33:32 UTC 1 year ago

Спасибо.

[info]jakobz

February 7 2011, 13:11:10 UTC 1 year ago

>Теперь шаблонизатор. Тут вариантов не было, однозначно XSLT.

А можно здесь пояснить? Я сам .net-разработчик, в основном работал в разных бекендах. Но я имел как-то опыт верстки на XSLT. Мне показалось это адом по сравнению, например, с тем же aspx-ом.

Почему вариантов нет? Какие еще варианты рассматривались? Шаблонизаторов ведь различных масса. Почему нельзя просто работать с бекендами из кода фронтенда без всяких архитектурных излишеств?

[info]andrewsumin

February 7 2011, 13:14:46 UTC 1 year ago

XSLT - самый гибкий. Фактически это функиональный язык.

Совсем недавно мы сделали прекомпиляцию, обработав XSL с помощью XSL.

[info]jakobz

February 7 2011, 13:29:05 UTC 1 year ago

Какой же он функциональный если в нем даже функцию объявить нельзя? http://stackoverflow.com/questions/110031/is-xslt-a-functional-programming-language

[info]andrewsumin

February 7 2011, 13:43:26 UTC 1 year ago

Оно? http://exslt.org/func/index.html
libxsl поддерживает из коробки.

[info]jakobz

February 7 2011, 14:05:39 UTC 1 year ago

Ну, положим такое есть. А передать функцию в другую функцию можно?

Я может сам не так круто разбираюсь в XSLT. Но я, например, вижу вот такие ужасы: http://www.artlebedev.ru/tools/technogrette/xslt/alpha-index/

На C# + aspx эту задачу можно решить в несколько строк кода. На XSLT же - это целая эпопея, достойная отдельной статьи и четырех страниц кода. Оно вот так вот обычно с XSLT?

[info]andrewsumin

February 7 2011, 14:29:34 UTC 1 year ago

Обычно не так, конечно есть редкие задачи, которые на XSL решать неудобно, мы их выносим в python.

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

У XSL и правда сложный вход, но у меня были хорошие учителя.
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…