50代・ほぼ独学・文系・未経験で２ヶ月半でWebアプリを開発するまで！【Rails+Nginx+Docker+AWS】

<h2>はじめに</h2>
コロナ禍の中で会社経営をあきらめ、50代目前にして「Webアプリの開発者に、オレはなる！」と決意し、２ヶ月半でアプリを作成した経緯をご紹介させていただきます。
<br /><br />

**絶賛転職活動成功！**（最終結果：企業エントリー145、書類通過10、内定３、業務委託３。転職活動期間2022/04末〜2022/11末）
ポートフォリオサイトURL：https://delicha.github.io
Wantedly プロフィール：https://www.wantedly.com/id/shouhei_yamamoto_bg

<h2>アプリを実装するまで</h2>
今回のアプリを作成する<b>「前」</b>のおもな自分のスペックです。

+ アプリ開発前の年齢は限りなく<b>５０歳</b>。
+ 大学は思いっきり<b>文系</b>の大学。
+ <b>元WEBデザイナー</b>なのでHTML,CSSなどの知識はある（JavaScriptはコピペ）。
+ <b>独学</b>でProgateやRails Tutorialをやったことがある。
+ <b>アメリカの大学卒</b>なので英語の公式ドキュメントや記事は読める（ただしプログラミング関係は日本語でも理解がむずかしかったりするのでそこまで有利に感じなかった）。
+ 今回採用したDocker, AWS, Nginxの知識は<b>「どこかでそんな単語を見たことあるような」のレベル</b>。

３年間ほど、書籍などを通して自分なりにアレンジをしたアプリを作成したことがあり、自社で半年ほど運用した経験はありました。

ただ実務未経験かつエンジニアの知り合いもいなかったため、<b>自分のレベルがどの程度なのか</b>、<b>実務に対応できるレベルとはいかほどなのか</b>、<b>勉強の方向性は合っているのか</b>、まったくわからず、その確認と学習の時間効率を考えて、今回はメンター（一週間に一回数十分のヘルプ、ただし基本は質問に対する解答ではなくヒント）をつけてアプリ制作行いました。

おかげでエラー時間を大幅に短縮でき、また実際に求められるレベルや努力する方向や労力をイメージできたのは大きかったです。

<h2>開発アプリ概要</h2>
<h3>アプリ名</h3>
<h4><font color="RoyalBlue">自分の第一印象を知るアプリ「Scouter(スカウター)</font></h4>

![IMG_2330.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/11766b8d-24b1-283d-5a90-f09042241db2.jpeg)

※転職活動終了により、AWSの各種サービスを削除しました(2022/12/07)。
Web URL:<a href="https://scouter.fun">https://scouter.fun</a>
GitHub URL:<a href="https://github.com/delicha/scouter">https://github.com/delicha/scouter</a>
ゲスト用: sk715@email.com / password

<h3>システム構成</h3>

![スクリーンショット 2022-07-26 16.07.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/7add3851-02f8-5e41-a9c6-ea68c76d3fbb.png)

<h3>アプリ制作の理由</h3>
経営者としてお客様がどんなニーズや欲求をもっているのか、そのニーズに答え、かつ会社として利益を上げられるサービスはないか、ということはよく考えさせられます。ニーズや欲求の多くはそれがなんであっても最終的には<b>「だれかに認められたい」</b>というところからの派生ではないかと仮説を立てています。<br />
今回のアプリのキャッチコピーを「第一印象って大事」としていますが、これも「だれかに認められたい」という欲求です。そのニーズに答えるためのアプリを作成したいと思いました。

<h3>誰のどんな課題を解決するのか？</h3>
<b>「マッチングアプリでマッチしない」</b>、<b>「初対面の人が自分に興味がなさそう」</b>、<b>「一体なにが原因なんだろう？」</b><br />と一度はだれでも思ったりするのではないでしょうか？<br />そんな自分の印象を客観的に知り、改善するためのアプリです。

<h3>実際に誰に使ってもらうか？</h3>

自分の印象を知り、改善したい方すべてが対象ですが、特に恋愛で異性からの印象を改善したい人、会社の履歴書の写真などでできるだけ良い印象をもってもらいたい人には有益なアプリだと思います。

<h3>なぜそれを解決したいのか？</h3>
自分の印象は他人から直接指摘されることはほとんどなく、主観的になりがちです。<br />マッチングアプリや結婚相談所は今やたくさんありますが、マッチングの最初の関門のプロフィール写真について指導したりアドバイスしてくれるようなサービスやアプリはあまりないと思います。そこを突破できないと中身までみてもらえるチャンスもありません。主観的に自分の他人から見たイメージを推測してなにかを改善しようとしても客観的なデータがなければその努力の方向は無駄骨にもなりかねません。
<br />自分の印象が他人から見てどうなのか、客観的な数値でわかれば（その数値の良し悪しはともかく）、正しい方向に改善の努力をしていけるはずです。

<h3>どうやって解決するのか？</h3>
このアプリでは、

a) 総合的に自分の印象の良さを数値で知ることができます。
b) 世代ごとに自分の印象を支持している世代、そうでもない世代を知ることができます。
c) 対同性、対異性の印象の支持率を知ることができます。
d) 自分を評価した人を知ることができ、その人物の「性格」「趣味」などを見ることによって、自分が支持されやすい性格の人、されにくい性格の人の分析なども可能です。

<h2>アプリ画面</h2>

（トップページ）
![IMG_2340 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/e7a8b023-7b27-3f15-78c2-3c4dd31039e6.jpeg)

（ログインページ）
![IMG_2339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/4e2b31b1-7d95-5779-2fa7-8d8ae28e30f9.jpeg)

（新規登録ページ）

![IMG_2341 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/e1a19a55-0625-3c08-2ddc-c2076f55c7ae.jpeg)

（ユーザー一覧）
![IMG_2332.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/52424ece-dc54-bf3d-2ff9-20bc3780f137.jpeg)

（ユーザープロフィール）
![IMG_2333.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/15537f23-ff25-4e80-27bf-bb6fbd3b0b76.jpeg)
![IMG_2334.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/729cf390-2236-37e5-55d0-da2178506b6a.jpeg)

（サブ画像カルーセル）
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/ba9bc974-bb3d-b789-53d2-af3af5816ae1.gif)


(他ユーザー評価)
![IMG_2342 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/9794197f-a45a-4db1-a6cc-c9337f2f0b02.jpeg)

（ユーザー評価)
![IMG_2335.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/e0650df4-3e4b-ed7d-3a7c-d619d9774aae.jpeg)

（評価ユーザー一覧)
![IMG_2331.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/2ce2f6fe-2e91-10ea-640b-0c0ab1966752.jpeg)

（管理者用ユーザー一覧）
![IMG_2336.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/6040e973-e9c3-d9cd-542d-c070614ac73c.jpeg)

（管理者用評価ー一覧）
![IMG_2337.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/31faf572-b8c7-2754-cef2-35ec51bde3f3.jpeg)

（スマホ対応レスポンシブデザイン）
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/fe8b1611-17ca-ade6-bdff-8173c91399de.gif)




<h2>使用技術</h2>

+ <b>フロントエンド：</b><br>HTML／Bootstrap4／Scss
+ <b>バックエンド：</b><br>Ruby(2.7.6)／RubyonRails(6.1.6)／Nginx(1.20-alpine)／Puma(5.6.4)／Rubocop(1.30.1)
+ <b>DB：</b><br>開発環境はDockerのPostgeSQL、本番環境はRDS（PostgeSQL）
+ <b>開発環境：</b><br>Docker／Docker Compose
+ <b>インフラ：</b><br>AWS（VPC／EC2／Route53／Internet Gateway／ALB／ACM／RDS／S3／CloudFront）
+ <b>ソース管理：</b><br>Git／GitHub

<h3>なぜその技術を使ったか？</h3>

<h4>フロントエンド: シンプルなHTML、CSS(Scss)、Bootstrapの組み合わせを採用。</h4> 
<b>他の選択肢（SPA)</b><br />

+ 個人的にはSPAに興味があり、PF作成前に学習サービスを通してフロントにVueを据えたSPAのアプリを一つ作成した。おおまかな仕組みを理解したが、VueとSPA用インフラ構築を新たに学ぶ必要があり、その時点での学習コストが大きいと判断したため断念した。（一方、DockerやAWSも新しい知識かつ学習コストが大きいと感じつつが採用したのは、SPAよりも実務においてはより優先順位が高いと判断したため。）

<h4>バックエンド: Ruby/Railsを採用</h4>  
<b>他の選択肢（PHP/Laravel, Python/Django）</b><br />

+ Phythonを採用しなかった理由は、Phythonはシェアが大きくなっている印象があるが、Djangoが使われているのをあまり聞かないこと。
+ 廃れてきた感は若干ありつつも今でもPHP/LaravelやRuby/Rails使ってる会社が多いこと。
+ PHP/Laravelを選ばずにRuby/Railsを選んだのは、前者よりも後者をより学習してきたこと。そのため今からPHP/Laravelを学習するよりも既知のRailsで開発することが時間効率もよい。
+ Railsの記事量が多いこと。
+ 初学者は多くの言語に手を出すよりも一つの言語をまずは深く理解することが大事。
+ 今回のアプリ作成においてどちらを使っても大幅に有利ということはない。

<h4>インフラ: AWSを採用</h4> 
<b>他の選択肢（Heroku）</b><br />

+ Herokuは練習アプリで何度か使用し、他の選択肢に比べ設定がそこまで難しくないのが利点だが、無料の場合WEBサイトの表示が遅いなどの欠点がある。
+ AWSは実務でデファクトスタンダードの印象があり、可用性、性能・拡張性、運用・保守性、セキュリティ、移行性において有利。むしろAWSの基本的な知識や設定を知らないことは致命的と感じた。

<h3>作成にあたって意識したこと、苦労したこと</h3>

<h4>フロントエンド: </h4> 

+ 内容的にマッチングアプリと親和性があると思い、いくつかのメジャーなマッチングアプリのデザインを参考にさせていただいた。
+ 自分の強みであるデザインには多少こだわりたかったので、カラーバランスや色味など不自然にならないように自分なりに工夫した。
+ レスポンシブデザインでスマホなどにも対応。Bootstrapをベースにしたためにパーツのデザインに崩れがあった部分は、CSSの上書き、もしくはそのパーツにBootstrapを使用せず新しくCSSで作り直して対応した。
+ ユーザーインタビューの参加者たちは初見でほとんど操作に迷うことがなかったのでUIはあまり問題なかったのだと思う。

<b>今後の課題</b><br />
SPAを実装できるようになり、操作感のストレスを軽減しUXを高められるようなアプリを構築すること。

<h4>バックエンド: </h4> 

+ まずNginxとApacheがなにかわからないところからのスタートで理解に苦労した。正直NginxとRailsを連携させるための設定部分に関しては今でも細かく理解はできていない。
+ メモ帳アプリ的な機能の実装の仕方はなんとなくわかるが、そこから外れた機能の実装は初めてで、テキストのコードの丸写しではなく自分で機能に必要な部品を考えていく、ということを初めてした。自作メソッドが動いたときの喜びは大きかった。
+ 途中からリファクタリングを強く意識した。最初は条件節でif文に頼りすぎてしまい、いわゆるクソコードになっていたが、配列を導入したり、メソッドに引数をつけることによって似た様なメソッドを一つにまとめたり、一つのメソッドがコンパクトになるように意識した。リファクタリングがうまくいくことは自分のツボらしく、その喜びはなににも変えがたい。

<b>今後の課題</b><br />
RailsをAPIとして使えるようになり、アプリのサービスの幅をより広げること。

<h4>開発環境: </h4> 

+ 今回のアプリ制作の最初の難関がDockerだった。メンターもDockerをほとんど使ったことがなくこれに関しては自力で解決しなければならなかった。Dockerを使っていると、いったい自分がどこでなにをしてるのかがよくわからず大変苦戦した。
+ ネットの記事やYoutubeどおりに作成しても動作せず困ったときに、まずは公式ドキュメントを見て確認してやっていかなければならないことを痛感させられた。
+ 今回開発と本番でDockerfileの内容が違うので、途中非効率に開発を進めていた時があった（具体的には開発用のリポジトリと本番用のリポジトリを分けて二重に運用していた）が、開発と本番用にそれぞれファイルを分ければできるということを学び、以降は開発がスムーズになった。

<b>今後の課題</b><br />
CI/CDが使えるようになり、開発効率を上げ、より人為的なミスを防げるようになること

<h4>インフラ: </h4> 

+ 書籍、Udemy、Youtubeを通して勉強しながらAWSの各サービスを設定をしていった。当然自分の場合と開発環境が全く同じわけではないので、その差分を学習しながら埋めていった。AWSの多種多様なサービスの多さに圧倒されつつも、必要最小限の構成には収めず、2つのパブリックサブネットの構成で冗長性を高め、ロードバランサーで可用性とセキュリティを高め、できるだけ実際採用されそうなインフラの構築を目指した。

<b>今後の課題</b><br />
DBをマスターとスレイブに分けて冗長性を高めたり、EC2からECSでの構築、CloudFormationに慣れること

<h2>アプリの実装機能</h2>

+ ログイン、ログアウト、ログイン保持
+ 情報登録、編集、削除
+ 画像のアップロードと削除
+ 画像のカルーセル
+ ユーザー一覧表示
+ ユーザープロフィール表示
+ ユーザーの評価を世代別、性別別に表示
+ ユーザーを評価した他ユーザーの一覧表示
+ 使い方マニュアル表示
+ ポイントの取得、消失
+ 検索機能（ID、名前、性別、世代、ポイント、権限）（管理者用）
+ ユーザー評価歴一覧表示（管理者用）

<h2>ER図</h2>

![スクリーンショット 2022-07-18 0.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/cda236bf-0edb-903d-f652-be3119d691c6.png)

<h3>アプリを作成するためにやったこと</h3>

闇雲にアプリを作成するのではなく以下の９つの工程を踏みながら開発しました。

<b>1. 課題定義</b>
　以下の４つを意識し定義。
　「誰のどんな課題を解決するのか？」
　「実際に誰に使ってもらうか？」
　「なぜそれを解決したいのか？」
　「どうやって解決するのか？」

<b>2. 要件定義</b>
「機能要件」、「非機能要件」を意識して定義しました。

<b>3. 業務フローの作成</b>
![スクリーンショット 2022-07-18 23.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/9894bd0b-d5f9-16d5-cc2e-12e976967452.png)
<b>4. 画面遷移図の作成</b>
![スクリーンショット 2022-07-18 23.02.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/38ab53ae-aaac-ba93-13e2-a3cca63a6718.png)
<b>5. ワイヤーフレームの作成</b>
(遷移画面が多数なのでマイページのみ抜粋)
![スクリーンショット 2022-07-19 0.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/726bfeb6-7a90-bf41-6d1a-4e9a6ecbb01b.png)
<b>6. テーブル定義</b>
![スクリーンショット 2022-07-19 0.10.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/7341d17f-dee4-e26d-54fd-8bd264ffd55d.png)

<b>7. システム構成</b>
![スクリーンショット 2022-07-26 16.07.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/7add3851-02f8-5e41-a9c6-ea68c76d3fbb.png)


<b>8. テスト仕様書</b>
（未登録者のみ抜粋/他登録者、管理者）
![スクリーンショット 2022-07-19 0.37.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730398/490da639-55d5-5444-da18-232e4e8cd9b7.png)

<b>9. ユーザーインタビューの実施</b>
３人の方に初見でアプリを使っていただき印象や感想を分かち合ってもらった。

<b>よかったところ</b>

+ デザインや操作性に関しては概ね良い評価をいただいた。
（ちなみに３人ともマッチングアプリを使ったことがない中での操作）

<b>まずまずだったところ</b>

+ ３人のうち１人の人は実際に使ってみたい、という結果だった。
（一人は自分の印象に悩んでいない、もう一人は既婚で異性に自分を印象づける必要がない。使わないといった人の中で、より細かい評価が出る仕様になれば使いたいと思った人がいた）

<b>改善した方がいいところ</b>

+ デザインがマッチングアプリ風で「なぜマッチング機能がないのか」とつっこまれた。
（マッチングの部分はマッチングアプリでいいのでは？とも思ったが、このアプリにマッチング機能をつけると相手に「いいね」を送る機能をさらに進化させたマッチングアプリになれるかもしれない）

+ 評価がでたその先になにかあるといいという意見をいただいた。
（自分の気になる人にポイントを支払って改善点を提案してもらう、という原案はあったが、今回はその機能をカットしていた）

+ 最初に自分のトップ画像を登録してくれる人が少なかった。
（FBのような市民権を得れば心理的抵抗はすくなくなると思われる）


<h2>学んだこと</h2>

「とにかくググれ！」というTwitterの中のエンジニアたちの声を信じて独学の間は、ググりまくってはよく精査もせずにその記事を手当たり次第に試していることがありましたが、メンターからの指摘でそれが悪手であることに気付かされました。

記事の内容が必ずしも正しいとは限らない、記事作成の時期にも注意しなければならない、一つのソースだけを見るのではなく、複数のソースを比べる必要がある、なにより公式やGitHubのスター数の多いREADMEなどのオリジナルソースを読むことが大事なことと学びました。

また、今回DockerやAWSなど自分にとっては新しい知識を学び適用したのですが、かなりエラーには悩まされました。その際に学んだことは「スピード重視の自分は大ざっぱな性格」であり、エンジニアであれば細部を大切に丁寧にやっていくことが大事なことなのだと学びました。エラーがありつつも数ヶ月で実装までこぎつけることができたことは自信になりました。今後もその自信が生きていくと思います。


<h2>さいごに</h2>

最初に自社（フランチャイズの塾）用に顧客管理アプリを作成したきっかけは、講師が毎回生徒のために授業報告書を手書きで書き、月に一度報告書をコピーして原本を生徒の保護者に渡し、コピーをファイルに閉じるという作業が発生していてわずらわしいと感じたためです。
<h4>解決したい点</h4>
1. 講師にとって手書きの報告書は時間がかかり負担<br />
2. 報告書とそれをコピーするコピー用紙が多量に必要で経費がかかる<br />
3. 手書きで報告書の綺麗さに個人差があり均一にならない<br />
4. 生徒が保護者に報告書を必ずしも渡さない<br />
5. 報告書のコピー用紙で棚のスペースが埋まってしまう
<h4>アプリを作成し改善した点</h4>
1. 手書きよりiPadでのタイピングで時短<br />
2. 紙が必要なくなり経費減<br />
3. 手書きではないので報告書の綺麗さが均一<br />
4. 授業後メールで報告書が即座に保護者に届く<br />
5. 棚が紙で埋まらなくなり、破棄する紙の量が大幅に減った<br />
6. ネット上で生徒の報告書、成績を管理できるので学校長がいつでも手元ですぐに生徒情報を確認できる<br />
<br />
授業後にメールで報告書が保護者に届く様になってから保護者の方たちに喜ばれ、またたくさんの講師に「前の手書き時代には戻れません」とおっしゃっていただいたのが忘れられません。

そのようにアプリを通してだれかの生活を便利にしたり、良い方向に持っていけるのは喜びだと思いました。この最初に作ったアプリは自前用のHerokuであげただけのセキュリティもあやしい、デザインもザ・Bootstrapだったのですが、今回は内容、技術、環境構築、デザインのあらゆる面で最初のアプリを超え、かつ実務にできるだけ近いものを作りたいと思って作りました。今後もさらに各面において精進し、お客様のニーズにあった多くの人に使っていただけるアプリサービスを提供できたらと思っています。