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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

суббота, 1 октября 2016 г.

Глава 4. Скриптовые языки, адаптация и маленький секрет Сашки

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

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

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

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

А как же большие данные?
Их обработка должно выполняться с максимальной скоростью (имеется в виду эффективность и результативность). Но если трезво взглянуть на ситуацию и всё-таки открыться суровой правде, то никому это не надо - ежесекундный обработанный гектар данных. Почему? Всё просто: человек в состоянии запоминать и оперировать единовременно примерно 3-7 артефактами. Именно поэтому сейчас так популярны технологии, которые позволяют выдавать информацию порциями, что, в свою очередь, позволяет растянуть процесс вычисления и обработки данных без ущерба для конечного пользователя.

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

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

Сашка улыбнулся и подумал, что если бы к нему пришёл человек и попросил разработать проект, о котором у самого незнакомца есть только общее представление, то, как минимум, для прототипа точно был бы выбран транслируемый язык. Ведь кроме скорости разработки, подобные языки обладают ещё несколькими очевидными преимуществами:
1. Кроссплатформенность.
2. Приемлемая рыночная цена.
3. Из-за низкого порога вхождения, огромное количество специалистов.
4. Огромное активное сообщество.
5. Впечатляющий набор готовых инструментов, работающих "из коробки".
6. Весёлость.

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

Тем временем в соседней комнате совсем юный человечек проснулся и пытался объяснить любящим родителям, что у него болит и как тяжело быть маленьким секретом.