dhtakeuti’s thoughts

主に開発やPCについて考えたこと、感じたことの記録

何故、私は Ruby on Rails チュートリアルを読むことにしたのか?(1周目)

f:id:dhtakeuti:20181109110131p:plainまだ1周目であるが、Ruby on Rails チュートリアル を読み始めて、第1章から第14章まで読了したので、振り返ってみる。

眠れる10年

私は50代で SE だった。仕事では主に Java SE/EE でアプリケーション・サーバーの部分の設計、開発を担当していたが、社内の既存フレームワーク上での開発を中心だったため、ほとんど POJO での開発となっていた。そのため、この10年くらいの間のWebサービスの動向や、実際の実装などとは縁がない状況だった。その後、参画しているプロジェクトから抜け、"API" を扱うプロジェクトに携わることになった。

ところが、である。まずもって、"API" が何なのか分からない。Webサービスを構築するんだと言われ、それと "API" が結びつかない。自分にとって "API" とは、Windows の Win32 API とか、UNIXシステムコールとかであるという認識であった。

いろいろ調べてみると、"API" とは RESTful API を指していることが分かった。そして、RESTful APISOAP の簡略版のようなもので、JSON フォーマット(及び、XML) でやり取りを行うものと理解した。リソースに対して HTTP の4つのメソッド "GET"、"POST"、"PUT"、"DELETE" を CRUD に当てはめて操作をする点がシンプルでわかりやすいことと、JSON フォーマットを採用することで JavaScript と親和性が高いことから、WebAPI の主流になり、API と言えば RESTful API を指していることがようやく分かった。

さて、10年以上昔から、Web を中心としたビジネスが企業にとって大きな影響を持ち、楽天Amazon といったネットショッピングを始め、我々はブラウザーを通じてのサービスの提供を受けている。この Web サービスの画面を表示する技術として、当時から MVC モデルが使用されている。今でも Java による Web アプリケーション入門として Apache Tomcat を使用して、MVC モデルでの構築を紹介されている。では MVC モデルで Web アプリケーションを作ったことがあるかと言えば、web.xmlJSPServletを書いてフォーム入力画面を入力して、"こんにちは、〇〇さん!" と表示される程度で分かったつもりになっていた1。ログイン処理の実装とか、 HTTP セッションの使用方法、Cookie の使い方も知らず、Struts での実装の仕組みを何となく掴んでいただけである。

これはまずい。

Web サービスが渦巻く現代において、その技術を自分の手を動かして身につけなければ今後 IT 関連で喰って行くことができなくなる、そう思った。このままでは会話でさえついて行けない。

その後、いろいろあって退職し、現在は再就職に向けての準備期間と決めた。そして、一応 経験がある IT 関連への再就職を目指して、眠っていた10年を取り返そうと考えた。

いきなり最新技術に行くのはハードルが高い。人工知能ブロックチェーンといったもの2に行く前に、Web サービスを構築できるようになることを目指し、RESTful API とか DevOps、テスト駆動開発など、自分のこれまでの経験の延長線上にある技術や手法を身に付けたいと考えた。

そこで、まずは Web サービス関連のここ10年間の流れを追いかけつつ、少し前の主流となる技術を実際に実装、運用してみることにする。世のオジさんに多い Java SE 1.8 の壁3を最初に取り除く必要もあり、最初は慣れ親しんでいる Java から始めて行こうと考えていた。

まずは MVC モデルを理解しよう。

最近の Web アプリケーションの構築は、Java では従来の Struts を始め、Strus2、Spring-MVC などのフレームワークが代表的なものらしい。PHP での実装では、CakePHP、Laravel などがある。Ruby では Ruby on Rails が代表的だ。Node.js では Express が多く使われている。また、Microsoft では主に C# で実装する ASP.NET がある。

今だとこの中で Struts2 を使用して、JSPServlet、JavaBeas、アノテーションを使用した MVC モデルでの実装の紹介が多く見られたが、あまり具体的な例は用いられていなかった。他の言語でのサンプルを探す中で、 Ruby on Rails チュートリアルで構築する Web アプリケーションが、非常に具体的で実践的な例だった。目次のレベルから見てもログイン処理でセッション管理やパスワード認証を含んでおり、テスト駆動での開発を推奨している。そこで、実際の内容はどうかと第1章と第2章を読んでみた時に、びっくりした。

第2章を読んで衝撃を受けた。

第1章では、Cloud 9 を IDE として使用する方法、Rails の導入とデフォルトの Rails アプリケーションの起動、開発言語ではお馴染みの "Hello World!" の出力の仕方、Git の操作方法、Bitbucket の操作方法、Heroku へのデプロイの仕方までが紹介されている。ここまでは、MVC モデルのさわりだけの紹介に留まっており、モデルは使用していないが、Rails で Web 画面上に文字列を出力する方法が分かる。ここまでは、なるほど Cloud で開発するのはこう進めるのか、といった感じでさらりと読めた。

第2章に進むと、簡単な Web アプリケーションを作成する方法が紹介されている。この中で、User モデルを作成する方法が紹介されているが、name と email という要素を持つことを指定して、以下のスクリプトを実行すると、User モデルのクラス定義だけでなく、それに関係する画面のテンプレートまで作ってくれる。ここまでは、今時のフレームワークとしては割と一般的になっているじゃないかと感じた。

$ rails generate scaffold User name:string email:string

ところが、次の操作として、下記を実行するように解説している。

$ rails db:migrate

このスクリプトで、現在参照している DB に対して、裏でテーブル作成が行われ、その内容に対して CRUD オペレーションに対応する RESTful API の画面から操作ができるようになってしまう。

これまで Java で DB を使う場合は、DDL を書いて DB にテーブルを作成し、Java のクラスに jdbc で接続して SQL 書いて行を取り出して、といろいろ記述してやっとデータが取り出せるようになっていた。その後 JavaBeans 経由で JSP に反映してやっと画面に表示されるようになるはずだ。それが、お仕着せではあるが、スクリプトを1行実行するだけで DB のテーブル定義から RESTful に則った操作画面までできてしまうことに心底驚くと共に、フレームワークブラックボックス性に一種の恐ろしさを感じた。非常に生産性が高い反面として、ある程度内部の動作を知って使わないと、危険な目に会うのではないかという不安だ。

これで、俄然、興味が湧き、実際に Ruby on Rails チュートリアルをやってみようと決めた次第である。

第3章で静的ページの表示方法、テストの作成と実行が説明され、第4章は Ruby の基本的な文法を説明した後、第5章以降は twitter に似た Web アプリケーションの作成の説明となっている。

Web サービスでは必ず必要と思われるユーザー管理やセッション管理、セキュリティー対策、メール連携、クラウドストレージ(Amazon S3)など、実用的な実装のサンプルとして非常に興味深いと感じた。2周目は読むだけでなく、実際にコードを書いて実行しながら読み進め、更に3周目もコーディングしながらフレームワークの理解を深めて行く予定だ。

参照先


  1. 2周目にしてMVCのモヤモヤが晴れた!(twitter) で紹介されている図が分かりやすい。この程度は理解していたつもりだった。

  2. ガートナーが「日本におけるテクノロジのハイプサイクル」2018年版発表 によると、『人工知能』『ブロックチェーン』は既に『幻滅期』に入っているそうだ。

  3. JDK 8の新機能ラムダ式とかストリーム機能とか、読むことすらできない。