воскресенье, 30 октября 2016 г.

Глава 5. Пользовательские алгоритмы, супер-герои и разбитые лодки

Раздался дикий свист и над головой пролетел очередной супер-герой. Да, нынче их стало удивительно много. Каждый раз, глядя на этих мужественных, самоотверженных людей, в голову к Сашке приходит одна и та же мысль.

Тем временем, минутная стрелка уже коснулась шестёрки, а часовая - в замешательстве замялась между десятью и цифрой одиннадцать. Что это значит? Пора на митинг.
Сашка очень любит утренние митинги, т.к. на них можно задать настроение для всего дня.

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

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

Что же, порадуемся за Сашку и его окружающих: печенье оказалось свежим, а кофе крепким и ароматным. Зарядившись энергией чёрного напитка, один из представителей интеллектуальной части общества принялся решать задачи. В этот самый момент, когда всё только начинается, в голову к Сашке всегда проникает одна и та же мысль.

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

Вы наверняка знаете, что у супер-героев есть какие-то сверх-способности. Например, по секрету открою вам одну из таких способностей Сашки. Как, вы не знали, что он супер-герой? Хм. Теперь знаете.
Способность о которой я хочу рассказать, это умение в удивительно короткие сроки и с поразительной лёгкостью прививать себе привычки и отказывать от них. Как правило, Сашка прививает себе полезные привычки, а отказывается от негативных.
Хорошо, давайте вернёмся к этому попозже, а пока продолжим про алгоритмы.

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

Что выбрать, каким путём пойти?
Как вы понимаете, вариантов много. Мы с вами рассмотрим несколько из них.

Начнём с самого простого: вы даёте пользователям редактировать код приложения. Страшно? Правильно. Вы можете надеяться или гарантировать, что ваши благожелательные пользователи не знают/не умеют использовать опасные функции/значения и сочетания тех и других. Однако, рано или поздно это приведёт вас к коллапсу. Поэтому если вы всё равно хотите идти этой дорогой, то позаботьтесь о создании хоть какой-либо песочницы для выполнения шедевров ваших очаровательных пользователей.

Сашке снова привиделась лодка и мастера. Однажды эти строители закончат лодку, продадут её кому-то и кто-то будет на ней плавать или она будет стоять у кого-то в сарае. Интересно, какое дело этим мастерам до судьбы их творения?

Пользователи всё ещё хотят редактировать алгоритмы, а вы передумали давать им доступ к исходникам. Тогда самое время взглянуть на ещё один путь решения. Мета-язык.
Суть достаточно проста, в отличие от реализации: вы придумываете свой язык со своими ограничениями и транслируете его уже в тот, который позже исполняется.
Да, это задача намного интересней предыдущей реализации, но вам сразу стоит подумать о следующем:

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

Допустим, что мастера делали эту лодку, - размышлял тем временем Сашка, - всю свою жизнь. В этом случае, они будут очень сильно волноваться за результат и за его судьбу. 
С другой стороны, если они делают по лодке каждый месяц, то со временем ценность лодок сильно упадёт и судьба результата станет не столь важной как в первом случае. Хотя, тут есть нюанс. Рассмотрим сразу несколько его разновидностей.
1. Мастерам сказали, что если лодка не поплывёт, то они не получат за неё ни копейки.
2. Мастерам сказали, что если лодка не поплывёт, то их всех расстреляют.
3. Мастерам сказали, что независимо от результата они получат деньги за проделанную работу.
4. Мастерам сказали, что если лодка поплывёт, то только в этом случае они получат оплату.
5. Мастерам сказали, что если лодка поплывёт, то они не только получат оплату за свою работу, но ещё им достанется премия.
Надо хорошенько подумать над каждым из этих вариантов, некоторые из которых выглядят одинаковыми.

А пользователи уже прямо-таки просят возможности редактировать и создавать алгоритмы, а вы уже замучились писать свой новый язык с блек-джеком и шлюпками для спасения. Тогда, наверное, стоит всё-таки взглянуть на готовые реализации таких вот языков или инструментов.
В сети вы можете найти уйму всего подходящего и не очень. Выбирать вам.
Если ваш основной язык - PHP, то можно взглянуть на скудный Expression от Symfony, на производительный Zephir, на, в конце-концов, V8 и его расширение для PHP, или даже Blockly.

Что бы вы ни выбрали, всегда держите фокус на своих потребностях и их приоритет. Возможно, кому-то покажется парадоксальным, но если ваши пользователи не знают что такое пространство имён, типы данных, передача по ссылке, выделение памяти и нечто подобное, то вы, скорее всего, потратите одинаковое время объясняя им как писать код для PHP/JS/Python и т.п. 

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

Над головой Сашки снова раздался свист, он поднял взгляд и проводил удаляющегося в объятья горизонта супер-героя, мысленно сказав ему то же самое, о чём он думал каждый раз, наблюдая подобное зрелище: "Вы не чините разбитые лодки - вы сокрушаете волны, что их топят." Сашка сделал глубокий вдох свежего, уже почти зимнего, воздуха и вошёл в здание. Переоделся и поднялся на своё рабочее место. Приступая к спасению мира решению задачи, он задал себе как обычно один и тот же вопрос: "Что я буду делать сегодня: заканчивать строить лодку или сокрушать волны?"

Комментариев нет:

Отправить комментарий