プログラミング学習歴１ヶ月半からWebアプリを開発してみた

## １．はじめに

　2020年8月からプログラミング勉強を勉強していますが、約１ヶ月かけてWebアプリを開発しました。勉強する前はこんな状態でした。

**・HTML、CSSはうっすらと名前を聞いたことがある**
**・現職ではWord、Excelぐらいしか使用していない**
**・寿司打で３０００円コースすらクリアできない**

この状態から１ヶ月半学習し**ほぼ独学**でWebアプリを開発をしました。

(一応10月から侍エンジニア塾にレッスンを受けていますが、アプリ開発前の基礎的な部分は独学で学習したこと、アプリ開発においては技術的な質問の回答、コードのレビューをインストラクターにしていただきましたが、アプリの方向性など大半は独自で考えたことを考慮して**ほぼ独学**という言葉を使いました。)

　学習歴１ヶ月半の実力を記録として残したくて記事にしました。

## ２．自己紹介

- 年齢：32歳

- 職業：プラント設計

- 未経験からエンジニア転職目指して勉強中。

- 2020年4月コロナ禍の中、一児の父となる。生まれた直後2ヶ月間、育児休暇を取得。

- プログラミング学習より育児を優先している。離乳食の裏ごしで腕を痛める。

#### 学習履歴
**2020年8月1日～9月18日**

- [Progate](https://prog-8.com/) : HTML,CSS,JavaScript,Ruby,Rails,Command Line,Git,SQL (各2週ずつ)

- [キタミ式イラストIT塾 基本情報技術者 令和02年](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C02%E5%B9%B4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297110210)

- [Linux標準教科書](https://linuc.org/textbooks/linux/) 

- [Railsチュートリアル](https://railstutorial.jp/)

- [プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)（第5章ぐらいまで）

- [AWS 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443)

- Udemy:　[Git：はじめてのGitとGitHub](https://www.udemy.com/course/intro_git/)、[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)
　　　 　
9月19日〜　Webアプリ作成開始

## ３．アプリ概要
 育児の悩み、不安を救うための育児特化型のQ&Aアプリです。

**【Home画面】**
![スクリーンショット 2020-10-25 8.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/90cb475f-c8b9-111e-c229-5b6746fb8e8f.png)
![スクリーンショット 2020-10-25 14.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/929520d2-5301-ab95-4d95-f06b7826d85a.png)


Herokuで公開しています→[ーSUKUSUKUー](https://childcare-questions-and-answer.herokuapp.com/)（PC&Chrome推奨）

Github →　https://github.com/SHOGOHORI/myapp

###使い方

- ログインなしでも、質問一覧、質問詳細の閲覧、キーワード検索、タグ検索が可能

- ゲストユーザーで簡単ログイン（``ゲストユーザーとしてログイン``ボタンをクリック）

- ``質問を投稿する``ボタンをクリックし、投稿フォーム画面へ

- 質問詳細から回答可能

## ４．作成目的
　長男が生まれた直後、妻が感染症により高熱を出し、入院する、しないの騒ぎになりました。結局入院はしませんでしたが１〜２週間ほどずっと熱は下がらず寝たきりになり、私一人で育児をしていました。
　生まれたばかりの一つ命を預かるという、とてつもない責任を感じていました。孤独と不安で押しつぶされそうな状況でした。その時の経験から、同じような状況にいるママ、パパの不安を少しでも埋めたいという思い、SNSに近い形のQ&Aアプリを作成しました。

##作成期間
**2020年9月19日〜10月20日（31日間）**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/ab1c32dd-5c6a-3e80-3114-9716ee3f8b98.png" width=50%>

一日6〜8時間ぐらい作成に費やしていましたので、作成時間は**１８０〜２００時間**ぐらいです。

## ５．設計

####ER図
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/ba0aeeea-b073-3d4f-fc4e-6cf580ed45eb.png)

####サイトマップ
![サイトマップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/62681bbe-adba-ac86-3cbc-901c5f195b1d.png)

####ワイヤーフレーム

![名称未設定ファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/93df81a5-d7aa-79b4-d252-6a57e70a8e1a.png)



## ６．使用技術
フレームワーク：Rails6.0.3
フロント：HTML、Sass、JavaScript（jQuery）
サーバーサイド言語：Ruby2.7.1
データベース：PostgreSQL
テストフレームワーク：Minitest → Rspec
サーバー構築：puma
開発環境：Docker 19.3.12　→　ローカル環境
本番環境：Heroku
検索機能：ransack
バージョン管理：Git hub
ページネーション機能：kaminari
使用マシン：Mac Catalina(10.15.7)
エディタ：VSCode

## ７．機能
####ユーザー機能
　・新規登録、ログイン、ログアウト、ゲストユーザーログイン機能
　・ログイン保持機能
　・ユーザープロフィール編集機能
　・ユーザーマイページが投稿した質問、回答の一覧表示

####投稿機能
　・一覧表示、記事詳細表示、投稿、画像アップロード、編集、削除機能
　・回答投稿機能

####質問検索機能
　・キーワード検索、タグ検索機能

####ページネーション機能
　・Ajax対応

####テスト機能
　・単体、統合テスト機能

## ８．苦労した点
####Dockerによる開発環境構築
　当初開発環境にDockerを導入しましたが、非常に重く、rails db:migrateやテストを実行する際にすごく時間がかかってしまいました。軽くする方法を色々調べましたが、状況は改善されず結局ローカル環境に切り替えました。
　後述するVer.2ではもう一度チャレンジしたいです。

####RSpecによるテスト記載
　RailsチュートリアルではMinitestを使用していたので、RSpecについて勉強しました。Rspecの文法理解、Capybaraの使い方等、苦労しました。

苦労した経験のアウトプット→[RSpecのディレクトリ構成とspecごと役割について](https://qiita.com/shogo-1988/items/d19cd5068cdeb825176d)

####Ajax対応
　JavaScriptの知識が不足していたのと、そもそもAjaxがどういう仕組なのか理解していなかった為、そもそもAjaxとは？JavaScriptでなにができるのか？jQueryの基本的な書き方・文法から勉強しました。

苦労した経験のアウトプット→[【Rails】ページネーションをAjax対応にする](https://qiita.com/shogo-1988/items/1b45d9d5251622dddad8)

####ビューのコーディング
 フロント部分、デザインとHTML、Sass、Bootstrap使い方について学習していなかったため、苦労しました。

## ９．反省点
#### Railsチュートリアルを起点にアプリ開発をスタートした

- Railsチュートリアルの復習という意味で勉強になりましたが、必要ない機能も追加してしまいました。（ユーザー登録にメールを使用する機能、パスワード再設定機能）

　<font color="Blue">**解決策：要件定義の段階で必要な機能を洗い出す。**</font>

- Railsチュートリアルで使用しているGemしかよく知りませんでした。（アプリ作成当初、devise、kaminari、carrierwave、RSpec、RuboCop等よく使われるGemについて知らなかった）


　<font color="Blue">**解決策：必要な機能に対してどのGemが適切か選定する。選定の際に評価と更新履歴を確認する。**</font>


- レイアウトにRailsチュートリアル感が出てしまいました。

　<font color="Blue">**解決策：ワイヤーフレーム作成の段階でどの層に向けてのWebアプリなのか意識してデザインする。**</font>

#### 計画性がなかった
- 要件定義を厳密にすると時間がかかると考え、簡単なER図とワイヤーフレームを作成した後、とりあえず手を動かしながら場当たり的に計画していったことから、ゴールがよくわからなくなってしまいました。逆に時間がかかりすぎたように思います。

　<font color="Blue">**解決策：まず作成完了の期限を決める。機能ごとにGithubのissueを作成して、branchをきる。**</font>

####コードが煩雑になってしまった

- コードをインストラクターにレビューしてもらった際、trailing whitespace（末尾のスペース）や無駄な改行、無駄なファイルが散見されました。

　<font color="Blue">**解決策：開発前にVScodeをコーディング規約の守れる設定にする。RuboCopで細かく静的コード解析を実行する。こまめに使用していないファイルを調べ削除する。**</font>
 
#### ただのQ&Aサイトになってしまった

- 初めて独自のアプリを作るため、挫折しないよう機能は最小限にとどめました。その結果、あまり独自性のないアプリになってしまいました。

　<font color="Blue">**解決策：後述するリーンキャンバスを作成し、同じテーマの他のサービスとの独自性を図る。**</font>

## １０．Ver.2に向けて
　別のWebアプリを作成することも考えましたが、子育てしている経験をWebアプリ開発に活かしたいのと、**「新米ママ、パパの不安を少しでも埋めたい」**という思いから、今のアプリをブラッシュアップしたVer.2を作成したいと思います。今回の反省を活かし、Ver.2でやりたいことをまとめました。（全部できるかわかりませんが。。。）

####要件定義を具体的に行う
　Ver.1を作成して、計画性、サービスの独自性、デザイン等全ておいて要件定義の重要性を認識しました。Ver.２ではリーンキャンバスを利用して要件定義を具体的に行おうと思います。そして、あの技術を使いたい！よりも、この要件を満たすためにはこの技術が必要、という形で技術を選びたいです。
　また、現職では設計の工程管理をしていたので、その強みを生かして開発の工程表を作成したいです。

【リーンキャンバス】
![スクリーンショット 2020-10-25 12.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687088/838970bb-8fb6-e2b0-6429-a7a23f8554fe.png)

[要件定義～システム設計ができる人材になれる記事](https://qiita.com/Saku731/items/741fcf0f40dd989ee4f8)

####実務を意識してGit、Githubを使用する
　Ver.1ではbranchをきって、git pushするぐらいしかしていなかったので、GithubのissueやGit-flowの活用、疑似共同開発を意識してプルリクしたりと、実務を意識してGit、Githubのバージョン管理をしたいです。

[Git-flowって何？](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)
[GitHub Cheat Sheet（日本語訳)](https://github.com/sotayamashita/github-cheat-sheet)

####AWSへデプロイ、CI/CDパイプラインの構築
　実際に運用することを想定してVer.2を作成したいので、AWSへデプロイしてドメイン取得までしたいです。あとネットワークの勉強も兼ねて。
　また、後の作業効率を考えてCI/CDパイプラインの構築したいです。

####想定する顧客や専門家に話を聞く
　新米ママ、パパに実際にサービスを使用してもらって、ヒヤリングしてブラッシュアップしたり、専門家に意見を聞いたりしたいです。

####その他実装したい機能
　・ユーザー登録にdeviseを使用
　・パフォーマンスを考慮し、テンプレートエンジンをhamlかslimにする
　・マイページに子ども情報（年齢、性別）を追加
　・回答の返信機能
　・ミニ日記機能
　・ブックマーク機能
　・フォロー、アンフォロー機能
　・アンケート機能
　・SNSシェア機能
　・デザインを充実させる
　・データベースをMySQL

## １１．まとめ
　Webアプリを開発してみて、下記のことがわかりました。

　**・よく言われる通り、アウトプットしつつのインプットが成長につながる**
　**・１つのエラーに何時間も費やす経験も良かったが、質問できるような環境構築も大事**
　**・要件定義に時間をかけることの重要性**

この経験を今後に活かしたいです。
何かWebアプリに問題点、指摘がありましたらどしどしコメントください！