Skip to content

Latest commit

 

History

History
433 lines (310 loc) · 25.3 KB

el-training.md

File metadata and controls

433 lines (310 loc) · 25.3 KB

el-training

このカリキュラムについて

この文書は、万葉で必須とされるRuby on Railsとその周辺技術の基礎を習得するための新入社員教育用カリキュラムです。 新入社員の能力によらず、必ず一通りのステップを実施していただきます。 研修期間は特に定めておりません。 すべてのステップを完了した時点で研修修了となります。

本カリキュラムでは、以下の登場人物を想定しています。

  • 新入社員(メンティー) : 本カリキュラムの受講者です。
  • メンター : 新入社員の教育・指導・助言を行います。また、新入社員と相談して仕様を一緒に決めたりする役割も担います。

指導について、メンターがどの程度関与するかどうかはメンターの裁量に一任します。また、研修期間については、新入社員のスキルレベルや社内の案件状況を考慮して、メンターの方であらかじめ目安を設定する予定です。

概要

システムの要件

本カリキュラムでは、課題としてタスク管理システムを開発していただきます。 タスク管理システムでは、以下のことを行いたいと考えています。

  • 自分のタスクを簡単に登録したい
  • タスクに終了期限を設定できるようにしたい
  • タスクに優先順位をつけたい
  • ステータス(未着手・着手・完了)を管理したい
  • ステータスでタスクを絞り込みたい
  • タスク名・タスクの説明文でタスクを検索したい
  • タスクを一覧したい。一覧画面で(優先順位、終了期限などを元にして)ソートしたい
  • タスクにラベルなどをつけて分類したい
  • ユーザ登録し、自分が登録したタスクだけを見られるようにしたい

また、上記の要件を満たすにあたって、次のような管理機能がほしいと考えています。

  • ユーザの管理機能

サポートブラウザ

  • サポートブラウザはmacOS/Chrome各最新版を想定しています

アプリケーション(サーバ)の構成について

以下の言語・ミドルウェアを使って構築していただきたいです(いずれも最新の安定バージョン)。

  • Ruby
  • Ruby on Rails
  • PostgreSQL
  • 【オプション要件】Dockerを利用して開発環境を構築する

サーバについては以下を利用していただきたいです。

  • Heroku
  • 【オプション要件】AWSアカウントで、EC2のインスタンスを作成して構築する
    • t2.micro(Amazon Linux)
    • RDS

※ 性能要求・セキュリティ要求は特に定めませんが、一般的な品質で作ってください。 あまりにサイトのレスポンスが悪い場合は改善をしていただきます

本カリキュラムの最終目標

本カリキュラムの終了時点で、以下の項目を習得することを想定しています。

  • Railsを利用した基本的なWebアプリケーションの実装ができるようになること
  • Railsアプリケーションで一般的な環境を使ってアプリケーションを公開できること
  • 公開されたRailsアプリケーションに対して、機能の追加やデータのメンテナンスができること
  • GitHubでPRをしてマージする一連の流れを習得すること。また、それに必要なGitのコマンドを習得すること
    • 適切な粒度でコミットができること
    • 適切にPRの説明文が書けること
    • レビューに対する対応と修正が一通りできること
  • 不明な点を適切なタイミングでチームメンバーや関係者に(今回はメンターになります)口頭やチャットなどで質問ができること

推奨図書

研修カリキュラムを進めるにあたって、以下の書籍を推奨図書としてオススメします。

現場で使える Ruby on Rails 5速習実践ガイドでは、研修カリキュラムと同様にタスク管理システムを題材としています。 そのため、本研修を進める上で参考になる点が多数あるかと思います。

また、本研修ではカバーしきれなかった内容や、チーム開発の進め方についても解説されています。ぜひ参考にしてみてください。

開発に役立つトピック集

特定の課題ステップには含められませんでしたが、活用してほしいトピックについて topics.md にまとめています。カリキュラムを実施する上で、必要に応じて参照して活用してください。

課題ステップ

ステップ1: Railsの開発環境を構築しよう

1-1: Rubyのインストール

  • rbenvを利用して最新バージョンのRubyをインストールしてください
  • ruby -v コマンドでRubyのバージョンが表示されることを確認してください

1-2: Railsのインストール

  • GemコマンドでRailsをインストールしましょう
  • 最新バージョンのRailsをインストールしてください
  • rails -v コマンドでRailsのバージョンが表示されることを確認してください

1-3: データベース(PostgreSQL)のインストール

  • 手元のOSでPostgreSQLをインストールしましょう
    • macOSの場合は brew などでインストールしてください

ステップ2: GitHubにリポジトリを作成しよう

  • 手元にGitをインストールしましょう
    • macOSの場合は brew などでインストールしてください
    • gitconfig でユーザ名、メールアドレスを登録しましょう
  • アプリ名(=リポジトリ名)を考えましょう
  • リポジトリを作成しましょう
    • アカウントがない場合は取得しましょう
    • その上で空のリポジトリを作成しましょう

ステップ3: Railsプロジェクトを作成しよう

  • rails new コマンドでアプリケーションに最低限必要なディレクトリやファイルを作成しましょう
  • rails new してできたプロジェクトのディレクトリ(アプリ名のディレクトリ)の直下に docs というディレクトリを作り、この文書ファイルをコミットしましょう
    • このアプリの仕様を管理下に置き、いつでも見られるようにするためです
  • 作成したアプリをGitHub上に作成したリポジトリにpushしましょう
  • バージョンを明示するため、利用するRubyのバージョンを Gemfile に記載しましょう(Railsは既にバージョンが記載されていることを確認しましょう)

ステップ4: 作りたいアプリケーションのイメージを考えよう

  • 設計を進める前に、どのようなアプリになるか完成イメージを(メンターと一緒に)考えてみましょう。ペーパープロトタイピングによる画面設計などがおすすめです
  • システムの要件を読んで、必要なデータ構造を考えてみましょう
    • どのようなモデル(テーブル)が必要そうか
    • テーブル内にどのような情報が必要そうか
  • データ構造を考えたら、それをモデル図に手書きで書いてみましょう
    • 完成したら撮影して、リポジトリに入れましょう
    • README.md にテーブルスキーマを記載しましょう(モデル名・カラム名・データ型)

※ 現時点で正解のモデル図を作成する必要はまだありません。現時点での想定として作ってみましょう(今後のステップで間違いと思ったら改修していくイメージです)

ステップ5: データベースの接続設定(周辺設定)をしよう

  • まずGitで新たにトピックブランチを切りましょう
    • 以降、トピックブランチ上で作業をしてコミットをしていきます
  • Bundlerをインストールしましょう
  • Gemfilepg (PostgreSQLのデータベースドライバ)をインストールしましょう
  • database.yml の設定をしましょう
  • rails db:create コマンドでデータベースの作成をしましょう
  • rails db コマンドでデータベースへの接続確認をしましょう
  • GitHub上でPRを作成してレビューしてもらいましょう
    • 必要に応じて WIP(Work In Progress) で PR を出すようにしましょう。詳しくはトピック集を参照してください
    • コメントがついたらその対応を行ってください。LGTM(Looks Good To Me)が2つついたらmasterブランチにマージしましょう

ステップ6: タスクモデルを作成しよう

タスクを管理するためのCRUDを作成します。 まずは名前と詳細だけが登録できるシンプルな構成で作りましょう。

  • rails generate コマンドでタスクのCRUDに必要なモデルクラスを作成しましょう
  • マイグレーションを作成し、これを用いてテーブルを作成しましょう
    • マイグレーションは1つ前の状態に戻せることを担保できていることが大切です! redo を流して確認する癖をつけましょう
  • rails c コマンドでモデル経由でデータベースに接続できることを確認しましょう
    • この時に試しにActiveRecordでレコードを作成してみましょう
  • GitHub上でPRを作成してレビューしてもらいましょう

ステップ7: タスクを閲覧・登録・更新・削除できるようにしよう

タスクの一覧画面、詳細画面、作成画面、編集画面、削除機能を作成しましょう。

これらの機能を一度に作成すると、PRが巨大になりがちです。 そのため、ステップ7ではPRを複数に分けて進めていきます。

今後のステップでも、PRが大きくなりそうな場合は2つ以上に分けてPRを出せないか検討しましょう。

ステップ7-1: タスクの一覧画面、詳細画面を作成しましょう

  • ステップ6で作成したタスクを、一覧画面、詳細画面で表示できるようにしましょう
  • rails generate コマンドでコントローラとビューを作成しましょう
    • どのテンプレートエンジンを採用するかはメンターと相談して決めましょう
  • コントローラとビューに必要な実装を追加しましょう
  • routes.rb を編集して、 http://localhost:3000/ でタスクの一覧画面が表示されるようにしましょう
  • Webブラウザとサーバの間でどのような処理が行われているか、メンターに説明してみましょう
  • GitHub上でPRを作成してレビューしてもらいましょう

ステップ7-2: タスクの作成画面、編集画面を作成しましょう

  • 画面上からタスクの作成や編集ができるようにしましょう
  • 作成、更新後はそれぞれflashメッセージを画面に表示させましょう
  • GitHub上でPRを作成してレビューしてもらいましょう

ステップ7-3: タスクを削除できるようにしましょう

  • 作成したタスクを削除できるようにしましょう
  • 削除後はflashメッセージを画面に表示させましょう
  • GitHub上でPRを作成してレビューしてもらいましょう

ステップ7-4: 追加したコードを振り返ってみよう

  • ステップ7-1〜7-3で追加したコードについて、メンターに説明してみましょう
    • クラス、メソッド、変数について
    • 処理の流れについて

ステップ8: SQLに触れてみよう

  • データベースを操作しましょう
    • rails db コマンドでデータベースに接続しましょう
    • SQLでタスクの閲覧、作成、更新、削除をしましょう
  • タスクの一覧画面にアクセスして、SQLのログが流れていることを確認しましょう
    • どのようなSQLが実行されているか、メンターに説明してみましょう
  • ActiveRecordのメソッドでどういうSQLが実行されるか確認してみましょう
    • rails cfindwhere などを実行してみましょう

ステップ9: E2Eテストを書こう

  • specを書くための準備をしましょう
    • spec/spec_helper.rbspec/rails_helper.rb を用意しましょう
  • system specをタスク機能に対して書きましょう
  • Circle CIなどのCIツールを導入して、Slackに通知するようにしましょう
    • 難易度を考えて、メンターが実施する形でも構いません。
  • 参考書籍:https://leanpub.com/everydayrailsrspec-jp

ステップ10: アプリの日本語部分を共通化しよう

  • Railsのi18nの仕組みを利用して、validation エラーメッセージを日本語で出力するようにしましょう

ステップ11: Railsのタイムゾーンを設定しよう

  • Railsのタイムゾーンを日本(東京)に設定しましょう

ステップ12: タスク一覧を作成日時の順番で並び替えよう

  • 現在IDの順で並んでいますが、これを作成日時の降順で並び替えてみましょう
  • 並び替えがうまく行っていることをsystem specで書いてみましょう

ステップ13: バリデーションを設定しよう

  • バリデーションを設定しましょう
    • どのカラムにどのバリデーションを追加したらよいか考えてみましょう
    • 合わせてDBの制約も設定するマイグレーションを作成しましょう
    • マイグレーションファイルだけを作成するため、 rails generate コマンドで作成しましょう
  • 画面にバリデーションエラーのメッセージを表示するようにしましょう
  • バリデーションに対してモデルのテストを書いてみましょう
  • GitHub上でPRを作成してレビューしてもらいましょう

ステップ14: デプロイをしよう

  • masterブランチにシンプルなタスク管理システムができたので、デプロイしてみましょう。
  • Herokuにデプロイを実施してみましょう
    • アカウントがなければ作成しましょう
  • デプロイされたHeroku上のアプリを触ってみましょう
    • これからはこのアプリにタスクを登録して開発を進めましょう
    • ※ ただし、Herokuのアプリケーションはインターネットでどこでも参照できるので、公開してはまずい情報は載せないようにしましょう
      • Basic認証をこの時点でいれてもいいかもしれません
    • 今後、ステップが終わるたびにHerokuへ自分のアプリを継続的にデプロイしましょう
  • デプロイの方法を README.md に記載しましょう
    • その際に、このアプリで使っているフレームワークのバージョン情報なども記載しておくとなおよいです

ステップ15: 終了期限を追加しよう

  • タスクに対して、終了期限を登録できるようにしてみましょう
  • 一覧画面で、終了期限でソートできるようにしましょう
  • specを拡充しましょう
  • PRしてレビューをしてもらったら、リリースしてみましょう

ステップ16: ステータスを追加して、検索できるようにしよう

  • ステータス(未着手・着手中・完了)を追加してみましょう
    • 【オプション要件】初学者ではない場合はstateを管理するGemを導入しても構いません
  • 一覧画面でタイトルとステータスで検索ができるようにしましょう
    • 【オプション要件】初学者ではない場合はransackなどの検索の実装を便利にするGemを導入しても構いません
  • 絞り込んだ際、ログを見て発行されるSQLの変化を確認してみましょう
    • 以降のステップでも必要に応じて確認する癖をつけましょう
  • 検索インデックスを貼りましょう
    • ある程度まとまったテストデータを用意して log/development.log を見ながら動作確認を行い、インデックスの追加により速度が改善されることを確認しましょう
    • 【オプション要件】PostgreSQLの explain などを使用して、データベース側でのインデックス使用状況なども見てみましょう
  • 検索に対してmodel specを追加してみましょう(system specも拡充しておきましょう)

ステップ17: 優先順位を設定しよう(※類似した実装経験のある人は省略可)

  • タスクに対して、優先順位(高中低)を登録できるようにしましょう
  • 優先順位でソートできるようにしましょう
  • system specを拡充しましょう
  • PRしてレビューをしてもらったら、リリースしてみましょう(以降続けてください)

ステップ18: ページネーションを追加しよう

  • KaminariというGemを使って一覧画面にページネーションを追加してみましょう

ステップ19: デザインを当てよう

  • Bootstrapを導入して、これまで作成したアプリにデザインを当てましょう
    • 【オプション要件】自分でCSSを書いてデザインする

ステップ20: 複数人で利用できるようにしよう(ユーザの導入)

  • ユーザモデルを作成してみましょう
  • 最初のユーザをseedで作成してみましょう
  • ユーザとタスクが紐づくようにしましょう
    • 関連に対してインデックスを貼りましょう
    • ※ Herokuにデプロイした際に、すでに登録されているタスクとユーザが紐づいているようにしてください(データメンテナンス)

ステップ21: ログイン/ログアウト機能を実装しよう

  • 追加のGemを使わず、自分で実装してみましょう
    • DeviseなどのGemを使わないことで、HTTPのCookieやRailsにおけるSessionなどの仕組みについて理解を深めることが目的です
    • また、一般的な認証についての理解を深めることも目的にしています(パスワードの取り扱いについてなど)
  • ログイン画面を実装しましょう
  • ログインしていない場合は、タスク管理のページに遷移できないようにしましょう
  • 自分が作成したタスクだけを表示するようにしましょう
  • ログアウト機能を実装しましょう

ステップ22: ユーザの管理画面を実装しよう

  • 画面上に管理メニューを追加しましょう
  • 管理画面にはかならず /admin というURLを先頭につけるようにしましょう
    • routes.rb に追加する前に、あらかじめURLやルーティング名( *_path となる名前)を想定して設計してみましょう
  • ユーザ一覧・作成・更新・削除を実装しましょう
  • ユーザを削除したら、そのユーザが抱えているタスクを削除するようにしてみましょう
  • ユーザの一覧画面で、ユーザが持っているタスクの数を表示するようにしてみましょう
    • N+1問題を回避するための仕組みを取り入れましょう
  • ユーザが作成したタスクの一覧が見られるようにしてみましょう

ステップ23: ユーザにロールを追加しよう

  • ユーザに管理ユーザと一般ユーザを区別するようにしてみましょう
  • 管理ユーザだけがユーザ管理画面にアクセスできるようにしてみましょう
    • 一般ユーザが管理画面にアクセスした場合、専用の例外を出してみましょう
    • 例外を補足して、適切にエラーページを表示しましょう(ステップ25で実施しても構いません)
  • ユーザ管理画面でロールを選択できるようにしましょう
  • 管理ユーザが1人もいなくならないように削除の制御をしましょう
    • モデルのコールバックを利用してみましょう
  • ※ Gemの使用・不使用は自由です

ステップ24: タスクにラベルをつけられるようにしよう

  • タスクに複数のラベルをつけられるようにしてみましょう
  • つけたラベルで検索できるようにしてみましょう

ステップ25: エラーページを適切に設定しよう

  • Railsが用意しているデフォルトのエラーページを自分が作った画面にしてみましょう
  • 状況に応じて、適切にエラーページを設定しましょう
    • ステータスコードの404ページと500ページの2種類の設定は少なくとも必須とします

あとがき

お疲れさまでした。 あなたは教育カリキュラムを一通り完遂しました!!

このカリキュラムでは触れきれませんでしたが、今後は以下のトピックなどが必要になると思うので、学習を進めていくとよいと思います(案件を通じて学ぶことも多いと思います)。

  • Webアプリケーションの基本的な理解を深める
    • HTTPとHTTPSに関する理解
  • Railsのもう少し進んだ使い方を習得する
    • STI
    • ロギング
    • 明示的なトランザクション
    • 非同期処理
    • アセットパイプライン(どちらかというとリリース系のトピック)
  • JavaScriptやCSSなどのフロントエンドに関するより高度な理解
  • データベースに対する理解を深める
    • SQL
    • よりパフォーマンスを重視したクエリの構築
    • インデックスの理解をより深める
  • サーバ環境に関するより多くの理解
    • Linux OS
    • Webサーバ(Nginx)の設定
    • アプリケーションサーバ(Unicorn)の設定
    • PostgreSQLに関する設定への理解
  • リリースに関するツールの理解
    • Capistrano
    • Ansible

(番外編)オプション要件

必須要件とは別に、タスク管理システムに関するオプション要件を以下に示します。 メンターと相談しつつ必要に応じて実施してみてください。

オプション要件1: 終了間近や期限の過ぎたタスクがあった場合、アラートを出したい

  • ログインした時点で、どこかに終了間近や期限の過ぎたタスクを表示してみましょう
  • 既読などが分かるようになるとよりよい

オプション要件2: ユーザの間でタスクを共有できるようにしたい

  • 複数人で同じタスクを参照・編集できるようにしたい
    • 例:メンターと新入社員でタスクを共有できること
  • 作成者を表示する

オプション要件3: グループを設定できるようにしたい

  • オプション要件2の続き
  • グループを設定できるようにして、グループ内だけでタスクを参照できるようにしたい

オプション要件4: タスクに添付ファイルをつけられるようにしたい

  • タスクに対して添付ファイルをつけられるようにしてみましょう
  • Herokuの場合はS3バケットにアップロードした添付ファイルを管理するようにします
  • 適切にGemを選別して利用してみましょう

オプション要件5: ユーザにプロフィール画像を設定できるようにしてみましょう

  • ユーザがプロフィール画像を設定できるようにしましょう
  • アップロードした画像はアイコンとして使用するので、遅くならないようにサムネイル画像も作りたい
  • 適切にGemやライブラリを選別しましょう

オプション要件6: タスクカレンダーの機能がほしい

  • 終了期限を可視化するために、カレンダーに終了期限別にタスクを表示するようにしてみましょう
  • ライブラリの使用・不使用は自由です

オプション要件7: タスクをドラッグ&ドロップで並べ替えられるようにしたい

  • タスク一覧でタスクをドラッグ&ドロップして並べ替えできるようにしてみましょう

オプション要件8: ラベルの使用頻度をグラフ化してみましょう

  • 統計情報を可視化するために、グラフを導入してみましょう
  • グラフの種類は見やすいものを提案してみましょう

オプション要件9: 終了間近のタスクを作成ユーザ宛てにメール通知してみましょう

  • 終了間近のタスクがある場合、バックグラウンドでメール通知してみましょう
  • メール送信はクラウドサービスを利用します
    • HerokuならばSendGrid
    • AWSならばAmazon SESなど
  • 1日1回のバッチで送信するようにしてみましょう
    • HerokuならばHeroku Scheduler(アドオン)
    • AWSだったらcronを設定してみる

オプション要件10: AWS にインスタンスを作って環境構築する

  • AWSに環境構築をしてデプロイしてみましょう
  • ミドルウェアはNginx+Unicornを推奨構成とします
  • EC2のインスタンス等はサーバ要件を参照してください