Крис Пайн
«Учись программировать»
Улучшенная и РАСШИРЕННАЯ версия
Оригинальный учебник
Отправная точка для будущего программиста
Полагаю, что всё это началось ещё в 2002 году. Я думал о преподавании программирования и о том, каким превосходным языком для обучения программированию стал бы Ruby. В том смысле, что мы все были в восхищении от Ruby, потому что это мощный, элегантный и действительно просто интересный язык. И мне подумалось, что было бы здорово начать знакомство с программированием именно с него.
К сожалению, в то время было немного документации по Ruby, предназначенной для новичков. Некоторые из нашего сообщества говорили о том, что очень пригодился бы учебник наподобие «Ruby для новичка», или в более широком смысле – для обучения программированию вообще. Чем больше я думал обо всём этом, тем больше накапливалось того, что мне нужно было высказать (и это меня несколько удивило). Наконец, кто-то сказал: «Крис, почему бы тебе тогда просто не написать учебник вместо того, чтобы всё время говорить о нём?» Так я и сделал.
Но получалось не слишком хорошо. У меня была масса идей, которые были хороши в теории, но в реальной задаче написать классный учебник для не-программистов таился гораздо больший вызов, чем я мог осознать. (Я имею в виду, что он казался хорошим для меня, но я-то уже знал, как программировать.)
Спасло меня вот что: я устроил так, что людям было действительно легко связаться со мной, и я всегда старался помочь людям, когда они на чём-нибудь застревали. Когда я видел, что многие застревали на одном и том же месте, я переписывал его. Работы было много, но учебник потихоньку становился всё лучше и лучше.
Спустя пару лет, он был уже весьма хорош. :-) В самом деле, настолько хорош, что я был готов сказать, что он закончен, и двигаться дальше к чему-то ещё. И как раз примерно тогда появилась возможность превратить этот учебник в книгу. Поскольку он был в основном почти готов, я посчитал, что трудностей не возникнет. Я только подчищу в нём некоторые места, добавлю несколько упражнений, ну, возможно, ещё несколько упражнений, и ещё несколько глав, и дам его на просмотр ещё 50-ти рецензентам…
Это заняло у меня ещё один год, но теперь я думаю, что он действительно в самом деле хорош, в основном благодаря сотням храбрецов, что помогли мне написать его.
То, что размещено на этом <a href="http://pine.fm/LearnToProgram/"> сайте, – это исходный вариант учебника, почти совсем не изменённый с 2004 года. Чтобы получить самую свежую и улучшенную версию, вам, возможно, захочется обратиться вот к <a href="http://pragmaticprogrammer.com/titles/fr_ltp"> этой книге.
Соображения для преподавателей
Было несколько руководящих принципов, которых я старался придерживаться. Я думаю, они делают процесс обучения гораздо более лёгким – ведь учиться программировать и так довольно тяжело. Если вы преподаёте или наставляете кого-то на путь благородного хакерства, то эти идеи могут помочь и вам.
Во-первых, я старался как можно больше разделять понятия так, чтобы учащемуся требовалось изучать каждый раз только одно понятие. Это было трудно сначала, но уж слишком легко после того, как я приобрёл некоторый опыт. Некоторые вещи должны изучаться прежде других, но я был поражён, насколько мало в действительности имеется таких иерархических зависимостей. В конечном счёте, я просто выбирал порядок изложения и старался скомпоновать материал таким образом, чтобы каждый новый раздел основывался на предыдущих.
Другой принцип, о котором я всё время помнил, – учить только одному способу делать что-либо. В этом очевидное преимущество учебника для тех, кто никогда не программировал ранее. С одной стороны, один способ делать что-то легче выучить, чем два. Хотя, возможно, более важная выгода от этого состоит в том, что, чем меньшему числу приёмов вы учите начинающего программиста, тем более изобретательным и сообразительным ему придётся быть в своих программах. Поскольку основная деятельность в программировании связана с решением задач, критически важным становится поощрять это насколько возможно на каждом этапе разработки.
Я постарался переводить понятия программирования на те понятия, которые уже есть у начинающего программиста, с целью представить идеи таким образом, чтобы нагрузка ложилась более на его интуицию, нежели на учебник. Объектноориентированное программирование подходит для этого весьма хорошо. Мне можно было достаточно рано начать ссылаться в учебнике на «объекты» и различные «типы объектов», невинно роняя такого рода фразы в подходящие моменты. Я не говорил что-либо подобное «всё в Ruby является объектами,» или «числа и строки – это разновидности объектов», поскольку эти утверждения в действительности ничего не значат для начинающего программиста. Вместо этого я предпочёл говорить о строках (а не о «строковых объектах»), но иногда я упоминал «объекты», имея в виду просто «вот эти вещи в этих программах». А то, что все эти вещи в Ruby фактически являются объектами, позволило этим уловкам с моей стороны хорошо сработать.
Хотя я желал избежать ненужного объектно-ориентированного жаргона, я хотел быть уверенным, что если им в самом деле нужно было узнать какой-то термин, они выучат правильное слово. (Я не хотел, чтобы им пришлось учить его дважды, верно?) Вот почему я применял слово «строки», а не «текст». Методы тоже нужно было как-нибудь назвать, и я называл их «методы».
Что касается упражнений, думаю, что я приготовил несколько удачных, но их никогда не бывает слишком много. Если честно, могу поспорить, что я половину времени провёл, просто пытаясь подобрать забавные и интересные упражнения. Скучные упражнения напрочь убивают всякое желание программировать, в то время как от безупречно подходящих упражнений появляется профессиональный зуд, перед которым начинающий программист вряд ли сможет устоять. Короче говоря, невозможно потратить слишком много времени на подготовку хороших упражнений.
Страницы этого учебника (и даже эта самая страница) сгенерированы <a href="/home/mike/Desktop/Learn/Ruby/ltp/ltp-ru/ShowTutorialCode.rb"> большой <a href="/home/mike/Desktop/Learn/Ruby/ltp/ltp-ru/ShowTutorialCode.rb"> программой – конечно, написанной на Ruby. :-) И поэтому, в оригинальном учебнике есть несколько тонкостей. Например, все примеры программного кода в действительности исполняются каждый раз, когда вы просматриваете страницу, и показанный результат – это результат, сгенерированный при выполнении. Думаю, это лучший, самый лёгкий и, конечно, самый крутой способ удостовериться, что весь представленный мной код отрабатывает в точности так, как я утверждаю. Вам не нужно беспокоиться о том, что я мог ошибочно скопировать выдачу какого-нибудь из примеров или забыл протестировать какую-то часть кода: он весь проверяется каждый раз, когда вы его просматриваете. Так, в разделе по генераторам случайных чисел, если вы перезагрузите страницу, то увидите, что числа каждый раз будут изменяться… Прекрасно. (Я применил похожий трюк для примеров кода, когда писал книгу, но очевидно, это наиболее заметно именно в этом учебнике.)
Благодарности
И наконец, мне бы хотелось поблагодарить всех в списке рассылки<a href="mailto:ruby-talk@ruby-lang.org"> ruby–talk за их мысли и ободрение; всех моих замечательных рецензентов за их помощь сделать эту книгу гораздо лучше, чем я сделал бы это один; в особенности – мою дорогую жену за то, что она была моим главным рецензентом / тестером / подопытным кроликом / музой; Мацумото – за создание этого сказочного языка программирования; издательство Pragmatic Programmers – за то, что сообщили мне об этом и, конечно, за публикацию моей книги!
Если вы заметили какие-то ошибки или опечатки, или у вас есть замечания, предложения или хорошие упражнения, которые можно добавить, пожалуйста, <a href="mailto:chris@pine.fm"> сообщите мне.
[А если у вас появятся замечания или уточнения по поводу перевода на русский язык, можете написать <a href="mailto:mikhail@shokhirev.com"> переводчику. –
0. Начинаем
Когда вы пишете программу для компьютера, вы должны «говорить» на языке, который ваш компьютер понимает: на языке программирования. Есть много, очень много разных языков, и многие из них – превосходные. В этом учебнике я выбрал для использования мой любимый язык программирования – Ruby.
Помимо того, что Ruby – мой любимый язык, это также самый лёгкий язык программирования из всех, с которыми я знаком (а знаком я весьма со многими). На самом деле, это и есть настоящая причина, по которой я пишу этот учебник: не то чтобы я решил писать учебник и остановился на Ruby как на своём любимом языке; наоборот, я нахожу Ruby настолько лёгким, что решил: обязательно должен быть хороший учебник для начинающих и непременно с его использованием. Именно простота Ruby побудила меня написать этот учебник, а вовсе не то, что это – мой любимый язык. (Чтобы написать подобный учебник на примере другого языка, такого как C++ или Java, потребовались бы сотни и сотни страниц.) Но не думайте, что Ruby – это язык для начинающих, раз он очень лёгкий! Это мощный язык программирования такого профессионального уровня, который вряд ли существовал ранее.
Когда вы что-нибудь пишете на естественном языке, написанное называется текстом. Когда вы пишете что-нибудь на компьютерном языке, написанное называется кодом. Я включил множество примеров кода на языке Ruby на протяжении учебника, большинство из них – это законченные программы, которые вы можете выполнять на своём компьютере. Чтобы легче было читать код, я окрасил части кода в различные цвета. (Например, числа всегда зелёные.) Всё, что предполагается вводить в программу, заключается в белую рамку, а всё, что выводит программа, помещается в голубую рамку.
Если вам встретится что-либо, что вы не понимаете, или у вас возникнет вопрос, на который вы не находите ответа, запишите его и продолжайте читать! Вполне возможно, что ответ найдется в одной из следующих глав. Однако, если ваш вопрос останется без ответа до последней главы, я скажу вам, куда можно отправиться, чтобы задать его. Есть множество чудесных людей, которые с желанием помогут вам; нужно только знать, где их найти.
Но сначала вам нужно загрузить и установить Ruby на ваш компьютер.
Установка под Windows
Установить Ruby под Windows легче лёгкого. Сначала вам нужно загрузить <a href="http://rubyinstaller.rubyforge.org/"> установщик Ruby. Обычно имеется пара версий на выбор; в этом учебнике используется версия 1.8.4, так что удостоверьтесь, что вы загрузили версию как минимум не старее этой. (Я бы просто взял самую свежую версию из имеющихся.) Затем просто запустите программу-установщик. Он запросит у вас, куда вы хотите установить Ruby. Если у вас нет серьёзных причин для обратного, я бы посоветовал установить его в каталог по умолчанию.
Чтобы программировать, вам нужно иметь возможность писать программы и выполнять программы. Для этого вам понадобится текстовый редактор и командная строка.
Установщик Ruby поставляется с прекрасным текстовым редактором под названием SciTE (Scintilla Text Editor). Вы можете запустить SciTE, выбрав его из меню «Пуск». Если вы хотели бы расцветить код, как в примерах этого учебника, загрузите эти файлы и поместите их в каталог редактора SciTE (c:/ruby/scite, если вы выбрали каталог по умолчанию):
• <a href="http://pine.fm/LearnToProgram/SciTEGlobal.properties"> Глобальные настройки
• <a href="http://pine.fm/LearnToProgram/ruby.properties"> Настройки для Ruby
Неплохой идеей будет создать где-нибудь каталог, чтобы хранить там все ваши программы. Убедитесь, что, когда вы сохраняете программу, вы сохраняете её именно в этот каталог.
Чтобы вам добраться до командной строки, выберите «Командная строка» из подменю «Стандартные» в меню «Пуск». Вам захочется переходить в каталог, где вы храните ваши программы. Команда cd.. переместит вас в каталог уровнем выше, а по команде cd foldername вы окажетесь в каталоге под названием foldername. Чтобы увидеть все подкаталоги в текущем каталоге, введите команду dir/ad.
Вот и всё! Вы готовы, чтобы учиться программировать.
Установка под Macintosh
Если у вас стоит Mac OS X 10.2 (Jaguar)
, значит Ruby уже установлен в вашей системе! Что может быть проще? К сожалению, я не думаю, что вы сможете использовать Ruby под Mac OS X 10.1
или более ранней версией.
Чтобы программировать, вам нужно иметь возможность писать программы и выполнять программы. Для этого вам понадобится текстовый редактор и командная строка.
Командная строка доступна посредством терминального приложения («Terminal application
«), которое находится в разделе меню «Приложения / Утилиты» («Applications / Utilities
«).
В качестве текстового редактора вы можете использовать тот, что вам более знаком или более удобен. Однако, если вы используете TextEdit, убедитесь, что вы сохраняете ваши программы в виде обычного текста! Иначе ваши программы не будут работать. Другими альтернативами для составления программ могут быть редакторы emacs, vi или pico: все они доступны из командной строки.
Установка под Linux
Во-первых, вы захотите убедиться, не был ли Ruby уже установлен у вас. Наберите на консоли команду which ruby
. Если она выведет что-нибудь наподобие /usr/bin/which: no ruby in (…)
, значит вам нужно будет загрузить Ruby. Иначе посмотрите, какая версия Ruby установлена, набрав ruby -v
. Если версия старее, чем последняя стабильная сборка с упомянутой выше страницы загрузки, то вам, возможно, захочется обновить её.
Если вы работаете как пользователь root, тогда вам, наверное, не нужны будут дальнейшие указания по установке Ruby. Если это не так, вам нужно будет попросить вашего системного администратора установить его для вас. (При этом способе установки все пользователи в этой системе смогут пользоваться Ruby.)
Или же вы можете просто установить его так, чтобы только вы могли использовать его. Переместите файл, который вы загрузили, во временный каталог, например, в $HOME/tmp
. Если файл называется ruby-1.6.7.tar.gz
, вы сможете открыть его командой tar zxvf ruby-1.6.7.tar.gz. Перейдите в каталог, который только что был вами создан (в нашем примере — в каталог cd ruby-1.6.7)
. Сконфигурируйте вашу установку, набрав команду ./configure --prefix=$HOME)
. Затем наберите на консоли команду make, которая соберёт ваш интерпретатор Ruby. Это может занять несколько минут. После того, как всё будет выполнено, напечатайте make install
, чтобы установить его. Потом вы пожелаете добавить каталог $HOME/bin
в список путей для поиска команд, отредактировав ваш файл $HOME/.bashrc с настройками командного интерпретатора. (Вам нужно будет выйти из системы и зайти снова, чтобы изменения вступили в силу.) После того, как вы сделали это, проверьте успешность установки командой ruby -v
. Если она сообщит, какая версия Ruby у вас установлена, тогда вы можете удалить файлы в каталоге $HOME/tmp
(или там, куда вы их разместили).
Вот и всё! Вы готовы, чтобы учиться программировать.
Во-первых, вы захотите убедиться, не был ли Ruby уже установлен у вас. Наберите на консоли команду which ruby
. Если она выведет что-нибудь наподобие /usr/bin/which: no ruby in (…)
, значит вам нужно будет <a href="http://www.ruby-lang.org/en/20020102.html"> загрузить Ruby. Иначе посмотрите, какая версия Ruby установлена, набрав ruby -v
. Если версия старее, чем последняя стабильная сборка с упомянутой выше страницы загрузки, то вам, возможно, захочется обновить её.
Если вы работаете как пользователь root, тогда вам, наверное, не нужны будут дальнейшие указания по установке Ruby. Если это не так, вам нужно будет попросить вашего системного администратора установить его для вас. (При этом способе установки все пользователи в этой системе смогут пользоваться Ruby.)
Или же вы можете просто установить его так, чтобы только вы могли использовать его. Переместите файл, который вы загрузили, во временный каталог, например, в $HOME/tmp
. Если файл называется ruby–i.6.7.tar.gz
, вы сможете открыть его командой tar zxvf ruby–i.6.7.tar.gz
. Перейдите в каталог, который только что был вами создан (в нашем примере – в каталог cd ruby–1.6.7
).
Сконфигурируйте вашу установку, набрав команду ./configure --prefix=$HOME)
. Затем наберите на консоли команду make, которая соберёт ваш интерпретатор Ruby. Это может занять несколько минут. После того, как всё будет выполнено, напечатайте make install
, чтобы установить его.
Потом вы пожелаете добавить каталог $HOME/bin
в список путей для поиска команд, отредактировав ваш файл $HOME/.bashrc
с настройками командного интерпретатора. (Вам нужно будет выйти из системы и зайти снова, чтобы изменения вступили в силу.) После того, как вы сделали это, проверьте успешность установки командой ruby –v
. Если она сообщит, какая версия Ruby у вас установлена, тогда вы можете удалить файлы в каталоге $HOME/tmp
(или там, куда вы их разместили).
Вот и всё! Вы готовы, чтобы учиться программировать.
1. Числа
А сейчас, когда вы всё установили, давайте напишем программу! Откройте ваш любимый текстовый редактор и наберите на клавиатуре следующее:
puts 1+2
Сохраните вашу программу (да, это программа!) под именем calc.rb (.rb – это то, что мы обычно пишем в конце имени программы, написанной на Ruby). А теперь выполните вашу программу, набрав ruby calc.rb
в командной строке. Она должна вывести на экране число 3. Видите, программировать не так уж трудно, не правда ли?
Знакомство с puts
Так что же происходит в этой программе? Я уверен, что вы смогли догадаться, что делает 1+2, и наша программа, в принципе, такая же, как эта:
puts 3
слово puts просто выводит на экран всё, что следует за ним.
Целые и плавающие
В большинстве языков программирования (и Ruby не является исключением) числа без десятичной точки называются целыми, а числа с десятичной точкой обычно называются числами с плавающей точкой или проще – плавающими. [По сути, это дробные десятичные числа, представленные в компьютере в двоичном виде. –
Вот несколько целых чисел:
5
–205
99 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 0
0
А вот несколько чисел с плавающей точкой:
54.321 0.001 –205. 3884
0.0
На практике в большинстве программ плавающие числа не используются, только целые. (В конце концов, никто не хочет прочитать 7.4 сообщений электронной почты, просмотреть 1.8 web–страниц или послушать 5.24 любимых песен…) Числа с плавающей точкой больше используются для научных целей (физических экспериментов и тому подобное) и для ЗЭ-графики. Даже большинство программ для денежных расчётов применяют целые числа: в них просто учитываются суммы в копейках! [в оригинале: «в пенсах»–
Простая арифметика
К этому моменту у нас есть всё необходимое, чтобы сделать простой калькулятор. (В калькуляторах всегда используются плавающие числа, поэтому если вы хотите, чтобы ваш компьютер просто работал как калькулятор, вы также должны использовать числа с плавающей точкой.) Для сложения и вычитания мы используем + и -, что мы уже видели в программе. Для умножения мы используем *, а для деления мы используем /. На большинстве клавиатур эти клавиши располагаются среди цифровых клавиш в правой её части. Если у вас уменьшенная клавиатура или ноутбук, то вы можете просто нажать клавиши Shift и 8 или / (та же клавиша, что и клавиша ?). Давайте попробуем немного расширить нашу программу calc.rb. Наберите на клавиатуре, а затем выполните следующее:
puts 1.0 + 2.0
puts 2.0 * 3.0
puts 5.0 – 8.0
puts 9.0 / 2.0
Вот что возвращает эта программа:
3.0
6.0 –3.0 4.5
(Пробелы в программе не важны; они просто делают код легче для чтения.) Что ж, в том, что мы увидели, нет ничего удивительного. А теперь давайте испробуем на целых числах:
puts 1+2 puts 2*3 puts 5–8 puts 9/2
В основном, то же самое, правда?
3
6
–3
4
Хм… кроме последнего! Но когда вы выполняете арифметические действия с целыми числами, вы получаете целочисленные ответы. Когда ваш компьютер не может получить «правильный» ответ, он всегда округляет его. (Конечно, 4 и есть правильный ответ в целочисленной арифметике для выражения 9/2; хотя, возможно, это не тот ответ, который вы ожидали.)