書籍紹介『初めてのプログラミング』

編集:ささだ

書籍紹介『初めてのプログラミング』

著者
Chris Pine
訳者
西山 伸
発行日
2006 年 7 月 25 日
体裁
B5 変型版 2 色 196 ページ
定価
本体 1,900 円(税込 1,995 円)
ISBN
ISBN4-87311-292-3

Ruby を使ったプログラミングの入門書ができました。行間から著者の Ruby への愛情が感じられる、あたたかみのある本です。プログラミングの経験のない読者に、飽きずに、興味を持って読み進めてもらえるよう、やさしい記述を心がけて書かれています。Ruby の入門書というよりも、プログラミングへの入門書として書かれている本です。Rubyist Magazine をご覧のみなさんはあらためてプログラミングに入門する必要はないと思いますが、とてもよい本なので、みなさんの身近に「プログラミングを勉強してみたい」という人がいたら、ぜひ本書をおすすめください。

著者からのメッセージ

原文

Hello, RUBIMA readers!

Since I wrote “Learn to Program”, the question I am asked most often is: “What are the answers to the exercises in the book?”

The first, sort of cute answer I like to give is: There are no right answers to a creative writing assignment. If I asked you to write a story with a wizard in it, what’s the right answer? “Harry Potter”, you say? Nope! The correct answer is “The Lord of the Rings”. 10 points for Tolkien, everyone else (even you, J. K. Rowling) has to try again. :)

Now this is cute, kind of funny anwer, but there’s some truth to it. The fact is, however, that this truth is much more apparent on large projects than on small ones… the smaller the project, the less opportunity for creativity. For example, the beloved “hello world” program. I think the majority of rubyists would really only give one answer:

 puts 'hello world'

And some of the exercises in “Learn to Program” (at least toward the beginning) are pretty small, and any solution program is going to look more or less like any other. (But these are so easy that once you write a program that does it, you know it’s right; no one ever asks for solutions to these problems.)

At some point in the middle of the book, though, the exercises get a little tougher, and already people can have fairly different programs that solve the problem. This is around the same time that people start adding their own little bits to their programs, so they do things I never asked for. As soon as a problem is complex enough to be solved in more than one way, creativity emerges. I don’t want to do anything to stifle that!

Things brings me to my real answer: If the program does what you want it to do, then it works. :) The part I stress is “what you want it to do, not what I want it to do”.

After working on a program of even mild complexity, many people start to see ways they could change the program to make it just a little bit better. In the process, the program becomes more personalized, more precious. It is this feeling of craftsmanship that leads to a love of programming. A strict sense of “this is the right answer” strangles this process, never lets it develop.

Another reason why I like this answer is that it’s just a short step away from the mantra of test-driven development: If your program passes all of your tests, then it is done. I’ll say, “If you don’t know what you want your program to do, how will you know when it does it? And if you do know, well then, write a test for it.”

Or maybe the real reason was that I, too, got stuck on that sorting exercise, and never did get that program working… :)

Happy Rubying!

Chris Pine
Oslo, Norway
28 August, 2006

日本語訳

Hello るびま readers!

『初めてのプログラミング』を書いてから、最もよく聞く質問は「この本の練習問題の答えは何ですか?」というものです。

これに一言で答えるなら、「計算問題じゃないんだから、正解なんかない」です。たとえば、問題をこうしましょう。「魔法使いの出てくる話を作りなさい」。答えは何かって?正解は『指輪物語』です。「これが正解」です。『ハリーポッター』はどうかですって?いいえ、不正解です。正解は『指輪物語』なんですから。トールキンに 10 ポイントあげましょう。他の話を書いた人は J.K. ローリングも含めて皆やり直し!

ありえないですよね。

ではこちらはどうでしょう。みんなの好きな hello world プログラムです。ほとんどのRubyist はこんな風に答えるでしょう。

 puts 'hello world'

ここで言いたいのは、このような小さな問題は、魔法使いの出てくる小説を書けというような大きな問題に比べて、創造性を発揮する余地がないと言うことです。

『初めてのプログラミング』の練習問題 (少なくとも最初のほう) にも小さな問題があります。そして、その解答プログラムはお互いに似通ったものになるでしょう。(でも、これらの問題はとても簡単なので、一度実行できるプログラムを書いたら、それが正しいということが“わかる”でしょうから、それらの問題の答えをあえて訊こうという人はいないと思います。)

本の中ほどから、練習問題はタフなものになり、その問題を解くのに全く異なるプログラムが書けるようになります。それに前後して、人々は自分のプログラムに少しずつ独自性を追加していくようになり、私が要求していないことをやりはじめます。複数の方法で解くことができるようになるくらい複雑な問題を相手にするようになれば、すぐに、創造性が発現します。私は、それをつぶすようなことは何一つしたくありません。

と言うことで、本当の答えに到達しました。もし、プログラムがあなたの期待通りの事をするなら、それはうまく動いています :)。強調したいのは、“あなた”の期待通り、であって“私”の期待通りではないということです。

複雑なプログラムに挑戦すると、多くの人は、それをもうちょっと良いものにできないかと、プログラムを改良する方法を探り始めます。この過程で、プログラムは、より個性的で価値の高いものになっていきます。こういった職人気質を感じてこそ、プログラミングが好きになっていくのだと思います。厳密な意味での「これが正解」は、この過程を抑制し、発展を止めてしまいかねません。

私がこの答えを気に入っているもう一つの理由は、これが、テスト駆動開発のマントラ:つまり「プログラムが全てのテストをパスしたら、それで完成。」ということから、半歩身を引くためのものだからです。私に言わせるなら、もし、プログラムに何をさせたいかがわかっていなかったら、それをいつ行うべきかをどうやって知るというのでしょう。そしてもしそれがわかったなら、そのときになってはじめてそのテストを書くべきでしょう。

まぁ、でも、本当の理由は…、わたしもソートプログラムの練習問題でつっかえてて、プログラムを実行させられなくなってしまったから…かも知れません… :)

Happy Rubying!

2006 年 8 月 28 日
ノルウェイ オスロにて
Chris Pine

翻訳者からのメッセージ

この本『初めてのプログラミング』は、 「プログラミング入門 – Rubyを使って –」 の内容に、加筆して書籍化したものです。

2004 年の夏、Ruby のチュートリアルを探していたところ、_why the lucky stiff さんの why’s (poignant) guide to ruby にリンクがあって、Learn to Program を見つけました。 とてもわかりやすく、さくさくと読め、完成度が非常に高かったのを思い出します。 オープンドキュメントだったと言うこともあり、翻訳を開始しました。

著者の Chris Pine 氏に初めて連絡をとったのは大体の翻訳が終わって、サイトの 公開をしたころです。そのとき、日本語への翻訳をとても喜んでくれて、 公開時にはオリジナルのサイトからリンクをしてもらい、また ruby-talk で紹介も してもらいました。 今年の初めにオリジナルサイトの内容を元に大幅に加筆されてアメリカで本が出版 されました。1 番のファンでもある私は早速手に入れて、これが日本でも出版されたら 良いなと思っていました。それが自分の手で翻訳できてとてもラッキーです。 日本語版の出版について Chris に連絡をしたところ、前書きと、オリジナル文章 である『プログラミングを教える人へ』の執筆を快く引き受けてくれました。 また、今回も、本の紹介がるびまに掲載してもらえると伝えたら、それに向けた 文章を 1 日で書き上げてくれました。

上記サイトを公開して以来、るびまの「Ruby の歩き方」からも、Link していただいた おかげでたくさんの訪問者に恵まれ、アドバイスやサジェスチョンをいただき、 とても感謝しています。 Chris の言う「これが正解」で言えば、この日本語訳は当然一つの答えでしか ないわけで、私一人で訳しているだけの完成度に比べれば、多くの方の力で もっともっと良い訳に育っていっているわけです。

本書のあとがきにも書きましたが、この本は徹底的に初心者志向です。 70 歳を過ぎた私の母は全くコンピュータを触ったこともない人ですが、 この本のイントロダクションを読んで、プログラミングがどういうものなのか 納得してもらえました。「コンピュータって案外ばかなのね。」と言っていました。 この本が、だれかに薦める一冊として、心にとめてもらえるものになれば幸いです。

2006 年 9 月 4 日
西山 伸

目次

著者まえがき
イントロダクション

1章 プログラミングを始める準備
	1.1 Windows
	1.2 Mac OS X
	1.3 Linux

2章 数と計算
	2.1 puts入門
	2.2 整数(integer)と浮動小数点数(float)
	2.3 単純な計算
	2.4 練習問題

3章 文字列
	3.1 文字列の計算
	3.2 12と'12'
	3.3 問題発生

4章 変数と代入

5章 数と文字列の変換
	5.1 変換
	5.2 putsに対するもう1つの見方
	5.3 メソッドgetsとchomp
	5.4 練習問題
	5.5 変数についての注意

6章	メソッド
	6.1 文字列メソッド特選
	6.2 練習問題
	6.3 少し程度の高い数学
	6.4 さらなる演算メソッド
	6.5 乱数
	6.6 Mathオブジェクト

7章	流れ制御
	7.1 比較メソッド
	7.2 分岐
	7.3 ループ
	7.4 論理を少し
	7.5 練習問題

8章	配列とイテレータ
	8.1 メソッドeach
	8.2 さらなる配列メソッド
	8.3 練習問題

9章	メソッドの作り方
	9.1 メソッド引数
	9.2 局所変数(local variable)
	9.3 返り値
	9.4 練習問題

10章 再帰とこれまでの復習
	10.1 再帰
	10.2 通過儀礼:並べ替え(ソート)
	10.3 練習問題
	10.4 例をもう1つ
	10.5 追加練習問題

11章	ファイルの読み書き、そして覚えておきたいあること
	11.1 何かをする、ということ
	11.2 コンピュータに関するあること
	11.3 大人のためのセーブとロード
	11.4 YAML
	11.5 写真ファイルのリネーム
	11.6 練習問題

12章	クラス
	12.1 Timeクラス
	12.2 練習問題
	12.3 Hashクラス
	12.4 範囲
	12.5 文字列に関していろいろ
	12.6 追加練習問題
	12.7 たくさんのクラスとClassクラス

13章	新しいクラスの作成と既存のクラスの更新
	13.1 練習問題
	13.2 クラスを作る
	13.3 インスタンス変数
	13.4 追加練習問題

14章	ブロックと手続きオブジェクト
	14.1 手続きオブジェクトを受け取るメソッド
	14.2 手続きオブジェクトを返すメソッド
	14.3 メソッドに対して(手続きオブジェクトではなく)ブロックを渡す
	14.4 練習問題

15章	この本を超えて
	15.1 irb:インタラクティブRuby
	15.2 PickAxe本:プログラミングRuby
	15.3 ruby-talk:Rubyのメーリングリスト
	15.4 TMTOWTDI(ティムトアディ)
	15.5 おしまい

付録A	Rubyと日本語環境
	A.1 漢字コードと変換
	A.2 日本語メソッド

プログラミングを教える人へ
訳者あとがき
索引