テックキャンプの最終課題にて作成したアプリケーションを紹介します。
また本資料では、自身で実装した箇所、および開発を通じて得られた経験についても紹介します。
フリーマーケット
ID: soccer
Pass: soccer08
Ruby
Ruby on Rails
MySQL
Github
AWS
Visual Studio Code
開発期間:7/22~8/14 22 日間
1日あたりの平均作業時間:9 時間
人数:5
アジャイル型開発(スクラム)
Trelloによるタスク管理
Chromeの最新版を利用してアクセスしてください。
ただしデプロイ等で接続できないタイミングもございます。その際は少し時間をおいてから接続ください。
接続先およびログイン情報については、上記の通りです。
同時に複数の方がログインしている場合に、ログインできない可能性がございます。
テストアカウントでログイン→トップページから出品ボタン押下→商品情報入力→商品出品
テストアカウントでログイン→マイページでクレジットカードを登録→トップページから商品を選択→商品購入
チーム開発を円滑に効率良く進める
開発スケジュールの設定
チームの進捗管理
1日3回のチームMTGの進行
ユーザーの入り口
アプリの説明や特徴を記載
haml, scss, javascriptを使いマークアップ
商品を新着順でトップページに表示
「新規投稿商品」にアクセスすると登録された商品が一覧表示
トップに商品が新着順で4件表示されるようにコントローラーに記述
ユーザーが出品・購入をするために不可欠な機能
gem ‘devise’を導入
ウィザード形式での実装
アプリを全世界にむけて公開する
EC2を使ってIPアドレスを取得
S3を使って本番環境での画像の保存先はS3、ローカル環境ではpublicフォルダに保存されるように条件分岐
basic認証を導入し、一部のユーザーのみ利用できるように設定。
今回スクラムマスターを務めましたので、開発を効率良く進めるために一日3回行うMTGについて以下のルールを提案しました。
「エラーが発生して先に進まない場合はMTGで報告する。その場ですぐ解決できる場合はMTG内で解決。その場での解決が難しいと私が判断した場合はMTG終了後に分かる人と個別で解決。それでも解決できない場合はメンターに相談する。」
以上のルール決めを初期の段階で決めたことで無駄にMTGが長引くことなくスケジュール通りに開発を進めることができました。
メンバーの書いたコードをしっかり理解した上でマージを行うことを心がけました。
特にpay.jpを使った商品購入機能、ancestoryを使ったカテゴリー機能、javascriptを使った商品出品機能の部分は個人的に非常に興味があった部分なので、私が担当しても実装できるレベルまで理解することを心がけました。
設計→マークアップ→デプロイ→DB設計→サーバサイドの順で開発を行いました。
設計の時点で「ユーザーの新規登録・ログイン機能を実装した上でないと、商品購入機能は実装できない」ことを把握していれば、より効率良く開発を進めることができました。 おそらく今より2日早く開発を終えることができました。
この教訓から最初の設計をチームでもっと入念に行うことの大切さを学びました。
頭では分かっていてもいざ口に出すとその言葉が出てこなかったり、流れをうまく説明できないことが多々ありました。
相手に分かりやすく伝えるために、常日頃から相手に説明するつもりで作業や勉強をする癖を身に付けることができました。
以上
Column | Type | Options |
---|---|---|
nickname | string | null: false |
string | null: false, unique: true | |
password | string | null: false |
last_name | string | null: false |
first_name | string | null: false |
last_name_kana | string | null: false |
first_name_kana | string | null: false |
birthday | date | null :false |
Column | Type | Options |
---|---|---|
user_id | string | null: false, foreign_key: true |
Column | Type | Options |
---|---|---|
user_id | references | foreign_key: true |
ship_last_name | string | null: false |
ship_last_name_kana | string | null: false |
ship_first_name | string | null: false |
ship_first_name_kana | string | null: false |
phone_number | bigint | null: false, unique: true |
zip_code | integer | null: false |
prefecture | string | null: false |
address | string | null: false |
second_address | string |
Column | Type | Options |
---|---|---|
user_id | string | null: false, foreign_key: true |
card_number | integer | null: false |
card_month | integer | null: false |
card_year | integer | null: false |
card_code | integer | null: false |
Column | Type | Options |
---|---|---|
item_name | string | null: false |
description | text | null: false |
brand | string | |
condition | string | null: false |
postage_id | string | null: false |
prefecture_id | string | null: false |
preparation_id | string | null: false |
price | string | null: false |
user | integer | null: false |
buyer | integer |
Column | Type | Options |
---|---|---|
name | string | null: false |
ancestry | string |
Column | Type | Options |
---|---|---|
item_id | string | null: false, foreign_key: true |
image | string | null: false |
Column | Type | Options |
---|---|---|
user_id | integer | null: false, foreign_key: true |
item_id | integer | null: false, foreign_key: true |
comment | text | null: false, foreign_key: true |
Column | Type | Options |
---|---|---|
user_id | integer | null: false, foreign_key: true |
item_id | integer | null: false, foreign_key: true |