Pull to refresh

Comments 82

Комбинация Ruby/RoR c *SQL — дает возможность БЫСТРО написать проект. Посмотреть «выстрелит» или нет. И если «все получилось» и нагрузка растет только так — уже можно не торопясь переписывать или оптимизировать «проблемные» части.

не менее быстро можно написать и на другом фреймвёрке, с которого миграция на производительную платформу будет легче. например grails + groovy++. вообще, конечно, каждый пишет на чём может и что знает лучше, но всё же лучше ориентироваться на производительные платформы с самого начала. посмотрите как фэйсбук сейчас мучается с php.
Назовите мне еще один framework, где есть настолько громадный набор сторонних библиотек (gems). RoR это уже давно конструктор и поэтому позволяет делать сложные сайты просто с фантастической скоростью. Я писал и на grails, и на play!, и на lift. Да, производительность JVM существенно выше, но мне пришлось писать просто дофига всего самому, где на RoR я в 99% подключил бы gem. Ruby потрясающи простой язык, если понять его концепцию. Scala — другой полюс, он гораздо сложнее нативной Java.
помнится искали мы что-нибудь для pam авторизации к ror — нашли только две бибилиотеки, одна кривая, другая падает. в groovy/java это уже есть изкаробки. Для grails кучи плагинов есть. Прежде чем ставить минус могли бы конкретно сказать, чего вам не хватает.
У вас старые данные про RoR. Буквально за последний год очень много добавилось, стало стабильным, включая PAM модули, поиск на Sphinx, ACL, работа с ДОБД, работа с key-value, пейджинг, крамбы и прочее работает весьма надежно. Хотя, безусловно, java всегда впереди планеты всей, например в направлении семантик веба, на роре в сравнении с явой это очень неразвито.
Назовите мне еще один framework, где есть настолько громадный набор сторонних библиотек (gems).

Да легко :)
Ruby gems: 25,950 gems cut since July 2009
Perl cpan: 96,766 Perl modules in 22,950 distributions
пардон :) про perl забыл — cpan монстр так монстр :)
[irony]что монстр делал?[/irony]
>Назовите мне еще один framework, где есть настолько громадный набор сторонних библиотек (gems).

java/maven
ага, и через maven можно поставить так же легко sass, haml, devise, coffeescript sprocket и т.д. например для lift?
Нет, это не так. Грельсы отстают на много-много лет от рельс.
Смотря с какой стороны посмотреть:

1. Grails более идеологически стабилен, там нет таких функциональных скачков от релиза к релизу.

2. Grails безумно растёт в Enterprise & Java Shop'ах — мейл лист у него один из самых активных среди Java Web Frameworks. Во многом этому способствует официальная поддержка SpringSource.

3. Наряду с проверенными || монстроузными (как кому больше нравится) Spring & Hibernate там появляется поддержка аутентичных Geb, Spock, Gradle.

Так что честно говоря не вижу в чём ему отставать если у него совершенно другой рынок и ЦА.
А если взять другую популярную связку Python + Django? Интересно, как тут обстоят дела с масштабируемостью и производительностью? И вообще, почему не так часто используют PostgreSQL
В реальной жизни PostgreSQL используют чаще для технологически-сложных проектов, просто у его пользователей не возникает такого количества проблем, о которых можно писать статьи :)
Если не считать двухсот параметров, которые нужно настраивать после установки.
поперхнулся подпрыгнул на стуле, что что?
если сравнивать в ruby 1.8, то быстрее, если с 1.9 — то одинаково, т.е. всё так же далеко от JVM
JRuby не сильно медлее Groovy
для groovy есть groovy++, java и gpars, а про проблемы с jruby написано в оригинальной статье
В оригинальной статье есть просто конкретное замечание к JRuby со стороны twitter инженеров в том плане, что они написали дохрена всего под CRuby и переписывать не собираются. Я просто указал на то, что нельзя сравнивать Ruby и JVM, так как под JVM есть тот же Groovy, который не быстрее Ruby, исполняющийся под тем же JVM via JRuby, и есть, например, native Java — которая действительно рвет в тряпки Ruby.
>они написали дохрена всего под CRuby и переписывать не собираются.
переписали они в контексте оптимизации, ибо нативная ruby/jruby версия тормозит.

>так как под JVM есть тот же Groovy, который не быстрее Ruby, исполняющийся под тем же JVM via JRuby
как правило он быстрее плюс значительно проще ускоряется методами выше
С таким подходом легко угробить проект. Представьте себе ситуацию (вполне реальную), что вы анонсировали некий сервис на хабре. Людям оный понравился, включилось сарафанное радио и нагрузка на систему начинает расти экспоненциально, доходя до точки бифуркации, что приводит к обрушению.

Для онлайн-проектов первое впечатление самое важное, так что рухнувшая на старте система теряет множество баллов, и за время латания дыр финансово обеспеченные игроки вполне могут успеть выстрелить улучшенным и устойчивым клоном.
UFO just landed and posted this here
Проблема в том, что Твиттер изначально развивался не как, например, Фейсбук. Тви делался сначала для быстрого общения друзей (лицокнига начиналась с целого университета), а потом у него не было ограничений на регистрацию (фейсбук распространялся в специально отобранных кампусах), кроме того, его открытое АПИ сильно стимулировало разработчиков, которые дергали сервера сервиса все большим количеством запросов. В результате этого Твиттер периодически рос экспоненциально, показывал кита, падая от нагрузки, отключал поиск… Ситуация требовала вмешательства тактического (чтобы поправить) и стратегического (чтобы справиться с все возрастающими потребностями).

В живом цикле разработки все сложнее, чем «сразу сделать все грамотно».
Лучше сделать правильную архитектуру приложение, так чтобы можно было БЫСТРО отмаштабироваться горизонтально и были места для оптимизации. Ну да, сначала можнт быть волна, не будет слэшдот/дигг-эффект — взяли на это время по-большие инстансов, потом все успокоилось и вырубили инстансы лишнии.

Но это не означает, что можно сделать все медленно и неправильно оставляя все на рефакторинг и оптимизацию.
> И если «все получилось» и нагрузка растет только так — уже можно не торопясь переписывать или оптимизировать «проблемные» части.

Есть оно действительно «выстреливает», то «не торопясь» обычно не получается.
Видно что переводил человек, не знакомый с Java. NIO это API JavaSE
Когда число посетителей сравняется с аудиторией твитера, то уже можно и перейти с RoR на что-то другое. Да ну хоть на ассемблере бэкэнд переписать для скорости (-: Человеческие и финансовые ресурсы это позволяют.
Есть другая сторона медали. Когда приходится проектировать систему, которая неизбежно «выстрелит» (хотя бы по причине вливаемых в рекламу средств), то тайм-аута на переписывание, по мере роста нагрузок, не будет. Так что приходится сразу же планировать масштабируемость и устойчивость. И тут рельсы/джанго годятся только для внутреннего прототипирования.
Я вас умоляю. Масштабировать проект на рельсах так же просто/сложно как и на других фреймворках. Запустил больше воркеров и всё.

Главные сложности возникают всегда с масштабированием БД. А это уж от языка не зависит.
UFO just landed and posted this here
Да, но нафоркать воркеров не стоит ничего (ну кроме самих машин, конечно).

А вот отмасштабировать базу — это СИЛЬНО больнее.

Поэтому мне и кажутся смешными все эти нападки на руби.
UFO just landed and posted this here
Из публичного интерфейса у них только Settings и всякие там Terms, About на RoR остались. Сама же JS-лента твитов напрямую с api.twitter.com работает.
UFO just landed and posted this here
Но это же не значит что рельсы/эрланг не масштабируются. Масштабируются, просто дороже.
А для монстров рынка (твиттеры там, фейсбуки всякие) общие правила всё равно не действуют.
UFO just landed and posted this here
Но опять надо сравнивать издержки не только на количество серверов, но и на стоимость работы программистов, причём не только для начальной разработки, но и для поддержки и развития. Грубо говоря, переписывание всего софта на ассемблере освободит просто куеву хучу ресурсов в мировых масштабах, но вот сколько будет стоить его переписать…
Вот именно, **специфическая задача**. Именно их имеет смысл «переписывать на ассемблере». И то только после результатов профилирования.

Писать же всю систему сразу на С не имеет смысла.

Про десятое правило Гринспуна все помнят? :-)

Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.
Прогресс не стоит на месте. Есть такой замечательный язык Go, приближённый по быстродействию к C++ и по простоте к Python.
Ну я не знаю ни одной системы, которая на этапе проектирования и запуска «неизбежно выстрелит». Твитер, Фб и т.п. на момент старта вряд ли предполагали такой отклик. С другой стороны, гораздо больше систем, которые задумываются, как вполне себе способные выстрелить, на поверку оказываются никакущими. Пример — гугловские волны. Уж сколько было потрачено человекочасов и средств, а отдача — 0.
Нужно быть немного чокнутым (или гением, что почти одно и то же), чтобы планировать «выстреливание» больших систем. Но помимо них существует множество вариантов, где можно пострелять не слонов, а дичь помельче. Более того, у малых и средних проектов значительно лучше продуманные изначально бизнес планы, а прибыль в очень короткие сроки покрывает все расходы на разработку и обслуживание. Всё же деньги делаются не только на раздувании гигантских пузырей, но и на пускании множества маленьких пузырьков :)
Чего я в тексте пропустил, если я так и не увидел чего-то, кроме повторения факта «Twitter переезжает с руби на java»?

Никакого более детального раскрытия информации, обзоров, цифр и результатов. Это что, пост?
Лучше почитать оригинал с InfoQ, там есть цитаты из интервью самого Evan Weaver — на Хабр доехали только выдержки. Ещё можно посмотреть Finagle — на первый взгляд API под Scala гораздо лучше выглядит чем дремучий лес колбеков Node.JS и прочих.
Опять эта тема твиттера и руби… Руби не повезло, что самый большой сайт на нём принадлежит такой странной в техническом отношении компании как твиттер. Несколько примеров… Они написала очередь сообщений на руби (кому вообще могло прийти в голову писать такое на руби во времена черепашьего 1.8?!, причём судя по тестам их реализация была очень далека от оптимальности...) — переписали на скале — по блогам пошли посты на тему; руби дрянь, скала рулит. Переписали поисковую подсистему на JVM с иcпользованием асинхронных запросов к бэкенду через netty — скорость выросла в 10 раз — все снова сделали вывод: руби дрянь, хотя если бы они переписали синхронный код на руби с иcпользованием асинхронности через event_machine, рост производительности был бы таким же огромным.
Плюс странные заявления, что Scala лучше ruby потому, что там статическая типизация, что снижает кол-во ошибок. Надёжность программ со статической типизацией это просто миф, в который верят люди у которых мало опыта с динамическими языками.
Из постов в блогах кажется, что Твиттер компания, где решают все проблемы переходом на новую более модную технологию и написанием своих велосипедов на ней…
Из постов в блогах кажется, что Твиттер компания, где решают все проблемы переходом на новую более модную технологию и написанием своих велосипедов на ней…

Но похоже этот подход оправдан, не так ли?
Языки со статической типизацией более надежны, это факт. Их компиляторы устраняют 100% ошибок, связанных с неправильными типами.
UFO just landed and posted this here
Я ему про Фому, он мне про Ерёму.

При чем тут Эрланг и его динамическая типизация?

UFO just landed and posted this here
Надежность бывает разная, конечно же.

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

Без динамической типизации в Эрланге было бы трудно сделать горячую замену кода. Тем не менее, он тоже движется в этом направлении: спецификации типов все-таки не зря ввели.
Каст в object а потом обратно в неправильный class ваш супер надежный компилятор то же обработает? А если у функции, например, 5 аргументов с типом string и я перепутал местами (или кто то поменял местами) аргументы — то же компилятор найдет? 100% ошибок (я утрирую, конечно) устранят unit test'ы. А их пофигу для чего писать, javascript, ruby, java.
Каст в object а потом обратно в неправильный class


Конечно. В С#, например, есть конструкция as. Если этот объект на самом деле не является тем, к чему ты его хочешь привести, она вернет null.

Пример с перепутанными аргументами вообще не в кассу.
Комплятор в compile time скажет, что тип неправильный или нет, при использрвании as? Или ошибка будет в runtime (NullPointerException)?

Почему пример с перепутанными аргументами не в кассу? Разве вызов метода и его проверка в compile time это не часть type safety компилятора?
> Комплятор в compile time скажет, что тип неправильный или нет, при использрвании as? Или ошибка будет в runtime (NullPointerException)?

Надо понимать что as, reinterpret_cast и подобные средства — это средства на крайний случай. В большинстве случаев они не нужны. Если ты хочешь выстрелить себе в ногу (специально), то языки обычно дают тебе такую возможность. И если ты кастишь вниз по иерархии, будь добр проверить на null.

> Почему пример с перепутанными аргументами не в кассу? Разве вызов метода и его проверка в compile time это не часть type safety компилятора?
> А если у функции, например, 5 аргументов с типом string

Ты сам то понял что сказал?
Хм, то есть
«Языки со статической типизацией более надежны, это факт. Их компиляторы устраняют 100% ошибок, связанных с неправильными типами.»
это лажа, так?

И компиляторы все же не дают 100% надежность при работе с типами, да? И как только мы кастим к базовому типу, то вся 100% надежность идет к чертям?

Кто то не врубается что такое type safety, видимо не доходит, что компилятор не может гарантировать 100% отлавливание ошибок работы с типами, потому что в каждом языке есть дыра, когда можно все эти проверки послать к черту.

Ну если не доходит, то и спор бессмысленный.
Вот именно, кто-то не врубается в type safety.

Ну успехов в профессиональном развитии, чтож.
На это я тебе отвечу так: «сдуру можно и хуй сломать».

А для нормальных людей компилятор всё гарантирует.
Имхо, тут у кого-то с логикой проблемы.

>Автомобили более безопасны, чем мотоциклы, это факт.
>А от попадания ядерной бомбы автомобиль защитит? Или от падения со 100 метрового обрыва? Нет! Значит автомобили не безпаснее мотоциклов! От всего вышеперечисленного спасет только радио «Радонеж»

Ваш пример с кастом на самом деле надуманный. Каст обходится в 99% случаев с помощью параметризированной типизации. А в тот момент, когда параметризированные типы не «срабатывают», надо просто внимательно посмотреть на то, как мы пытаемся их применять. Generics — относительно новое понятие для мейнстрим-разработчиков. Я сам отлично помню, как путался с ними лет пять назад. Сегодня же единственные случаи когда мне приходится использовать cast — это работа со старыми или плохо адаптированными к generics библиотеками.

Самый возмутительный пример: в JPA метод getResultsList() объекта Query возвращает нетипизированный список. Во многих проектах утилитарная функция его приведения — единственное место, где я реально использую cast.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Ну а почему Вы лезите сюда с провокационными заявами — РОР кал — ПХП — чудо?
Здесь и так горюют рубисты, в том числе и я.

Дело не в том, что кто-то что-то переделывает во имя чего-то.
А как раз в том, что «кто-то что-то переделывает во имя чего-то.»
Улавливаете? Людям же насрать, что Твиттер в большинстве своем выстрелил благодаря Руби/рор.
Что развертка и масштабирование было в реалтайме. Что можно было диманически и довольно быстро учитывать пожелания клиентов/юзеров.
Людям настрать, что запросы к бд выросли с сотен до миллиардов обращений! У вас есть проект с такими запросами?
Людям насрать на то, что поддерживать рор проект намного лечге и экономически выгоднее, чем держать свору высококвалифицированных С/++ специалистов.

Люди слышат одно — Твиттер отказывается от Руби.
Значит Руби — кал! На кол его! Скала рулит! Хотя до этого момента абсолютное большинство даже и не догадывалась о существовании оного.

Да, обидно, чертовски обидно видеть как на ЯП сказывается политика одной, хотя и большой компании.

Но Мац далеко не дурак. Он увидел потолок. Предел. Что нужно оптимизация ради экономии.
Он уже над этим работает. (Я надеюсь..)
1.9 ветка была не об этом.
Кстати — твиттер страртовал еще на 1,8 руби со всеми вытекающими.
Если они до сих пор были на нем — это говорит об огромном потенциале.

Но люди же не слышат этого. ТВИТТЕР ОТКАЗЫВАЕТСЯ ОТ РУБИ! — вот всё, что на слуху.

А тут Вы еще со своим пхп.
Люди видят то, что хотят видеть. Даже есть вы двести раз повторите в корне логичную и разумную мысль, человек все-равно преобразует ее в то, что его разуму более понятно.

Я к тому, что внимательные и грамотный читатель не видит в заголовке «Твиттер отказывается от Руби», этого и не подразумевается — Эван Уивер говорит о том, что Ruby (RoR) до сих пор остаются очень хороши для решения некоторых поставленных задач. Просто не всех.

В конце-концов, вы же не думаете, что Ruby и его аудитория пострадают из-за того, что Twitter переносит часть своих технологий на другие языки/инструменты/платформы? Я думаю, большую часть выгоды он уже получил. А если развитие и дальше пойдет текущими темпами, то все-равно этот язык, как и фреймворк, войдет в историческую когорту «самых популярных». Даже я, человек очень далекий от фактического программирования (не то мышление) пытался освоить азы ООП именно с этого языка, т.к. его синтаксис прост до безумия.

Или вам неприятно видеть Ruby в качестве стартовой ступени разработчика?
Мне? Да я уже год как не представляю иного ничего такого же быстрого и наименее затратного.
Руби в юниксе уже есть.
Всё, что нужно поставить -гемы или рвм. Далее рор.
Далее гитхаб.
Далее хероку.

И все это парой строкой в баше.
Это же прекрасно!

гит всё же, а не гитхаб? :-)
Да нет же.
github.com через git, конечно же.
Обратно не понял. Установить гитхаб? У них исходники в открытом доступе? Да и зачем тебе гитхаб локальный? :-)
Ну да — залил исходники. Свои — им.
Не хочешь светить — купи премиум — будет все в хайде.
Итого — с любой точки у тебя доступ к своим проектам.
А хероку подключил через гитхаб.
Закомитил в гите, пушнул на хаб, обновил хероку — все. Все изменения уже в деплое.

Или я чего-то не улавливаю в вопросе?
Эм… Каким-таким функционалом обрастал Твиттер, что приходилось «диманически и довольно быстро учитывать пожелания клиентов/юзеров»?

Проблема была одна — тормоза и стабильность. Функционалам обрастала экосистема вокруг Твиттера, которую он потом начал скупать или имплементить самостоятельно — но уже в пост-RoRовские времена.
UFO just landed and posted this here
Как мне разпрочитать ваш комментарий обратно, я не хочу его знать?
PHP стал быстрее, функциональнее и удобнее в последней версии
Это как заявить «Лада стала быстрее/надежнее/удобнее» в топике о том, как како-нибудь олигарх пересел с Феррари на Майбах.
UFO just landed and posted this here
UFO just landed and posted this here
Поменяли один RunTime, на дргуой чуток побыстрее.
Sign up to leave a comment.

Articles