【要件定義編】学生エンジニアが個人開発する時に迷わないようにするためのサービス

#この記事の対象
- 独学でプログラミングを勉強している学生エンジニア
- 個人開発を行おうとしている、もしくは行っている初学者エンジニア
- 要件定義ってどういう風にやっているの？っていう方

文系でプログラミングを独学で勉強している大学三年生の私が今できる最大限で考えていきます。

# きっかけ
現在進行形で自分が何かしらのサービスを作る上で、どんな技術を使ってどんな風にどんな順序で開発を進めていくのが分からないからというのが始まり。学生エンジニア（特に未経験、インターンなどの経験もなく独学で勉強している人）は、ポートフォリオなどを作ろうとするときに大きな壁が存在すると思う。

**1.アイデアがない**
**2.どこから手を付けるべきか分からない**
**3.モチベが続かない**

以上の三つが学生エンジニア、特に未経験の方の共通した課題であると考えています。（自分が正にそうだから）

そのため上記の三つを解決するために**「学生エンジニアが個人開発する時に迷わないようにするためのサービス」**を開発したいと考えました。

# 課題を掘り下げてみる

先ほど挙げたこの三つの課題をもう少し深く考えてみようと思う。

**1.アイデアがない**

これはチュートリアルなどをクリアしてTodoアプリや掲示板などを作った後に起こりがちな現象である。プログラミング自体が好きで何かを発想したり考えたりするのが苦手な人にありがちな気がする。これは、自分もそうだけど何かを作ろうとするときにハードルを上げすぎているからかもしれないと思った。よく、エンジニア系のイベントでハッカソンというものがありますよね？自分は未経験で全然クソアプリしか作れないから、参加してもどうせ足を引っ張って迷惑をかけるだけだから参加しない方が良いだろう。などと考える人が多いと思います。（筆者もそうでした）そのため、こんな物でも良いんだよというハードルを下げたい。

また、自分はアイデアがないのではなくて、そもそも身近な課題を発見できていない、もしくは課題を課題として認識できていない、あるいは言語化できていないだけではないだろうか？と考えた。そのため、サービスにはどんな課題を解決したいのかという課題解決型のモノに限定しようと思う。意味のないTODOアプリであったとしても何か意味づけをするだけで変わってくると思う。（例えば、ただプログラミングの練習のためにTodoアプリを作ったというよりも、「怠惰な大学生による課題を計画的に終わらせるためのTodoアプリ」「ゼミの発表やグループワークの時にやるべきことを分担できるTodoアプリ」みたいなやつの方が面白くないですか？）こんな感じで、たとえTodoアプリというプログラミングをしている人ならそんなん簡単やんって思うものかもしれないけれど、意味づけを行うことで価値が生まれるし、自然と「計画的に終わらせるためには期限が設定できた方がいい」とか「分担するためには人の名前を設定して、その人に割り振られてるタスクだけを見れる画面作ろう」とかアイデアが思いつきますよね。

ということで、ハードルはTodoアプリくらいめっちゃ低くていいけど、ちゃんと課題を言語化して意味づけを行うこと。


**2.どこから手を付けるべきか分からない**

これは絶望を感じるくらいにその通り過ぎて泣ける。特に、独学でやろうとする人はQiitaやZennや各種ブログなどで公開している作り方やTipsなどを見ても自分と全く同じような人は存在しないから、何が正しいのか分からなくて一生調べ続ける。どの言語を使ってどんなフレームワークを使うのか？そもそも、どうやって公開すればいいの？DBの設計なにそれ？開発環境の構築？もう無理・・・ってなります。（筆者も経験済みです）

これは、要件定義 → 技術選定 → 設計（URI,DB,UI/UX,インフラなど）→ コーディングなどのフローが分かりやすく示されていることで解決するのではないかと考えた。未経験エンジニアのためのロードマップとかよく記事とかYoutubeとかで見るけどあれと同じような感じだと思っています。ここら辺は開発に関する本や記事を読みながら、詳細は後日決めていきたいと思います。

**3.モチベが続かない**

これは、自分が文系で周りにプログラミングに関する人だったりエンジニアを志す人が少ないからかもしれませんが、何かを始めようとしても自分一人でモチベーションを保ち続けることは本当に難しいし、一定のところまで行ったら誰かの意見がもらえたり何かしらの評価をしてもらうことは大切だと思う。実際のサービスもユーザーのフィードバックによって成長していくものだろう。

また、これは自分特有の問題であると思うのですが計画や理想なんかを実際に形として組み立てたとしても、それで満足してしまって全然続かないことが多いんです。だから、進捗を随時保存できたり、それらを評価合えるような機能が欲しいなと思います。例えば、一つの小さな機能を実装したら実装完了ボタンを押してそれをTwitterに投稿できるようにするとか。

# サービス概要
一言でいえば**「学生エンジニアが個人開発する時に迷わないようにするためのサービス」**

**１．身近な問題を言語化し課題を設定する。**
**２．開発フローに従って、要件定義、技術選定、設計、コーディングを行う。（フォーマットを作成して、いろんな人との比較をしやすくする。）**
**３．進捗状況を報告したり、他の人へのアドバイスや励ましの言葉を贈る。**
**４．サービスを公開する**

ざっくり、こんな感じですね。

# 要件定義

**【基本機能】**

**ユーザー新規登録/ログイン/ログアウト**
ユーザー名・メールアドレス・パスワードを使って新規登録を行うことができる。
メールアドレス・パスワードを使ってログインできる。

**ユーザープロフィール登録/編集**
ユーザー名・メールアドレス・パスワードの編集ができる。
プロフィール写真のアップロードできる。

**サービス投稿/編集/削除**
サービス名、サービスの概要、サービスが解決したい課題を作成・編集・削除できる。

**サービス一覧表示**
全てのサービス名、概要を表示でき、詳細ページに飛ぶことができる。
いいね順に並び替えることが可能。
（できれば、使用しているフレームワークなどでの絞り込み、検索機能まで）

**要件の定義/編集/削除/状態管理**
機能と機能の説明を投稿、編集、削除ができる。
実装が完了している機能にはチェックボックスを入れることができる。

**URI設計の作成/編集/削除**
URL、CRUD、ページでできることを作成、編集、削除できる。（表形式）

**技術選定の作成/編集/削除**
フロントエンド、バックエンド、インフラ、その他の項目に分けて使用するプログラミング言語、フレームワーク、各種サービス名を設定、編集、削除できる。

---


**【応用機能】**

**サービスに対するコメント機能**
サービスの詳細ページでコメントを投稿、編集、削除できる。

**サービスに対するいいね機能**
サービスの詳細ページでいいねができる。

**サービス検索、並び替え機能**
名前、タグ、作成者、いいね数を用いた検索、並び替えが可能。

**要件の機能が実装できたらTwitterで共有できる**
チェックボックスをいれたらTwitterへの共有を促すフォームが出てくる。
共有を押すと共有され、✖を押すと共有されない。

# 使用技術

**フロントエンド**
Vue.js

**バックエンド**
Laravel
MySQL

**インフラ**
Heroku(できたらAWSがいいけど未定)

**開発環境**
VSCode
Git、GitHub

# URL設計

| URL | メソッド | 説明 |
|:-:|:-:|:-:|
|/|GET|トップページ、サービスの使い方や概要を説明する。|
|/register|GET|ユーザーの新規登録フォームが表示されている。|
|/register|POST|ユーザー登録とログインページにリダイレクトする。|
|/login|GET|ログインフォームが表示されている。|
|/login|POST|ログイン処理とユーザーページにリダイレクトする。|
|/logout|POST|ログアウト処理を行う。|
|/users|GET|登録されているユーザー名、ユーザー情報がすべて表示されている。|
|/users/{userId}|GET|ユーザー情報とユーザーが投稿したサービス一覧の表示。|
|/services/{serviceId}|GET|任意のサービスの詳細情報が表示されている。|
|/services/{serviceId}/edit|GET|サービスの編集画面を表示する。|
|/services/{serviceID}/edit|POST|サービスの編集フォームを送信し、編集を実行する。|
|/services/{serviceId}|GET|特定のサービスの詳細情報が表示されている。|
|/comment|POST|特定のサービスへのコメントが保存される。|
|/task|POST|特定のサービスのタスクが追加・編集できる。|

#まとめ
意外と書き出してみると止まらなくなるものですね(笑)。実際にどういうものがいいのか開発して見ながら徐々に変化していくものだと思います。しかし、とにもかくにもアウトプットをして形にしないと何も始まりません。あなたが今考えていることは明日には一週間後には忘れてしまっているでしょう。まずは、皆さんも要件定義を頑張ってやってみましょう！最初は自分なりにでいいと思います。何度も失敗して最高の形を見つけていきましょう！自分も模索しています！！