Программисту для написания своих проектов необходимо знать разные языки программирования (programming languages). Некоторые из них являются универсальными и кроссплатформенными, а какие-то предназначаются для строго определенных целей и задач. Ряд языков программирования выступает в качестве узкоспециализированных инструментов разработки. К числу таковых относится Ruby (Руби).
Сегодня предстоит изучить этот язык программирования получше. Необходимо разобраться, что это за инструмент разработки, какие у него поддерживаются особенности и функции, для чего он может пригодиться программисту. Дополнительно нужно ознакомиться с его положением в мире информационных технологий, плюсами и минусами.
Предложенная информация ориентирована на широкую публику. Она подойдет как обычным ПК-пользователям, желающим разобраться с тем, что собой представляет собой Ruby lang, так и IT-специалистам, которые выбирают языки для дальнейшего изучения.
Определение
Ruby (Руби) – это динамический, интерпретируемый, рефлективный и высокоуровневый язык программирования. Он предусматривает независимость от операционной системы, а также сильную динамическую типизацию. Его синтаксис напоминает Eiffel и Perl, а объектно-ориентированный подход схож со Smalltalk.
Ruby является универсальным языком – он используется для создания самого разного программного обеспечения. Разработчиками применяется преимущественно в веб-программировании. Коды, получающиеся при помощи рассматриваемого инструмента, интуитивно понятные. Это делает процедуру разработки на Ruby более комфортной и быстрой. Язык часто используется совместно с фреймворком Ruby of Rails для веб-разработки.
Историческая справка
Рассматриваемый инструмент программирования был создан в начале 90-х годов прошлого века. Его создателем выступил Юкихиро Мацумото. Он знал Perl и Python, но решил создать новый объектно-ориентированный язык. Мацумото считал Perl «игрушечным» и даже «эзотерическим» языком, а Python – недостаточно объектно-ориентированным. Юкихиро был настоящим фанатом объектно-ориентированного подхода к разработке, поэтому он начал трудиться над созданием действительно объектно-ориентированного и простого в понимании языком.
Ruby появился к 1995 году. Он впервые был представлен Мацумото японскими разработчиками. Уже в первых его версиях были заметны отличительные черты, которые сохранились в рассматриваемом инструменте программирования по сей день. К ним можно отнести:
- объектно-ориентированный дизайн;
- использование классов и наследования;
- работу с миксинами и итераторами;
- замыкания;
- сборщик мусора;
- обработку исключений.
Инструкция на английском языке для Ruby появилась в конце 90-х. Тогда же возник англоязычный форум ruby-talk. Это поспособствовало широкому распространению языка за пределами Японии.
Философия языка
Ruby – это объектно-ориентированный язык, созданный Юкихиро Мацумото, настоящим приверженцем объектно-ориентированной разработки. Основным назначением этого инструмента стало создание простых и понятных программ для решения задач, в которых время программирования и простота имеет большую значимость, чем скорость непосредственной работы.
У Ruby есть собственная философия, которую в мире информационных технологий принято называть «Путь Ruby». Он не имеет точной формулировки, иногда используется для критики. «Путь Ruby» поддерживает следующие философские принципы:
- Язык, созданный для человека, а не для компьютера. У Ruby приоритетами являются удобство и минимизация затрат трудов разработчика при создании проекта. Программиста стараются освободить от рутинных задач, с которыми компьютер способен справиться лучше, быстрее и качественнее.
- Просто, но не слишком. Упрощение синтаксиса рассматриваемого инструмента является плюсом, но оно не должно переходить некоторые границы. Те, за которыми упрощение кода превращается в центральную задачу, самоцель. Это вредит конечному результату.
- Принцип наименьшей неожиданности. Ruby позволяет создавать программы, которые предсказуемы в плане поведения. Проблем с созданием таких проектов не возникает при последовательном изучении языка. Мацумото уверяет, что целью разработки Ruby была минимизация неожиданностей для него самого. Но, как только его язык получил широкое распространение, выяснилось, что мышление программистов похоже. Это привело к тому, что принцип «наименьшей неожиданности» совпал с принципами Мацумото.
- Оригинальность имеет значение, но естественность важнее. Избыточность допускается, но только тогда, когда она действительно удобна. Ruby получил идеологию языка Perl в части представления разработчику возможности достижения одного и того же результата несколькими способами. все люди разные, им для свободы должна быть предоставлена возможность выбирать. Мацумото позаботился об этом моменте при разработке Ruby.
- Не быть рабом производительности. Философия изучаемого инструмента программирования не требует от разработчика «гонки» за производительностью. Корректировки кода требуются тогда, когда производительность конкретного проекта находится на недопустимо низком уровне. Если при создании проекта заранее известно об исправлениях, его требуется делать с учетом соответствующего факта. Элегантность должна быть предпочтительнее эффективности, если эффективность не слишком критична.
- Не бояться изменений при выполнении. У Ruby есть динамические средства, включая самомодификации проекта во время исполнения. Они дают невероятные возможности, полезные для эффективной разработки. Снижение производительности, которое обычно происходит из-за применения соответствующих функций, чаще всего находится на уровне допустимого.
- Следовать простым и строгим правилам языка, но не доходить до педантизма. Ruby – язык программирования, в котором правила и соглашения нужны для того, чтобы сделать исходный код программы более простым и понятным. Если отступление от них в каждом отдельно взятом случае логично и понятно – оно будет являться оправданным.
- Не нужно ни с чем бороться. Ruby такой, каким он придуман. Программист не должен ждать, что соответствующий инструмент разработки будет вести себя так, как другой, «привычный» ему язык. Разработчик имеет право следовать своим представлениям и привычкам, сложившимся в ходе практики, но если ожидания ошибочны, нужно просто принять это и использовать в дальнейшем.
Все эти пункты наглядно демонстрируют принципы, которые помогают программировать на the Ruby.
Области применения
Юкихиро Мацумото планировал создать язык общего назначения. Это ему удалось реализовать в Ruby. «Общее назначение» – это значит, что инструмент может быть применен в самых разных целях. Для Ruby данное утверждение актуально. С его помощью получится писать проекты самых разных видов.
Практически сложилось так, что Ruby используется в качестве языка программирования для веб-сайтов и сервисов. С его помощью пишут серверные части клиент-серверных моделей. Огромным спросом у Руби пользуется фреймворк Ruby of Rails. Он используется бэкендерами и фуллстек-программистами.
При помощи рассматриваемого инструмента написаны некоторые другие приложения:
- Metasploit – для пентестинга;
- Vagrant – для работы с виртуальными средами;
- Homebrew – для установки приложений при помощи командной строки macOS.
Встретить код, написанный при помощи Ruby, можно почти в любой области разработки.
Свойства и особенности
Ruby создавался в качестве простого и понятного языка, на котором получилось бы писать различные проекты. Данная затея положительно сказалась на синтаксисе инструмента: он стал лаконичным и понятным, а также заточенным под объектно-ориентированную разработку программного обеспечения.
К ключевым свойствам и особенностям Ruby можно отнести:
- Понятный синтаксис. Рассматриваемый инструмент – это «язык для людей». Он создавался так, чтобы человек мог без существенных затруднений управляться с ним. Данное свойство позволяет автоматизировать некоторые рутинные процессы и ускорить процедуру создания программного обеспечения. Одни и те же задачи могут быть реализованы в программном коде разными методами.
- Интерпретируемость. Ruby не является компилируемым. Это значит, что его исполняет специальная программа-интерпретатор. Она построчно работает с исходным кодом в режиме реального времени. Компилируемые языки сначала переводят проект в машинный код, а потом уже их исполняет система.
- Объектно-ориентированный подход. Он представляет все сущности, с которыми будет иметь дело разработчик программного обеспечения, в качестве объектов. Объекты умеют взаимодействовать с другими, но не вмешиваться в их внутреннее устройство. Операции с ними осуществляются внутри методов – специальных свойств-функций, которые будут прописываться для каждого объекта. Методы могут быть вызваны так, чтобы изменить их сущность.
- Поддержка блоков. Блок – одна из ключевых конструкций в Ruby. Она также отличает язык от остальных инструментов разработки программного обеспечения. Блоком называется произвольный участок кода, который допускает передачу в ту или иную функцию/метод. В качестве блока может использоваться любой код, даже чужой. Он не будет менять работу самого метода, но может быть реализован (выполнен) внутри него. Для запуска соответствующего кода из блока используются специальные команды. Блоками удобно пользоваться, когда требуется добиться большего уровня гибкости объектов и их поведения в зависимости от обстоятельств.
- Динамическая типизация. Ruby (language) – язык с поддержкой динамической типизации. Типы в программных кодах, написанных на нем, будут определяться динамически. Разработчик не задает их самостоятельно при создании новой переменной: определение осуществляется автоматически при присваивании ей того или иного значения. Если речь идет о числе, переменная получит числовой тип, а в случае работы со словами или буквами – строковый и так далее.
- Многопоточность. У Ruby поддерживается «из коробки» многопоточность, которая не связана с системой. Это значит, что какие-то процессы в проекте могут выполняться параллельно друг другу. Данный прием положительно сказывается на быстродействии и производительности.
Все это должен знать каждый разработчик, подбирающий себе язык программирования для дальнейшего изучения.
Преимущества и недостатки
Ruby – язык, который имеет как преимущества, так и недостатки. Знать о них рекомендуется каждому, кто заинтересовался рассматриваемым инструментом разработки. Соответствующие сведения помогут понять, стоит ли изучить его или нет на самом деле.
К преимуществам языка программирования Ruby можно отнести:
- Ориентированность преимущественно на человека. Целью создания изучаемого инструмента разработки выступило формирование языка, который был бы понятен и удобен обычному человеку. Программисты говорят, что Руби действительно справился с этой задачей – его концепты и идеи такие, чтобы разработчикам было удобно и легко понимать их. Исходный код проекта, написанного с его помощью, понятен человеку. Его легко не только читать, но и понимать. А объектно-ориентированная концепция не мешает адаптации инструмента под функциональную разработку.
- Изящество и лаконичность. Ruby спроектирован так, чтобы на нем можно было реализовывать весьма изящные, удобные и понятные разработчикам концепты. Это положительно сказывается на распространенности и популярности инструмента – на нем приятно писать. Данную особенность чаще всего выделяют программисты, которые перешли на Ruby после длительной работы с другими средствами разработки. Решить одну и ту же задачу с помощью рассматриваемого языка получается по-разному, что положительно сказывается на его гибкости. Исходный код проекта будет не просто изящным, но и чистым, красивым.
- Многофункциональность. Руби – универсальный язык разработки. Он может использоваться в любой области, хоть и применяется чаще всего в веб-программировании. Встретить Ruby можно в десктопных проектах, а также в приложениях для macOS.
- Стабильную нишу. Веб-программирование при помощи Руби является достаточно востребованным. Количество вакансий, предлагаемых разработчикам, стабильное. Также стоит отметить, что программисты на Ruby хорошо (высоко) ценятся. С помощью этого инструмента получится быстро запустить продукт, поэтому он активно применяется в стартапах и технологичных проектах, которые должны в сжатые сроки выйти на рынок.
- Востребованность. Иногда кажется, что вакансий разработчиков Ruby мало по сравнению с другими инструментами программирования. На самом деле это не так. Некоторые компании намеренно набирают себе в команду программистов, знакомых с теми или иными языками, а затем переучивают их на Руби. Это положительно сказывается на зарплате специалиста. Человек, который пишет на Ruby, будет получать в среднем больше, чем при работе с другими популярными языками разработки.
- Активное сообщество. У Руби есть открытое и активное, а также дружелюбное сообщество. В нем очень много опытных программистов. Они в любой момент готовы прийти на помощь новичкам и подсказать, как писать тот или иной код. Много в сообществе Руби уделяется качеству проектов, а также хорошим практикам. На Ruby принято сразу писать исходный код грамотно – чтобы его было легко читать и понимать.
Недостатки у Руби тоже есть. К ним можно отнести:
- Достаточно трудное изучение. Ruby тяжело учить с нуля, если до этого человек вообще никогда не занимался программированием. Новичкам рекомендуется сначала освоить базовые концепции разработки – только потом переходить к Руби.
- Производительность. Первые версии рассматриваемого инструмента программирования получали огромную критику за производительность. Язык работал в несколько раз медленнее своих аналогов. Со временем соответствующий минус немного сгладился, но Руби все равно работает чуть медленнее компилируемых средств разработки. В областях, где критична скорость, он не используется.
- Ресурсозатратность. Интерпретатор у рассматриваемого языка является «тяжелым», а сам Руби – сложным. Все это требует много ресурсов системы. Программы на Ruby не получится писать под старые и маломощные устройства. Это основная причина, по которой язык почти не используется в мобильной разработке и других схожих областях.
- Отсутствие обратной совместимости. Это сделано намеренно – чтобы язык мог развиваться. Правда, при переводе проекта на новую версию Руби могут возникать некоторые проблемы.
- Неполную многопоточность. У Руби поддерживается механизм глобальной блокировки интерпретатора. Соответствующая технология используется для синхронизации потоков. Она не дает одному процессу выполнять более одного потока кода. Технология была введена в Ruby Language для потокобезопасности, но она ограничивает возможности разработки.
Ключевые особенности Руби и его области применения, свойства и характеристики были изучены. Освоить это средство разработки помогут дистанционные компьютерные курсы.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Ruby: описание, особенности и области применения OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Программисту для написания своих проектов необходимо знать разные языки программирования (programming languages). Некоторые из них являются универсальными и кроссплатформенными, а какие-то предназначаются для строго определенных целей и задач. Ряд языков программирования выступает в качестве узкоспециализированных инструментов разработки. К числу таковых относится Ruby (Руби). Сегодня предстоит изучить этот язык программирования получше. Необходимо разобраться, что это за" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/ruby-opisanie-osobennosti-i-oblasti-primeneniya/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#article","name":"Ruby: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f OTUS","headline":"Ruby: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/09\/oj-1080x720-2024-09-13T234117.008.jpg","width":2245,"height":1587},"datePublished":"2024-09-13T20:41:56+00:00","dateModified":"2024-09-13T20:41:58+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, Ruby, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#listItem","position":2,"name":"Ruby: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#webpage","url":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/","name":"Ruby: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f OTUS","description":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (programming languages). \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438 \u0437\u0430\u0434\u0430\u0447. \u0420\u044f\u0434 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u0437\u043a\u043e\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041a \u0447\u0438\u0441\u043b\u0443 \u0442\u0430\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f Ruby (\u0420\u0443\u0431\u0438). \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0448\u0435. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/09\/oj-1080x720-2024-09-13T234117.008.jpg","@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/#mainImage"},"datePublished":"2024-09-13T20:41:56+00:00","dateModified":"2024-09-13T20:41:58+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/10927" /><link rel='shortlink' href='https://otus.ru/journal/?p=10927' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fruby-opisanie-osobennosti-i-oblasti-primeneniya%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fruby-opisanie-osobennosti-i-oblasti-primeneniya%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-10927 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-10927" class="the-post post-10927 post type-post status-publish format-standard has-post-thumbnail category-polza tag-ruby tag-programmirovanie">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Ruby: описание, особенности и области применения
</h1>
<a href="https://otus.ru/journal/ruby-opisanie-osobennosti-i-oblasti-primeneniya/" class="date-link" data-wpel-link="internal"><time class="post-date">13 сентября, 2024</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T234117.008.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Ruby: описание, особенности и области применения" title="Ruby: описание, особенности и области применения" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T234117.008-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T234117.008-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T234117.008-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Определение">Определение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0" title="Историческая справка">Историческая справка</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%A4%D0%B8%D0%BB%D0%BE%D1%81%D0%BE%D1%84%D0%B8%D1%8F_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0" title="Философия языка">Философия языка</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F" title="Области применения">Области применения</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8" title="Свойства и особенности">Свойства и особенности</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8" title="Преимущества и недостатки">Преимущества и недостатки</a></li></ul></nav></div>
<h1 class="wp-block-heading"></h1>
<p>Программисту для написания своих проектов необходимо знать разные языки программирования (programming languages). Некоторые из них являются универсальными и кроссплатформенными, а какие-то предназначаются для строго определенных целей и задач. Ряд языков программирования выступает в качестве узкоспециализированных инструментов разработки. К числу таковых относится Ruby (Руби).</p>
<p>Сегодня предстоит изучить этот язык программирования получше. Необходимо разобраться, что это за инструмент разработки, какие у него поддерживаются особенности и функции, для чего он может пригодиться программисту. Дополнительно нужно ознакомиться с его положением в мире информационных технологий, плюсами и минусами.</p>
<p>Предложенная информация ориентирована на широкую публику. Она подойдет как обычным ПК-пользователям, желающим разобраться с тем, что собой представляет собой Ruby lang, так и IT-специалистам, которые выбирают языки для дальнейшего изучения.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Определение<span class="ez-toc-section-end"></span></h2>
<p>Ruby (Руби) – это динамический, интерпретируемый, рефлективный и высокоуровневый язык программирования. Он предусматривает независимость от операционной системы, а также сильную динамическую типизацию. Его синтаксис напоминает Eiffel и Perl, а объектно-ориентированный подход схож со Smalltalk.</p>
<p>Ruby является универсальным языком – он используется для создания самого разного программного обеспечения. Разработчиками применяется преимущественно в веб-программировании. Коды, получающиеся при помощи рассматриваемого инструмента, интуитивно понятные. Это делает процедуру разработки на Ruby более комфортной и быстрой. Язык часто используется совместно с фреймворком Ruby of Rails для веб-разработки.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D1%82%D0%BE%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0"></span>Историческая справка<span class="ez-toc-section-end"></span></h2>
<p>Рассматриваемый инструмент программирования был создан в начале 90-х годов прошлого века. Его создателем выступил Юкихиро Мацумото. Он знал Perl и Python, но решил создать новый объектно-ориентированный язык. Мацумото считал Perl «игрушечным» и даже «эзотерическим» языком, а Python – недостаточно объектно-ориентированным. Юкихиро был настоящим фанатом объектно-ориентированного подхода к разработке, поэтому он начал трудиться над созданием действительно объектно-ориентированного и простого в понимании языком.</p>
<p>Ruby появился к 1995 году. Он впервые был представлен Мацумото японскими разработчиками. Уже в первых его версиях были заметны отличительные черты, которые сохранились в рассматриваемом инструменте программирования по сей день. К ним можно отнести:</p>
<ul>
<li>объектно-ориентированный дизайн;</li>
<li>использование классов и наследования;</li>
<li>работу с миксинами и итераторами;</li>
<li>замыкания;</li>
<li>сборщик мусора;</li>
<li>обработку исключений.</li>
</ul>
<p>Инструкция на английском языке для Ruby появилась в конце 90-х. Тогда же возник англоязычный форум ruby-talk. Это поспособствовало широкому распространению языка за пределами Японии.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A4%D0%B8%D0%BB%D0%BE%D1%81%D0%BE%D1%84%D0%B8%D1%8F_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0"></span>Философия языка<span class="ez-toc-section-end"></span></h3>
<p>Ruby – это объектно-ориентированный язык, созданный Юкихиро Мацумото, настоящим приверженцем объектно-ориентированной разработки. Основным назначением этого инструмента стало создание простых и понятных программ для решения задач, в которых время программирования и простота имеет большую значимость, чем скорость непосредственной работы.</p>
<p>У Ruby есть собственная философия, которую в мире информационных технологий принято называть «Путь Ruby». Он не имеет точной формулировки, иногда используется для критики. «Путь Ruby» поддерживает следующие философские принципы:</p>
<ol>
<li>Язык, созданный для человека, а не для компьютера. У Ruby приоритетами являются удобство и минимизация затрат трудов разработчика при создании проекта. Программиста стараются освободить от рутинных задач, с которыми компьютер способен справиться лучше, быстрее и качественнее.</li>
<li>Просто, но не слишком. Упрощение синтаксиса рассматриваемого инструмента является плюсом, но оно не должно переходить некоторые границы. Те, за которыми упрощение кода превращается в центральную задачу, самоцель. Это вредит конечному результату.</li>
<li>Принцип наименьшей неожиданности. Ruby позволяет создавать программы, которые предсказуемы в плане поведения. Проблем с созданием таких проектов не возникает при последовательном изучении языка. Мацумото уверяет, что целью разработки Ruby была минимизация неожиданностей для него самого. Но, как только его язык получил широкое распространение, выяснилось, что мышление программистов похоже. Это привело к тому, что принцип «наименьшей неожиданности» совпал с принципами Мацумото.</li>
<li>Оригинальность имеет значение, но естественность важнее. Избыточность допускается, но только тогда, когда она действительно удобна. Ruby получил идеологию языка Perl в части представления разработчику возможности достижения одного и того же результата несколькими способами. все люди разные, им для свободы должна быть предоставлена возможность выбирать. Мацумото позаботился об этом моменте при разработке Ruby.</li>
<li>Не быть рабом производительности. Философия изучаемого инструмента программирования не требует от разработчика «гонки» за производительностью. Корректировки кода требуются тогда, когда производительность конкретного проекта находится на недопустимо низком уровне. Если при создании проекта заранее известно об исправлениях, его требуется делать с учетом соответствующего факта. Элегантность должна быть предпочтительнее эффективности, если эффективность не слишком критична.</li>
<li>Не бояться изменений при выполнении. У Ruby есть динамические средства, включая самомодификации проекта во время исполнения. Они дают невероятные возможности, полезные для эффективной разработки. Снижение производительности, которое обычно происходит из-за применения соответствующих функций, чаще всего находится на уровне допустимого.</li>
<li>Следовать простым и строгим правилам языка, но не доходить до педантизма. Ruby – язык программирования, в котором правила и соглашения нужны для того, чтобы сделать исходный код программы более простым и понятным. Если отступление от них в каждом отдельно взятом случае логично и понятно – оно будет являться оправданным.</li>
<li>Не нужно ни с чем бороться. Ruby такой, каким он придуман. Программист не должен ждать, что соответствующий инструмент разработки будет вести себя так, как другой, «привычный» ему язык. Разработчик имеет право следовать своим представлениям и привычкам, сложившимся в ходе практики, но если ожидания ошибочны, нужно просто принять это и использовать в дальнейшем.</li>
</ol>
<p>Все эти пункты наглядно демонстрируют принципы, которые помогают программировать на the Ruby.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F"></span>Области применения<span class="ez-toc-section-end"></span></h2>
<p>Юкихиро Мацумото планировал создать язык общего назначения. Это ему удалось реализовать в Ruby. «Общее назначение» – это значит, что инструмент может быть применен в самых разных целях. Для Ruby данное утверждение актуально. С его помощью получится писать проекты самых разных видов.</p>
<p>Практически сложилось так, что Ruby используется в качестве языка программирования для веб-сайтов и сервисов. С его помощью пишут серверные части клиент-серверных моделей. Огромным спросом у Руби пользуется фреймворк Ruby of Rails. Он используется бэкендерами и фуллстек-программистами.</p>
<p>При помощи рассматриваемого инструмента написаны некоторые другие приложения:</p>
<ul>
<li>Metasploit – для пентестинга;</li>
<li>Vagrant – для работы с виртуальными средами;</li>
<li>Homebrew – для установки приложений при помощи командной строки macOS.</li>
</ul>
<p>Встретить код, написанный при помощи Ruby, можно почти в любой области разработки.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8"></span>Свойства и особенности<span class="ez-toc-section-end"></span></h2>
<p>Ruby создавался в качестве простого и понятного языка, на котором получилось бы писать различные проекты. Данная затея положительно сказалась на синтаксисе инструмента: он стал лаконичным и понятным, а также заточенным под объектно-ориентированную разработку программного обеспечения.</p>
<p>К ключевым свойствам и особенностям Ruby можно отнести:</p>
<ol>
<li>Понятный синтаксис. Рассматриваемый инструмент – это «язык для людей». Он создавался так, чтобы человек мог без существенных затруднений управляться с ним. Данное свойство позволяет автоматизировать некоторые рутинные процессы и ускорить процедуру создания программного обеспечения. Одни и те же задачи могут быть реализованы в программном коде разными методами.</li>
<li>Интерпретируемость. Ruby не является компилируемым. Это значит, что его исполняет специальная программа-интерпретатор. Она построчно работает с исходным кодом в режиме реального времени. Компилируемые языки сначала переводят проект в машинный код, а потом уже их исполняет система.</li>
<li>Объектно-ориентированный подход. Он представляет все сущности, с которыми будет иметь дело разработчик программного обеспечения, в качестве объектов. Объекты умеют взаимодействовать с другими, но не вмешиваться в их внутреннее устройство. Операции с ними осуществляются внутри методов – специальных свойств-функций, которые будут прописываться для каждого объекта. Методы могут быть вызваны так, чтобы изменить их сущность.</li>
<li>Поддержка блоков. Блок – одна из ключевых конструкций в Ruby. Она также отличает язык от остальных инструментов разработки программного обеспечения. Блоком называется произвольный участок кода, который допускает передачу в ту или иную функцию/метод. В качестве блока может использоваться любой код, даже чужой. Он не будет менять работу самого метода, но может быть реализован (выполнен) внутри него. Для запуска соответствующего кода из блока используются специальные команды. Блоками удобно пользоваться, когда требуется добиться большего уровня гибкости объектов и их поведения в зависимости от обстоятельств.</li>
<li>Динамическая типизация. Ruby (language) – язык с поддержкой динамической типизации. Типы в программных кодах, написанных на нем, будут определяться динамически. Разработчик не задает их самостоятельно при создании новой переменной: определение осуществляется автоматически при присваивании ей того или иного значения. Если речь идет о числе, переменная получит числовой тип, а в случае работы со словами или буквами – строковый и так далее.</li>
<li>Многопоточность. У Ruby поддерживается «из коробки» многопоточность, которая не связана с системой. Это значит, что какие-то процессы в проекте могут выполняться параллельно друг другу. Данный прием положительно сказывается на быстродействии и производительности.</li>
</ol>
<p>Все это должен знать каждый разработчик, подбирающий себе язык программирования для дальнейшего изучения.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8"></span>Преимущества и недостатки<span class="ez-toc-section-end"></span></h2>
<p>Ruby – язык, который имеет как преимущества, так и недостатки. Знать о них рекомендуется каждому, кто заинтересовался рассматриваемым инструментом разработки. Соответствующие сведения помогут понять, стоит ли изучить его или нет на самом деле.</p>
<p>К преимуществам языка программирования Ruby можно отнести:</p>
<ol>
<li>Ориентированность преимущественно на человека. Целью создания изучаемого инструмента разработки выступило формирование языка, который был бы понятен и удобен обычному человеку. Программисты говорят, что Руби действительно справился с этой задачей – его концепты и идеи такие, чтобы разработчикам было удобно и легко понимать их. Исходный код проекта, написанного с его помощью, понятен человеку. Его легко не только читать, но и понимать. А объектно-ориентированная концепция не мешает адаптации инструмента под функциональную разработку.</li>
<li>Изящество и лаконичность. Ruby спроектирован так, чтобы на нем можно было реализовывать весьма изящные, удобные и понятные разработчикам концепты. Это положительно сказывается на распространенности и популярности инструмента – на нем приятно писать. Данную особенность чаще всего выделяют программисты, которые перешли на Ruby после длительной работы с другими средствами разработки. Решить одну и ту же задачу с помощью рассматриваемого языка получается по-разному, что положительно сказывается на его гибкости. Исходный код проекта будет не просто изящным, но и чистым, красивым.</li>
<li>Многофункциональность. Руби – универсальный язык разработки. Он может использоваться в любой области, хоть и применяется чаще всего в веб-программировании. Встретить Ruby можно в десктопных проектах, а также в приложениях для macOS.</li>
<li>Стабильную нишу. Веб-программирование при помощи Руби является достаточно востребованным. Количество вакансий, предлагаемых разработчикам, стабильное. Также стоит отметить, что программисты на Ruby хорошо (высоко) ценятся. С помощью этого инструмента получится быстро запустить продукт, поэтому он активно применяется в стартапах и технологичных проектах, которые должны в сжатые сроки выйти на рынок.</li>
<li>Востребованность. Иногда кажется, что вакансий разработчиков Ruby мало по сравнению с другими инструментами программирования. На самом деле это не так. Некоторые компании намеренно набирают себе в команду программистов, знакомых с теми или иными языками, а затем переучивают их на Руби. Это положительно сказывается на зарплате специалиста. Человек, который пишет на Ruby, будет получать в среднем больше, чем при работе с другими популярными языками разработки.</li>
<li>Активное сообщество. У Руби есть открытое и активное, а также дружелюбное сообщество. В нем очень много опытных программистов. Они в любой момент готовы прийти на помощь новичкам и подсказать, как писать тот или иной код. Много в сообществе Руби уделяется качеству проектов, а также хорошим практикам. На Ruby принято сразу писать исходный код грамотно – чтобы его было легко читать и понимать.</li>
</ol>
<p>Недостатки у Руби тоже есть. К ним можно отнести:</p>
<ol>
<li>Достаточно трудное изучение. Ruby тяжело учить с нуля, если до этого человек вообще никогда не занимался программированием. Новичкам рекомендуется сначала освоить базовые концепции разработки – только потом переходить к Руби. </li>
<li>Производительность. Первые версии рассматриваемого инструмента программирования получали огромную критику за производительность. Язык работал в несколько раз медленнее своих аналогов. Со временем соответствующий минус немного сгладился, но Руби все равно работает чуть медленнее компилируемых средств разработки. В областях, где критична скорость, он не используется.</li>
<li>Ресурсозатратность. Интерпретатор у рассматриваемого языка является «тяжелым», а сам Руби – сложным. Все это требует много ресурсов системы. Программы на Ruby не получится писать под старые и маломощные устройства. Это основная причина, по которой язык почти не используется в мобильной разработке и других схожих областях.</li>
<li>Отсутствие обратной совместимости. Это сделано намеренно – чтобы язык мог развиваться. Правда, при переводе проекта на новую версию Руби могут возникать некоторые проблемы.</li>
<li>Неполную многопоточность. У Руби поддерживается механизм глобальной блокировки интерпретатора. Соответствующая технология используется для синхронизации потоков. Она не дает одному процессу выполнять более одного потока кода. Технология была введена в Ruby Language для потокобезопасности, но она ограничивает возможности разработки.</li>
</ol>
<p>Ключевые особенности Руби и его области применения, свойства и характеристики были изучены. Освоить это средство разработки помогут дистанционные компьютерные курсы.</p>
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a href="https://otus.ru/?utm_source=oj" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Otus<span class="wpel-icon wpel-image wpel-icon-6"></span></a>!</em> </p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/ruby/" rel="tag" data-wpel-link="internal">Ruby</a><a href="https://otus.ru/journal/tag/programmirovanie/" rel="tag" data-wpel-link="internal">программирование</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fruby-opisanie-osobennosti-i-oblasti-primeneniya%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fruby-opisanie-osobennosti-i-oblasti-primeneniya%2F&text=Ruby%3A%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%2C%20%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%B8%20%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fruby-opisanie-osobennosti-i-oblasti-primeneniya%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fruby-opisanie-osobennosti-i-oblasti-primeneniya%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2024%2F09%2Foj-1080x720-2024-09-13T234117.008.jpg&description=Ruby%3A%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%2C%20%D0%BE%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20%D0%B8%20%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D0%B8%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/chto-takoe-pymorphy/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/chto-takoe-pymorphy/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Что такое Pymorphy" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T232936.869-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T232936.869-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T232936.869-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T232936.869-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T232936.869-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T232936.869-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Что такое Pymorphy" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/chto-takoe-pymorphy/" data-wpel-link="internal">Что такое Pymorphy</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/chto-takoe-pymorphy/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-09-13T20:29:59+00:00">13 сентября, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">4 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/ssao-chto-eto-takoe-prostymi-slovami/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/ssao-chto-eto-takoe-prostymi-slovami/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="SSAO: что это такое простыми словами" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T235328.733-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T235328.733-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T235328.733-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T235328.733-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T235328.733-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/09/oj-1080x720-2024-09-13T235328.733-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="SSAO: что это такое простыми словами" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/ssao-chto-eto-takoe-prostymi-slovami/" data-wpel-link="internal">SSAO: что это такое простыми словами</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/ssao-chto-eto-takoe-prostymi-slovami/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-09-13T20:53:58+00:00">13 сентября, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">5 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/ruby-opisanie-osobennosti-i-oblasti-primeneniya\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 16:38:46 GMT -->