セキュリティ、DB設計、パフォーマンス分析__。Railsを使ったWebアプリ開発をパワーアップする書籍6冊

2024年12月18日

日本Rubyの会代表理事

高橋 征義

株式会社達人出版会代表取締役、一般社団法人日本Rubyの会代表理事。20世紀末よりWeb制作会社にてプログラマーとして勤務する傍ら、任意団体として日本Rubyの会を設立。後に法人化し、現在まで代表理事を務める。2010年よりITエンジニア向けの電子書籍の制作と販売を行う達人出版会を創業、現在まで代表取締役。ほか、RubyKaigiや技術書典の運営にも関わる。著書に『たのしいRuby』(共著)など。好きな作家は新井素子。
X:@takahashim

はじめに

こんにちは、高橋征義(@takahashim)と申します。一般社団法人日本Rubyの会という、Rubyの開発者と利用者を支援する会の代表をしています。この組織もそれなりに長いのですが、WebサイトやWebアプリをつくり始めたのはそれ以上に長く、学生の趣味だった時代も含めますとかれこれ30年ほどになるでしょうか。今でも仕事と趣味の両方でWebアプリのコードを読み書きしています。改めて文字にして記すと異様に長いですね……。でもWebプログラミングには30年やっていてもぜんぜん飽きない面白さがあります。

さて本稿のお題は「Ruby on Rails(以下Rails)アプリ開発者向けの書籍紹介」です。イメージとしては「Railsアプリ開発を始めて4、5年たってる人が、次のステップに進むために読む本」といった内容を想定しているのですが、普通のRuby本・Rails本ですとそこまで習熟する前に読んでおいていただきたいレベルのものが多いんですよね。

※ ところで本稿では、「Railsアプリ開発(者)」という言葉で「Ruby on Railsをフレームワークとして使用しているWebアプリケーションの開発(者)」を指すことにさせてください。Railsそのものの開発(者)も大事なのですが、本稿では触れておりません。

また、Railsはおかげさまで順調に開発が進んでいるフレームワークで、つい先日出たRails 8でも古い機能が非標準になったり新たなモジュールが加わったりしています。私見ではRailsは変化を比較的肯定的に捉えており、多少の手間が必要となってもアップグレードのためのガイドを充実させながら新バージョンに追従させようとしているようです。そういう背景もあるため古めの本はあまり紹介しない方がいいかも? という気持ちもあります。

そして新しめの知識ですと、おそらくネットの記事やカンファレンスの発表資料・動画、あるいはGitHubなどでのissuesやコミットログなどが情報源となっており、本としてまとまったものではなさそうな気がします。

かといって、であれば本は読まずにネットだけに絞った方がよいかというと、それもまた少し違うように思います。そもそもあらためて考えてみると、何年もRailsアプリ開発を続けている人が期待しているのは、Railsに限らない、Webアプリケーション開発にかかわる広範な知識と実体験によるものになるのではないでしょうか。

そう考えると、むしろRubyやRailsに関する本よりも、もう少し幅広い題材の本をおすすめする方が良さそうです。ということで、上記のようなテーマを寄稿することにしました。

想定しているレベル感について

本稿の対象読者としては以下のようなスキルレベルを想定しています。

  • Rails Guides(あるいは日本語訳のRailsガイド)はだいたい一通り読んでみたことがある(ただし完全には理解できてないところもあるかもしれない)
  • Rubyリファレンスマニュアルも必要に応じて読んだことがある(理想的にはArray、String、Hash、IO、Enumerableなどは全てのメソッドの説明を一度は読んでおいた方が良いです)
  • Railsのソースコードや使用しているgemのソースコードも必要に応じて読んだことがあるが、読めば何でも理解できるわけでもない

もちろん、例えばソフトウェア開発の経験はあるけどWebはそんなに詳しくないとか、あるいはまだそこまで達してないけど今のうちから学んでおきたいといった方も大歓迎です。なおRailsに超詳しい方が冷やかしに読まれるのもwelcomeですが、お手柔らかにお願いします。

「Rails Guides」はRailsについての大変良くできた公式ドキュメントです。まだ読んでない記事があるのであれば全部読まれることをおすすめします。中級者になると読むまでもなく知ってることの方が多いかもしれませんが、こういう文書が便利なのはRails初心者やまだ中級まで達していない人がチームにいたときに「ここに書いてあるよ」とURLを添えて伝えられることです。こういう用途では誰でも読めるネットのコンテンツは重宝します。

前置きが長くなってしまいましたが、そろそろ本題の書籍紹介に入りましょう。

書籍リスト
  1. 1. 『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』徳丸浩 著
  2. 2. 『楽々ERDレッスン』羽生章洋 著
  3. 3. 『詳解システム・パフォーマンス 第2版』Brendan Gregg 著、西脇靖紘 監訳、長尾高弘 翻訳
  4. 4. 『HTML解体新書』太田良典、中村直樹 著
  5. 5. 『研鑽Rubyプログラミング』Jeremy Evans 著、角谷信太郎 翻訳
  6. 6. 『Googleのソフトウェアエンジニアリング―持続可能なプログラミングを支える技術、文化、プロセス』Titus Winters、Tom Manshreck、Hyrum Wright 編、竹辺靖昭 監訳、久富木隆一 翻訳

まずはセキュリティを網羅


▲『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』徳丸浩 著、SBクリエイティブ

本稿の執筆を依頼いただいた際、最初に思いついたのが本書です。

Railsにおけるセキュリティと言えば「Rails Guides」にも「Securing Rails Applications」(日本語訳はRails セキュリティガイド)というよくできた記事があります。これを読めば最低限の知識は身につくのですが、とはいえ細かいことは何も書いていないのでこれだけでは対症療法でしかなく、根本的な問題点や解決方法には気づけない危険性があります。

もうちょっと詳しく知りたい、あるいは網羅的に知りたいのであれば、結局はRailsではなくWebアプリケーションのセキュリティの知識が必要になるはずです。そんなときにおすすめしたいのが本書です。

「体系的に学ぶ」というタイトルで何かすごい体系が展開されるのかと思われるかもしれませんが、本書の体系的という言葉は「網羅的」あるいは「包括的」と読み替える方が良さそうです。第4章で紹介される様々な脆弱性とその対策は、まさにRailsでも問題になったり対策されたりしてきたものです。現在のRailsが良くできている部分も見えてくるかもしれません。

なお本書はバックエンド寄りの知識が多いように感じられます。Railsアプリ開発者であればバックエンドが中心になるため都合が良いのですが、フロントエンド側・ブラウザ中心のセキュリティにも興味がある方は、本書と合わせて『Webブラウザセキュリティ』も読まれると良いかと思います。

Railsの本質に迫る。データベース設計の本


▲『楽々ERDレッスン』羽生章洋 著、翔泳社

本書はアプリケーション開発者のためのデータベース設計の本です。

「データベースをうまく設計するための本」を探してみると、正規化とかデータベースのパフォーマンスとかデータの堅牢性とか、要するにアプリケーションに依存しない設計面についての本が見つかりやすい印象があります。これはこれで必要な技術ではありますが、Railsアプリ開発者に必要なのは特定アプリケーションに適したテーブル・レコードを設計するための技術です。これを解決するのは、データベース設計の本ではなく、いわゆるモデリングの本なんですよね。そういった本はなかなか書かれていないというか、既存のモデリングの本は業務システム・エンタープライズ寄りで、Railsアプリ開発者から見るといろいろ違和感が大きく、あまりおすすめしづらいのです。

ここで少し書籍の話とは離れてRailsアプリ開発について説明すると、Railsの本質は全力でDBに乗っかるところにあると思っています。Railsが便利で良くできているのはとどのつまりPostgreSQLやMySQLといったDBシステムが良くできており、RailsはそのDBの良さを下手にねじ曲げようとせず、極力素のまま引き出そうとしているからではないでしょうか。これはつまりDBとアプリを密に結合させることになるわけですが、Rails的にはむしろ「DBのテーブルにRubyが生えたやつがActiveRecord」くらいの気持ちで向き合った方がすっきりしそうです。

Railsアプリ開発がDBと密接に関わるということは、Railsアプリ開発者は全員データベース設計者でもある、ということです。これはDBに詳しい人にDBのスキーマ設計をお願いするべきではなく、Railsアプリ開発者全員がスキーマ設計できなければいけない、ということでもあります。いくらRailsにはDBのマイグレーション機能があるといっても、その手間を最小限にするには都度々々ベターな設計ができなければいけません。

その意味で、Webアプリケーション開発者がモデリングに手を出すにあたっては本書あたりが良いのではないでしょうか。少し古めの本ではありますが、 あんまり新しめの本で良い本が少ないんですよね。オブジェクト(クラス)のモデリングなら平澤章氏の『UMLモデリングレッスン』あたりもよいのですが、こちらの本ではDBのモデリングについては13章「ERモデリングレッスン」で触れられているだけで少し物足りないのでした。

本書がRailsアプリ開発者に向いているところはテーブルにIDを振るところです。これはRailsにとっては基本中の基本ですが、データベース設計方面では比較的嫌がられる仕様です。具体的にはBill Karwin氏の『SQLアンチパターン』では「3章 IDリクワイアド(とりあえずID)」としてアンチパターンの1つに挙げられていますし、ミック氏の『達人に学ぶDB設計徹底指南書 第2版』でも「グレーノウハウ」として挙げられています(なお2冊ともDB設計の本としては良い本なので、Railsアプリ開発者の方にもぜひ読むことをお勧めします)。

ところが本書ではIDについて肯定的です。27ページから47ページまでの分量を割いてIDとキーとコードについて詳しく論じていますが、結論から言うとIDは振っておけ、ということになっています。第3部で実践されるER図でも機械的にIDカラムを割り振っていて、Railsでよく見慣れた設計になっていると思います。このあたりもRailsアプリ開発者が本書を安心して読める理由の1つになっています。

パフォーマンスについて学ぶ


▲『詳解システム・パフォーマンス 第2版』Brendan Gregg 著、西脇靖紘 監訳、長尾高弘 翻訳、オライリー・ジャパン

最初はLinuxあたりの書籍をすすめようかと思ったのですが、コンテナ時代に素のLinuxシステムの話をするのも少しずれるかもしれませんし、さりとて仮想化技術をターゲットにすると発散しそうだし……と悩んだ結果、少し方向性を変えて本書にしてみました。

Webアプリケーション開発者が下のレイヤーの技術に興味を持つのは、おそらくパフォーマンスかキャパシティに問題が起きそう、あるいはすでに起きており何とかして改善したいという場合ではないでしょうか。もちろん純粋に技術的な興味を持ってその辺りの技術に手を出す方もおられるはずですが、書籍をお勧めするにあたってはもう少し具体的なご利益が得られる本の方が学び甲斐がありそうです。であるなら、パフォーマンスについて詳しく触れた本を入口にしてみようという作戦です。

もっとも本節冒頭にも少し書きましたが、本書を読むにはLinuxなどのUnix系のOSの知識についてはざっくりとしか紹介されていません。ちゃんと読んで理解するには一定程度の事前知識が必要になります。そのため本書を読んでみてもここはなんかよく分からないな? というところがあるかもしれません。そんな時は、その分野、例えばOSやファイルシステムやネットワークなどといったジャンルの別の本を読んでみるといいでしょう。むしろそういった各ジャンルの本を読むきっかけになるのも、本書を読むメリットだと思っています。例えばLinuxについて詳しくないというのであれば『入門 モダンLinux』や『[試して理解]Linuxのしくみ 増補改訂版』あたりを読んでみると良いでしょう。

もちろん本書の主題はパフォーマンス分析(とその向上、改善)の本です。その本質は「第2章 メソドロジ」にあります。この章ではパフォーマンス分析のメソドロジーについて一通り列挙するスタイルになっており、よく行われるけれどダメなやり方も良いやり方も触れられています。正直に言うと、評者もパフォーマンス・チューニングには明るくなくて、「ランダム変更アンチメソッド」「アドホックチェックリスト」くらいあまり良くないやり方しかできてない気もします。いやー、お恥ずかしい限りですね。改めて本書を読み返して、反省の意味を込めつつ学び直さなければ……という感想を持ちました。

仕様書を理解するためのHTML知識


▲『HTML解体新書』太田良典、中村直樹 著、ボーンデジタル

本書はHTMLについての解説書です。

最近のRailsアプリですとAPIサーバとして実装され、フロントエンドについてはRailsは何もしない場合も少なくないかと思います。一方、そうは言ってもRailsはフルスタックのフレームワークではあります。そこでフロントエンド寄りの本も扱いたいとは思ったのですが、CSSやJSについては1冊2冊取り上げただけではどうにもならなさそうです。そこで、HTMLを対象とした本書を取り上げてみます。

手で静的HTMLを書いたことがないという人も少なからずいるかもしれませんが、最終的にブラウザでレンダリングされるのはHTMLです。div要素にいろんな属性とJavaScriptを駆使するだけで便利なサイトを作ることも可能ではあっても最適解とは言えないでしょう。やはり様々な要素と属性を適切に使うのが一番です。一度は腰を据えてじっくりとHTMLに取り組んでも損はないでしょう。

ところで本書の帯にも〈「仕様書を読め!」と上司に言われたら、真っ先に読む本!〉とあるように、本書はHTMLの仕様書の代わりになるものではありません。本書を読むことによって仕様書を理解するための最低限の知識を身に着けたあとは、Living Standardとして粛々と更新され続けるHTML Specを読んでみたいところです。場合によってはMDN Web Docsにも頼ると良いでしょう。こちらは日本語版もあります。

Rubyをより使いこなすために

冒頭ではいろいろ書きましたが、Rubyの本も一冊くらいは紹介してみます。現代Rubyについて学ぶならこの本あたりがおすすめできそうです。

▲『研鑽Rubyプログラミング』Jeremy Evans 著、角谷信太郎 翻訳、ラムダノート

本書はRubyの中・上級者向けの書籍です。Rubyの使い方を一通り分かっている人が、さらに使いこなす上では参考になるところが多いはずです。とりわけ、一般的なプログラミングのベストプラクティス的なやり方をRubyに適用するにはどうすればよいか、もっと言うとRubyに適用するべきかどうかといったことについての知見は興味深いです。

例を1つ挙げると、第2章の「2.2 SOLID原則のトレードオフ」ではRubyとSOLID原則との関わり(の難しさ)についてそれぞれ考察しています。やみくもにSOLID原則を振り回すのも考えものだということが伝わってきます。もっとも著者のこだわりを感じるところでもあるので異論はあるかもしれません。このレベルになると結構意見が分かれるようなこともあるんですよね……。それでも、本書ではなぜそのような主張をするのかについても細かく触れられているので、意見が異なる方でもどのようなところが意見が分かれる理由になるのかが明確になり、安心して取捨選択できそうです。

ちなみに「第III部 Rubyのウェブプログラミングの原則」はRailsアプリを開発する分にはあんまり役に立たないかもしれません。そもそも本書の著者がDBやWebアプリケーションのフレームワークを独自に開発しているわけで、Railsのポリシーに批判的なところがあるのは不思議ではありません。もっとも、著者がRailsのライブラリと自作ライブラリとを比較しているところも、特にひいきの引き倒しがあるわけではなく、冷静に観察しているように見えます。その意味では、本書は必ずしもRailsに囚われない、様々なWebプログラミングについての知見を深めることもできる本とも言えそうです。

開発全般を広く学ぶ


▲『Googleのソフトウェアエンジニアリング―持続可能なプログラミングを支える技術、文化、プロセス』Titus Winters、Tom Manshreck、Hyrum Wright 編、竹辺靖昭 監訳、久富木隆一 翻訳、オライリー・ジャパン

ここまで紹介してきたのは個別技術についての本でしたが、本書は何かの技術に特化したものではなく、広く開発全般についての書籍になります。

タイトルには「ソフトウェアエンジニアリング(ソフトウェア工学)」という言葉が入っていますが、どちらかというと(最近はあまり聞かない言葉かもしれませんが)広い意味での「開発プロセス」についての本であると思っています。実際に第3部のタイトルは「プロセス」になってますし。第2部はその背景にあるもの、第4部はそれを支えるツール群、という解釈ですね。

開発プロセスには「唯一の正解」はなさそうだとはいえ、自社の開発をどのように進めていくかを考えると、何かしら参考になる標準的なプロセスと、それを解説したものが欲しくなってきます。あるいはそれ以前に、「そもそも考えなければいけない点」と「その具体的なやり方・考え方」を並べてくれるだけでもありがたいかもしれません。本書でいうと「コードレビュー」とか「ドキュメンテーション」とか「廃止」とか、この辺りはちゃんとやらないとと思いつつ実際には後回しになりがちではないでしょうか。それを思い出させてくれるだけでも価値がありそうです。もちろんそこに書かれている考え方や実践されている内容も大いに参考にしたいです。

もっとも本書第1章のまとめでも「『私がこう言うのだから(そうする)』は、何かをやる理由としては不適切である」と書かれているように、「Google(あるいはグーグラー)がそうやってるからうちでも同じようにやってみるべき」とか「勇者ヒンメルならそうしたからだ」みたいな物言いも自社のポリシーを考える際には不適切な考え方かもしれません。同じく第1章ではスケールすることの重要性が書かれていますが、それはGoogleのような規模に成長してしまっているためスケーラビリティから逃れられないという事情もありそうです。だからこそ、ポール・グレアム(※1)氏はスタートアップに対して「スケールしないことをしよう」などと言ったりしたのではないでしょうか。

その意味では、Railsアプリ開発者ならDHH(※2)氏とJason Fried(※3)氏による『小さなチーム、大きな仕事 ―働き方の新スタンダード―』辺りを読んでみて、違うスタイルを学んでみるのも良さそうです。

※1 『ハッカーと画家 コンピュータ時代の創造者たち』の著者として知られる米国のLispプログラマー。
※2 Railsの作者であるDavid Heinemeier Hansson氏の通称。
※3 Rails誕生のきっかけとなったプロジェクト管理ツール 「Basecamp」を手がける米企業「37Signals」の共同創業者兼CEO。

おわりに

本稿はRailsアプリ開発者に求められる技術を網羅したものではありません。具体的には以下のような分野についても別途学ぶ価値がありそうです。

  • ・テスト(開発者テスト・品質テスト)
  • ・フロントエンド
  • ・UX
  • ・アーキテクチャ設計
  • ・コンテナ(+オーケストレーション)

もちろん、こういった知識をすべて一人でまかなう必要はありません。現代ではチームで開発することが多いでしょうし、Railsアプリ開発のチームとは別にフロントエンドのチームやインフラのチームに分かれていることも多いでしょう。

しかし、Railsは「The One Person Framework」を標榜するフレームワークでもあります。一人で開発するのであれば、その一人が(多少薄くても)広く知見を身に着けておく必要があります。DHH氏も(インターネットに接続するサーバを運用するのは難しい的な意見をFUDだから耳を貸すなとまで言った上で)「You can run your own server.」と書いています。Railsアプリ開発者ならそこまで手を広げなくてもいいかも……と思わず、魂の赴くままにあれこれ手を出してみては積読するのも良いものです。みなさんのご健闘を祈ります。

人気記事

  • コピーしました

RSS
RSS