Посты / Laravel или Ruby on Rails?

08.09.2018 18:18
Всем привет. Хотел бы очень поверхностно сравнить эти два замечательных фреймворка. Поскольку уже достаточно много всего написано по различию в языках программирования PHP и Ruby, а также приведена масса примеров, я просто расскажу о своих впечатлениях.

Итак, я с PHP проработал около 15 лет. Сколько всего было написано и переписано, просто не счесть. Я работал с огромным количеством всевозможных CMS, фреймворков, просто нативным кодом писал проекты, а после появления Laravel перешел на него. На Laravel я написал около десятка проектов, при этом около трех очень крупных (естественно в команде с другими программистами). Кстати этот блог тоже написан на Laravel. И что я могу сказать. Ни разу мне не было легко писать сложные вещи (социальные сети, крупные порталы, финансовые анализаторы, форумы и т.д.). Вечно приходилось что-то придумывать, писать десятки тысяч строк кода, чтобы простые задачи превратились в бизнес требования заказчика. И самого фреймворка Laravel это тоже касается.

Самый ад - это получить часть уже написанного проекта от другой команды, которая начинала его писать. Естественно, по устоявшейся традиции отечественного софтостроительства, нет ни документации, ни комментариев в коде. Глядя на тысячи строк кода можно просто прозреть от попытки понять, какой же в этом коде смысл и логика.

Почему так происходит. Сам по себе ЯП PHP - это гремучая смесь древнего говна мамонта с современными подходами в разработке, взятыми, в том числе и из Java (который для создания веб сайтов не самый подходящий кандидат). В попытке сделать из простого языка программирования, который изначально создан для создания простых вебстраничек, ООП монстра с миллионом фишек и плюшек из других ЯП, сам PHP превратился в некое подобие квестовой игры, где вы можете ее завершить сотней разных способов.

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

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

По мимо этого две разные команды разработчиков, могут по разному видеть процесс создания одного и того же проекта. И мало того, каждый программист из команды также все видит по своему. И что в итоге получается? Что каждый программист, даже в рамках одной команды, считает своего коллегу говнокодером. А себя считает именно тем специалистом, который делает все эталонно и правильно.

Теперь вернемся к Laravel. Сам фреймворк очень неплохая попытка собрать трэшевый ЯП, PHP, в некое организованное пространство со сводом гибких правил, которые помогут делать проекты быстрее и качественнее. Большое количество плюшек из коробки, относительно простые роуты, инверсия зависимостей и прочие ништяки должны упростить создание проекта. Но фиг там.

Если речь идет о создании чего-то простого, типа блога, то все еще не так плохо. А вот когда идет процесс создания чего-то сложного и крупного, тут и начинается очередной трэш. И по большей части это проблемы не столько фреймворка, сколько самого PHP. Что вы видите, когда открываете файл класса? Невероятное количество немспейсов. У вас в классе сложная проверка условий? Сломайте себе все глаза, а заодно и мозг в попытке понять суть всех этих if else. Вы увидели в логике фабрику? А теперь попробуйте понять, как она работает и почему программист сделал именно так, потому что вы вообще бы делали по другому, и возможно тут и не нужно и вовсе фабрики использовать.

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

Плюс к этому можно отнести: тут разобраться невозможно, писали говнокодеры, давайте все делать с нуля. Или тут нужен рефакторинг, останавливаем проект на квартал и все рефакторим. "Эта музыка будет вечной, если я заменю батарейки".

И сам Laravel не просто не помогает избавиться от этого хаоса, но и привносит новый. Например, бесконечное количество релизов, ломающих обратную совместимость. Либо бесконечно обновляйся и рефактори до бесконечности свой код, либо сиди на уже старой версии и забудь о прогрессе. Отсутствие человеческого автокомплита заставляет вас использовать всякие костыли на подобие ide-helpers, который будет вам все время гадить в код своими комментариями.

Теперь о Ruby on Rails (RoR). Сам руби я знаю давно. Лет пять назад работал но проекте с Рельсами. Впечатление были очень приятные и положительные. Единственная проблема, это трудно найти работу, по сравнению с PHP, конечно. Сегодня же я участвую в новом крупном проекте (сложный аналитический комплекс), где так же используется RoR, но уже без всяких шаблонов и других потрохов. Только Rails API в чистом виде. Вы себе не представляете, какое я получаю удовольствие на проекте. Я просто отдыхаю. Я не чувствую, что мне нужно опять изобретать велосипед. Все идет просто и ненапряжно.

Почему так происходит. Во первых - это заслуга самого Ruby. Язык очень лаконичный и очень логичный. Для многих новичков, кто изучил вначале пыху, а потом попробовал руби, происходит взрыв мозга и полный зашквар. Чаще всего человек плюется и отказывается от своей затеи. Почему так? Потому что и в Ruby и в RoR, вообще другой подход к разработке. Он более изящный, более "хитрый". Буквально парой строк кода можно творить алгоритмическое безумие. Но нахрапом этот язык не взять. Его нужно либо учить, как первый, либо приходить к нему спустя многие годы мучений на пыхе.

Сам код в рельсах очень минималистичный и читаемый. Использование аксессоров избавляет вас от бесконечного количества кода для создания геттеров и сеттеров. Валидаторы там где им и место, в моделях, а не в контроллерах. Гибкость и всемогущество  роутеров в RoR просто поражает. Вы контролируете все и вся, легко все переопределяя, если это нужно. Превосходный автокомплит. Огромная вариация по проверке данных и всевозможным циклам. Такая вещь, как блоки - это просто разрыв мозга, на сколько легко можно строить алгоритмы, с простым и читаемым кодом. Создание своей системы аутентификации заняло аж целых три строчки кода, а авторизации еще плюс несколько.

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

Поэтому я считаю, что Ruby on Rails - это фреймворк, который на много более эффективен для разных задач, чем Laravel. А сам язык Ruby более органичен и логичен, чем PHP.

Прошу в меня тапки не кидать. Это только мое сугубо субъективное мнение. Кстати, знаю не только пыху и руби, ежедневно пишу и на JS, плюс знаю Python и Java. Так что сужу не с позиции любви к тому что я знаю, а по более или менее объективным параметрам. Всем всех благ.
0