Введение в «Full-Stack» JavaScript.

В процессе создания любого веб-приложения у вас наверняка появляются десятки архитектурных решений.

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

Следуя своему опыту, я могу сделать вывод, что «full-stack» JavaScript позволяет добиться абсолютно любых целей. Наверное, вы неоднократно сталкивались с этим понятием и возможно даже анализировали все его преимущества или просто обсуждали с друзьями. А пробовали ли вы воспользоваться этим подходом в собственном проекте? В этой статье я постараюсь объяснить основные преимущества «full-stack» JavaScript и особенности его работы.

Изображение ниже позволяет получить общее представление:

toptal-blog-500-opt

(Увеличенная версия).

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

Почему я использую JavaScript.

Я начал заниматься веб-разработкой с 1998 года. В то время, для большинства серверных разработок мы использовали Perl, но уже тогда для работы над клиентской частью использовался JavaScript. С тех пор веб-серверные технологии полностью изменились: мы прошли через волну появления новых языков и технологий, таких как PHP, ASP, JSP, NET, Ruby, Python и это еще далеко не полный список. Разработчики начали понимать, что использование двух отдельных языков для клиентской и серверной среды значительно усложняет многие вещи.

В начале становления PHP и ASP, когда шаблонные движки были еще просто идеей, разработчики нередко встраивали код приложения прямо в HTML. Использование встроенных скриптов было далеко не редкостью:

<script>
    <?php
        if ($login == true){
    ?>
    alert("Welcome");
    <?php
        }
    ?>
</script>

Или, что еще хуже:

<script>
    var users_deleted = [];
    <?php
        $arr_ids = array(1,2,3,4);
        foreach($arr_ids as $value){
    ?>
    users_deleted.push("<php>");
    <?php
        }
    ?>
</script>

Очень часто использование нескольких разных языков приводило к появлению типовых ошибок и к неправильному использованию операторов таких, как for и foreach. Кроме того, написание кода для серверной и клиентской части, а также сохранение идентичности структуры данных является затруднительным даже сегодня. Исключением можно считать проекты, над которыми работает целая команда разработчиков с инженерами, специализирующимися в отдельности на клиентской части (front end) и на серверной (back end). Но даже если все эти люди смогут обмениваться информацией, они не будут иметь возможность сотрудничать друг с другом по вопросам программного кода:

<?php
    $arr = array("apples", "bananas", "oranges", "strawberries"),
    $obj = array();
    $i = 10;
    foreach($arr as $fruit){
        $obj[$fruit] = $i;
        $i += 10;
    }
    echo json_encode(obj);
?>
<script>
    $.ajax({
        url:"/json.php",
        success: function(data){
            var x;
            for(x in data){
                alert("fruit:" + x + " points:" + data[x]);
            }
        }
    });
</script>

Первые попытки объединить существующие возможности в рамках единого языка основывались на создании клиентских компонентов на сервере и компиляции их в JavaScript. Как и ожидалось, это не сработало и большинство проектов не удалось реализовать (например, ASP MVC заменили на ASP.NET Web forms и GWT в ближайшем будущем, возможно, будет заменен на Polymer). Но, по сути, идея была отличной: создание одного языка для клиентской и серверной части позволяет нам повторно использовать компоненты и ресурсы (ресурсы в этом случае – ключевое слово).

Ответ был прост: адаптировать JavaScript под сервер.

Язык JavaScript был создан для обслуживания серверной части в Netscape Enterprise Server, но на тот момент он просто не был готов выполнять свое назначение. После нескольких лет проб и ошибок появилась библиотека Node.js. Она не только позволила разместить JavaScript на сервере, но и стала основой идеи неблокируемого программирования (возможность выполнять последующие операции, даже если выполнение предшествующей операции не может быть полностью завершено).

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

Node.js навсегда изменила способ обработки ввода/вывода. При доступе к базам данных (ввод/вывод) мы, как веб-разработчики, привыкли использовать следующие строки:

var resultset = db.query("SELECT * FROM 'table'");
drawTable(resultset);

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

Благодаря Node.js и неблокируемому программированию у нас появляется возможность усилить контроль над выполнением программы. Теперь (даже если у вас идет параллельное выполнение обработки драйвером базы данных (ввод/вывод)) вы можете влиять на отработку программы и устанавливать, что она будет делать в случае получения resultset:

db.query("SELECT * FROM 'table'", function(resultset){
   drawTable(resultset);
});
doSomeThingElse();

С помощью этого фрагмента, мы установили два потока программы: первый обрабатывает наши действия только после отправки запроса к базе данных, в то время как второй обрабатывает наши действия только после получения resultSet с помощью простой обратной связи. Это элегантный и в то же время действенный способ управления параллельностью. Как говорится: «Все работает параллельно — исключением является только ваш код». Таким образом, код можно будет легко написать, просмотреть, понять и поддерживать в работоспособном состоянии. При этом вы не теряете контроль над программным потоком.

Все эти идеи на то время уже не были чем-то качественно новым. Так почему же они стали такими популярными с Node.js? Ответ достаточно прост: неблокируемое программирование может быть достигнуто несколькими способами. Пожалуй, проще всего использовать обратные связи и события. Реализация такого подхода в большинстве языков – это непростая задача. Если обратные связи являются довольно распространенным явлением для большинства языков, то о событиях такого сказать нельзя. Очень часто вы будете использовать связи с внешними библиотеками (например, Python с Tornado).

Но в JavaScript обратные связи также как и события встроены в язык. Почти каждый программист, который хоть немного работал с JavaScript, знаком с ними (или по крайней мере использовал события, даже не имея представления об особенностях их функционирования). Каждый существующий стартап так или иначе повторно использует как серверные, так и клиентские разработки (т.е. ресурсы), решая проблему с поиском «Специалистов по разработке на языке Python».

Итак, теперь у нас есть невероятно быстрая платформа (благодаря неблокируемому программированию) с языком программирования, который достаточно прост в использовании (благодаря JavaScript). Но достаточно ли этого? Будут ли продолжаться поиски чего-то нового? Я уверен, что в будущем JavaScript также будет занимать важное место в разработке. Позвольте мне объяснить почему.

Функциональное программирование.

JavaScript стал первым языком программирования, который ввел функциональную парадигму в массы (конечно же, Lisp был первым, но большинство программистов никогда не использовали этот язык для создания приложений). Lisp и Self оказали на Javascript основополагающее влияние. Именно эти языки воплотили в себе множество инновационных идей, которые помогли освободить наши умы, чтобы исследовать новые методы, модели и парадигмы. И все это было перенесено в JavaScript. Взгляните на monads, Church numbers или даже (более практический пример) коллекцию функций от Underscore, которые позволяют сохранить строки и код.

Динамические объекты и наследование прототипу.

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

Javascript — это интернет.

JavaScript создавался как язык, предназначенный для использования в интернете. Данная стратегическая линия была установлена с самого начала и никто не собирается от неё отступать. Все попытки изменить её не удались; вспомните, например, провал Java Applets, замену VBScript на TypeScript от Microsof (который компилируется в JavaScript) и неудачи Flash на рынке мобильной связи и HTML5. Замена JavaScript без нарушения функциональности миллионов веб-страниц является невозможной. Следовательно мы должны стремиться не к поиску каких-то альтернатив, а к качественному улучшению существующих возможностей Javascript. И никто лучше не подходит для этой работы, чем Технический комитет 39 из ECMA (European Computer Manufacturers Association).

Попытки создать нечто похоже на JavaScript предпринимаются чуть ли не каждый день. Примерами могут быть CoffeeScript, TypeScript, а также миллионы других языков, которые компилируются в JavaScript. Эти альтернативные варианты могут быть полезными на определенных стадиях разработки (источник карт), но они не смогут вытеснить JavaScript в долгосрочной перспективе по двум причинам: число их сторонников никогда не будет больше и их лучшие качества уже реализованы в ECMAScript (т.е.JavaScript). JavaScript — это не ассемблер: это язык программирования высокого уровня  с исходным кодом, который понятен для разработчика.

End-to-End JavaScript: Node.js и MongoDB.

Мы рассмотрели основные причины популярности JavaScript. Далее, мы рассмотрим JavaScript, как одну из причин для использования Node.js и MongoDB.

Node.js.

Node.js — это платформа для быстрого создания и масштабирования сетевых приложений (именно такое определение представлено на официальном веб-сайте Node.js). Кроме всего прочего Node.js — это в настоящее время наиболее популярная JavaScript среда разработки, которой пользуются тысячи приложений и библиотек. Даже библиотеки браузера в настоящее время работают на Node.js. Что еще более важно, быстрое серверное исполнение позволяет разработчикам сосредоточиться на более сложных проблемах, таких как собственность при обработке родных языков. Даже если вы не планируете создавать основной сервер приложений с помощью Node.js, вы можете использовать некоторые его инструменты для улучшения процесса разработки. Например, Bower используется для управления интерфейсными пакетами, Mocha — для модульного тестирования, Grunt — для выполнения автоматизированных задач сборки, а Brackets — для полнотекстового кодового редактирования.

Итак, если вы собираетесь создавать JavaScript приложение для сервера или клиента, вы должны обязательно познакомиться с Node.js, поскольку вам придется работать с ним ежедневно. Безусловно существуют некоторые интересные альтернативные варианты, но ни один из них не имеет даже 10% от общего количества сторонников Node.js.

MongoDB.

MongoDB — это НеSQL ориентированная база данных, использующая JavaScript в качестве языка запросов (но написанных не в JavaScript), тем самым завершая end-to-end JavaScript платформу. Но даже это не главная причина того, почему следует выбрать именно эту базу данных.

MongoDB — это документо-ориентированная система управления базами данных (СУБД) с открытым исходным кодом, не требующая описания схемы таблиц. Эта система лишена схематического представления, что позволяет гибко сохранять объекты и, таким образом, быстро адаптироваться к изменениям в требованиях. Плюс этой системы в очень хорошей масштабируемости и в том, что она основана на модели map-reduce, что делает её пригодной для приложений с большим объемом данных. MongoDB является настолько гибкой системой, что может быть использована в качестве  документарной базы данных без схематического …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.