読者です 読者をやめる 読者になる 読者になる

うんこめも

自律分散うんこ製造システムについてのメモ

Railsチュートリアルを終えた話

システム開発 日記

いまさら感がなくはないけれどrailsチュートリアルをようやく終わらせることができた(Rails4.2対応 第3版)

http://railstutorial.jp/

Railsの基本的な機能、モデル、ビュー、コントローラ、テンプレート、パーシャル、フィルタ、検証、コールバック、has_many/belongs_to/has_many through関連付け、セキュリティ、テスティング、デプロイについて使い方を学べたと思う。 これからrailsで開発していくなかでちょっと困ったときにチュートリアルに戻って参照することもありそう。

つくっていただいたMichael Hartl氏と翻訳に尽力した安川 要平氏(@yasulab)に感謝します。

せっかくなので自分の現時点でのRails観とチュートリアルの紹介、そしてちょっとしたコメントを残しておこうと思う。

そもそもRuby on Railsとは(自分の認識)

https://github.com/rails/rails

Ruby製のフルスタックWebアプリケーションフレームワーク

ほかのフレームワークと比較すると以下のような特徴があると思っている(商用でがっつり開発した経験はない主観 だらだらまとめです)

  • 多機能であること
    • sinatraなどと比較し) デフォルトでも多機能
    • Java製のフレームワークと比べると)RubyのライブラリであるGemの種類とその情報も多い。ただし依存性の管理などに課題もある?
  • 設定よりも規約( CoC:Convention over Configuration)という考え方に基づいており、制約は多くなるがコード量が少なくて済む
    • ただし、理解が浅い開発者(自分も含まれるだろう)がレールから外れると理解しにくいコード量が増えるなど保守性が悪化するという指摘もある
  • 開発が活発でまっすぐ(に素人目には見える)
    • これは、いい点としては先進的な機能が使えるやバグ改修が早いということがあるが、悪い点としてはバージョンアップ時に後方互換性がなくメンテナンスコストが高くつくことも意味する
    • Java EEは思想は素敵に見えるんだけれど、利害関係企業の多さからか規格と実装の方向性がよく見えない。GlassFishのごたごたもあったりJava EE 7準拠でAPサーバなにがいいんですかね(いま調べるとWildFlyがいいのでしょうか?)
  • 一般人が安価に手に入れられる情報が多い
    • オンライン/書籍、日本語英語どちらもドキュメントや参考記事が多い。ただ、古いバージョンのものも多いので注意が必要
    • たとえばQiitaの記事数はLaravelの625、Djangoの397、springの256、Playの122に比して、railsは6358と圧倒的(2016/4/13)
      • (いずれも複数バージョンのタグがあるので乱暴です。。)
    • たぶん、特にJavaあたりでは大企業内にかなりの情報やノウハウがあるんだろうけれど、なかなか出てこないので、たんに情報ではなく一般人が安価に手に入れられる情報、という意味
  • 動的な型付けである(これはRubyの特徴)
    • とりあえず動かすためにはたいへん便利。ただ、大規模(コード量だけでなく開発者数も含めて)でミッションクリティカルなシステム開発には向かない。素直にJavaなど使いましょう。

Railsチュートリアルとは

ハーバードを出てカリフォルニア工科大で物理学の博士号を取得したMichael Hartl氏がつくって安川 要平氏をはじめとするみなさまが日本語に翻訳している便利Rails学習コンテンツ*1

Railsそのものだけでなく、Webアプリ開発の流れを学べます。 まず、ブラウザで使えるIDEであるCloud9で開発してBitbucketでバージョン管理し、Mintestでテストを書く(テストファーストにやるところもあるけれど厳格ではない)、Herokuにデプロイして確認できる。

各コラムや補足は理解を助けるのに便利。公式なドキュメントにはのらない実践的な知恵や文脈の共有もあって学びがあった。

とはいえ、プログラミング未経験者には、新しい概念が多すぎて難しいとは思う。 とはいえ、どの要素が実際に動くものにどう影響するか感じながら学習をすすめるのにこれより向く教材はあまり思いつかない(helloworldや、やさしいRubyなどから、Webアプリのことを理解するのは大きな断絶がある)。 ただし、困ったときにすぐ聞けるひとがいないとつらいかも。なにか困ったことなどあれば自分でよければ相談に乗りますのでお声掛けください。

また、Cloud9が速度も使い勝手もかなりよいことがわかった。ブラウザでみるWebアプリである以上、ショートカットに不満はあるしネットワークに依存するけれど。 https://c9.io/

Railsチュートリアルを効率よく利用するために

自分は2/9から4/13までかかったので2か月ほど。どれくらいの時間をかけたかは計測すべきではあったのだけれど細切れの時間でやっていてうまくできなかった。 10章のセッションまわりは認証のいろんなテクニックがあって難しく2周したけれどほかは素直でわかりやすい。

ほか、これからやる人に向けてのコメント

  • デュアルディスプレイチュートリアルとエディタを両方見ながらやるとよい。出先でノートPCだとけっこうしんどかった
  • 写経の教育効果については議論もあるけれど、typo時にどんなエラーがあるか、どうデバッグするかわかるのは開発時にすこし役立つかも
  • 頻繁にテストをはしらせて、失敗時にどんなメッセージが出るか確認するとよいかも

感想

すぐれた教育コンテンツは、正確な情報を載せるだけでなく、受講生を飽きさせずにつづけさせ、スキルないし知識を身につけるかそのきっかけを与えるものだと思っている。 このRailsチュートリアルは間違いなくすぐれた教育コンテンツ。初学者がプログラミングを学習するときに一番の障壁になる環境への配慮や、はじめは同じことを使うたびに説明してくれる辛抱強さとやさしい演習での理解の促進をたすけている。 そして、これをつくるには、対象についての理解だけでなく読者への想像力と柔軟な編集力が必要だと思う。ほんとうに尊敬する。

プログラミングやフレームワークの学習のためには、ケーススタディ方式が主流で、Railsチュートリアルもそのフォーマットにのってはいるけれど完成度が高い。 Webに公開することでコメントやフィードバックを得ているのもあるかもしれない。(自分も4か所ほど誤字について指摘をし、すぐ反映していただけた)

ほかの分野でこれだけのコンテンツ、つくれるのだろうか。PCひとつでだれでも動かせてすぐ結果が見られるプログラミングならではの側面もあるけれど、マニュアルや研修のカリキュラムつくるときは参考にしたい。

-

Rails自体については、RubyRailsのお作法、シンボルやパスのルールなどはもうちょい慣れが必要かも。 開発しながら考えたり調べたり、教えてもらったりする中で理解を深めていけるのだろうか。

それと並行して、これがきれいなRailsアプリだ!みたいなものをもうちょっと読んだり書籍を読んだりしていきたいところ。

京都でRails使っていたり勉強している人いれば勉強会したい思いもあります(誰かいないかな、やりませんか)。

今後知りたいこと

  • みんなRails、どういう環境で開発しているんだろう。MacVimAtom?それともRubyMine??WindowsのひとはVagrantAtomとかかな。AtomだとどんなPackage使っているんだろう。cloud9の不足も・・・
  • 本番環境、みんなどうしているんだろ。PaaS?自前?ネットで調べると、OSがUbuntuな記事多いんだけれどなんでだろ?CentOSは非主流?
  • Rails暗黙知部分、どう学ぶべきか・・・

あと、あらためて感じたのですがDDDでいうところのユビキタス言語とプログラミング上の命名が直結している英語圏の人たち、けっこう優位だと思う。基軸言語の強み。 DDDについてもうひとつ書いておくとモデリングActiveRecordパターンをどうすりよせていくかはいろいろ議論されているようだ。DDDを実践できているわけではない知ったか話ではあるのだけれど考えておきたいところ。

この本にもちらっと書いてあった。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

チュートリアル終わらせた人向けメモ)最後の演習について

12.5節、最後の最後の演習。どう書くのが正解だろうとすこし迷った

1ページ目のFeedが表示されているかどうかを確認するテスト。 無難な回答はこんなふうに、micropostのcontentがbodyに含まれているかどうかを確認するものだけれど、これだと順序の正しさはテストできない。

  test "feed on home page" do
    get root_path
    @user.feed.paginate(page: 1).each  do |micropost|
      assert_match CGI.escapeHTML(micropost.content) , response.body
    end
  end

これを確認するには、どのmicropostが何番目かを確認するテストにする必要があるのでこう書いてみた*2

  test "feed on home page" do
    get root_path
    @user.feed.paginate(page: 1).each_with_index  do |micropost, i|
      assert_select "ol li:nth-of-type(#{i + 1})", /#{Regexp.escape(micropost.content)}/
    end
  end

*1:2016.4.14 追記。多くの方々が貢献しているコンテンツです

*2:とはいえ、ちゃんとやるならfixtureで時間を指定してつくって、それがその順序になっていることを確認する必要があるのだろうけれど・・・