Pull to refresh

Вы до сих пор не любите JavaScript?

Reading time 6 min
Views 95K
С началом эпохи HTML5, рынку понадобилось большое количество JavaScript программистов. Многие специалисты по другим языкам, начали массово переориентироваться на JavaScript. Я много раз видел, как программисты с большим опытом ругали этот, один из самых гибких и могучих, язык, не понимая его принципов. В этой статье я постараюсь рассказать суть и философию JavaScript. Здесь будет всего 4 строчки кода и много-много того, что не напишут в учебниках. Обещаю, что вы полюбите этот язык, или по крайней мере, станете эффективнее в нём. Итак, поехали!

Я по очереди буду рассматривать основные особенности языка и следствия из них. Например, JavaScript обладает очень низким порогом входа. Если вы знакомы с C++ или Java, то можете начать вполне сносно программировать на нём уже через 15 минут после знакомства. Однако, для того, чтобы делать профессиональные вещи, нужно читать документацию, книги по паттернам JavaScript, общаться с более опытными коллегами. Большинство «пузатых и маститых джедаев программирования», конечно же, этого не делают и ругают себя язык. Может, было бы лучше, если бы порог входа был выше? Думаю, что нет (хотя критики было бы меньше). Согласитесь, гораздо проще постигать нюансы, когда вы уже можете написать работоспособный код.

JavaScript мультипарадигменный язык. Он объединяет объектно-ориентированный и функциональный подходы. Так-же доступно структурное программирование и многое другое. Это обусловлено высочайшей гибкостью языка. Функции являются объектами первого рода, переменные могут менять тип, объекты — получать новые свойства на лету. Хорошо это или плохо? С одной стороны, это создаёт проблемы с пониманием у программистов, привыкших к определённости таких языков, как Java или C#. Но это малая плата за эффективность. JavaScript, в большинстве случаев, позволяет создавать приложения гораздо быстрее, чем его строго типизирование товарищи. Приведу всего один пример: я работал в компании, разрабатывающей биржевой терминал. Необходимо было создать настольное приложение на .Net C# и его точную копию в веб на JavaScript. С# приложение разрабатывала команда из 12 программистов в течении двух лет, JavaScript — команда из 3 программистов в течение года. Можно говорить о разнице в квалификации, о том, что возможно влияли другие факторы, но так или иначе разница в 8 раз показательна.

Как же удалось добиться такой скорости разработки? Большинство языков ставят ограничения, якобы для нашего же блага. JavaScript не признаёт ограничений, вы можете менять код где угодно и когда угодно, в том числе гибко патчить чужой код. Если сравнивать языки программирования с политическими системами, то, скажем VBA — это тоталитаризм, вы поставлены в жёсткие рамки и даже не можете посмотреть все исходники. C++ — это демократия, ваша свобода махать руками заканчивается там, где начинается нос вашего собеседника. Это хороший, сильный язык программирования, ограничивающий свободу личности ради общего блага. JavaScript — это анархия, вы можете менять всё что угодно и никто вам не помешает, не ограничит вашу свободу. Проблема в том, что не все могут жить при полной свободе. Нужна высокая внутренняя культура, чтобы не украсть у соседа трактор, даже если тебе за это ничего не будет. То же самое и в коде, например, распространённая практика в JavaScript, не делать приватные свойства истинно приватными. Создаются обычные (публичные) свойства и к их имени просто дописывается знак подчёркивания. Считается, что другие программисты увидят это и не будут использовать это свойство без особой необходимости. Бывают ситуации, когда заложиться на значения приватного свойства или даже модифицировать его, является самым прямым и правильными путём. Да, везде бывают исключения, и JavaScript позволяет нам их делать. В таких случаях, программист разбирается в чужом коде и берёт на себя ответственность за последствия. «Он же может всё сломать!?» — негодуют адепты других языков. Об этом следующий пункт.

В JavaScript нет защиты от дурака. Мы считаем, что все, кто работают над кодом — профессионалы и доверяем им. (пауза) В хорошей JavaScript команде все программисты одного уровня. Он может быть низким или высоким, но не должен слишком сильно отличаться. Так же, как в стране, где все воруют, честному человеку приходится сложно, или в обществе порядочных людей, негодяй сразу получает по заслугам, так же и в анархическом и бесконтрольном JavaScript джуниоры будут ломать код джедаев, а джедаи будут использовать абсолютно не понятные для джуниоров (но понятные для любого профессионала) архитектурные ходы, невольно снижая их продуктивность. Так нужно ли перестраховываться через язык, или лучше просто набирать правильных людей? Некоторые ругают JavaScript за то, что они называют «баги» и «нелогичность». Например:

'3' - 2 === 1;
'3' + 2 === '32';


Это как раз то, для чего после быстрого старта желательно всё-таки прочитать про преобразование типов. Для любого, даже начинающего программиста на JavaScript, приведённые выше примеры тривиальны и абсолютно предсказуемы. За 10 лет подобные вещи ни разу не вызывали у меня проблем. Ещё одна интересная задачка, что вернёт этот код:

Math.max(2, []);
Math.max(2, {});


забавно, но первая строчка вернёт 2, а вторая NaN (Not a Number). Считать ли это ошибкой и нелогичностью? Смотри выше, защиты от дурака в JavaScript нет, и если вы передаёте вместо числа объект или массив — можете пенять только на себя. Точно так же в C++ можно писать в память разный мусор и ругать язык. Если у тебя есть пистолет, то это не значит, что нужно стрелять себе в ногу.

Немного про обработку ошибок — она в JavaScript молчаливая. Это значит, что если программа может продолжаться — она с большой вероятностью продолжится. Скажем, вы поделили на нуль, большинство языков выбросит ошибку и завершит работу, а JavaScript покажет Infinity и, возможно, даже выведет его в интерфейс пользователю в виде строки, если так задумана логика программы. Хорошо это или плохо? Я бы сказал, это позволяет создавать программы с высочайшим уровнем стабильности. Выход из строя одного элемента не выводит из строя всю систему. Конечно, плохо показывать пользователю NaN или undefined, но это гораздо лучше, чем аварийно завершиться, как все мы много раз видели у многих нативных прогамм под Windows (и не только). Мы доверяем программистам и считаем их профессионалами, поэтому в идеальном мире такие ситуации не должны появляться. Если же проблема всё-таки возникла — у нас есть страховка, некоторый запас прочности языка. И, конечно же, в особо важных местах программы мы можем вручную проверять значения на NaN, null, undefined, создавая абсолютно строгий код.

На десерт расскажу видение самой неоднозначной особенности JavaScript — прототипного наследования. Если говорить об Объектно Ориентированном Программировании, то вообще говоря, оно не требует, чтобы объекты обязательно были объявлены через классы. Более того, часто нам нужен какой-то объект в единственном экземпляре, либо нужно создать несколько однотипных объектов, но отличающихся какими-то нюансами — дополнительные поля, флаги, методы и т.п… Часто, классы создавать совсем не обязательно, это излишний уровень абстракции, и прототипное наследование, или даже создание объектов на лету, прекрасно справляется с такими задачами. Согласно принципу бритвы Оккама, не стоит плодить лишний код, если задачу можно решить проще. Такой подход требует не только меньше текста, но и меньше оперативной памяти и процессорного времени. Классы не поставляются из коробки, но если вы пишете большое enterprise-приложение — написать 20 строчек своей реализации классов для вас не составит труда. Если нет — воспользуйтесь одной из многочисленных библиотек, в таких языках как C++ без библиотек придётся гораздо сложнее. Хотя некоторые предпочитают писать на чистом JavaScript, это не так сложно и имеет дополнительные преимущества.

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

Последняя и самая важная вещь, которую нужно понимать о JavaScript, связана с его динамической типизацией. Это может показаться странным, но я хочу задать такой вопрос: а для чего вообще существует система типов? В мире людей преобладает не типизованная информация: мы не можем часто провести грань, повесть это или роман, младенец трансформируется в ребёнка, потом в подростка. Можно ли назначить этим стадиям тип и нужно ли это делать? Типы данных естественны для компилятора, гораздо проще преобразовывать код если мы сразу знаем какие примитивы нам подают. Но прогресс движется вперёд и я считаю, что языки с гибкой типизацией — существенным шагов вперёд. В традициях JavaScript, если вам не хватает типов классов — вы можете создать их вручную, написать обёртку, ввести ограничения. Я работал в игровой компании, продукт которой имел очень сложную логику, и они сделали обёртку для классов с жёсткой типизацией, множественным наследованием и блек джеком. JavaScript обладает потрясающим уровнем интроспекции и вы можете подстраивать его под себя в очень широких пределах.

Чтобы быть совсем честным, скажу так же о пожалуй самом существенном минусе JavaScript: профессиональное программирование на нём во многих аспектах сложнее, чем на Java или C#. Если в строго типизированных языках вы видите хотя бы типы аргументов, которые вы принимаете в функцию, то в JavaScript нужно все эти данные держать в голове. Порой вы не можете быть уверены даже в том, какие методы имеет тот или иной объект. Это требует высокого уровня концентрации и хорошего понимания архитектуры. Если вы готовы на это и готовы честно изучить язык, а не слепо кодить с места в карьер — вы получите поистине один из самых мощных инструментов, для создания гибкого и кроссплатформенного программного обеспечения с высокой скоростью.
Tags:
Hubs:
+34
Comments 241
Comments Comments 241

Articles