Permalink
Switch branches/tags
Nothing to show
Find file Copy path
86bf9ce Jun 14, 2018
1 contributor

Users who have contributed to this file

267 lines (130 sloc) 52.9 KB

Ruby для романтиков

Вместо предисловия

В 21 веке программирование стало одной из важнейших наук в любой экономике. Процессы, которые происходили раньше без помощи компьютеров, были полностью или частично оптимизированы. Бизнес и простые люди увидели пользу электронных машин и началась эпоха расцвета IT-индустрии.

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

В какой-то момент стало очевидно, что программист - одна из профессий 21-ого века. Но как стать программистом? В каком направлении приложить усилия? Что нужно изучать, а что не нужно? Как наиболее эффективно использовать время, чтобы освоить какую-либо технологию?

Прежде, чем дать ответ на эти вопросы, нужно ответить на самый главный вопрос: а зачем нужно становиться программистом? Какой в этом смысл?

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

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

Также это могут быть молодые люди, которые вынуждены идти в ногу со временем и осваивать технологии как можно быстрее, и как можно быстрее получать результат от своих знаний. Причем, результат не только в виде самих знаний - как написать ту или иную программу - а результат в денежном эквиваленте.

Знание какого-либо направления в программировании подразумевает знакомство с основами языка, с элементарной теорией (которая отличается для каждого направления), с основными понятиями и определениями, а также знакомство с не основными инструментами (такие как операционная система, утилиты и дополнительные инструменты).

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

Поэтому человек, начинающий или желающий изучать программирование стоит перед выбором - куда податься? Что учить?

Если вы являетесь научным сотрудником НИИ, то выбор скорее всего упадет на язык python или c++, т.к. для этих языков накоплено большое количество библиотек для анализа и обработки данных.

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

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

Язык руби (ruby - англ.) и веб-программирование это что-то среднее между "поскорее найти работу", “выучить что-нибудь несложное и интересное” и “чтобы также пригодилось в будущем”. Руби позволяет не только составлять скучные программы, работая на кого-то в офисе, но также может быть полезен дома, в быту (одна из моих последних программ - обучение игре на гитаре).

Также философия самого языка подразумевает, что обучение и использование не будет скучным. К примеру, один из принципов языка - принцип наименьшего сюрприза (principle of a least surprise), который говорит буквально следующее: "чтобы вы не делали - скорее всего у вас получится". Согласитесь, что это уже вдохновляет!

Существуют также и другие языки программирования. Автор не в коем случае не утверждает, что они плохие. Каждый язык хорош для определенной задачи. Но вспомним про нашу задачу и сравним с некоторыми другими языками.

Руби против ибур

Язык "ибур" это “руби” наоборот. Это экзотический язык программирования, который кроме меня никто не знает. Я его сам только что придумал и я сам не знаю что он делает. Давайте сравним ибур с руби по трем параметрам, которые я описал выше:

Поскорее найти работу:

Руби - очень популярный язык, легко найти работу

Ибур - никто о нем не знает, работу найти невозможно

Остальные параметры можно не сравнивать. Другими словами, если вам важно не только программирование в себе (что тоже неплохо), но и возможность заработать в обозримом будущем, то руби - неплохой выбор. Язык довольно популярен. Конечно, не так как остальные. Скажем, JavaScript более популярен, но давайте сравним JavaScript и руби.

Выучить что-нибудь несложное и интересное:

Руби - principle of a least surprise, что уже довольно неплохо.

JavaScript - изначально не создавался с идеей "принципа наименьшего сюрприза". Сложнее, чем руби, т.к. является полностью асинхронным (пока поверьте мне наслово).

Докажем, что JavaScript не такой уж и простой как может показаться на первый взгляд. Рассмотрим программу на рубие, которая сортирует числа:

[11, 3, 2, 1].sort()

Программа выше должна отсортировать числа 11, 3, 2, 1 в возрастающем порядке (пока не важно если этот синтаксис вам непонятен, мы еще будем проходить эту тему). Результат работы программы на руби: 1, 2, 3, 11. Без сюрпризов! Но напишем ту же самую программу на JavaScript:

[11, 3, 2, 1].sort();

Синтаксис в этом случае очень похож и отличается лишь точкой с запятой (semicolon) в конце. Но каков будет результат? Не всегда JavaScript программисты с опытом могут дать правильный ответ, ведь результат работы программы довольно неожиданный: 1, 11, 2, 3. Почему это так - это вопрос уже к истории. Но чтобы отсортировать числа в JavaScript, надо написать:

[11, 3, 2, 1].sort((a, b) => a - b);

Если разобраться, то это несложно. Но вопрос в другом. Нужно ли вам на начальном этапе тратить время на такие тонкости? JavaScript вполне востребован, и каждый руби-программист должен знать его на минимальном уровне. Но, признаться, быть full-time JavaScript разработчиком я бы хотел только за очень большие деньги.

К тому же "чтобы также пригодилось в будущем" не очень подходит в случае с JavaScript. Язык очень динамично развивается. Знания полученные 10 лет назад уже не актуальны (в данном случае я говорю про популярные фреймворки - наборы инструментов). В случае с руби фреймворк rails существует уже более 10 лет. Знания, полученные 10 лет назад до сих пор применимы.

К слову, про применимость знаний стоит сделать отдельное замечание. Знания языков shell-скриптинга до сих пор применимы, через более чем 30 лет мало что изменилось. Знания основ Computer Science - до сих пор применимо, на интервью и не только, эти знания практически не устаревают.

Про применимость какого-либо языка в будущем никто не может дать точных прогнозов. Однако, можно посмотреть на статистику последних лет. На момент написания этой книги компания Microsoft купила GitHub за 7.5 миллиардов долларов, который был написан как раз на языке ruby. Другими словами, язык на сегодняшний день находится в прекрасной форме. Выпускаются обновления, улучшается скорость и синтаксис. А количество доступных библиотек позволяет быстро решить практически любую задачу (в рамках направления, которое называется веб-программирование).

Для фана

На наш взгляд, язык программирования должен не только решать какие-то бизнес-задачи, но и быть приятным в использовании настолько, чтобы его хотелось использовать каждый день.

К примеру, язык Java является отличным инструментом для решения бизнес-задач. Но требует к себе уважения - язык является типизированным (мы еще коснемся этой темы), необходимо указывать точный тип данных с которыми производятся различные операции. Это требует времени и полностью оправдано в бизнес-среде, где лучше потратить в несколько раз больше времени на разработку, чем платить потом за ошибки.

В случае с руби можно написать программу быстро, "на коленке". Нет очень большой надежности (что тоже является проблемой), но многие компании, особенно стартапы, пришли к выводу, что надежность является “достаточной”, а относительно невысокая скорость выполнения не является проблемой. Все это с лихвой компенсируется скоростью разработки. Ведь в современном мире часто требуется сделать что-то быстро, чтобы быстро получить инвестиции, привлечь первых пользователей пока другие долго думают.

С личной точки зрения автора, руби является хорошим инструментом для того, чтобы сделать что-то свое. Какой-то свой проект, программу, которой можно поделиться с окружающими, привлечь к себе внимание или заработать денег.

Другими словами, руби это эффективный, нескучный язык не только для работы, но и для себя лично - язык для романтиков.

Что мы будем изучать

Как уже было замечено ранее, существует множество направлений программирования. Каждое направление уникально, и требует своих собственных навыков. На взгляд авторов на данный момент существует два (возможно и больше) "проверенных" направления в программировании, которые дают максимальный результат за минимальный срок. Под результатом тут понимается как денежная компенсация, так и само умение что-то сделать своими руками.

Первое направление это мобильная разработка: программы для мобильных телефонов (Android, iPhone), планшетов (iPad) и других устройств.

Второе направление - веб-программирование.

Если выбирать между мобильной разработкой и веб-программированием, то "быстрота освоения" любой из этих двух технологий по количеству вложенных усилий примерно одинакова. Однако, мобильная разработка обладает своими минусами. Например, Java - язык для составления программ для Android - был уже упомянут выше. Нельзя сказать, что он является “достаточно простым” для новичка. Если честно, то с этим можно жить. В Java нет ничего такого, что является непостижимым или очень сложным.

Однако, сама мобильная разработка часто подразумевает оптимизацию кода под мобильные устройства любыми средствами. Языки программирования и SDK (software development kit - набор разработчика для определенной платформы) очень часто навязывают определенный стиль разработки. И этот стиль сильно отличается от классического, объектно-ориентированного, программирования в сторону процедурного программирования. Процедурное программирование не всегда позволяет полностью использовать возможности языка, хотя это и не всегда важно, особенно если ваша задача - получить зарплату.

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

В случае с веб-программированием на языке руби все выглядит немного иначе. Сам язык разрабатывается и поддерживается сообществом программистов. Веб-фреймворк rails, о котором мы еще поговорим, также поддерживается исключительно сообществом. Это позволяет программистам со всего света создавать удобный инструмент именно таким, каким хочется. Не оглядываясь на политику какой-либо компании.

Более того, программы на языке руби редко исполняются на мобильных устройствах, поэтому "специально" оптимизировать их практически никогда не требуется. Ну и основное отличие руби от языков для мобильной разработки состоит в том, что руби это динамический язык - не в том смысле, что он динамично развивается (и это тоже) - а в том, что в нем присутствует так называемая динамическая типизация данных, о которой было уже упомянуто выше. Основное преимущество динамической типизации по сравнению со статической - меньше правил и меньше строгости, что дает более высокую скорость разработки приложений программистом (за счет более медленного исполнения написанных программ и “достаточной” надежности. Но скорость исполнения нас не особо интересует, ведь руби не используется для разработки мобильных приложений).

Несомненно, существуют и другие направления в программировании, которые не были проверены авторами этой книги. Например, разработка компьютерных игр. Наверное, для того, чтобы "проверить" все направления не хватит жизни, поэтому мы оставим эту затею для пытливых умов, и займемся тем, что точно востребовано на рынке, дает возможность “быстрого входа”, и является более или менее интересным и нескучным.

Веб-программирование или что-то другое?

Книга разделена на две части. В первой части мы рассмотрим основы языка руби и использование языка из т.н. командной строки. Во второй части будет непосредственно веб-программирование и фреймворк rails.

Подождите, - скажет наблюдательный читатель, - ведь мы только что говорили про веб-программирование, а оно будет только во второй части?

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

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

Сколько зарабатывают программисты?

Этот вопрос очень важен для тех, кто в программировании совершенно не разбирается. Но прежде, чем на него ответить, я хочу сделать отступление.

Т.к. руби это в основном язык для веб-программирования, именно руби программисты положили начало удаленной (remote, на расстоянии) работе. Культура работать над одним проектом удаленно больше всего выражена именно в веб-программировании.

Оно и понятно - для создания программного обеспечения, например, для самолетов, наверное, полезнее находиться именно в научном центре и работать рука об руку со своими коллегами из научного центра. Но в случае с веб-проектами, часто не важно где именно находится разработчик. Вклад в культуру удаленной разработки сделала и команда "37 signals", разработчики которой находятся в разных частях света, и даже в разных временных зонах. Именно в “37 signals” появилась первая версия, пожалуй, самого популярного фреймворка для веб-разработки (rails).

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

Если взглянуть на статистику удаленных работ, то язык руби занимает второе место по количеству доступных работ https://remoteok.io/stats.php. Первое место удерживает JavaScript, но только лишь из-за того, что минимальные знания JavaScript являются необходимостью и он требуется в совокупности со остальными языками: Java, PHP, Ruby и т.д. А вот "чистый JavaScript" для full-stack программирования находится уже на третьем месте (Node.js).

Хочется заметить, что количество работ по определенному языку не является самым важным показателем, и вообще не может быть никаких важных показателей с помощью которых можно сделать "точный выбор" на всю оставшуюся жизнь. Мы лишь говорим о том, что мы знаем сейчас. Прогнозировать на несколько лет вперед в IT-индустрии очень сложно. Но, несомненно, хорошая новость заключается в том, что вам не нужны тысячи работ - достаточно найти одну. Также обычно не очень важно сколько именно времени вы потратите на поиск работы - одну неделю, две недели или два месяца.

Тут мы подходим к статистике, которая была собрана студентами руби-школы. Так сколько же зарабатывают руби программисты? Прежде чем ответить, сделаем оговорку, что речь будет идти только про удаленную работу. Рынок удаленных зарплат более стабилен, он был уравновешен программистами из разных стран, и на нем сформировалась определенная цена. Нет смысла сравнивать зарплату "на месте", т.к. руби программист может (и даже обязан) работать удаленно, т.к. в большинстве случаев это более выгодно. Также подразумевается, что программист имеет минимальные знания английского языка, которые позволяют ему общаться по переписке с заказчиками из других стран.

Категории зарплат можно условно разделить на три части. В настоящее время стоимость часа работы программиста с 1 годом опыта составляет не более 10 долларов в час. От 1 года до 3 лет - примерно от 10 до 25 долларов в час. От 3 до 7 лет - примерно от 25 до 40 долларов в час. При достижении цифры в 40 долларов в час все становится очень индивидуально. К слову, стандартное количество часов в месяц - 160.

Из нашего опыта, вполне реально без особых навыков за 1 год освоить программирование на руби и найти первую удаленную работу. Возможно, потребуется предрасположенность (этот факт не был доказан) и знание или желание выучить английский. Этот путь прошли многие студенты руби-школы, и подтверждение этим словам можно найти в нашем чате https://t.me/rubyschool

Среда исполнения

Среда исполнения - важное понятие. В дальнейшем вводится понятие среда/окружение (environment), но это не одно и то же. Среда исполнения - это где и "кем" будут запускаться ваши программы на языке руби. Скажем, ученый-химик может делать эксперимент в пробирке, в большой стеклянной банке, и даже в собственной ванной. То же самое справедливо и для программы на руби. Она может быть исполнена разным “интерпретатором” (программой для запуска программ), в разных условиях - на операционной системе Windows, Mac, Linux.

Когда автор этих строк впервые познакомился с компьютером, среда исполнения была одна - не было никакого выбора. При включении компьютера был виден курсор и надпись "ОК", которая означала что можно вводить программу. Сейчас компьютеры стали более умными и новичку еще предстоит разобраться как запускать программу, где вводить текст программы, “чем” запускать написанную программу, какая среда исполнения лучше.

Кстати, в какой именно операционной системе запускается программа для нас не очень важно. На сегодняшний день программу, написанную на любом из популярных языков программирования можно запустить на трех ОС: Windows, Mac, Linux. Обычно не требуется никаких изменений в самой программе или эти изменения минимальны.

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

Несмотря на то, что мы начнем запускать наши программы в ОС Windows, в будущем настоятельно рекомендуется не использовать ОС Windows для запуска программ на языке руби. Однако, эту ОС при желании можно использовать для написания программ. В любом случае, авторы рекомендуют как можно быстрее установить Linux (Mint Cinnamon edition, как наиболее простой дистрибутив) и использовать его. Если вы используете Mac, то нет необходимости устанавливать Linux.

Настройка Windows для запуска первой программы

Терминал (который также называют словами "консоль", “оболочка”, “шелл”, “командная строка”) - друг любого руби-хакера. Чтобы запускать программы, которые мы с вами напишем, нужен какой-то центральный пульт, откуда мы будем руководить процессом. Этим пультом и служит терминал.

Ради точности следует заметить, что терминал - не совсем правильное слово. Но оно часто используется. Программисты говорят "запустить в терминале", но если копнуть глубже, то терминал - особая программа, которая запускает оболочку (shell). И на самом деле мы отправляем команды в оболочку, где терминал служит лишь транзитным звеном, удобной программой для соединения с оболочкой.

Забегая вперед, хочется заметить что существуют разные типы оболочек. Стандартной оболочкой в индустрии является bash. Однако, авторы рекомендуют использовать zsh (читается как "зи-шелл"), в вариации “Oh My Zsh”. Эта оболочка немного отличается от стандарта, но дает более широкие возможности и является более удобной.

Но в ОС Windows стандартная оболочка это cmd.exe. Если вы нажмете Пуск - Выполнить - cmd.exe, то увидите черный экран и "приглашение" командной строки:

TODO картинка

"Приглашение" заканчивается символом >, который означает, что оболочка ожидает вашего ввода. Стоит сразу запомнить неочевидный момент - если что-то не получается, необходимо попробовать перезапустить оболочку. Это справедливо и для других операционных систем и за свою карьеру авторы наблюдали “магическое действие” этого трюка на уже, казалось бы, очень опытных программистах.Выйти из оболочки можно словом exit или просто нажав на крестик вверху окна.

В ОС Linux и Mac терминал обычно доступен по-умолчанию среди программ. И можно запустить его щелкнув по невзрачной иконке, скорее всего в виде прямоугольника. В этих операционных системах приглашение командной строки принято обозначать символом доллара $. Это не всегда правда, но на будущее стоит запомнить - если вы видите знак доллара где-нибудь в документации и после этого знака идет команда (например $ ls), то знак доллара обычно вводить не надо. Это просто индикатор того, что команду надо выполнять в оболочке bash (или частично совместимой с ней zsh).

Не важно в какой оболочке вы сейчас находитесь, введите команду ruby и нажмите Enter. В случае с Linux и Mac, ошибки не будет, команда запустится и тихо будет ожидать окончания ввода программы. В Windows должна быть ошибка, ведь язык руби по-умолчанию не установлен, а это значит что нам надо его установить.

Тут следует сделать отступление. Сейчас и в будущем - если вы не знаете что делать, задайте вопрос гуглу. Например, в нашем случае - "how to run ruby program on windows". Умение задавать вопрос и искать ответ - половина дела. Если честно, то только благодаря этому умению можно научиться программировать. Главное - мыслить последовательно и логически. Если не получается, всегда можно обратиться за помощью в чат (ссылка есть выше в тексте).

Для запуска программ на руби нужно запустить ruby installer (задание - самим найти и скачать эту программу). После того как программа установлена, можно запускать ruby (не запускается? Может попробовать перезапустить терминал?). Ruby запустится "тихо", и будет ожидать вашего ввода. Введите “puts 1+1”, затем нажмите Enter, а потом Ctrl+D (иногда Ctrl+D приходится нажимать два раза):

$ ruby

puts 1+1

2

$

Что мы видим на экране выше? Приглашение командной строки ($), вводим ruby, потом "puts 1+1", потом Enter, который переводит нас на следующую строку, на которой мы нажимаем Ctrl+D. После этого “сама появляется” цифра 2. Что же тут произошло?

Во-первых, вы запустили программу для запуска программ. ruby - это программа (интерпретатор), которая позволяет запускать ваши, человечески написанные, программы. Компьютер говорит на языке нулей и единиц, и чтобы вас понять, ему надо считать человеческий язык - "puts 1+1".

Комбинация Ctrl+D (обозначается также ^D) пригодится вам во всей вашей дальнейшей жизни, она передает сигнал о том, что "ввод закончен" (конец ввода, end of input, end of file, EOF,). Это байт (его значение равно 4 - это запоминать не надо), который говорит о том, что наступил конец текстового потока данных, данных больше не будет. Интерпретатору ruby ничего больше не остается - только запустить то, что вы написали. Что и было сделано.

"puts 1+1" это ваша первая программа. Но мы не сохраняли ее в файле, мы ввели эту программы с клавиатуры и она “пропала” после того, как была выполнена. Сожалеем, что вы не сохранили свою первую программу. Но ничего страшного, она занимала всего лишь 8 байт, и восстановить ее - небольшая проблема.

Что же такое "puts 1+1"? Прежде чем ответить на этот вопрос, выполните задание. Запустите программу “1+1” (без puts). Мы увидим, что ничего не происходит. На самом деле результат был посчитан, но просто не выведен на экран. Возможен вариант, когда вы зададите компьютеру какую-нибудь сложную задачу и он будет считать ее очень долго. Но если вы не написали puts, то результат мы не узнаем.

Другими словами, puts выводит результат. Это сокращение от двух английских слов: put string (вывести строку). В других языках были приняты другие сокращения для вывода строки, например в языке Бейсик это "print".

Так почему же надо писать puts вначале, а не в конце? Ведь сначала надо посчитать, а потом уже выводить. Почему puts стоит вначале? Все просто, в этом случае говорят что "метод (функция) принимает параметр". Т.е. сначала мы говорим что мы будем делать - выводить, а потом говорим что именно мы хотим выводить. Нашу программу можно также записать как “puts(1+1)”. В этом случае видно, что в скобках - параметр. Ведь в математике мы сначала считаем то, что в скобках, а потом уже выполняем остальные действия.

Кстати, наши поздравления! Вы написали свою первую программу. Задание - остановитесь тут и попробуйте написать программу, которая считает количество миллисекунд в сутках, следующий абзац содержит ответ:

$ ruby

puts 60 * 60 * 24 * 1000

(нажмите Ctrl + D)

Задача чисто математическая, количество секунд в минуте умножаем на количество минут в часе, умножаем на количество часов в сутках. И чтобы получились миллисекунды, а не секунды, умножаем на 1000.

Далее, попробуйте запустить следующую программу:

puts 55 * 44 * 33 * 22 * 1**1

Запись ** означает возведение в степень. Например, 3 ** 2 = 3 * 3 = 9. Удивительно, но результат работы программы (5 в пятой степени умноженное на 4 в четвертой и т.д.) выше будет равен количеству миллисекунд в сутках! Этому нет какого-то объяснения. Совпадение? Может быть. Если вы знаете объяснение, напишите нам на email.

В качестве упражнения, попробуйте написать такую конструкцию (подумайте, что произойдет):

puts 60 * 60 * 24 * 1000 == 55 * 44 * 33 * 22 * 1**1

Здравствуйте, я ваш REPL

В случае с "1+1" выше наш интерпретатор выполнил два действия: read (прочитать), evaluate (выполнить). Т.к. не было третьего действия “print” (puts в нашем случае), то не было и результата на экране. Т.е. чтобы мы видели результат, надо выполнить read (R), evaluate (E), print (P). Хорошо бы еще и не запускать ruby каждый раз, чтобы программа в бесконечном цикле (loop - L) спрашивала нас “что хотите выполнить?”, т.е. сразу принимала бы ввод без лишних разговоров.

Из начальных букв у нас получилось REPL - read evaluate print loop. Т.е. REPL это такая программа, которая сначала читает, потом исполняет, потом печатает результат, и потом начинает все сначала. Это понятие широко известно и используется не только в ruby. А в руби REPL-программа называется irb (interactive ruby).

Попробуйте ввести irb и посмотрите что произойдет:

$ irb

2.5.1 :001 >

Непонятные цифры вначале - это версия руби. В нашем случае 2.5.1 (то же самое покажет команда ruby -v). 001 это номер строки - первая строка. Т.е. REPL уже содержит "P" (print), то можно вводить “1+1” без puts. Задание - посчитайте количество секунд в сутках не выводя результат на экран с помощью puts.

Принцип наименьшего сюрприза говорит нам о том, что выход из REPL должен быть командой exit. Вводим exit - получилось!

Тут хочется заметить, что авторы редко используют именно irb в роли REPL. Существуют более удобные инструменты (pry), которые выполняют ту же самую функцию, но имеют больше настроек.

Запуск программы из файла

Запуск программы из файла ненамного сложнее. Достаточно передать аргумент интерпретатору руби с именем файла:

$ ruby app.rb

В этом случае интерпретатор считает программу из файла app.rb и запустит ее также как если бы вы ввели эту программу и нажали ^D.

Но возникает вопрос - как и где сохранить эту программу, в чем ее набрать, какой редактор кода использовать? Для начала ответим на вопрос "где" сохранить программу, т.к. этот вопрос подразумевает знакомство с файловой системой и в нем есть некоторые подводные камни.

Для Windows, операционной системы с которой вам нужно как можно скорее уходить на Linux, необходимо создать директорию (каталог, папку) в разделе C: и назвать ее, например, projects. После этого нужно перейти в директорию, создать там файл и запустить его.

Другими словами, нужно уже уметь делать как минимум четыре вещи:

  1. Создавать директорию

  2. Переходить в директорию

  3. Создавать файл в директории и сохранять что-то в этот файл

  4. Запускать файл (это мы уже умеем: ruby app.rb)

Тут можно было бы дать основные команды ОС Linux для этих целей и не завязываться на ОС Windows. Однако, рынок диктует свои условия - большинство пользователей сейчас работают на Windows, а значит с большой долей вероятности и у вас установлена эта операционная система. Но не стоит отчаиваться, мы исправим этот досадный факт, а пока постараемся как можно быстрее настроить нашу среду исполнения чтобы мы могли писать и запускать программы, а исправлением займемся потом.

Умение ориентироваться в файловой системе - ключевой навык любого программиста. Как библиотекарь должен знать где какая книга лежит, так и программист должен знать (или уметь разобраться, найти) где лежит тот или иной файл. Нужно всегда иметь в голове примерную "картинку" файловой системы.

Но из практики обучения студентов этому, казалось бы, простому делу выяснилось, что не все представляют себе что такое файловая система и как эффективно работать с файлами (создавать, находить, переносить, переименовывать). Можно было бы написать список команд и сказать - запомните или плохо будет. Но мы пойдем более гуманным и проверенным путем - мы познакомимся с файловым менеджером.

Я Фар, ваш файловый менеджер (а я полночный командир)