Первые 20 часов. Как быстро научиться… чему угодно Кауфман Джош
Вы: Протяни руку к хлебу и схвати его.
Приятель: (Протягивает руку к хлебу, сжимает пальцы и разжимает. Хлеб остается на месте.)
Вы ИДИОТСКАЯ ИГРА!!!
Это глупый пример, но именно так выглядит программирование, особенно в самом начале.
Компьютер, подобно вашему приятелю, не может понять то, что вы в точности не определили. Любой сложный процесс, который вы пытаетесь описать, нуждается в полном и однозначном определении.
Именно в этом и заключается сложность программирования: одна-единственная неточная или ошибочная команда делает всю программу нерабочей. В этом отношении программирование не терпит компромиссов — ваша программа либо корректная, либо некорректная. Точность нужна в каждой детали.
Компьютеру безразлично ваше очарование и чувство юмора. Если программа неполная или плохо написана, то ваше приложение зависнет, и вы потеряете данные. Или вы напишете баг: фрагмент неверного кода, который вызовет неожиданные и непредсказуемые последствия. Тут как в математике — либо работает, либо нет. Никто не поставит вам высокую оценку за усердие.
При всем при том в программировании не существует единственного, универсального решения поставленной задачи — так же как и в математике. Есть тысячи способов получить из ваших входных данных желаемый результат. Программист должен выработать конкретный подход на основании имеющихся в его распоряжении средств.
Привыкнув к тому факту, что компьютер не способен читать ваши мысли, вы постепенно учитесь давать инструкции, которые система может понять — точно так же, как вы учились точно определять термины и описывать простейшие действия приятелю в игре «Сэндвич», прежде чем отдавать сложные команды.
В чем особенность программирования интернет-приложений?
Теперь у нас есть рабочее определение программирования. Оно предельно упрощено, однако позволяет понять, что мы пытаемся сделать.
Как бы то ни было, меня не интересуют все разновидности программирования — я хочу писать программы работы с сайтами. Если вы когда-либо пользовались программами электронной почты, например Gmail, Hotmail, Yahoo Mail или любой другой, то понимаете, о чем идет речь. Эти программы выполняются в вашем интернет-браузере. Чтобы использовать их, не нужно загружать программное обеспечение в компьютер. Вы просто указываете нужный сайт в браузере и регистрируетесь. Можно приступать.
Это очень важное отличие программного обеспечения, которое выполняется локально, от того, что выполняется удаленно на интернет-сервере. Чтобы разработать интернет-приложение, необходимо сначала написать его, а затем протестировать, убедившись в его работоспособности. Весь процесс разработки и тестирования выполняется на вашем компьютере.
После того как программа заработала, вы посылаете ее на «рабочий» интернет-сервер, где к ней получают доступ другие люди. Пользователи интернета не могут зайти на ваш компьютер из сети, поэтому загрузка программы на интернет-сервер открытого доступа является необходимым условием, чтобы вашим приложением могли пользоваться другие.
Это значит, что процесс разработки делится на два основных этапа: локальное программирование плюс тестирование — и загрузку программы на удаленный рабочий сервер для реального применения. Я должен выяснить, что представляют собой оба этих этапа.
Из предыдущего опыта работы с HTML и CSS я сделал один вывод: эти языки «немые» в том смысле, что вы не можете заставить главную веб-страницу хранить какую-либо информацию.
Допустим, у вас есть файл веб-страницы, содержащий приветствие «Привет всем!» [6], и вы хотите заменить слово «всем» именем пользователя, который посещает страницу. Отличная идея, но главные веб-страницы не способны хранить информацию, которую можно впоследствии воспроизвести. Они просто воспроизводят текст из файла, а этот файл не позволяет себя изменять.
Это свойство описывается таким техническим термином, как состояние. Главные веб-страницы, созданные с помощью HTML и CSS, не запоминают состояние и поэтому называются ресурсами «без запоминания состояния». На веб-странице вы можете создать окно для ввода имени пользователя с кнопкой «Сохранить», но для сохранения этой информации необходимо предусмотреть для нее специальное место.
Вот почему интернет-приложения используют для сохранения информации два подхода: базы данных и куки-файлы.
Понятие базы данных лучше всего иллюстрирует стопка учетных карточек. Предположим, вы хотите создать адресную книгу, в которой указаны имя, номер телефона, адрес электронной почты, пол и возраст всех ваших друзей.
Каждый друг получает свою учетную карточку, в которой записывается информация о нем. Если кто-то из друзей, к примеру, меняет адрес электронной почты, вы можете стереть старую информацию с карточки и заменить ее новой. Взглянув на любую учетную карточку, вы видите всю информацию сразу.
Стопка учетных карточек аналогична базе данных. Каждая карточка в стопке называется записью. В базе данных у вас может быть столько записей, сколько вам нужно, однако в какой-то момент стопка может вырасти до таких размеров, что пользоваться ею будет неудобно. Нередко имеет смысл разделить стопку на несколько частей: например, друзья и родственники в одной части, коллеги — в другой.
Пока понятно? А вот теперь самое интересное. Представьте, что ваша стопка учетных карточек стала волшебной. Вы можете разговаривать с ней, приказывая показать вам карточки, отвечающие определенным условиям, например:
покажи мне карточку Джона Смита;
покажи мне все карточки женщин;
покажи мне все карточки людей, которым больше пятидесяти лет.
Очень удобно, правда? В сущности, именно для этого и служат базы данных — предоставляют вам способ хранения структурированной информации, а также способ ее извлечения в любой удобной форме.
Каждая разновидность данных, которую мы заносим в карточку, называется полем. Чем больше полей в базе данных, тем больше потенциальных способов извлечения информации, когда она вам потребуется.
Базы данных — самый распространенный способ хранения информации в интернет-приложениях. Если вам нужно хранить такие данные, как имя пользователя, адрес электронной почты, и другие подобные сведения, для этого прекрасно подойдет база данных. После того как Джон Смит войдет в ваше приложение, вы можете извлечь его имя из записи в базе данных, а затем вывести на экран: «Привет, Джон Смит!»
Другой распространенный способ хранения информации в интернет-приложениях — куки-файл. Это очень маленький текстовый файл, сохраняемый на компьютере пользователя. Куки-файлы удобны для хранения небольшого объема данных непродолжительное время.
В случае нашей программы для адресной книги можно хранить куки-файл, созданный в тот момент, когда Джон Смит входит в систему. Куки-файл Джона содержал бы такую информацию: username = johnsmith и loggedin = true. Если Смит покинет приложение, а затем снова вернется, программа распознает куки-файл и откроет доступ без повторной регистрации. Можно сделать так, чтобы куки-файлы хранились определенное время, что удобно для этого типа программирования. (Если вы увидите на сайте сообщение «Запомнить этот пароль», то происходит именно запись куки-файла.)
В данном случае мы производим разбиение на основные элементы. Это ни в коем случае не исчерпывающий список уникальных характеристик веб-программирования, однако его вполне достаточно, чтобы получить представление, чему мне нужно научиться. Это переменные, условные операторы, исключения, локальная/рабочая среда, базы данных и куки-файлы.
Видите, насколько полезным оказалось подобное разбиение? Я начал с туманного представления о том, чем я хочу заняться, а теперь у меня есть конкретный список навыков, которые нужно освоить.
Тем не менее я еще не готов приступать к работе. Помните, я говорил о том, что компьютеры не понимают человеческого языка? Мне нужно выбрать язык программирования, чтобы писать команды программы, а для этого потребуются дополнительные исследования.
Выбор языка для программирования интернет-приложений
В нашем распоряжени есть тысячи самых разных языков программирования, и каждый день появляются новые. У этих языков свой синтаксис, который по большей части определяется тем, для каких задач создавался язык. Каждый язык оптимизирован для решения определенного класса задач.
Прежде чем приступать к изучению программирования, я решил потратить час на просмотр самых популярных сайтов для программистов и выяснить, какие языки рекомендуются разработчикам интернет-приложений. Эти предварительные исследования помогут мне решить, какой язык мне нужно освоить и какие начальные навыки мне потребуются для практических занятий.
Два самых популярных сайта для программистов — это Stack Overflow [7] и Hacker News [8], и поэтому за советом в выборе языка я обратился именно к ним.
Stack Overflow представляет собой диалоговый сайт, место, на котором задают вопросы типа: «Как мне сделать Х?» Опытные и знающие программисты обычно отвечают на вопросы — дают конкретные советы, излагают подходы, указывают, как исправить ошибку, — что делает сайт лучшим помощником в решении сложных задач программирования.
Hacker News — это социальная сеть, собрание ссылок на соответствующие обсуждения. Темы на Hacker News меняются ежеминутно, но все они обычно связаны с новыми достижениями в программировании, технологии и бизнесе, что делает этот сайт идеальным местом для поиска хотя бы первичной информации о новостях программирования.
Программисты всего мира ежедневно создают новые языки, библиотеки и методы. Одни сочетания технологий и подходов годятся для конкретной задачи, другие нет. Зачастую убедиться в этом можно только методом проб и ошибок.
С точки зрения программирования термин «лучший» применим лишь по отношению к задаче, которую вы пытаетесь решить, и к вашим приоритетам. В общем случае рекомендуется 1) выбирать инструменты, позволяющие эффективно решить задачу, а 2) при наличии нескольких вариантов выбирать те, которые вам больше нравятся. Вполне справедливо.
Просмотр архивов Stack Overflow и Hacker News привел к перегрузке информацией: ее было слишком много, особенно для того, кто не знаком с терминологией. Мне требовалось избавиться от ненужной информации, чтобы получить конкретный совет.
Тут помогла одна тактическая уловка, о которой многие не знают: популярные поисковые машины позволяют ограничить поиск конкретным сайтом, чтобы не просеивать всю сеть. Соответствующая команда в Google выглядит следующим образом:
"search phrase" site: example.com
Замените "search phrase" термином, который нужно найти, а "example.com" — адресом сайта, где вы ищете этот термин. Кавычки означают поиск точного соответствия указанной фразе. Если опустить кавычки, Google покажет страницы, содержащие все слова из фразы, но не обязательно в указанном порядке.
Используя этот прием, я задал поиск нескольких фраз: «программирование интернет-приложений», «обучение программированию», «программирование для начинающих», — и потратил еще около часа на просмотр результатов.
И вот что мне удалось выяснить: опытные создатели интернет-приложений советуют начинать с одного из двух распространенных языков программирования, Ruby или Python. Судя по всему, Ruby и Python относительно легко освоить, они достаточно мощные и служат хорошей основой для важных концепций программирования. Ruby более популярен у программистов, специализирующихся на веб-приложениях, а Python предпочитают ученые, в частности математики, из-за большого количества научных библиотек, позволяющих производить вычисления и строить графики.
У обоих языков, Ruby и Python, есть свои активные сообщества разработчиков, огромное количество бесплатных ресурсов, хорошо написанные книги, а также программы и инструменты, облегчающие применение основных функций. Выбор одного из двух языков, похоже, определяется в основном личными вкусами.
Познакомившись с несколькими примерами программ, написанных на обоих языках, я решил изучать Ruby. Для меня как для новичка программные строки на Ruby выглядели аккуратными, удобочитаемыми и казались относительно понятными. Поскольку основные понятия и приемы, которые я освою при помощи Ruby, будут применимы к другим языкам, которые возможно, заинтересуют меня впоследствии, то почему бы не сделать процесс начального обучения приятным?
Кроме того, я собираюсь использовать программы и инструменты, которые либо поддерживают, либо требуют Ruby. В частности, Jekyll написан на Ruby, и поэтому изучение Ruby поможет мне решить мою насущную проблему. Аналогичные инструменты существуют и для Python, но мне кажется, что пользоваться ими сложнее.
Выбор среды разработки
Помимо советов относительно языков программирования, разработчики интернет-приложений делятся сведениями о среде разработки: библиотеках программ, которые облегчают решение задач, встречающихся в каждом приложении.
Библиотеки очень важны потому, что компьютер делает в точности то, что вы ему говорите. Не больше и не меньше.
Это сложно, потому что с точки зрения компьютерной программы существует только код, который вы написали. Как выразился знаменитый физик Карл Саган: «Если вы хотите приготовить яблочный пирог с нуля, вы должны сначала создать Вселенную».
«Вселенная» для вашей программы определяется 1) инструкциями и командами кодовой базы; 2) библиотеками, которые импортирует ваша программа, и 3) системой, в которой выполняется программа. Если код, необходимый для выполнения данной операции, отсутствует в системе, то ваша программа зависнет или выдаст сообщение об ошибке.
Большинство языков программирования включают библиотеки, необходимые большинству программистов, но совсем немного специальных инструментов. Здесь на помощь приходит среда разработки. Вместо того чтобы программировать все с нуля, что займет много времени, вы задействуете среду разработки, которая позволит импортировать и использовать проверенные и надежные библиотеки для решения специальных задач, и сосредоточиваетесь на своем приложении, а не создаете Вселенную.
Среда разработки может иметь разный объем. Некоторые среды включают множество функций и команд в попытке сэкономить программистам время, другие же обходятся минимумом, охватывая лишь несколько основных функций.
В настоящее время у языка Ruby имеется несколько основных сред разработки интернет-приложений. Самые популярные из них — это Ruby on Rails [9] и Sinatra [10].
Ruby on Rails (ее часто называют просто Ruby) была одной из первых больших сред разработки интернет-приложений, предназначенных для Ruby. Созданная в 2004 году Давидом Хейнемейером Ханссоном, Rails использовалась для создания нескольких популярных приложений компании 37signals [11], одним из владельцев которой был Ханссон. В настоящее время тысячи компаний разработали серьезные интернет-приложения для бизнеса на основе Rails.
Программный каркас Rails основан на «генераторах», встроенных программах, которые в ответ на одну команду генерируют большой объем стандартного кода. Затем стандартный код модифицируется в соответствии с конкретными требованиями программиста. Rails помогает разработчику сэкономить время и создать работоспособное приложение без необходимости писать программу с нуля — при условии, если он знает, что ему нужно.
Среда разработки Sinatra, наоборот, является минимальной. Sinatra не использует генераторы, а предоставляет в распоряжение разработчика несколько простых функций, необходимых практически в каждом интернет-приложении, а затем самоустраняется.
Приложения Sinatra выглядят простыми по сравнению с приложениями Rails. Одна-единственная команда в Rails может сгенерировать больше десяти папок и больше 20 файлов. Приложение Sinatra во многих случаях состоит всего лишь из одного файла. Sinatra не генерирует большой массив кода, который затем может быть удален, а поддерживает простоту проекта, добавляя ровно столько кода, сколько нужно для работы.
Подобно выбору языка программирования, выбор среды разработки определяется в основном личными предпочтениями и характером задачи. Rails больше подходит для крупных проектов, над которыми работают несколько программистов, а Sinatra — для небольших. У этих двух сред разработки много общего, и недавнее исследование на RubySource.com показало, что выбор между ними по большей части определяется субъективными причинами [12].
GitHub — это источник программ с открытым кодом, который используют многие программисты для разработки и поддержки своих проектов. Там легко найти примеры приложений, написанных в Rails и Sinatra, чтобы получить представление о каждой среде разработки, и я потратил еще один час на изучение открытых проектов.
Тут существует нетривиальный риск: чтобы изучить программирование, требуется сделать выбор. После того как вы отдали предпочтение определенному языку программирования и среде разработки, гораздо легче приступить к изучению всего, что необходимо знать для написания программы. Однако, не сделав этого выбора, можно потратить годы на поиски «идеальных» средств программирования.
Лучше выбрать язык и среду программирования, которые кажутся вам привлекательными, потратить какое-то время на знакомство с ними и согласиться на неизбежные компромиссы, чем годами заниматься «исследованиями», не продвинувшись ни на шаг. Целый день просидеть в Stack Overflow и Hacker News — это не программирование.
В конечном итоге я решил начать со среды Sinatra. Генераторы Rails могут сэкономить уйму времени, если знать, что ты делаешь, — но я этого не знаю.
Интуиция подсказывает мне, что в такой ситуации лучше выбрать Sinatra. В этой среде программирования ясный, простой и понятный синтаксис. Единственный код, который существует в приложении Sinatra, — это код, созданный разработчиком. Среда разработки хорошо задокументирована, примеры рабочих приложений можно без труда найти на GitHub, а за помощью обратиться к Stack Overflow.
Когда-нибудь я, возможно, поэкспериментирую с Rails. Но теперь лучше начать со среды разработки Sinatra.
Анализ конечного результата
Потратив около пяти часов на предварительные исследования, я сделал все, что требуется для начала работы: разбил интернет-программирование на элементы, выбрал язык, среду разработки и конкретный проект. Пора приступать к делу.
«Разработать приложение в среде Sinatra, которое обслуживает сайт Jekyll» — так выглядит целевой уровень мастерства, однако мне нужно проанализировать это заявление, чтобы спланировать следующий шаг. Чему я должен научиться?
Еще час исследований, и я получаю вот какой результат.
1. Jekyll создает рабочий сайт из локальных статических файлов. Мне нужно сделать шаблон HTML для сайта при помощи специальных форматирующих тегов и экспортировать архив публикаций с сайта PersonalMBA.com, как описывается в инструкции, написанной Полом Стаматиу[13].
2. Приложение, созданное в среде Sinatra, обрабатывает запросы от посетителей сайта, предоставляя им запрошенные файлы. Это приложение я должен написать с нуля.
3. Готовый сайт Jekyll и серверное приложение Sinatra требуется загрузить на сетевой хост.
4. Для решения всех этих задач мне нужно понять, как установить на мой компьютер последнюю версию языка Ruby, а также среду Sinatra и другие необходимые программы.
Последнее требование может служить превосходным примером подготовки необходимых условий для занятий. Если я не смогу понять, как установить Ruby на свой компьютер, то буду не в состоянии перейти к следующим этапам. Так что начинать нужно с этого.
Важно отметить, что интернет-технологии меняются ежедневно. Вполне вероятно, что какие-то последовательности команд, приведенные в данном разделе, уже устареют к тому времени, когда вы будете читать книгу. Не переживайте: важен метод, а не команды.
Аналогичным образом, у вас возникнет искушение лишь бегло просмотреть приведенные фрагменты программы. Это естественное желание: строки кода выглядят слишком сложными, и вы, скорее всего, не сразу поймете, что они означают.
Я бы советовал вам не поддаваться искушению. Эти имена, команды и символы казались мне такими же чужими, как сейчас кажутся вам. Эта глава посвящена процессу, с помощью которого вы разберетесь в том, что они значат и как их использовать. Если вы попытаетесь прочесть строки программы, то извлечете гораздо больше пользы из этой главы.
Вперед!
Обновление Ruby
Компьютер у меня уже есть, и это хорошее начало: без него писать программу невозможно.
В настоящее время я пользуюсь Apple MacBook Air с операционной системой Mac OS X 10.6. Недолгий поиск в Google позволяет выяснить, что операционная система поставляется с уже установленной программой Ruby версии 1.8.7. И это тоже хорошо: я могу запускать написанные на языке Ruby программы без дополнительных усилий.
Но проблема в том, что Ruby 1.8.7 не самая последняя версия программы. Когда я пытаюсь установить Jekyll, система сообщает, что программа требует версию Ruby не ниже 1.9.1, и это значит, что мне нужно выяснить, как обновить программу. Придется вновь прибегнуть к помощи Google.
Поиск выявил две программы, предназначенные для облегчения установки Ruby: rbenv и ruby-build. Обе программы поддерживаются Сэмом Стефенсоном, разработчиком Ruby из компании 37signals. Вместе они помогают устанавливать новые версии Ruby и указывать компьютеру, какую версию использовать.
Инструкция на странице документации [14] rbenv показывает, как установить программы на компьютер. Вот что представляют собой команды установки:
$ cd ~
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo./install.sh
$ cd..
$ git clone git://github.com/sstephenson/rbenv.git.rbenv
$ mkdir — p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashprofile
$ echo 'eval "$ (rbenv init — )"' >> ~/.bashprofile
$ exec $SHELL
$ rbenv install 1.9.3-p125
$ rbenv rehash
$ rbenv global 1.9.3-p125
Выглядит устрашающе, но это всего лишь список команд. Давайте проанализируем его.
Эти команды водятся в программе Terminal, которая предустановлена на компьютерах Apple. В кинофильмах часто показывают хакеров, которые лихорадочно набирают длинные строчки команд, отображающиеся на экране. Так вот — их компьютеры работают в программе Terminal [15].
Я открываю программу и ввожу первую команду:
$ cd ~
Эту команду понять нетрудно. Символ $ программа Terminal выводит на экран, когда готова к приему новой команды. cd — это сокращение от «сменить каталог» (change directory). Не составляет труда выяснить, что символ ~ обозначает «корневой каталог пользователя», то есть папку на моем компьютере, где хранится мой профиль пользователя.
Я набираю команду и нажимаю клавишу «Ввод». Теперь программа Terminal выводит на экран следующую строчку:
joshkaufman $
Это хорошая новость: я перешел в корневой каталог. Пока все в порядке. Я набираю следующую команду:
$ git clone git://github.com/sstephenson/ruby-build.git
Компьютер отвечает:
git: command not found
Похоже, программа git не установлена на моем компьютере. Я должен выяснить, как это сделать.
Что такое git?
Занявшись поиском инструкций о том, как установить git в операционную систему Mac OS X, я наткнулся на Heroku Toolbelt [16]. Heroku [17] — это компания, предоставляющая хостинг для интернет-приложений, следовательно, они заинтересованы в том, чтобы облегчить создание этих самых интернет-приложений.
Heroku Toolbelt представляет собой программу, которая устанавливает несколько распространенных инструментов разработки программного обеспечения, необходимых для создания приложений на Heroku. Среди них есть и git [18].
Я скачал загрузочный пакет, запустил его и получил подтверждение, что все установлено правильно. Теперь попробую еще раз ввести команду:
$ git clone git://github.com/sstephenson/ruby-build.git
Ответом мне стали следующие строки:
Cloning into ruby-build…
remote: Counting objects: 1004, done.
remote: Compressing objects: 100 % (453/453), done.
remote: Total 1004 (delta 490), reused 937 (delta 431)
Receiving objects: 100 % (1004/1004), 108.77 KiB, done.
Resolving deltas: 100 % (490/490), done.
Успех! «Done» (готово) — это хороший признак. Кроме того, сообщения об ошибке не было. Идем дальше.
Я продолжаю вводить остальные команды. Судя по информации в инструкции по загрузке, я загружаю необходимые файлы и при помощи команды echo добавляю фрагменты текста в файлы конфигурации, а затем перезапускаю программу под названием SHELL, чтобы сохранить изменения. После перезагрузки SHELL программы rbenv и rubybuild установлены на моем компьютере. Ура!
Теперь пора установить последнюю версию Ruby:
$ rbenv install 1.9.3-p125
Программа автоматически загружает исходный код Ruby и делает сборку, выводя впечатляющее количество информации в окне программы Terminal. (Теперь я чувствую себя как настоящий голливудский программист.) [19]
$ rbenv rehash
Судя по документации, эта команда помогает компьютеру распознать, что установлена новая версия Ruby.
$ rbenv global 1.9.3-p125
Эта команда устанавливает, что версия 1.9.3-p125 является версией Ruby по умолчанию на данном компьютере. В руководстве сказано, что запуском следующей команды я указываю компьютеру необходимость использовать новую версию:
$ ruby — v
Вот что я получаю в ответ:
ruby 1.9.3p125 (2012–02–16 revision 34643) [x8664-darwin11.3.0]
Ура! Именно такое сообщение и должен вывести на экран компьютер.
В руководстве сказано, что если я захочу установить новую версию Ruby на этот компьютер, то должен снова запустить выполнение команд rbenv install, rbenv rehash и rbenv global. Достаточно просто.
Несмотря на то что поначалу эти команды вызвали у меня испуг, на самом деле они элементарны. То, что кажется невнятицей, — всего лишь сокращения. После расшифровки этих сокращений понять команду легко.
Полезно помнить, что никто не знает этих тонкостей с рождения. В большинстве случаев нужно потратить несколько минут на чтение документации, а затем попробовать ввести то, что там написано [20].
Установка библиотек Ruby (Gems)
Теперь, когда на компьютере есть последняя версия Ruby, настало время выяснить, как установить нужные мне библиотеки, в том числе Sinatra.
Библиотеки языка Ruby называются gems, и, как оказалось, установить их очень легко. Вот команда, которая устанавливает библиотеку Sinatra:
$ gem install sinatra
Для обновления Sinatra до последней версии нужно ввести следующую команду:
$ gem update sinatra
Что может быть проще?
Однако, прежде чем устанавливать остальные библиотеки, я хочу убедиться, что программа gem у меня тоже обновлена. Поскольку мой компьютер поставлялся со старой версией Ruby, то вполне вероятно, что все связанное с этим языком программное обеспечение тоже нуждается в обновлении.
Потратив немного времени, я нахожу команду для обновления gem для Ruby.
$ gem update — system
Довольно просто.
Запуская команду gem install, я замечаю, что она устанавливает и другие библиотеки, такие как rack, rack-protection и tilt. Эти дополнительные библиотеки называются средствами поддержки зависимостей. Они нужны для работы Sinatra и поэтому автоматически загружаются по команде gem install.
Книги
Теперь, будучи готовым приступить к программированию приложений на языке Ruby, я решил обратиться к двум справочникам по Ruby, которые чаще всего рекомендуют на Stack Overflow: «Программирование на языке Ruby» («The Well-Grounded Rubyist») (2009) Дэвида А. Блэка и «Красноречивый Ruby» («Eloquent Ruby») (2011) Расса Олсена. Обе книги представляют собой вводные пособия, предназначенные для того, чтобы познакомить читателя с основными концепциями и приемами Ruby, а также справочники.
Я также купил книгу «Sinatra: к работе готов» («Sinatra: Up and Running») (2011) Алана Харриса и Константина Хассе. Эта книга представляет собой вводный курс в среду программирования Sinatra. Подробная документация на Sinatra имеется в Сети, но книга содержит множество примеров, которые поясняют, как использовать Sinatra для решения стандартных задач.
Просматривая эти книги, я нашел несколько ссылок на сайты, которые могут служить справочниками по синтаксису Ruby.
The Official Beginner’s Guide to Ruby [21].
The Ruby Refresher [22].
Ruby Security Reviewer’s Guide [23].
Для начала этого справочного материала вполне достаточно, и я выделил полтора часа для быстрого просмотра всего, что у меня есть.
Я брал каждую книгу, изучал содержание и указатель, отмечая термины и понятия, которые казались мне важными. Я также выделял концепции, упоминаемые многократно, и обращал внимание на порядок их появления. Я читал заголовки и врезки. Закончив с книгами, я проделал то же самое с сайтами.
Вот что мне удалось выяснить. Помимо переменных, условных операторов, исключений и других основных понятий программирования, язык Ruby строится на двух основных концепциях: объектах и методах.
Объекты — это существительные мира программирования; с ними мы можем что-то делать. Допустим, я хочу создать в Ruby новую переменную под названием firstname (имя) и хочу, чтобы она содержала мое имя. В Ruby эта команда имеет вид:
firstname = "Josh"
Довольно просто. Помещая имя Josh в кавычки, я указываю Ruby, что имя — это строка, то есть последовательность букв и цифр. Это делает firstname объектом класса «строка». (Класс — это особый тип объектов с определенными характеристиками.)
Строки не единственный класс объектов. Вот пример класса целых чисел:
million = 1000000
Если объекты — это существительные языка программирования, то методы являются аналогом глаголов: то, что мы можем делать с объектами.
Предположим, у меня есть два строковых объекта, содержащих мои имя и фамилию:
firstname = "Josh"
lastname = "Kaufman"
Я могу использовать символ сложения (+), чтобы объединить эти строки, то есть соединить вместе:
fullname = firstname + lastname
Контрольный вопрос: что содержит переменная fullname? Если вы скажете «Josh Kaufman», то ошибетесь.
Не забывайте, что компьютер делает только то, что вы ему говорите. Вы не указывали, что нужно добавить пробел между «Josh» и «Kaufman». Поэтому переменная fullname будет содержать «JoshKaufman».
Поэтому если мы хотим исправить эту маленькую ошибку, то нужно изменить команду, добавив в нее пробел:
fullname = firstname + " " + lastname
«+» — это метод, и его действие зависит от того, к каким объектам он применяется. Если мы применим его к целым числам, а не строкам, то получим операцию сложения, а не объединения.
sum = million + million
Чему будет равна сумма? «2000000».
Встроенные методы Ruby помогут вам сразу же осуществить много интересных операций. Допустим, я хочу написат свои имя и фамилию задом наперед. Вместо того чтобы записывать это сочетание букв вручную или сочинять маленькую программу для расстановки букв в обратном порядке, я могу использовать метод reverse, доступный для каждого строчного объекта:
fullname.reverse
Вот что получится в результате: namfuaKhsoJ
Можно использовать одновременно несколько методов. Если я хочу расположить буквы имени и фамилии в обратном порядке и сделать все буквы строчными, то могу написать команду:
fullname.reverse.downcase
Результат: namfuakhsoj. В точку!
Похоже, научиться программированию на Ruby — это научиться использовать встроенные и создавать новые объекты, классы и методы, а также манипулировать ими. Помимо встроенных, вы можете при необходимости сами создавать, изменять и удалять объекты, классы и методы, что делает язык мощным и гибким средством программирования [24].
Документация на Ruby [25] содержит стандартный список объектов и методов, доступных для пользователя. Этот список впечатляет, но пугаться вы не должны — применять их все совсем не обязательно. Наоборот, большинство из них на первых порах безопаснее не трогать. Это опции, которые вы можете использовать при необходимости.
Документация служит еще одной цели: когда вы пытаетесь дать команду, которую Ruby не понимает, сообщение об ошибке подскажет вам, в каком месте произошел сбой.
Допустим, мы хотим выполнить следующую программу:
animal = "Zebra"
number = 7
puts animal + number
Команда puts означает «печать». Мы просто хотим, чтобы программа вывела на экран то, что она понимает под animal + number.
Вот что я получил в ответ, когда пытался запустить эту программу:
TypeError: can’t convert Fixnum into String from program.