Comments 184
Больше всего мне в Руби не хватает асинхронного программирования и огорчает полнейшее отсутствие неизменяемых структур данных. No future.
Со всех трибун кричат что ни в коем случае не следует использовать эвент машин, ибо он устарел. Даже если им пользоваться, не припомню подобной лаконичности как например здесь:
Про заморозку объектов я промолчу, no comment
То, что eventmachine устарел честно говоря тоже слышу первый раз. Можно вас попросить привести аргументы критиков или ссылку дать на соответствующий материал?
Неизменяемые структуры хороши не только тем, что они не изменяются (это тоже плюс, это гарантия для нас, что никто ничего не сделает с нашими данными, значит можно легко шарить их по ссылке), а что мы можем эффективно работать с ними, создавая новые данные на основе старых без полного копирования. Зачастую это древовидные структуры в основе своей. Возможно нужно еще и гц тюнить под это
Фриз ничего такого не предоставляет.
Асинхронное программирование само по себе имеет узкую нишу и если этой технологии не находится применение в большинстве случаев, не означает, что он устарел. В это же время асинхронные http библиотеки могут спокойно использовать под капотом eventmachine и никто не кричит, что они устарели.
Асинхронно это реализовывать на nodejs довольно бесяче (особенно раньше, на колбеках), но очень производительно — когда один запрос ожидает ответа от внешнего сервиса — бд, кеша или еще чего — другой исполняется.
Во-первых, RoR тоже нишевый, а Go до сих пор местами очень сырой. Во-вторых, Crystal – язык общего назначения. В-третьих, чтобы новый язык развивался нужно о нем хотя бы говорить.
Если бы Crystal быстрее развивался, то легко бы потеснил Go. Но за Go стоят практически неограниченные ресурсы гугла и легионы разрабов на волне хайпа. У Crystal маленькая команда разработчиков и про него мало кто слышал :(
Я уже сам написал пару мелких проектов на Crystal, но инфраструктура слабая, shard'ов (внешних модулей) мало, комьюнити небольшое. Печально, конечно.
В моём личном сравнении Go vs Crystal последний по удобству выигрывает с отрывом. Именно за счёт рубевого синтаксиса.
Вообще никак не нишевой. Он одного класса с Go. Но что сырой, это да, нужно согласиться :(
Все там будут, но сомневаюсь, что рубисты в данный момент смотрят на WASM, скорее на альтернативу для замены в недалекой перспективе.
UPD. Но вот языку, который начнет вытеснять других на WASMе, самое время начинать набирать силу.
Пример Coffescript может быть поучительным, т.к. это был Javascript со вкусом Ruby, но сейчас на нем пишут полтора человека.
Возможно, привкус Python не понравился)
А вообще, скорее из-за того, что появился Babel, а потом и сам JS (ES) стали активней развивать.
И почему это у Ruby дела не очень? Сам язык то продолжает так же развиваться. 3-я версия в активной разработке с существенными изменениями.
А по поводу миграции — это вполне закономерное развитие проектов. Если они «выстреливают». Ruby не самый производительный, но он позволяет быстро писать.
Если бы CoffeeScript выбирали исключительно из-за синтаксиса, то он и сейчас бы здравствовал. А его выбирали из-за возможностей: в JS тогда не было классов и даже стрелочных функций. Соответственно и умер он из-за того, что в JS появились сравнимые возможности.
А WASM здесь при том, что подавляющее большинство языков, которые не приспособятся к Web, ждет неизбежное забвение.
Я за ним слежу, и даже есть один проект в продакшене. Но по динамике развития, складывается ощущение, что там один Жозе его развивает (это видно по статискике github).
Хм, так вы посмотрите статистику за 2018-й год. На долю Жозе приходится примерно половина коммитов, но как минимум ещё 9 человек активно участвовали.
Но в целом, смотреть динамику развития Elixir по компилятору не очень правильно. Основное развитие идёт в тулинге и в сопутствующих библиотеках. Например, из свеженького Phoenix LiveView
Например, Максимом Индыковым из Staply, чья команда переезжает с Ruby на Go
Это чтобы через ~5 лет снова переехать на новый хайповый язык?
Символы без скобок — внизу пример есть, как это читается. Меньше не значит лучше. Go многословен, чтобы он читался всегда однозначно вне зависимости от контекста. Вы там конечно написали, что не имеет значения, но это величайшая глупость. Я должен знать, что это, потому что от этого зависит, кончится ли выполнение функции на этом или за этим одним идентификатором находится еще цепочка функций. Это объективный критерий читабельности и у Ruby с ним проблемы очевидно, раз он позволяет так писать.
stackoverflow.com/questions/21743841/how-to-avoid-annoying-error-declared-and-not-used
Дебаг становится болью и страданием. Часть кода и импортируемых либ вечно закомменчена, потому что компилятор много на себя берет. Ходи вечно туда-сюда, то закомментируй, то раскомментируй кусок. Потом обязательно что-то забываешь раскомментить, из-за этого упадет в другом месте, и так далее.
А ведь решение простое — пусть компилятор компилирует, а линтер проверяет на все эти неиспользуемые переменные. По отдельности. Или флаг какой-нибудь ввести, чтобы управлять поведением компилятора. Но нет, разработчики языка же самые умные, давайте мол, заставим всех писать так, а не иначе.
На самом деле хороший язык в своей области, и писать на нем в целом приятно, но вот от этого момента у меня конкретно пригорает. Сколько лет прошло, а до сих пор не изменили это поведение.
Да, преимущества исчезают внезапно, потому что все относительно. Пока нет лучшей альтеранативы, что-то будет преимуществом.
Шел 10й год хайпа golang. Хайповали Avito, Ozone, Alibaba, Mail.ru…
Хайп давно прошел. Давно идут дни спокойной и уверенной разработки.
В своей ниже для своих задач. Полностью согласен.
в конкретном проекте
Я бы уточнил — в конкретном этапе проекта. Или нынче все стартапы начинают сразу писать на Go?
Зависит от ниши, но да, стартовать на Go уже просто, поскольку библиотек стало много. Несколько лет назад писать прототип сразу на Го было тяжко. Я бы сказал, что есть некоторые проблемы а той нише, где рельсы и джанго, но и это вопрос времени. Синтаксис конечно после руби будет убог, но зато появится многопоточность и упростится поставка. Тут уж надо определяться.
Любопытнее было бы противопоставить, elexir и go.
Вот тут про тулы для управления зависимостями
Так что про простоту работы с Go, всё хитрее чем кажется на самом деле. И сам язык не обладая достаточными абстракциями склоняет к написанию громадных простыней кода и жутких генераторов простыней кода.
У Go много преимуществ, но не перед Ruby — точно (кроме производительности, но чтобы это заметить надо с ооочень большими и сложными проектами работать). Это вообще из разных ниш и для разных задач языки.
И сам язык не обладая достаточными абстракциями склоняет к написанию громадных простыней кода и жутких генераторов простыней кода.
Меня почему-то не склоняет. Склоняет обычно он тех, кто пришел из других языков и пытается писать на Go как на них.
У Go много преимуществ, но не перед Ruby — точно
Почему-то с него разработчики стабильно перебираются на Go. А ниши у них общие, это языки для бэкэнда в его самых разных проявлениях.
Склоняет обычно он тех, кто пришел из других языков и пытается писать на Go как на них.
По-моему, природа неприязни к Ruby аналогична)
Почему-то с него разработчики стабильно перебираются на Go. А ниши у них общие, это языки для бэкэнда в его самых разных проявлениях.
На Go перебираются прежде всего из-за его производительности и неприхотливости к ресурсам. Сомневаюсь, что удобство разработки является причиной. И ниши я бы всё же немного разделил. Ruby прямой конкурент Python. Они не исключительно для бэкенда, это языки общего назначения. На Go можно написать однофайловый скриптик и просто запустить?
Ruby прямой конкурент Python.Совершенно не конкуренты. Питон — это МЛ и анализ данных. Руби — это бекенд веб сервисов.
На Go можно написать однофайловый скриптик и просто запустить?Да.
Совершенно не конкуренты. Питон — это МЛ и анализ данных. Руби — это бекенд веб сервисов.
Ну это смотря с какой колокольни смотреть. Что если так?
github.com/arbox/machine-learning-with-ruby
github.com/vinta/awesome-python#web-frameworks
Chef, Capistrano, Phusion Passenger, Mina, Puppet, Vagrant это разве бекенд веб сервисов?
Хммм, а разве Go интерпретируемый?
github.com/arbox/machine-learning-with-ruby — ну это, конечно, по сравнению с тем, что есть в Python, баловство.
Ну это смотря с какой колокольни смотреть. Что если так?Да как бы можно и на си писать веб-приложение, что не делает его конкурентом php :)
Факт в том, что среди языков общего назначения никто не может переплюнуть python в области анализа данных. Да, в руби есть несколько либ для этого, но это совершенно не то. Питон — это готовая инфраструктура, тогда как руби — несколько кубиков.
Но если говорить о написании веб-приложения безо всяких вычислений и нейронных сетей, руби не переплюнет пока никто по скорости разработки. Да, в питоне есть и фласк, и джанго, и sqlalchemy, и другие хорошие либы, но с руби не сравнится.
Хммм, а разве Go интерпретируемый?Нет, но вопрос ведь был не об этом. «На Go можно написать однофайловый скриптик и просто запустить?» На go можно написать код, сохранить его в файле main.go, а потом просто запустить его через go run main.go
Тогда уж 3-4 года назад, как минимум. Когда Лазада развернулась и создала с сотню рабочих мест для гошников.
Трудно такой долгий срок растущей популярности оправдывать только хайпом.
Для Go до сих пор нет нормального инструментария для удобной разработки(не учитывая GoLang от JetBrains)
«Крупные компании» — слишком расплывчатое и индивидуальное понятие, для меня крупные компании это Microsoft, Oracle, Samsung и я что то не слышал что бы они продвигали Go. Только Google более менее в эту сторону смотрит.
Мне кажется как то так.
Еще раз давайте попробуем, Alibaba, Avito, Ozine, Booking.com, Mail.ru — пойдет, как большие компании?
эта часть фразы понята?
Из перечисленных компаний на мой взгляд крупные Alibaba, Mail.ru, Ozone.
Про остальные я не слышал и не в курсе, насколько они «крупные».
Booking.com и avito — крупные. Посмотрите.
Но в любом случае, что-то новое открылось: крупные компании используют golang.
Кстати, Google.
И я не совсем понимаю что вы подразумеваете под словом «крупные», вы про количество сотрудников или про суммарную площадь офисов?
И да, среди российских компаний довольно много ИТ компаний которые продвигают Go, пишут что то для себя.
Хоть бери и сам изучай его. Но как человек вне веб разработки, боюсь что буду лепить сложные велосипеды, и на это уйдет нерациальное количество времени.
Если есть желающие работать над долгосрочным проектом, просьба отписать в личку.
Но на практике, во время реальной разработки, вы, скорее всего, пользуетесь каким угодно редактором с подсветкой синтаксиса. И вот эта самая подсветка обычно работает отлично, решая запрашиваемую проблему тем, что по умолчанию красит вызов функции и вывод содержимого переменной в разные цвета.
А best practices (rubocop) еще и усугубляет дело вместо того, чтобы исправлять.
Могли бы вы привести пару-тройку примеров?
- Если бы style check всегда настаивал на том, что вызов функции должен быть со скобочками ( a() )
Это вы привыкли к идее, что функция — это со скобочками. Почитайте про Smalltalk — от него Ruby очень многое почерпнул, станет понятнее, почему можно без скобок жить.
Чтобы понять, что у функции есть значимое возвращаемое значение
В большинстве случаев возращаемое значение в руби значимо, из этого и стоит исходить.
А что вам мешает настроить rubocop под ваши правила?
С первыми двумя пунктами можно почти согласиться, но и тут легко найти объяснения:
- Если "а" — это локальная переменная, то это будет подсвечено редактором. И дополнительная фича — если вы перенесете вычисление этой переменной в функцию, то не нужно будет её переименовывать.
- Можно и должно выделяться пустой строкой перед возвращаемым результатом. И лучше придерживаться, что любая функция возвращает осмысленное значение (на то она и функция).
- А тут ruby-way, ООП и основная фишка ruby. В случае с a.positive — переменная "а" — может быть чем угодно, например специфичным value-object, а не только числовым значением.
За многоточием скрывается дофига строчек кода
Жаль, хорошо было бы по возможность разбить на несколько методов. И тогда контекст из, например, 5-ти строчек воспринимался бы лучше.
в ruby не принять называть функции например get_a / set_a.
Наверняка есть исключения, но, надеюсь, нигде не приняты такие названия функций. Имеется в виду, get/set_%одна-буква%.
1. Если бы style check всегда настаивал на том, что вызов функции должен быть со скобочками ( a() )
И я продолжу настаивать на том, что это вопрос подсветки редактора кода + некоей привычки.
2. style check не должен ругаться на return. Явный return показывает, что функция возвращает что-то осмысленное, и надо следить за результатом. Иначе можно сломать ее вставив новый код в конец (да даже просто добавив логгинг). Чтобы понять, что у функции есть значимое возвращаемое значение, нужно искать все места, где она используется.
Поправьте если не прав, это вы про случай, когда явный return можно опустить, так как больше функция не может отдавать ничего в принципе? Или линтер ругается на что-то другое?
3. Это у же больше просто к физической читаемости, чем к семантической: почему a.positive? считается согласно чекеру лучше, чем a > 0? Может у меня слишком много классов образования, но мне это кажется просто неадекватным.
safe navigation можно использовать с таким подходом, как вариант, но если вам прямо-таки не нравится этот линтер, — ничего же не мешает отрубить его в rubocop.yml.
Простите, ваш изначальный тезис был про то, что rubocop/best practices делает ситуацию хуже. Я, возможно, вас неправильно понял. Наоборот, мне воспринялось, что вы говорите про то, что отсылки из style guide плохи.
Что здесь a? Вызов функции a(), или ранее объявленная переменная 'a'?
А не всё ли равно? Что от этого зависит?
Переменные — существительные.
Для того, чтобы их отличать, достаточно правильного именования.
Когда начинаешь этим пользоваться, понимаешь, насколько это удобно — когда «a» может быть хоть переменной, хоть функцией, и тебе на это плевать.
Например, определенный контроллер обрабатывает апи-запрос на создание пользователя. В теле этого контроллера будет строка, что-то вроде:
@user = User.create(create_params)
create_params на самом деле функция, описанная где-нибудь выше, но в этом случае используется как переменная. И это намного более читаемо, чем что-то вроде такого:
@user = User.create(create_params())
Зачем тут акцентировать скобками вызов функции? Какую пользу это принесет, кроме «в пхп/жс/питоне я привык, чтоб было так»?
А вот польза «без скобок» вполне очевидная — поведение не зависит от реализации. В других языках вызвать переменную как функцию — ошибка, вызвать функцию как переменную — ошибка. Изменил потом переменную на функцию или наоборот — и ходи потом во все места, где оно используется, исправляй.
Изменил потом переменную на функцию или наоборот — и ходи потом во все места, где оно используется, исправляй.
Вот поэтому, видимо, скорость разработки на Ruby выше) Он позволяет сосредотачиваться на сути (предметной области), а не на реализации.
Так высокую прожорливость Ruby никто не отрицает. Но разве это следствие синтаксиса?
И в этом направлении работы активно ведутся — повышается скорость, улучшается сборщик мусора и т.д. Да и в плане окружения, сейчас всё больше встречается хостингов с поддержкой Ruby. PHP и Python тоже не всегда были быстрыми неприхотливыми.
.Net со сборкой мусора виноват был, если что.
И это вовсе не добавляет понимания коду
В каком-нибудь javascript'e
function b() { return 42; }
a(b)
иfunction b() { return 42; }
a(b())
означают совершенно разную логику. В первом случае мы в функцию а передали функцию б, которую можно будет вызвать внутри этой функции а. Во втором случае мы вызвали функцию б и результаты ее выполнения передали в функцию а.Но в руби
def b
42
end
a(b)
иdef b
42
end
a(b())
иb = 42
a(b)
по результатам выполнения означают одно и то же. В первом случае мы вызвали функцию б, результаты ее выполнения передали в функцию а (не смотря на отсутствие скобок, это все равно вызов функции, а не ее передача в другую функцию). Во втором случае — то же самое. В третьем — мы вручную присвоили переменной данные и передали их в функцию а. В итоге, во всех трех случаях, на вход в функцию а поступит число 42.Это удобно когда знаешь, и непривычно, когда не знаешь. Но оценка с точки зрения непривычности — не самая адекватная. Я, к примеру, совершенно не разбираюсь в c++. И, когда читаю исходник какого-либо интересного мне репозитория, чтобы разобраться в алгоритме, для меня код просто дико нечитаемый, приходится продираться сквозь него. Но это не значит, что синтаксис языка плох.
А тут ради сомнительно экономии двух скобок приходится извращаться с Proc. Я понимаю что выразительность языка была поставлена во главу его дизайна. Но тут они зашли слишком далеко, на мой взгляд.
С учетом современных тенденций использования функциональных подходов, то это еще одна причина потери популярности.
С учетом современных тенденций использования функциональных подходов, то это еще одна причина потери популярности.»
Вы хотите сказать что Haskell менее функциональный язык чем другие тоже из-за того что в нём скобки необязательны? =)
Math.max() > Math.min()
Не смотря в доку, попробуйте угадать какой результат и почему?
Вроде бы и скобочки на месте стоят, а логики никакой…
P.S. А по поводу того что Руби в чём-то на другие языки не похож, это нормально, как ещё новые языки будут появляться, если они должны быть похожи на Си, например?
Но, на всякий случай напомню что эта ветка про читаемость руби.
И сценария где сложно разбираться в коде из-за того что вместо переменной выполняется какой-то метод объекта я даже представить не смог, буду благодарен за пример.
Если это переменная — найти её элементарно, ибо она объявлена строго внутри этой функции (в руби строго с областью видимости переменных).
Если это метод он по неймспейсу ищется очень быстро, а если есть удобная возможность исполнять код (в тестах, например) там #source_location есть и другие замечательные плюшки.
Ну программисты в Японии конечно есть очень задротистые интересные. Например, Yusuke Endoh, который написал знаменитую quine-relay — цепной квайн на 100 языках программирования. Он, кстати, рубист.
Как раз в руби код читается сверху вниз и далее слева направо в большинстве случаев и надо очень сильно не в стиле руби писать чтобы было как вы говорите.
Вот в других языках легко примеры привести:
— например, «генераторы» в Python, Erlang, Elixir, Haskell, они вообще читаются от центра и во все стороны =)
— В JS, C++, Go и.т.п. есть постфиксный "++"
— В Clojure вообще можно пайпить во все стороны
Условие фильтрации справа.
То есть чтобы понять над чем мы вообще проводим операцию, то смотрим в центр, потом направо, в конце налево. А генераторы могут быть сложнее + использоваться как выражение. Теперь пример этого же на Руби:
с магией(типа для команды опытных товарищей)
values.select(&:even?).map { |i| i * i }
без магии
values.select { |i| i.even? }.map { |i| i * i }
Читается в правильном порядке слева направо. Ничего не надо промежуточного запоминать, всё логично.
А ещё мнения Павла очень сильно портят всю статью.
Почему язык не может быть популярным из-за того что он удобный?
8-10 лет назад такой же вопрос бы задали о руби, через 10 зададут ещё о каком-то языке.
Основной причиной был трудночитаемый код, что в сочетании с приличной разницей в часовых поясах между частями команды приводило к постоянным проблемам с интеграцией изменений, сделанных разными людьми.
Еще одной проблемой (ни до того, ни после мной не встреченной) была зацикленность немногочисленных «гуру» на «Ruby-way» и DRY — что сильно сказывалось на code review, особенно если учесть что у каждого из гуру этот самый «way» был какой-то свой, особенный.
Ну и последнее — низкая производительность. На машинах, где Руби еле шевелился — потом система, переписанная на Java просто летала.
Мне ruby то как раз нравится тем что на нем можно писать для людей
Старая уже статья:
habr.com/post/206024
Очень много говорят о переезде существующих проектов с руби на whatever. Если разработчик говорит что меняет веру — то чаще всего слышу что на elixir. Интересно было бы услышать мнение команд, которые решили делать новый проект не на рельсах, а на том же Go.
По личному опыту знаю, что накидать небольшую приложуху или прототип на рельсах — крайне удобно. Да даже большой проект стартовать и позднее — поддерживать — очень приятно (в плане удобства ЯП и фреймворка). Некоторые части со временем требуют оптимизации, это да. А вот чтобы сходу на Go и достаточно большое приложение — это вообще возможно?
В какой-то момент твой прототип выростает в большое приложение и ты понимаешь, что ты завязан на этом фреймворке, а он тянет ресурсы.
Это-то понятно. Меня интересует опыт разработчиков, решивших сразу делать все с расчетом на будущее с потребностью в производительности. Ну вот например, приносит ли такое решение в жертву тот же ActiveRecord (или еще что) со всеми его удобствами, если проект сходу пишется на том же Go?
Я как-то недавно присутствовал на совещании с потенциальными технологическими партнерами. И зашел у нас разговор по поводу тсогласования API наших сервисов.
— Нам в вашем API будет нехватать фичи X.
— Да, надо сделать, но это нужно выносить в отдельный сервис ибо под такое у нас сейчас нет ничего. Когда у нас там сроки?
— Три месяца.
— Блин, будем на Ruby тогда писать.
— А обычно на чем?
— Обычно на Go ибо производительнее, но за три месяца не успеем — разработка на Go дороже по человека часам. А потом перепишем, если выстрелит бизнес.
Вот примерно такая у ребят мотивация. Мы тоже пишем на Go, но с Python. Обычно на Go пишем нечто долгоживущее в памяти и быстрое.
Ruby On Rails был практически идеальным фреймворком для своей технологической эпохи — HTML + jQuery. Фронт и бэк отлично существовали в одном проекте, странички верстались на Haml/slim/erb, большая часть логики была в backend, и все это благодаря синтаксису ruby было очень приятно.
Что поменялось?
Произошла революция во фронте. React, Vue, Angular потребовали отдельных навыков и создали большее разделение между фронтом и бэком. Много кода стало уходить из шаблонов на фронт, интеграция Rails со всеми этими вещами не сказать что вызывает у меня восторг, а скорее желание держать фронт и бэк вообще раздельно как разные проекты.
Количество логики в backend заметно уменьшилось и возникает желание держать его также на JS, чтобы не иметь разделения по компетенциям в команде.
Также произошла революция ML, и возник огромный спрос на Python разработчиков, а дальше сработала логика — если в команде есть Python, давайте не будем плодить сущностей и давайте делать бэк на Python.
Эти 2 тренда — миграция на Python и перенос логики во фронт и сделали Rails не столь уникальным и нужным.
А вот как это побороть? Развивать ruby сообщество не только в сторону Rails, но и в сторону прикладного программирования — нормальные биндинги к GUI, библиотекам ML, чтобы можно было например писать комфортно GTK приложения на Ruby, но, боюсь, у сообщества нет на это ресурсов.
Вообщем итог — просто сменилась технология веб разработки и ничего с этим не сделать, у Ruby и Rails останется ниша «приятного фреймворка для разработки API и статичных сайтов», но хайп уже просто в другом месте.
Я наверное один извращенец, который любит js и готов на нем писать все и вся...
Руби пробовал по работе, с каким-то аддовым шаблононизатором, шаг влево или вправо и проект не стартует, как у меня горело бордовым пламенем, на разработчиков, которые придумали использовать этот гем.
С тех пор я руби даже не воспринимаю в серьез, вот так поделка написанная, кем-то может убить желание использовать язык.
Интересно, но ни в статье, ни в комментах никто не вспоминает .net
Микрософт плохой, следовательно, .net тоже.
Да и .net Windows-only. Вот .net core — уже привлекает внимание и потихоньку начинает воспринимается всерьез.
У нас последний продукт на дельфях остался, старый монстр, но, думаю, тоже будет переписан
ruby-doc.org/stdlib-2.5.3/libdoc/fileutils/rdoc/FileUtils.html#method-c-rm_f
copy_stream и cp, почему тогда не назвать copy_stream как cs?
Как и в php видимо у ruby идут вызовы в C библиотеки, а там как угнодно можно назвать
Это касательно ruby
Консистентность — C# — referencesource.microsoft.com/#mscorlib/system/io/stream.cs,f956b0c07e86df64
Java — docs.oracle.com/javase/7/docs/api
С неймингом все ок
Непонимаю за что минус
github.com/mono/mono/blob/master/mcs/class/Mono.Posix/Mono.Unix.Native/Syscall.cs#L4577
Такие названия и интерфейсы связаны больше с миром Unix-подобных систем и там они отторжения не вызывают (то есть в других языках и технологиях на этих системах похожие интерфейсы)
Пример что вы привели действительно представляет из себя либу с некрасивыми интерфейсами, но это исключение, а не правило для мира Ruby.
spectrum.ieee.org/static/interactive-the-top-programming-languages-2018
P.S. Ryby на 13-м месте в этом рейтинге.
Руби конечно крут в плане синтаксиса и чистоты написания кода и выражения мыслей, если сильно не впадать в идиоматический код с очень короткими методами.
Сейчас работаю с web — бекэнд на Go. Думаю, что в плане производительности работы веб сервисов Go — вне конкуренции. Но написать быстро прототип Web приложения на Go кажется довольно трудным. Очень не хватает как раз готового фреймворка, чтобы не делать стандартные вещи руками. Но думаю, его и не будет из-за того, что Go не выразительный язык, много лапши с if err != nil
Интересует такой момент. Можно ли использовать как раз оба продукта: Ruby on Rails для быстрого написания прототипа, а затем отдельные куски переписывать на Го (если проседает производительность)?
По идее можно поставить перед ними Nginx и отдельные роуты, которые надо заоптимайзить, пробрасывать на Go сервисы.
Кто-то делать так, может поделиться, насколько это жизнеспособно?
Спасибо.
Интересует такой момент. Можно ли использовать как раз оба продукта: Ruby on Rails для быстрого написания прототипа, а затем отдельные куски переписывать на Го (если проседает производительность)?Да, примерно так это будет выглядеть.
По идее можно поставить перед ними Nginx и отдельные роуты, которые надо заоптимайзить, пробрасывать на Go сервисы.
Проблема, с которой будете сталкиваться — неподходящая архитектура. По факту, вы пишете монолит на рельсах, а потом решаете сделать микросервисы — часть на рельсах, часть на go. Но в монолите обычно разные куски сильно связаны друг с другом, а значит, вы будете писать повторяющиеся куски бизнес-логики и на рельсах и на go, дописывать отдельное приватное апи в рельсах — потому что go будет время от времени у них что-то спрашивать — и наоборот, рельсы будут что-то спрашивать у go.
В общем — весело будет всем. Я бы сказал, что если есть такая возможность — лучше заморозить рельсы (или замедлить выход новых фич), параллельно писать приложение на go, а потом, когда оно будет готово, разом переключиться. Иначе — бардак обеспечен.
Самое главное — избегать проектов-самописов, все делать на фреймворках. В идеале на одном (я выбрал Yii2).
Изучал в разное время Python, Ruby — не зашли. Да, все красиво и изящно, но на рынке PHP нет равных. Синтаксис не кажется уродливым, он просто другой.
Но тем не менее, эволюционировать надо и поэтому в свободное время начал изучать Go.
Самое главное — избегать проектов-самописов, все делать на фреймворках. В идеале на одном (я выбрал Yii2).
Это очень дельное замечание. Только мне юи не зашел, пользовался ларкой, в основном. Но и на симфони было пару проектов.
Но большинство крупных проектов-монстров на которых я работал — это были именно самописы. Спустя пол года такой работы в любой конторе, мне хотелось брать в руки автомат и всех стрелять! :))
И главное начальство не хотело ничего трогать, менять, переходить на современные технологии. Мол 20 лет работало, еще столько же нам будет денег приносить. До разума не достучаться, тебя скорее уволят (хоть и ведущий разработчик), чем дадут что-то довести до ума.
После последнего такого проекта, я окончательно решил сбежать с пыхи. У меня даже статейка есть сравнения ларки и рельсов (чисто мои личные ощущения): cleverman.org/post/laravel-ili-ruby-on-rails
У меня, кстати, аналогичное восприятие пыхи после руби)
На go люди обычно пишут, когда реализовывают микросервисную архитектуру. Большой сложный нагруженный веб проект, с десятком микросервисов, балансировщиком, месседж брокером и прочими радостями. Монолитное приложение на нем не так часто пишут.
Если вы хотите делать веб приложения «старого типа», когда браузер по запросу получает готовую веб страницу — лучше рельсов до сих пор нет ничего. Если же «нового типа» — когда фронт отделен (вроде реакта, ангуляра или вуе) и рендерится самостоятельно в браузере, а от сервера требуется только апи — тут голые рельсы не идеально конечно подходят. Можно в этом случае либо использовать рельсы + grape (гем для описания апи) — я таким путем обычно иду, либо из отдельных гемов (грейп/синатра + актив рекорд + ...) собрать себе приложение — но тут ручной работы больше и часть «фишек» рельсов исчезают, либо вообще использовать nodejs — за счет асинхронности оно для апи-приложений хорошо подходит, но плохо, если нужно рендерить html.
1. Самая незначительная. Все запросы, кроме crud, нужно добавлять в роутер по-отдельности.
2. Валидация входных параметров. У грейпа она настолько крутая, что уже невозможно отказаться.
3. Генерация документации по апи для фронтендеров. Я написал себе небольшой класс, который парсит апи и отдает json с его структурой. Плюс html страничку, которая берет этот json и превращает его в множество интерактивных форм для отправки тестовых апи запросов. Такой самописный swagger получился, т.к. оригинальный меня не устраивает в некоторых местах.
2. Я когда перешел на рельсы, то радовался, что валидатор находится в модели. Типа там, где ему и место. Как только пошли сложные данные, которые должны валидироваться, но не должны сохраняться в базу или на основе проверки менять данные для сохранения, то я понял, что так дело не пойдет. Пришлось писать свою обертку над стандартным валидатором, а для сущностей делать свои файлы валидаторов (где нужно со сложной логикой). Плюс подгонять их для работы с юнит тестами. Теперь хоть могу валидировать данные где угодно. Но это кастомное решение, над которым пришлось повозиться.
3. Вот этим я не занимался. Мне проще глянуть в роуты, если я чего забыл. А для тестирования АПИ я использую Postman
А вообще я перебрал уйму ЯП. И просто из любопытства и в поиске быстрого, удобного и универсального инструмента. И понял, что серебряной пули не существует. ЯП, к сожалению — это далеко не все, что должен знать и уметь хороший специалист.
Поэтому я остановился на очень гибком ЯП (руби), с очень приятным синтаксисом. В конце концов, все эти разговоры о производительности очень часто звучат от людей, которые не знают, что это вообще такое. Многие сидят на небольших проектах, с дневной посещаемостью в пару тыс. человек, в лучшем случае. А большинство тормозов возникает из-за БД и больших пингов.
Руби и рельсы живы и будут и дальше жить. Это всего навсего инструмент. Отличный инструмент. А всякие хипстеры будут до конца дней своих скакать от технологии к технологии, разводя бизнес на бабки, внушая своим боссам, что важен именно ЯП, а не профессиональные специалисты, которые умеют строить архитектуру. На какой проект не попадешь, как откроешь запросы к БД, так, сука, плакать хочется. Ни индексов правильно расставить не умеют, ни запрос грамотно составить (вместо одного запроса тянут данные пятью и больше). Зато ЯП им виноват, давайте все на Go перепишем, он же быстрее.
А из свежих проектов, которые появились на рельсах и реакте — это проект по расчету стройматериалов e-tamarin.com Так что используют руби и рельсы, и ГитХаб тоже все устраивает. Растет и развивается. А тот, кто вайтишник, ему всегда будет что-то мешать, то плохие ЯП, то сложные БД, то слабые сервера, то отсутствие четвертого вэбпака в серверном языке (это вообще был перл).
Но при этом существуют же некие преданность технологии и даже культ инструмента. Скажи пхп-шнику, что пора переезжать на .NET, услышишь «PHP отличный, полмира на нем пишет», или просто получишь в лоб.
Я из этой же кагорты. Для меня лучше Tcl/Tk ничего нет.
Пацаны, так Ruby умер или нет?