HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>8 июн 2022</li>
2 <ul><li>8 июн 2022</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Senior-разработчик на Ruby рассказывает, как устроен язык и что на нём пишут, сколько зарабатывают "рубисты" и почему Rails - революционный фреймворк.</p>
4 </ul><p>Senior-разработчик на Ruby рассказывает, как устроен язык и что на нём пишут, сколько зарабатывают "рубисты" и почему Rails - революционный фреймворк.</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5 <p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6 <p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
6 <p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
7 <p>Шесть лет программирует на Ruby on Rails, до этого пару лет работал fullstack-разработчиком на PHP. Собеседует кандидатов и читает авторский курс по Ruby on Rails для стажёров компании, в которой работает. Пропагандирует Fedora Linux. </p>
7 <p>Шесть лет программирует на Ruby on Rails, до этого пару лет работал fullstack-разработчиком на PHP. Собеседует кандидатов и читает авторский курс по Ruby on Rails для стажёров компании, в которой работает. Пропагандирует Fedora Linux. </p>
8 <p>Ruby - это объектно-ориентированный язык общего назначения с динамической типизацией. Он появился в Японии в 1995 году и быстро завоевал там популярность. Однако из-за отсутствия документации на английском языке мир узнал о нём лишь пару лет спустя.</p>
8 <p>Ruby - это объектно-ориентированный язык общего назначения с динамической типизацией. Он появился в Японии в 1995 году и быстро завоевал там популярность. Однако из-за отсутствия документации на английском языке мир узнал о нём лишь пару лет спустя.</p>
9 Юкихиро Мацумото, создатель Ruby<em>Фото: Wikimedia Commons</em><p>Создатель Ruby Юкихиро Мацумото (Matz) изначально создавал язык понятным для людей, а не для машин. Он считал, что разработчики должны получать удовольствие от работы и быть продуктивными, а не бороться с дизайном языка.</p>
9 Юкихиро Мацумото, создатель Ruby<em>Фото: Wikimedia Commons</em><p>Создатель Ruby Юкихиро Мацумото (Matz) изначально создавал язык понятным для людей, а не для машин. Он считал, что разработчики должны получать удовольствие от работы и быть продуктивными, а не бороться с дизайном языка.</p>
10 <p>В основном Ruby применяется в веб-разработке - нишу языка определил удачный фреймворк,<a>Ruby on Rails</a>. Но есть и другие направления: скрипты, деплоймент, безопасность и так далее.</p>
10 <p>В основном Ruby применяется в веб-разработке - нишу языка определил удачный фреймворк,<a>Ruby on Rails</a>. Но есть и другие направления: скрипты, деплоймент, безопасность и так далее.</p>
11 <p>Ruby лаконичный, и у него приятный синтаксис. Там, где на другом языке приходится писать много ненужного кода, в Ruby можно обойтись парой строчек. За лаконичность и приятный синтаксис на первых порах пришлось платить производительностью. Но сегодня по производительности программ Ruby не уступает таким динамическим языкам, как Python и JavaScript.</p>
11 <p>Ruby лаконичный, и у него приятный синтаксис. Там, где на другом языке приходится писать много ненужного кода, в Ruby можно обойтись парой строчек. За лаконичность и приятный синтаксис на первых порах пришлось платить производительностью. Но сегодня по производительности программ Ruby не уступает таким динамическим языкам, как Python и JavaScript.</p>
12 <p>Синтаксис Ruby одновременно напоминает Python, Perl и немного Pascal - из-за открывающих и закрывающих блоков. Ruby также повлиял на некоторые языки программирования. Например, создатели Elixir и Crystal вдохновлялись его синтаксисом.</p>
12 <p>Синтаксис Ruby одновременно напоминает Python, Perl и немного Pascal - из-за открывающих и закрывающих блоков. Ruby также повлиял на некоторые языки программирования. Например, создатели Elixir и Crystal вдохновлялись его синтаксисом.</p>
13 <p>Сравним код программы Hello World! на Ruby и C++.</p>
13 <p>Сравним код программы Hello World! на Ruby и C++.</p>
14 <p>Код на Ruby:</p>
14 <p>Код на Ruby:</p>
15 puts "Hello, World!"<p>Код на C++:</p>
15 puts "Hello, World!"<p>Код на C++:</p>
16 #include &lt;iostream&gt; int main() { std::cout &lt;&lt; "Hello, World!" &lt;&lt; std:endl; return 0; }<p>На Ruby можно без проблем перейти с любого языка. Но легче всего будет тем, кто уже имел дело с динамически типизированными языками - например, с Python. А если вы переходите со статически типизированного языка, то всегда помните о duck typing.</p>
16 #include &lt;iostream&gt; int main() { std::cout &lt;&lt; "Hello, World!" &lt;&lt; std:endl; return 0; }<p>На Ruby можно без проблем перейти с любого языка. Но легче всего будет тем, кто уже имел дело с динамически типизированными языками - например, с Python. А если вы переходите со статически типизированного языка, то всегда помните о duck typing.</p>
17 <p>Duck typing означает, что если объект ведёт себя как утка и крякает как утка, то он и есть утка. Например, если у объекта есть какие-то методы, характерные для строк, то Ruby будет считать этот объект строкой. Поэтому всем, кто переходит с языков со статической типизацией, нужно сначала привыкнуть и не пытаться жёстко контролировать типы.</p>
17 <p>Duck typing означает, что если объект ведёт себя как утка и крякает как утка, то он и есть утка. Например, если у объекта есть какие-то методы, характерные для строк, то Ruby будет считать этот объект строкой. Поэтому всем, кто переходит с языков со статической типизацией, нужно сначала привыкнуть и не пытаться жёстко контролировать типы.</p>
18 <p>В Ruby можно получать результат вычислений на лету: мы можем остановить программу, посмотреть, что хранится в памяти, продолжить или перескочить на другое место исполнения. За это мы и любим Ruby и другие динамические языки :)</p>
18 <p>В Ruby можно получать результат вычислений на лету: мы можем остановить программу, посмотреть, что хранится в памяти, продолжить или перескочить на другое место исполнения. За это мы и любим Ruby и другие динамические языки :)</p>
19 <p>Динамическая типизация - главное преимущество Ruby. С ней можно не запоминать типы переменных и при этом не бояться получить кучу ошибок. Она освобождает программиста от рутины и позволяет сфокусироваться на более важных вещах - например, бизнес-логике, вместо того чтобы бороться с дизайном языка.</p>
19 <p>Динамическая типизация - главное преимущество Ruby. С ней можно не запоминать типы переменных и при этом не бояться получить кучу ошибок. Она освобождает программиста от рутины и позволяет сфокусироваться на более важных вещах - например, бизнес-логике, вместо того чтобы бороться с дизайном языка.</p>
20 <p>Ещё с динамическими языками мы не думаем об утечках памяти: не выделяем её и не описываем типы. Мы объявляем класс и пишем код внутри, а дальше язык сам следит за всеми манипуляциями с памятью.</p>
20 <p>Ещё с динамическими языками мы не думаем об утечках памяти: не выделяем её и не описываем типы. Мы объявляем класс и пишем код внутри, а дальше язык сам следит за всеми манипуляциями с памятью.</p>
21 <p>Ruby больше всего подходит для веб-разработки. На нём написано много приложений в сфере<a>e-commerce</a>,<a>SaaS</a>-решений, биржевых площадок и других сложных проектов. Единственное, для чего Ruby не подходит, - это real-time-приложения. Они требуют работать с сокетами и последовательно идентифицировать пользователей, а у Ruby с этим проблемы.</p>
21 <p>Ruby больше всего подходит для веб-разработки. На нём написано много приложений в сфере<a>e-commerce</a>,<a>SaaS</a>-решений, биржевых площадок и других сложных проектов. Единственное, для чего Ruby не подходит, - это real-time-приложения. Они требуют работать с сокетами и последовательно идентифицировать пользователей, а у Ruby с этим проблемы.</p>
22 <p>Стартапы часто используют Ruby, потому что на нём можно быстро проверять идеи. В связке с Rails это просто идеальный язык для создания прототипов и <a>MVP</a>. Откройте сайт<a>Y Combinator</a>, и вы увидите, что 8 из 10 топовых проектов написаны именно на Ruby on Rails.</p>
22 <p>Стартапы часто используют Ruby, потому что на нём можно быстро проверять идеи. В связке с Rails это просто идеальный язык для создания прототипов и <a>MVP</a>. Откройте сайт<a>Y Combinator</a>, и вы увидите, что 8 из 10 топовых проектов написаны именно на Ruby on Rails.</p>
23 <p>Люди выбирают эту технологию, потому что она позволяет быстро делать проекты, вовлекать новых разработчиков и пилить функциональность и фичи, а потом тестировать их и выкатывать.</p>
23 <p>Люди выбирают эту технологию, потому что она позволяет быстро делать проекты, вовлекать новых разработчиков и пилить функциональность и фичи, а потом тестировать их и выкатывать.</p>
24 <p>Известные компании - GitHub, GitLab, Shopify, Airbnb, SoundCloud, Dribbble, Kickstarter и Stripe - тоже внедряют Ruby в свои проекты. Есть и те, кто использует Ruby, но не афиширует это.</p>
24 <p>Известные компании - GitHub, GitLab, Shopify, Airbnb, SoundCloud, Dribbble, Kickstarter и Stripe - тоже внедряют Ruby в свои проекты. Есть и те, кто использует Ruby, но не афиширует это.</p>
25 <p>Ruby - это интерпретируемый язык программирования, то есть ему не нужна предварительная компиляция в машинный код, чтобы запустить программу. Вместо этого интерпретатор выполняет программы напрямую, последовательно считывая файл от начала до конца.</p>
25 <p>Ruby - это интерпретируемый язык программирования, то есть ему не нужна предварительная компиляция в машинный код, чтобы запустить программу. Вместо этого интерпретатор выполняет программы напрямую, последовательно считывая файл от начала до конца.</p>
26 <p>У такого подхода есть преимущества:</p>
26 <p>У такого подхода есть преимущества:</p>
27 <ul><li>мы не привязываемся к платформе - достаточно установить интерпретатор, чтобы запустить код;</li>
27 <ul><li>мы не привязываемся к платформе - достаточно установить интерпретатор, чтобы запустить код;</li>
28 <li>не нужно описывать типы данных - за это отвечает динамическая типизация;</li>
28 <li>не нужно описывать типы данных - за это отвечает динамическая типизация;</li>
29 <li>проще добавлять новые возможности и фичи.</li>
29 <li>проще добавлять новые возможности и фичи.</li>
30 </ul><p>Но также есть и недостатки:</p>
30 </ul><p>Но также есть и недостатки:</p>
31 <ul><li>относительно низкая скорость выполнения;</li>
31 <ul><li>относительно низкая скорость выполнения;</li>
32 <li>ошибки, связанные с типами.</li>
32 <li>ошибки, связанные с типами.</li>
33 </ul><p>Давайте разберёмся, как Ruby работает изнутри. Допустим, у нас есть Ruby-файл со строкой - "puts 1 + 2". Что делает интерпретатор?</p>
33 </ul><p>Давайте разберёмся, как Ruby работает изнутри. Допустим, у нас есть Ruby-файл со строкой - "puts 1 + 2". Что делает интерпретатор?</p>
34 <p>Сначала он считывает файл целиком, а потом разбивает код на токены: "puts", " ", "1", " ", "+", " " и "2". Заметьте: пробел сохраняется в отдельном токене.</p>
34 <p>Сначала он считывает файл целиком, а потом разбивает код на токены: "puts", " ", "1", " ", "+", " " и "2". Заметьте: пробел сохраняется в отдельном токене.</p>
35 <p>После этого Ruby запускает лексический анализатор, который должен проверить и добавить дополнительные параметры для каждого токена. Он берёт первый - "puts" - и добавляет к нему специфичные параметры, чтобы компьютер понял, что нужно дальше с ним делать. И так для каждого токена.</p>
35 <p>После этого Ruby запускает лексический анализатор, который должен проверить и добавить дополнительные параметры для каждого токена. Он берёт первый - "puts" - и добавляет к нему специфичные параметры, чтобы компьютер понял, что нужно дальше с ним делать. И так для каждого токена.</p>
36 <p>Затем запускается парсер для составления<a>абстрактного дерева</a> - пути исполнения кода. И завершающий шаг: Ruby переводит это дерево в низкоуровневый байт-код, понятный виртуальной машине Ruby, и запускает его. Если на каком-то из этапов происходит ошибка, то запускается Ruby-код, который выводит эту ошибку.</p>
36 <p>Затем запускается парсер для составления<a>абстрактного дерева</a> - пути исполнения кода. И завершающий шаг: Ruby переводит это дерево в низкоуровневый байт-код, понятный виртуальной машине Ruby, и запускает его. Если на каком-то из этапов происходит ошибка, то запускается Ruby-код, который выводит эту ошибку.</p>
37 <p>Итак, вот что делает Ruby:</p>
37 <p>Итак, вот что делает Ruby:</p>
38 <ul><li>считывает файл;</li>
38 <ul><li>считывает файл;</li>
39 <li>разбивает его на токены;</li>
39 <li>разбивает его на токены;</li>
40 <li>запускает лексический анализ для дополнительной информации;</li>
40 <li>запускает лексический анализ для дополнительной информации;</li>
41 <li>запускает парсер для AST-дерева;</li>
41 <li>запускает парсер для AST-дерева;</li>
42 <li>переводит дерево в низкоуровневый байт-код;</li>
42 <li>переводит дерево в низкоуровневый байт-код;</li>
43 <li>исполняет код.</li>
43 <li>исполняет код.</li>
44 </ul><p>Новые версии Ruby выходят практически каждый год. Недавно вышла третья версия, в которую добавили возможность переписывать нотации типов в отдельных файлах. В чём смысл?</p>
44 </ul><p>Новые версии Ruby выходят практически каждый год. Недавно вышла третья версия, в которую добавили возможность переписывать нотации типов в отдельных файлах. В чём смысл?</p>
45 <p>В статически типизированных языках типы можно описывать прямо в коде, но Matz, создатель Ruby, решил, что это плохой путь: добавить типы в язык легко, а вот убрать потом - трудно. Matz верит, что в скором будущем появятся инструменты, которые сами будут определять тип на лету. Он не хочет добавлять статическую типизацию прямо в код. Поэтому в третьей версии появилась типизация в отдельных файлах и <a>pattern matching</a> - как в Elixir. Также в Ruby v3 добавили<a>Ractors</a> - инструмент для параллельного запуска программ, новый<a>JIT‑компилятор</a>для ускорения выполнения кода и статический анализатор типов - typeof.</p>
45 <p>В статически типизированных языках типы можно описывать прямо в коде, но Matz, создатель Ruby, решил, что это плохой путь: добавить типы в язык легко, а вот убрать потом - трудно. Matz верит, что в скором будущем появятся инструменты, которые сами будут определять тип на лету. Он не хочет добавлять статическую типизацию прямо в код. Поэтому в третьей версии появилась типизация в отдельных файлах и <a>pattern matching</a> - как в Elixir. Также в Ruby v3 добавили<a>Ractors</a> - инструмент для параллельного запуска программ, новый<a>JIT‑компилятор</a>для ускорения выполнения кода и статический анализатор типов - typeof.</p>
46 <p>А ещё улучшили<a>REPL</a>: добавили подсветку синтаксиса, автодополнение и "быструю документацию", переработали вывод некоторых ошибок и разработали новые дебаги.</p>
46 <p>А ещё улучшили<a>REPL</a>: добавили подсветку синтаксиса, автодополнение и "быструю документацию", переработали вывод некоторых ошибок и разработали новые дебаги.</p>
47 <p>Думаю, команда Ruby будет усерднее работать над ускорением языка, потому что компании пишут всё больше сложных проектов на Ruby on Rails. Например, сейчас<a>Shopify</a>улучшает свой YJIT‑компилятор, чтобы в несколько раз повысить производительность приложений на Rails, - обычный компилятор умеет оптимизировать только чистый Ruby-код.</p>
47 <p>Думаю, команда Ruby будет усерднее работать над ускорением языка, потому что компании пишут всё больше сложных проектов на Ruby on Rails. Например, сейчас<a>Shopify</a>улучшает свой YJIT‑компилятор, чтобы в несколько раз повысить производительность приложений на Rails, - обычный компилятор умеет оптимизировать только чистый Ruby-код.</p>
48 <p>Думаю, в будущем Ruby получит больше встроенных инструментов и начнёт заимствовать синтаксические конструкции из других языков, таких как JavaScript с его стандартами ES6, ES7 и так далее.</p>
48 <p>Думаю, в будущем Ruby получит больше встроенных инструментов и начнёт заимствовать синтаксические конструкции из других языков, таких как JavaScript с его стандартами ES6, ES7 и так далее.</p>
49 <p>Да никаких. Он же идеален! Ну, почти… :)</p>
49 <p>Да никаких. Он же идеален! Ну, почти… :)</p>
50 <p>Конечно, у Ruby, как и у других языков, есть минусы. Основные - GIL и потребление памяти.</p>
50 <p>Конечно, у Ruby, как и у других языков, есть минусы. Основные - GIL и потребление памяти.</p>
51 <p><strong>GIL - Global Interpreter Lock.</strong>Из-за него мы не можем эффективно использовать ядра процессора. Например, у меня есть 16-ядерный процессор. Я запускаю вычисления нескольких потоков, чтобы программа посчитала на каждом потоке какие-то формулы. Запускаются потоки. Сначала один поток работает с одним ядром. Затем он останавливается и сохраняет состояние, а процесс переключается на другой поток, который тоже использует одно ядро. Остальные ядра при этом бездействуют.</p>
51 <p><strong>GIL - Global Interpreter Lock.</strong>Из-за него мы не можем эффективно использовать ядра процессора. Например, у меня есть 16-ядерный процессор. Я запускаю вычисления нескольких потоков, чтобы программа посчитала на каждом потоке какие-то формулы. Запускаются потоки. Сначала один поток работает с одним ядром. Затем он останавливается и сохраняет состояние, а процесс переключается на другой поток, который тоже использует одно ядро. Остальные ядра при этом бездействуют.</p>
52 <p>Получается, из 16 ядер всегда будет использоваться только одно. А происходит это потому, что Ruby создавался во времена, когда у процессоров было всего одно ядро. Сейчас команда Ruby занимается этой проблемой.</p>
52 <p>Получается, из 16 ядер всегда будет использоваться только одно. А происходит это потому, что Ruby создавался во времена, когда у процессоров было всего одно ядро. Сейчас команда Ruby занимается этой проблемой.</p>
53 <p><strong>Работа Ruby с памятью.</strong>Язык практически не отдаёт её обратно - даже если она не используется. Допустим, вы запустили приложение: через час оно ест два гигабайта, а через два часа - четыре. Это преувеличение, но программы на Ruby работают примерно так.</p>
53 <p><strong>Работа Ruby с памятью.</strong>Язык практически не отдаёт её обратно - даже если она не используется. Допустим, вы запустили приложение: через час оно ест два гигабайта, а через два часа - четыре. Это преувеличение, но программы на Ruby работают примерно так.</p>
54 <p>Внутри это происходит следующим образом. Ruby делит память на участки фиксированной длины - страницы. Страницы, в свою очередь, делятся на слоты. Представим, что я создал приложение, которому нужно четыре слота, а на странице свободно всего три. Тогда Ruby выделит новую страницу и на ней заполнит четыре слота, а слоты с предыдущей страницы будут пустовать. При этом, если на странице занят хотя бы один слот, Ruby не освободит память из-под неё.</p>
54 <p>Внутри это происходит следующим образом. Ruby делит память на участки фиксированной длины - страницы. Страницы, в свою очередь, делятся на слоты. Представим, что я создал приложение, которому нужно четыре слота, а на странице свободно всего три. Тогда Ruby выделит новую страницу и на ней заполнит четыре слота, а слоты с предыдущей страницы будут пустовать. При этом, если на странице занят хотя бы один слот, Ruby не освободит память из-под неё.</p>
55 <p><strong>IDE.</strong>Для разработки на Ruby подойдёт любой расширяемый редактор кода - VS Code, Vim, Emacs, Sublime Text, Atom. Но если нужна полноценная IDE, то можно использовать платную<a>RubyMine</a>.</p>
55 <p><strong>IDE.</strong>Для разработки на Ruby подойдёт любой расширяемый редактор кода - VS Code, Vim, Emacs, Sublime Text, Atom. Но если нужна полноценная IDE, то можно использовать платную<a>RubyMine</a>.</p>
56 <p>На данный момент для работы я использую RubyMine, а для pet-проектов VS Code и Neovim.</p>
56 <p>На данный момент для работы я использую RubyMine, а для pet-проектов VS Code и Neovim.</p>
57 Vim как IDE для Ruby<em>Источник:<a>SpaceVim</a></em><p><strong>Тесты.</strong>Для тестов есть классный и богатый фичами фреймворк<a>RSpec</a>, который уже стал стандартом в сообществе. В самом Ruby есть встроенные<a>MiniTest</a>и <a>TestUnit</a>.</p>
57 Vim как IDE для Ruby<em>Источник:<a>SpaceVim</a></em><p><strong>Тесты.</strong>Для тестов есть классный и богатый фичами фреймворк<a>RSpec</a>, который уже стал стандартом в сообществе. В самом Ruby есть встроенные<a>MiniTest</a>и <a>TestUnit</a>.</p>
58 <p><strong>Ruby-стандарты.</strong>Сообщество создало общий стандарт для написания кода, который называется<a>RuboCop</a>. Ещё есть гайды на сайте<a>rubystyle.guide</a>. Всё это находится в открытом доступе - пользуйтесь и пишите идеальный код. А если стандарты сообщества вас не устраивают, то можно локально добавить свои.</p>
58 <p><strong>Ruby-стандарты.</strong>Сообщество создало общий стандарт для написания кода, который называется<a>RuboCop</a>. Ещё есть гайды на сайте<a>rubystyle.guide</a>. Всё это находится в открытом доступе - пользуйтесь и пишите идеальный код. А если стандарты сообщества вас не устраивают, то можно локально добавить свои.</p>
59 <p><strong>Другие утилиты.</strong>Программисты любят Ruby, потому что у него очень богатая экосистема - разнообразные библиотеки, менеджеры зависимостей (<a>Bundler</a>), менеджер пакетов (<a>RubyGems</a>), встроенный менеджер тасков<a>Rake</a>, интерактивные среды программирования и дебаггеры (<a>IRB</a>). Если этого не хватает, можно добавить<a>Pry</a>-дебаггер.</p>
59 <p><strong>Другие утилиты.</strong>Программисты любят Ruby, потому что у него очень богатая экосистема - разнообразные библиотеки, менеджеры зависимостей (<a>Bundler</a>), менеджер пакетов (<a>RubyGems</a>), встроенный менеджер тасков<a>Rake</a>, интерактивные среды программирования и дебаггеры (<a>IRB</a>). Если этого не хватает, можно добавить<a>Pry</a>-дебаггер.</p>
60 <p>Для продвинутых программистов есть утилиты, которые позволяют строить AST-деревья и смотреть, как Ruby-дебаггер работает на уровне C-кода. На <a>RubyGems</a>и <a>Ruby Toolbox</a>можно посмотреть "джемы". А если не нашли ничего подходящего, то можете создать свой джем и выложить его на один из этих сайтов.</p>
60 <p>Для продвинутых программистов есть утилиты, которые позволяют строить AST-деревья и смотреть, как Ruby-дебаггер работает на уровне C-кода. На <a>RubyGems</a>и <a>Ruby Toolbox</a>можно посмотреть "джемы". А если не нашли ничего подходящего, то можете создать свой джем и выложить его на один из этих сайтов.</p>
61 <p>С помощью утилит<a>Ruby Version Manager (RVM)</a>и <a>ASDF</a>можно установить несколько версий языка и управлять зависимостями. А <a>Sidekiq</a>позволяет обрабатывать фоновые задачи - это одна из самых популярных и стабильных библиотек.</p>
61 <p>С помощью утилит<a>Ruby Version Manager (RVM)</a>и <a>ASDF</a>можно установить несколько версий языка и управлять зависимостями. А <a>Sidekiq</a>позволяет обрабатывать фоновые задачи - это одна из самых популярных и стабильных библиотек.</p>
62 <p>Большой популярности Ruby добился благодаря фреймворку Ruby on Rails - в нём были фичи, которыми не обладали другие фреймворки.</p>
62 <p>Большой популярности Ruby добился благодаря фреймворку Ruby on Rails - в нём были фичи, которыми не обладали другие фреймворки.</p>
63 <p><a>Rails</a> - это fullstack-фреймворк для разработки приложений любой сложности. Его создала компания<a>37signals</a>(в прошлом Basecamp) в 2005 году и тем самым привнесла много нового в мир веб-разработки.</p>
63 <p><a>Rails</a> - это fullstack-фреймворк для разработки приложений любой сложности. Его создала компания<a>37signals</a>(в прошлом Basecamp) в 2005 году и тем самым привнесла много нового в мир веб-разработки.</p>
64 <p>Например, в Rails появились обратимые миграции баз данных - это когда мы можем сделать миграцию, а потом откатить все изменения парой команд. Не менее революционной фичей было сжатие тела CSS-кода -<a>Asset Pipeline</a>.</p>
64 <p>Например, в Rails появились обратимые миграции баз данных - это когда мы можем сделать миграцию, а потом откатить все изменения парой команд. Не менее революционной фичей было сжатие тела CSS-кода -<a>Asset Pipeline</a>.</p>
65 <p>Главная проблема большинства фреймворков тех времён была в том, что у них не было единой системы конфигурирования и настройки приложений. Rails привнёс понятие convention over configuration, появилась единая и понятная структура. Программисты стали использовать это соглашение и писать проекты на Ruby гораздо быстрее. Появлялось всё больше видеоуроков, возникали локальные сообщества, проводились конференции по Rails. Одним словом - Ruby взлетел.</p>
65 <p>Главная проблема большинства фреймворков тех времён была в том, что у них не было единой системы конфигурирования и настройки приложений. Rails привнёс понятие convention over configuration, появилась единая и понятная структура. Программисты стали использовать это соглашение и писать проекты на Ruby гораздо быстрее. Появлялось всё больше видеоуроков, возникали локальные сообщества, проводились конференции по Rails. Одним словом - Ruby взлетел.</p>
66 <p>Со временем Ruby сдал позиции как fullstack-фреймворк. Во фронтенде появились более крутые конкуренты -<a>React</a>,<a>Vue.js</a>и <a>Angular</a>. В итоге Rails стали использовать в основном только в бэкенде. Но недавно вышедшая версия Rails 7 кардинально изменила ситуацию: разработчики добавили поддержку ECMAScript 6 и HTTP/2.0. Теперь для запуска фронтенда не нужно устанавливать Node.js. Раньше это было немыслимо.</p>
66 <p>Со временем Ruby сдал позиции как fullstack-фреймворк. Во фронтенде появились более крутые конкуренты -<a>React</a>,<a>Vue.js</a>и <a>Angular</a>. В итоге Rails стали использовать в основном только в бэкенде. Но недавно вышедшая версия Rails 7 кардинально изменила ситуацию: разработчики добавили поддержку ECMAScript 6 и HTTP/2.0. Теперь для запуска фронтенда не нужно устанавливать Node.js. Раньше это было немыслимо.</p>
67 <p>В седьмой версии Rails также появилась новая киллер-фича -<a>Hotwire for Rails</a>. Это когда отправка HTML проходит по сокету: открывается сокет-канал и по нему приходит HTML-файл. Фреймворку больше не нужно делать отдельные запросы на бэкенд - достаточно просто подписаться на сокет. А ещё недавно создатели Ruby on Rails выпустили фреймворк<a>Stimulus</a>, который позволяют программисту меньше работать с JavaScript-кодом.</p>
67 <p>В седьмой версии Rails также появилась новая киллер-фича -<a>Hotwire for Rails</a>. Это когда отправка HTML проходит по сокету: открывается сокет-канал и по нему приходит HTML-файл. Фреймворку больше не нужно делать отдельные запросы на бэкенд - достаточно просто подписаться на сокет. А ещё недавно создатели Ruby on Rails выпустили фреймворк<a>Stimulus</a>, который позволяют программисту меньше работать с JavaScript-кодом.</p>
68 <p>В общем, Rails всё ещё остаётся самым широко используемым Ruby-фреймворком. Есть ещё<a>Hanami</a>и <a>Sinatra</a>, но они обладают рядом недостатков, которых нет у Rails.</p>
68 <p>В общем, Rails всё ещё остаётся самым широко используемым Ruby-фреймворком. Есть ещё<a>Hanami</a>и <a>Sinatra</a>, но они обладают рядом недостатков, которых нет у Rails.</p>
69 <p>Сейчас рубисты очень востребованны. Статистику по зарплатам можно посмотреть на канале<a>Jooby</a>. Судя по данным с этого канала, в СНГ ситуация такая:</p>
69 <p>Сейчас рубисты очень востребованны. Статистику по зарплатам можно посмотреть на канале<a>Jooby</a>. Судя по данным с этого канала, в СНГ ситуация такая:</p>
70 <ul><li>джуниор - до 1000 долларов;</li>
70 <ul><li>джуниор - до 1000 долларов;</li>
71 <li>джуниор+ - от 1000 до 2000 долларов;</li>
71 <li>джуниор+ - от 1000 до 2000 долларов;</li>
72 <li>мидл - от 2000 до 4000 долларов;</li>
72 <li>мидл - от 2000 до 4000 долларов;</li>
73 <li>сеньоры - от 4000 до 7000 долларов;</li>
73 <li>сеньоры - от 4000 до 7000 долларов;</li>
74 <li>сеньоры, которые работают с заказчиками напрямую, - от 4500 до 9500 долларов.</li>
74 <li>сеньоры, которые работают с заказчиками напрямую, - от 4500 до 9500 долларов.</li>
75 </ul><p><strong>Книги.</strong>Начинающим рекомендую прочитать три базовые книги. Из них вы узнаете, как работает язык, освоите его объектную модель и метапрограммирование:</p>
75 </ul><p><strong>Книги.</strong>Начинающим рекомендую прочитать три базовые книги. Из них вы узнаете, как работает язык, освоите его объектную модель и метапрограммирование:</p>
76 <ul><li><a>Programming Ruby 1.9 &amp; 2.0</a>;</li>
76 <ul><li><a>Programming Ruby 1.9 &amp; 2.0</a>;</li>
77 <li><a>The Well-Grounded Rubyist</a>;</li>
77 <li><a>The Well-Grounded Rubyist</a>;</li>
78 <li><a>Metaprogramming Ruby 2</a>.</li>
78 <li><a>Metaprogramming Ruby 2</a>.</li>
79 </ul><p>Джуниорам и выше я тоже советую изучить метапрограммирование и объектно-ориентированный дизайн при работе с Ruby, чтобы понять, как делать инверсию зависимостей, соблюдать принцип единственной ответственности, или <a>SOLID</a>. Также изучите внутреннее устройство Ruby: как он парсит данные, как запускается и работает его виртуальная машина. Ответы на эти вопросы вы найдёте в следующих книгах:</p>
79 </ul><p>Джуниорам и выше я тоже советую изучить метапрограммирование и объектно-ориентированный дизайн при работе с Ruby, чтобы понять, как делать инверсию зависимостей, соблюдать принцип единственной ответственности, или <a>SOLID</a>. Также изучите внутреннее устройство Ruby: как он парсит данные, как запускается и работает его виртуальная машина. Ответы на эти вопросы вы найдёте в следующих книгах:</p>
80 <ul><li><a>Practical Object-Oriented Design in Ruby</a>;</li>
80 <ul><li><a>Practical Object-Oriented Design in Ruby</a>;</li>
81 <li><a>Ruby Under a Microscope</a>.</li>
81 <li><a>Ruby Under a Microscope</a>.</li>
82 </ul><p><strong>Рассылки.</strong>Получать новости о Ruby можно в еженедельной рассылке<a>Ruby Weekly</a>, это позволяет оставаться "на волне". Также есть рассылка<a>Random Ruby</a>и <a>This Week in Rails</a> - последнюю ведут создатели Rails.</p>
82 </ul><p><strong>Рассылки.</strong>Получать новости о Ruby можно в еженедельной рассылке<a>Ruby Weekly</a>, это позволяет оставаться "на волне". Также есть рассылка<a>Random Ruby</a>и <a>This Week in Rails</a> - последнюю ведут создатели Rails.</p>
83 <p><strong>Telegram-каналы:</strong></p>
83 <p><strong>Telegram-каналы:</strong></p>
84 <ul><li><a>pro.rb</a> - чат Ruby-разработчиков;</li>
84 <ul><li><a>pro.rb</a> - чат Ruby-разработчиков;</li>
85 <li><a>Saint P Ruby Community</a> - сообщество Ruby-программистов из Питера;</li>
85 <li><a>Saint P Ruby Community</a> - сообщество Ruby-программистов из Питера;</li>
86 <li><a>Ruby, Rails, Hanami</a> - сообщество по Ruby, где люди делятся опытом;</li>
86 <li><a>Ruby, Rails, Hanami</a> - сообщество по Ruby, где люди делятся опытом;</li>
87 <li><a>Ruby / Rails Inside</a> - большая коллекция статей о Ruby;</li>
87 <li><a>Ruby / Rails Inside</a> - большая коллекция статей о Ruby;</li>
88 <li><a>Evil Martians</a> - новости и статьи по Ruby;</li>
88 <li><a>Evil Martians</a> - новости и статьи по Ruby;</li>
89 <li><a>Ruby &amp; Elixir Job</a> - канал с вакансиями.</li>
89 <li><a>Ruby &amp; Elixir Job</a> - канал с вакансиями.</li>
90 </ul><p><strong>YouTube-каналы:</strong></p>
90 </ul><p><strong>YouTube-каналы:</strong></p>
91 <ul><li><a>Ruby Russia club</a>;</li>
91 <ul><li><a>Ruby Russia club</a>;</li>
92 <li><a>Saint P Ruby Community</a>;</li>
92 <li><a>Saint P Ruby Community</a>;</li>
93 <li><a>Evrone Development</a>;</li>
93 <li><a>Evrone Development</a>;</li>
94 <li><a>Tenderlove’s Cool Stuff</a>.</li>
94 <li><a>Tenderlove’s Cool Stuff</a>.</li>
95 </ul><p>Новичкам советую в первую очередь разобраться с концепцией языка и объектной моделью - и только потом приступать к изучению фреймворков. Иначе будет казаться, что Rails - это магия. На самом же деле это всего лишь метапрограммирование и много чего ещё.</p>
95 </ul><p>Новичкам советую в первую очередь разобраться с концепцией языка и объектной моделью - и только потом приступать к изучению фреймворков. Иначе будет казаться, что Rails - это магия. На самом же деле это всего лишь метапрограммирование и много чего ещё.</p>
96 <p>Тем, кто планирует сменить стек, скажу, что Ruby on Rails - это действительно крутой инструмент. Переходите на него, пробуйте и получайте кайф от разработки. А если этот фреймворк надоест - вы всегда можете перейти на другой. Воспринимайте языки программирования и фреймворки как инструменты, которые облегчают жизнь, и не зацикливайтесь на чём-то одном.</p>
96 <p>Тем, кто планирует сменить стек, скажу, что Ruby on Rails - это действительно крутой инструмент. Переходите на него, пробуйте и получайте кайф от разработки. А если этот фреймворк надоест - вы всегда можете перейти на другой. Воспринимайте языки программирования и фреймворки как инструменты, которые облегчают жизнь, и не зацикливайтесь на чём-то одном.</p>
97 <p>Хорошему программисту должно быть всё равно, на какой стек переходить. Сегодня мы пишем на одном языке, а через месяц - на другом. Будьте Software Engineer, который может разобраться во всём.</p>
97 <p>Хорошему программисту должно быть всё равно, на какой стек переходить. Сегодня мы пишем на одном языке, а через месяц - на другом. Будьте Software Engineer, который может разобраться во всём.</p>
98 <a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>
98 <a>Научитесь: Профессия PHP-разработчик с нуля до PRO Узнать больше</a>