give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

筆者自らが語る「プロを目指す人のためのRuby入門」のこだわりと見どころ

このブログでもすでに何度か紹介していますが、いよいよ2017年11月25日に僕が執筆した「プロを目指す人のためのRuby入門」が発売されます。
僕の手元には一足先に見本誌が届きました!

表紙は真っ赤なチェリーが目印です。

f:id:JunichiIto:20171119171711j:plain

背表紙もよく目立つ赤色!
写真ではわかりにくいですが、普通の赤色ではなく、少しピンク色がかった個性的な赤色です。

f:id:JunichiIto:20171119171807j:plain

すでに東京都内を中心に、一部の書店では先行発売が始まっています。

  • ジュンク堂書店 池袋本店(池袋)
  • 三省堂書店(神保町)
  • 書泉ブックタワー(秋葉原)
  • 有隣堂 ヨドバシAKIBA店(秋葉原)
  • 紀伊國屋書店 新宿本店(新宿)
  • 丸善 丸の内本店(丸の内オアゾ)
  • 丸善 ラゾーナ川崎店(川崎市)

書泉ブックタワーでは早くもコンピュータ書のベスト3に入ったらしいです。
(まだ先行発売期間中なのにすごい!)

お近くに書店がない場合はAmazonでも予約注文できます。

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

また、電子書籍版(Kindle、EPUB、PDF)も正式発売日(11月25日)頃に発売される予定になっています。

ところで、このブログではまだしっかり本書の紹介をしていませんでした。
そこで今回のエントリではこの本のこだわりと見どころをいろいろ紹介したいと思います。

その前に、ちょっと長いので先に目次を載せておきますね。

それでは以下が本編です!

どんな本なの?

簡単にいうと、本書は「他の言語での開発経験があり、これからRubyを始めたい人」や「Rubyプログラミングの経験はある程度あるものの、まだまだ自信がない人」に向けて、Rubyの言語仕様や開発の現場で役立つ知識を詳しく、ていねいに解説した技術書です。

単にRubyの文法や言語仕様を解説するだけでなく、本書には次のようなコンテンツも含まれています。

  • 各章ごとにチュートリアル形式+テスト駆動開発で説明する例題
  • Rubyのデバッグ技法(うまく動かないときも冷静に対処できるように!)
  • リファクタリングのポイント
Railsアプリを作りたい人に特にオススメ!

本書はあくまで「Rubyの本」であり、「Railsの本」ではありません。
ですが、僕自身が普段Railsアプリをメインで開発していることもあって、「Railsアプリを作るならここは絶対に押さえておきたい」というRubyの学習ポイントはひととおり網羅するようにしました。
なので、「Rubyを勉強する一番の理由は、Railsアプリを開発するためだ」という人に特に向いています。

表紙にも書いてあるとおり、キャッチフレーズは「Railsをやる前に、Rubyを知ろう」です。

注意:プログラミング未経験者向けの本ではありません

本書はプログラミング未経験者向けの本ではない点に注意してください。
本書で想定している読者は、他の言語で開発の経験があったり、すでにある程度Rubyプログラミングを進めていたりする人です。

「変数とは」「配列とは」といった「プログラミングの基本のキ」は説明していないので、まったくプログラミングをやったことがないという人は、先に別の書籍やオンライン教材で勉強しておくことをおすすめします。

本書で説明する内容

本書ではRubyに関する次のような内容を、それぞれ章を分けて詳しく説明しています。

  • Rubyの基礎(文字列・数値・真偽値・条件分岐・メソッド定義etc)
  • 配列・範囲(Range)・繰り返し処理
  • ハッシュ・シンボル
  • 正規表現
  • クラスの作成
  • モジュール
  • 例外処理
  • yield・Proc

また、以下の内容も説明していますが、これらは第12章の中でまとめて「あっさりと」説明しています。

  • 日付や時刻
  • ファイルやディレクトリ
  • CSV・YAML・JSON
  • 環境変数や起動時引数
  • evalやsendメソッド
  • Rake
  • gemとBundler

なぜあっさりにしたのか、その理由はまたのちほど説明します。

本書で説明しない内容

一方、次のような内容は本書では説明の対象外としています。

  • マルチスレッドプログラミング
  • メタプログラミング
  • gemの作成と公開
  • C言語を使った拡張ライブラリの作成

これらの内容を詳しく知りたい方は、「パーフェクトRuby」や「メタプログラミングRuby」といった他の専門書を読んでください。

「本書の刊行に寄せて」の執筆はなんと、まつもとゆきひろさん!

本書の冒頭にある「本書の刊行に寄せて」の文章は「Rubyのパパ」こと、まつもとゆきひろ(Matz)さんにお願いして書いてもらいました!
まつもとさんに執筆していただけるなんて、僕は本書の著者として大変光栄です。
みなさん、ぜひご一読を!

f:id:JunichiIto:20171120050531j:plain

試し読みはできるの?

はい、できます。
技術評論社の書籍ページで第5章「ハッシュやシンボルを理解する」の一部と、「本書の刊行に寄せて」「まえがき」がPDFとして公開されています。

gihyo.jp

筆者自らが語る「プロを目指す人のためのRuby入門」のこだわりと見どころ

さて、ここからは筆者である僕自身が、本書のこだわりと見どころを書いていきます。
本書を手に取っていただいた際は、ぜひこれらのポイントにも注目してください!

リファレンス本にしない

配列やハッシュのメソッドをあれこれ1つずつ説明するようなリファレンス本にはしていません。
いや、実は最初の原稿ではたくさん説明していたんですが(たとえばzipメソッドの使い方とかね)、ページ数も大幅に増えるし、「そもそもこんなの、ググったら公式ドキュメントに載ってるじゃん?」と思ったので、途中でばっさりカットしました。

なので、本書では「APIドキュメントを見れば載っている内容」は必要最小限にして、「APIドキュメントにはない説明」や「ググっても出てこない情報」を優先して書くようにしています。

構文や言語機能はひととおり網羅する

前述の通り、ライブラリのメソッドを一つずつ説明するようなことはしていませんが、Rubyの構文や言語機能はひととおり網羅するようにしました。
ふだんそこまで目にしないような使用頻度が少ない機能も紹介しています。

たとえば、以下のコードに出てくる**とかです。(5.6.2項のサンプルコードから抜粋)

h = { us: 'dollar', india: 'rupee' }
# 変数hのキーと値を**で展開させる
{ japan: 'yen', **h } #=> {:japan=>"yen", :us=>"dollar", :india=>"rupee"}

あとはブロックローカル変数とか(4.8.5項のサンプルコードから抜粋)。

numbers = [1, 2, 3, 4]
sum = 0
# ブロックの外にあるsumとは別物の変数sumを用意する
numbers.each do |n; sum|
  # 別物のsumを10で初期化し、ブロック引数の値を加算する
  sum = 10
  sum += n
  # 加算した値をターミナルに表示する
  p sum
end
#=> 11
#   12
#   13
#   14

# ブロックの中で使っていたsumは別物なので、ブロックの外にsumには変化がない
sum #=> 0

ライブラリのメソッドであればその名前でググりやすいんですが、コードの中に出てきた**とか|n; sum|;とかって、非常にググりにくいんですよね。
自分で使うことはなくても、他の人が書いたコードに**|n; sum|が出てくる可能性はゼロではありません。
なので、そうしたコードを見たときに「これ何だっけ?あ、そういえばあの本に載ってた気がするな」と思ってもらえるように、構文やRuby標準の言語機能は一通り網羅するようにしています。

「ただのライブラリ」であれば、自力で使い方を調べてもらう

反対に、「ただのライブラリ」であれば特別な構文や言語機能を使うわけではないので、説明を最小限にしています。
「ただのライブラリ」というのは具体的にいうと、DateクラスやFileクラスのことです。
DateクラスやFileクラスの場合は、結局APIドキュメントを見れば使い方がわかるものがほとんどです。
なので、「基礎がしっかりしていれば、あとは自力でなんとかできるはず」ということで、多くのページを割いて説明するのは見送ることにしました。

DateクラスやFileクラスを第12章でまとめて「あっさりと」説明したのはこうした理由からです。

あえて主観を強くする

本書では僕自身の経験に基づく、僕自身の考えをあえてたくさん散りばめています。
本書を読んでもらうと気づくと思いますが、「実際はxxxはあまり使われません」とか「こちらの書き方の方がいいでしょう」といった文言が頻繁に登場します。
これは、主観を排除して機能的な説明に終始してしまうと、結局APIドキュメントと同じような本になってしまうと考えたからです。

また、Rubyの場合は1つのことを実現するのに、いろんな方法が用意されていることが多いです。
そうした場合、初心者のうちは「いっぱいあるけど、いったいどれを使えばいいの??」と迷いがちになると思います。
なので、「おすすめはこっち」とか「こういう仕様になっているが、あまり使わない方が良い」と優先度や重要度に濃淡を付けて、できるだけ学習の負担を減らすように配慮しました。

25ページ:
f:id:JunichiIto:20171120051720p:plain

141ページ:
f:id:JunichiIto:20171120051725p:plain

もちろん、主観が強いということは、他のRubyプログラマ(特に経験豊富な上級者)と意見がぶつかりやすくなるデメリットもあります。
ただ、どちらかが絶対正しいということはケースは少ないと思うので、もし僕の説明と違うことを言う人に出会ったら、うまく議論して良い着地点を見つけてもらえればと思います。

簡単な内容から高度な内容へ進むように構成した

章の構成や章の中身の構成(説明の順番)はかなり頭を悩ませたテーマの一つです。

まず、章の構成については基本的に後半になればなるほど難しく、高度になっていきます。
各章の内容はそれまでに説明してきた内容を理解できている、という前提で進んでいくので、最初は前から順番に読んでいってください。

また、1つ1つの章の内部も簡単な内容から高度な内容へ進むようになっています。
後半に出てくる難しい内容はそこまで登場頻度が高くないものもあるので、最悪「困ったときにまた読み直す」でも構いません。

章末問題ではなく、「章中問題」になっている

少し変わっているのは章ごとの例題が章末ではなく、「章の途中」に登場するところです。

f:id:JunichiIto:20171120070904p:plain

執筆当初は「ふつうは章末に例題が来るよねー」と思って、例題を章末に書いていたのですが、ソニックガーデンの同僚に原稿をレビューしてもらったところ「例題にたどり着く前に読み疲れてしまう」「例題を読む頃には最初の方に出てきた内容を忘れてしまう」といった意見が続出しました。

なので「これはまずい」ということで、あれこれ修正案をひねり出し、最終的に次のような順に落ち着きました。

例題を解くために必要な知識の説明
 ↓
例題の解説(チュートリアル形式)
 ↓
例題に登場しなかった高度なトピック

少し変わった順番ですが、そのぶん長い章や難しい章でも途中で脱落しにくくなっていると思います。

テーマ(説明する技術分野)によっては章を分散させた

「1つのテーマを1つの章に無理に押し込まない」というのも少し変わったポリシーかもしれません。
たとえば、「Rubyにおけるメソッドの定義」を説明しようとすると、以下のようなさまざまな種類のメソッドを説明する必要があります。

  • シンプルなメソッド
  • 可変長引数を使うメソッド
  • キーワード引数を使うメソッド
  • ブロックを使うメソッド

普通の入門書だと、これらの説明が「メソッド定義」の項に全部詰め込まれていることが多いかもしれません。

しかし、可変長引数を使うのであれば配列の知識が、キーワード引数を使うのであればハッシュの知識が、ブロックを使うのであればProcの知識が、それぞれ必要になります。
なので、本書ではメソッド定義の説明が次のように各章に分散しています。

  • シンプルなメソッド
    → 第2章・Rubyの基礎を理解する
  • 可変長引数を使うメソッド
    → 第4章・配列や繰り返し処理を理解する
  • キーワード引数を使うメソッド
    → 第5章・ハッシュやシンボルを理解する
  • ブロックを使うメソッド
    → 第10章・yieldとProcを理解する

「メソッド定義の方法をリファレンス的に調べたい」というときには少し不便ですが、そのぶん、前から順番に読んでいったときは、説明がスムーズに頭に入ってくるはずです。

例題の動作確認はテストコードから行う

第2章と第9章以外は、全部例題の動作確認をテストコードから行っています。
テスティングフレームワークはMinitestを使っています。
たとえば、こんな感じです。(第5章の例題から抜粋)

require 'minitest/autorun'
require './lib/convert_length'

class ConvertLengthTest < Minitest::Test
  def test_convert_length
    assert_equal 39.37, convert_length(1, from: :m, to: :in)
    assert_equal 0.38, convert_length(15, from: :in, to: :m)
    assert_equal 10670.73, convert_length(35000, from: :ft, to: :m)
  end
end

初心者向けの入門書では「putsメソッドやprintメソッドを使って画面やターミナルに結果を表示&目視で確認」といった形で説明することが多いかもしれません。
しかし、「プログラムの実行結果を毎回目視で確認」なんていうことは、本格的な開発の現場ではやらないはずです。(ですよね?ね、ね??)

テストコードやテスト駆動開発は慣れさえすれば簡単ですし、毎回目視で確認するより開発効率がよくなります。
それに、コードをきれいに書き直すリファクタリングでもテストコードは必要不可欠です。

「入門書だからテストコードの書き方は後回しにする」ではなく、「入門書だからこそ最初からテストコードをどんどん書いて慣れてもらう」というのが、この本のポリシーです。

可能な限りサポートページで最新情報に追従していく

Everyday Railsのような電子書籍オンリーの本と比較すると、紙の本は一度出版されると簡単に内容がアップデートできないのが難点です。
また、IT関連の技術書は移り変わりが早いため、数年すると本の情報が古くなってほとんど役に立たなくなることも多いです。

Rubyはプログラミング言語なので、Railsのようなフレームワークに比べるとまだ安定していますが、それでもときどき後方互換性が失われる変更が入ることもあります。

そこで、「プロを目指す人のためのRuby入門」では僕が開設した著者サポートページでできるかぎり最新情報を補完していこうと考えています。

ruby-book.jnito.com

たとえば、本書はRuby 2.4をベースに執筆しましたが、2017年12月25日にはRuby 2.5のリリースが控えています。
もし本書で説明している内容と、Ruby 2.5の動作で大きな差異が発生する場合は、この著者サポートページでどこがどう変わるのかを説明する予定です。

こうしたアップデート情報は以下のFacebookページでもお知らせしていきます。
Facebookアカウントをお持ちの方はぜひ「いいね!」または「フォロー」をして、アップデート情報をキャッチしてください!

Junichi Ito's Books(伊藤淳一の著書)- Facebook

表紙デザインにチェリーが使われている理由

表紙デザインには大きなチェリー(さくらんぼ)の写真が使われています。

f:id:JunichiIto:20171117134149j:plain:w250

表紙デザイナーさんいわく、さくらんぼを選んだのは「果物のルビー」と言われているから、だそうです。

本書のタイトルは「プロを目指す人のためのRuby入門」ですが、ちょっと長いので「チェリー本」のような愛称が付くといいなーと個人的には思っています。
みなさんも略して呼びたいときはぜひ「チェリー本」で!🍒

編集者さんからも見どころを一言

ところで、僕のPRだけではなく、編集者さんからも見どころを語ってもらおう、ということで、今回編集を担当してくれた技術評論社の吉岡さんにも本書の見どころや印象に残っているエピソード等を質問してみました。

Q. 本書の見どころを教えてください。

各章の真ん中あたりにある例題が見どころだと思っています。本書は、学んだ知識を本書の中ですぐに試せるよう随所に工夫がこらしてありますが、その最たるものがこの例題です。チュートリアル形式になっているので、リファクタリングやテスト駆動開発の手順もよくわかりますし、パズルを解くような、プラモデルを組み立てていくような、そんな楽しさも感じられると思います。

Q. 編集者として注目してほしいポイントや、裏方としての苦労は何かありますか?

伊藤さんからは紙面に関していろいろな注文をいただきましたが、中でも「こまか!」と思ったのが「~」の文字の位置を行の上下中央にしてほしいという注文です(当初、~は行の上よりに配置されるフォントになっていた)。

修正前:
f:id:JunichiIto:20171117140624p:plain

修正後:
f:id:JunichiIto:20171117140628p:plain

この修正は~の部分を1文字ずつ修正していく必要があるため、結構手間のかかる修正でした。しかし、コード中で<<~のような書き方をすることを考えると、プログラマにとっては重要なことなのだろうと思い、対応しました。ほかにも伊藤さんに指摘を受けたところ(コメントの微妙な記載位置とか)はできるかぎり対応したので、プログラマが見ても違和感のないレイアウトになっていると思います。

Q. 伊藤さんと仕事を進めてきて印象に残っているエピソードがあれば教えてください

私が記憶しているかぎり、本書は最低でも2回大きな書き直しをしています。下書き段階でレビュアーの指摘を受けて構成を大きく見直したときと、初校の段階で読者目線で読み直したうえで細かなコンテンツの入れ換えをしたときです。大きな書き直しのたびに、本書の目的から外れる内容は大胆に省かれ、足りない情報は細かく補われ、確実に読者に必要な情報のみにまとめられていきました。捨てられたものの内容や量を知っているだけに、本書に収録された情報は、私にはすべてエース級の価値あるものばかりに感じられます。

Q. とはいえここだけの話、「伊藤さんのここが困った」というような話も結構あるんじゃないですか?

ええ(笑)。前述のとおり、伊藤さんの推敲はなかなかアクロバティックです。校正段階でもその勢いは止まらず、「まだ修正できるなら修正したい! いや、修正すべき!」という熱意がビリビリ伝わってきました。それに合わせて紙面を修正していくのは大変でした。内容の質は上がったので結果的には良かったのですが、当時は「推敲は執筆段階で完了していてほしかった」という思いがあったり、なかったり……。

筆者からのコメント

吉岡さん、回答ありがとうございました。

そうそう、原稿はなんだかんだで100ページ以上カットしましたね。
せっかく書いたので、あの原稿はどこかで無料公開したいなーと思っています。

注文に関してはいろいろ細かくてすいません💦 入稿直前の推敲でも大変お世話になりました。
ギリギリまで修正に付き合ってもらったおかげで、"factory_girl_rails" も "factory_bot_rails" に変更できました!

441ページから抜粋:
f:id:JunichiIto:20171120053642p:plain:w300

One more thing: 本の「開いたままにしやすさ」にも注目!

先ほどの吉岡さんのコメントには出てきませんでしたが、僕が見本誌を受け取って「おおっ!」と思ったのは、これだけのボリューム(472ページ)であるにも関わらず「本を開いたまま」にしやすいことです。

上のツイートにもあるように、本を開いたままキープしやすいので、コードを写経するときも楽に勉強できます。
これも吉岡さんが最適な本文用紙をチョイスしてくれたおかげです。
みなさんも実物を手にしたらぜひチェックしてみてください!

まとめ(と、お願い)

というわけで、このエントリでは2017年11月25日に発売される「プロを目指す人のためのRuby入門」のこだわりと見どころをあれこれ書いてみました。

ところで、最後にひとつだけみなさんにお願いがあります。
もし「面白そうだな~。買ってみようかな~。」という人がいたら、できるだけ早め(年内ぐらいを目処)に購入してもらえると嬉しいです。

というのも、最初の1~2ヶ月の売れ行きが良いと、書店さんは「これは売れる本だ」ということで常時在庫を確保してくれるらしいからです。
逆に「売れ行きが悪い本だな」と思われると、返本されてずっと在庫ゼロになってしまうんだそうです。

もちろん、いつ買うかはみなさんの自由なので無理にとは言いませんが、「仕方ないな~、協力してやるか~」という心優しい人がいたら、気持ち早めに購入してもらえるとありがたいです。
よろしくお願いします🙏

Rubyの入門書はすでにたくさん出ていますし、最近はオンライン教材なんかも充実してきているので、「紙でできた新しいRubyの本」は結構不利だよなあ、という気はしています。
しかし!!
そんな不利な状況だからこそ、「日本で一番わかりやすいRubyの入門書を目指してやる!😤」という気概でこの1年間、原稿を書いてきました。

このエントリで述べたとおり、既存の入門書にはない創意工夫もたくさん取り入れています。
そうした工夫が吉と出るか凶と出るか、これから本の売れ行きやみなさんの感想を見ながら、じっくり判断していきたいなーと思っています。

それではみなさん、「プロを目指す人のためのRuby入門」(チェリー本)をよろしくお願いします!!

f:id:JunichiIto:20171119171614j:plain
みなさん、よろしくね!

ご購入はこちらから

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

正式発売前は先行発売中の下記の書店へ!

  • ジュンク堂書店 池袋本店(池袋)
  • 三省堂書店(神保町)
  • 書泉ブックタワー(秋葉原)
  • 有隣堂 ヨドバシAKIBA店(秋葉原)
  • 紀伊國屋書店 新宿本店(新宿)
  • 丸善 丸の内本店(丸の内オアゾ)
  • 丸善 ラゾーナ川崎店(川崎市)

書評はこちら

Misocaの麦島さんに本書の書評を書いてもらいました。
何も言ってないのにしっかりと大事なポイントを押さえてくれているので、こちらもぜひ!
mugi1.hateblo.jp