【未経験・独学】教員と学生のための振り返り学習プラットフォームを開発しました【Nuxt / Rails / Tailwind CSS / Firebase Authentication / GitHub Actions】

## はじめに
初めまして。

未経験から独学でフロントエンドエンジニアを目指している、

かせい([@kaseispace](https://x.com/kaseispace))と申します。

この度、対話型振り返りシステム「ReCap」を開発しましたので、ご紹介させていただきます。

興味を持っていただけたら、開発したアプリを触っていただけると嬉しいです。また、簡単なアンケートにもご協力いただければさらに感謝いたします。アンケートは以下のリンクからご意見をお寄せください。

https://docs.google.com/forms/d/e/1FAIpQLSet5g1gv3LdmHXYNDW_crEbQExsLUcH5T4w5V7cSuVC8a3E1Q/viewform?usp=dialog

皆様のフィードバックをお待ちしております。

## ポートフォリオの紹介

![サイトのOGP画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954066/f7cc3e51-6797-703b-3150-e488300922fc.png)

### サービス概要
「ReCap」は、**教員と学生のための振り返り学習プラットフォーム**です。
**教育現場での利用**を想定しており、教員が作成したプロンプトに基づき、学生はチャット形式で対話を通じて振り返りを行います。**対話型の振り返り**は、学生が自分の考えを**自由に表現しやすい**という特徴があります。振り返りの内容がすべて提出された後には、**個別のフィードバック**を受け取ることができます。これにより、**学びを深め、新たな気づきを得るサポート**をしています。

### サービスURL

https://www.recaplearning.com?12

:::note info
推奨端末について 
ReCapはレスポンシブ対応しておりますが、システムの特性上、PCでの利用を推奨しております。
:::

:::note info
システムの特性上、教員と学生がいて初めて成り立ちます。
これに伴い、開発者側であらかじめ「フルスタック大学」で教員アカウントを作成し、いくつかの授業を登録しておきました。

**振り返りだけを試してみたい方は、「フルスタック大学」で学生アカウントを作成**し、以下の中から好きな授業に参加してください。
ただし、**授業が開講されている曜日でないと振り返りができない**ので、その点にご注意ください。
:::

:::note warn
現在、ReCapの登録は大学に限定されています。そのため、大学以外の学校（中学校、高校、専門学校など）は登録できませんので、ご了承ください。
:::

| 授業名                   | クラスコード  | 開講日　    |
|:------------------------:|------------:|------------:|
| プログラミング入門        | mascxLE      | 月          |
| HTMLとCSSの基本          | AcbS9Zb      | 火          | 
| JavaScript入門           | krkrSID      | 水          | 
| コンピュータサイエンス概論 | NSpY1lD      | 木          | 
| データベースの基礎        | Zgr0i3S      | 金          | 
| ネットワークの基礎        | NBhym9z      | 土          | 
| バックエンド開発入門      | ET6C0Ie      | 日          | 

### Figmaで体験する「ReCap」
「ReCap」の使い勝手を簡単に体験していただくために、Figmaを使用したプロトタイプを作成しました。アカウント作成の手間を省き、まずは気軽に操作感を試したい方に最適です。このプロトタイプで「ReCap」の魅力を感じたら、ぜひ実際のシステムも試してみてください。

https://www.figma.com/proto/KDvVsfNRQkM56ZxVIV5VEr/ReCap-Design?page-id=189%3A2679&node-id=443-9575&p=f&viewport=207%2C141%2C0.04&t=AmuHS8DJTDRXXNgk-1&scaling=scale-down&content-scaling=fixed&starting-point-node-id=443%3A9575&show-proto-sidebar=1

### GitHubリポジトリ
**フロントエンド**

https://github.com/kaseispace/recap-frontend

**バックエンド**

https://github.com/kaseispace/recap-backend

### 開発背景
私が初めて振り返りの大切さを実感したのは、学生時代の授業で振り返りをする機会があったときです。それまでは、勉強したことをそのままにして、振り返ることなんてほとんどありませんでした。

でも、その授業では、授業後に振り返りをすることが求められていて、私は言われるがままに振り返りを行っていました。当時はその重要性をあまり感じていませんでしたが、後でその振り返りを見返すと、自分の学びをもう一度確認することができ、深く理解する助けとなっていることに気づきました。

特に、テスト対策のときに振り返りがすごく役立ちました。自分ができなかったことに対して振り返ることで、理解が足りなかった部分をはっきりさせて、効率よく復習することができました。

この経験から、**振り返りは学習効果を高めるためにとても重要な手法**であることを痛感しました。

振り返り学習は、学んだことをもう一度見直して、次の学習に活かす大切なプロセスです。でも、多くの学生は勉強したことをそのままにしてしまい、振り返りをすることが少ないのが現実です。

### 「ReCap」の目的
「ReCap」は、振り返りの導入や改善を考えている教員の皆様に向けて開発しました。このアプリは、学生たちが自分の学びを振り返り、より効果的に活用できるよう支援することを目的としています。

**「ReCap」の特徴**
- **チャット形式の振り返り**：学生が自由に考えを表現しやすい対話型の振り返り
- **個別フィードバック**：振り返り内容に基づくフィードバックで学びを深める
- **クラスの振り返り共有**：クラス全体の振り返りを閲覧し、他の学生の意見や気づきを共有
- **新たな気づきを得る**：他人の振り返りから学び、自己成長を促進

### システムの利用イメージ

![利用イメージ画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954066/ea0fc88f-7d3c-4d33-524b-d6ca4abeba19.png)

**1. 授業開始前（教員向け）**
まず、教員は授業前に以下の準備を行います。

- システムに授業の日付を登録
- 授業内容に合わせた振り返り用のプロンプト（質問）を作成し、生徒に公開

**2. 授業中（学生向け）**
授業が進行する中で、学生は以下の活動を行います。

- 授業中、教員が振り返りの時間を指示します。そのタイミングで、学生は自分の学びを振り返り、システムに記録します。このとき、教員が提示したプロンプト（質問）に沿って入力

**3. 振り返り終了後（教員・学生向け）**
振り返りが完了した後、以下の活動を実施します。

- 教員
    - システムを通じて学生の振り返り状況を確認
- 学生
    - システムからのフィードバックを確認し、必要に応じて振り返り内容を修正
    - 他の学生の振り返りを参考にし、自分の学びを深める

## 機能紹介 - 教員ページ


  <table>
    <thead>
      <tr>
        <th>担当授業登録機能</th>
        <th>振り返りプロンプト作成機能</th>
      </tr>
    </thead>
    <tr>
      <td>
        <a href="https://gyazo.com/80f2525f4fe27ef8d31f9ff628aba7f5"><img
          src="https://i.gyazo.com/80f2525f4fe27ef8d31f9ff628aba7f5.gif"
          alt="担当授業登録"
          width="1000"
        ></a>
      </td>
      <td>
        <a href="https://i.gyazo.com/9dec2b62bf8726765dce9c1e0f91f5c9"><img
          src="https://i.gyazo.com/9dec2b62bf8726765dce9c1e0f91f5c9.gif"
          alt="振り返りプロンプト作成"
          width="1000"
        ></a>
      </td>
    </tr>
    <tr>
      <td>
        担当授業の登録を行ってください。<br>
        登録後、授業ページにてクラスコードが発行されます。
        このクラスコードを学生に共有してください。
      </td>
      <td>
        学生に振り返らせたいプロンプトの登録をしてください。<br>
        プロンプトは複数登録可能です。<br>
      </td>
    </tr>
  </table>

  <table>
    <thead>
      <tr>
        <th>振り返りプロンプト公開機能</th>
        <th>振り返りプレビュー機能</th>
      </tr>
    </thead>
    <tr>
      <td>
        <a href="https://i.gyazo.com/89ce35dda119affa9f47f1166d45ee57"><img
          src="https://i.gyazo.com/89ce35dda119affa9f47f1166d45ee57.gif"
          alt="振り返りプロンプト公開"
          width="1000"
        ></a>
      </td>
      <td>
        <a href="https://i.gyazo.com/4fc5ab745b23155d5a8f06c2ae126d0e"><img
          src="https://i.gyazo.com/4fc5ab745b23155d5a8f06c2ae126d0e.gif"
          alt="振り返りプレビュー"
          width="1000"
        ></a>
      </td>
    </tr>
    <tr>
      <td>
        作成したプロンプトを有効化すると、学生に公開されます。<br>
        有効化後、チャットアイコンが表示されます。
      </td>
      <td>
        チャットアイコンをクリックすると、プレビューを確認できます。
      </td>
    </tr>
  </table>

  <table>
    <thead>
      <tr>
        <th>授業日登録機能</th>
        <th>振り返り履歴閲覧機能</th>
      </tr>
    </thead>
    <tr>
      <td>
        <a href="https://i.gyazo.com/90cd859f1729b76d68fda30a8c2dba97"><img
          src="https://i.gyazo.com/90cd859f1729b76d68fda30a8c2dba97.gif"
          alt="授業日登録"
          width="1000"
        ></a>
      </td>
      <td>
        <a href="https://i.gyazo.com/4f86fb249112f366f68fb4e30ede5139">
          <img
            src="https://i.gyazo.com/4f86fb249112f366f68fb4e30ede5139.gif"
            alt="振り返り履歴閲覧"
            width="1000"
          >
        </a>
      </td>
    </tr>
    <tr>
      <td>
        授業日の登録を行ってください。<br>
        現在の授業日が終了するまで、次の授業日の登録はできません。<br>
        編集・削除は可能です。
      </td>
      <td>
        学生が各授業回で行った振り返り内容を閲覧できます。
      </td>
    </tr>
  </table>

## 機能紹介 - 学生ページ

  <table>
    <thead>
      <tr>
        <th>授業参加機能</th>
        <th>振り返り登録・閲覧機能</th>
      </tr>
    </thead>
    <tr>
      <td>
        <a href="https://i.gyazo.com/2fdb29891a62b79dcc1627a904e9639a"><img
          src="https://i.gyazo.com/2fdb29891a62b79dcc1627a904e9639a.gif"
          alt="授業参加"
          width="1000"
        ></a>
      </td> <td>
        <a href="https://i.gyazo.com/d71c7269d5ba9dfced1ce16e1d553dcf"><img
          src="https://i.gyazo.com/d71c7269d5ba9dfced1ce16e1d553dcf.gif"
          alt="振り返り登録・閲覧"
          width="1000"
        ></a>
      </td>
    </tr>
    <tr>
      <td>
        教員から共有されたクラスコードを入力してください。<br>
        クラスコードが一致すると、そのクラスへの参加が完了します。
      </td>
      <td>
        チャットアイコンをクリックします。<br>
        振り返りが開始され、指示に従って振り返りを行います。<br>
        全ての振り返りが終了後、振り返り履歴から登録内容を確認できます。また、振り返りに対してフィードバックが返されます。
      </td>
    </tr>
  </table>

   <table>
    <thead>
      <tr>
        <th>振り返り編集機能</th>
        <th>みんなの振り返り機能</th>
      </tr>
    </thead>
    <tr>
      <td>
        <a href="https://i.gyazo.com/a47f288c60a66c368c15f39bc8cc1ddd"><img
          src="https://i.gyazo.com/a47f288c60a66c368c15f39bc8cc1ddd.gif"
          alt="振り返り編集"
          width="1000"
        ></a>
      </td> <td>
        <a href="https://i.gyazo.com/6019a5f19b0446d216c3a3fdb3518f86"><img
          src="https://i.gyazo.com/6019a5f19b0446d216c3a3fdb3518f86.gif"
          alt="みんなの振り返り"
          width="1000"
        ></a>
      </td>
    </tr>
    <tr>
      <td>
        登録済みの振り返りをフィードバックや他の学生の振り返りを参考にして編集できます。
      </td>
      <td>
        他の学生の振り返りを閲覧できます。<br>
        振り返りは内容のみが表示されますが、カードをクリックすると質問を含めた全文や省略された部分が表示されます。
      </td>
    </tr>
  </table>

## こだわりポイント
### 付箋風カードによる振り返り共有
学生が記入した振り返りの内容を付箋風のカードに表示することで、クラスメートの振り返りを簡単に閲覧できるようにしています。

このデザインには、教室で学生が各々の意見を付箋に書いて模造紙に貼り付け、共有するという情景をシステムに取り入れたいという思いを込めています。視覚的に振り返りを共有することで、他の学生の意見や考えを取り入れることができ、自分自身の学びを深める手助けとなります。

![みんなの振り返り画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954066/636cebf7-5527-dff8-6982-cff5b8a72fa3.png)

### 振り返りの記入状況の可視化
学生の振り返り状況を簡単に確認できるよう、記入済みの場合はチェックマーク、未記入の場合はバツ印や黄色の四角で表示しています。
これにより、グラフとアイコンを使って直感的に情報を把握できるようにしました。

![振り返りの可視化グラフ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954066/161c6f51-fdc9-4bb3-270b-17ba8efe855e.png)

## 使用技術一覧
#### フロントエンド
- Vue 3.5.11
- Nuxt 3.13.2
- TypeScript 5.6.2
- コード解析/フォーマッター：Nuxt ESLint
- テストフレームワーク：Vitest / Nuxt Test Utils
- UIライブラリ：Tailwind CSS
- 主要パッケージ： VueUse / Nuxt Icon / Nuxt Image / vue-chartjs
#### バックエンド
- Ruby 3.3.4
- Ruby on Rails 7.1.3
- コード解析/フォーマッター：Rubocop
- テストフレームワーク：RSpec
#### インフラ
- Vercel (フロントエンド)
- Render (バックエンド)
#### CI/CD
- Github Actions
#### 環境構築
- Docker
#### 認証
- Firebase Authentication
#### API
- 学校コード検索 API
- OpenAI API

## 技術選定の理由

### フロントエンド
**検討した技術**：React / Next.js
ReactやNext.jsは非常に魅力的なフレームワークですが、私がプログラミングを始めた頃、挫折せずに開発を続けるためには、学習難易度の低い技術が重要でした。

VueはJavaScriptをそのまま書いているような感覚で、Reactに比べて学習のハードルが低いと感じました。また、Vueはシンプルで直感的な設計がされており、コンポーネントベースのアーキテクチャを直感的に理解できました。

Nuxt3は、今回はSPAモードで運用しているため、SSRやSSGの恩恵はありませんが、オートインポートなどの便利な機能が豊富であるため、開発効率を向上させることができました。

今後は、Nuxt3を使用したSSRの開発にも挑戦し、さらに深い知識と経験を積みたいと考えています。また、ReactやNext.jsにも挑戦し、その豊富なエコシステムと高いパフォーマンスを活用した開発にも取り組みたいと思っています。

### UI
**検討した技術**：Vuetify
Vuetifyは、Vue.jsに基づいた人気の高いUIライブラリで、多くのコンポーネントが揃っています。これらのコンポーネントを使うことで、複雑なCSSをほとんど書かずに美しいUIを簡単に作成することができます。

しかし、今回はCSSの学習も兼ねて、自由にカスタマイズ可能なTailwind CSSを採用しました。Tailwind CSSを使用することで、CSSの基礎をしっかりと身につけることができました。確かにVuetifyと比べて工数はかかりましたが、結果として得た知識と経験は非常に良い学びになりました。

### バックエンド
**検討した技術**：PHP / Laravel
プログラミングを始めた当初、私は有名な「Railsチュートリアル」というサービスを利用して学びました。Railsチュートリアルは、初心者が挫折せずに学びやすい内容で構成されており、私にとって非常に理解しやすかったです。そのため、最初に習得したフレームワークがRailsでした。

ポートフォリオを開発する際にも、すでに馴染みのある技術を使うことが効率的だと判断し、Railsを採用しました。これにより、学習コストを抑えつつ、開発を進めることができました。

### インフラ
**検討した技術**：AWS
バックエンドのデプロイ先としてAWSを検討しましたが、今回は見送りました。その理由は、学習コストと費用の面からです。AWSは非常に強力なプラットフォームですが、使いこなすためにはかなりの学習が必要です。また、コストも考慮する必要があります。

## 画面遷移図

https://www.figma.com/design/KDvVsfNRQkM56ZxVIV5VEr/ReCap-Design?node-id=189-2679&t=2H5lpZcVIpUr7ieO-1?1

## ER図

![ER図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954066/79290dda-a513-2b33-5694-1b5e00b33120.png)

## インフラ構成図

![インフラ構成図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954066/9a0aa7c3-ee96-8b68-9236-974bcf222673.png)

## ポートフォリオを開発する際に学習・参考にした教材や記事

### HTML・CSS / JavaScript・TypeScript

https://prog-8.com/dashboard

https://typescriptbook.jp/

### Vue / Nuxt

https://gihyo.jp/book/2022/978-4-297-13072-5

https://gihyo.jp/book/2023/978-4-297-13685-7

https://reffect.co.jp

https://zenn.dev/tentel/books/08b63492b00f0a

### Rails

https://railstutorial.jp/

https://zenn.dev/igaiga/books/rails-practice-note/viewer/rails_rspec_workshop

### Docker

https://y-ohgi.com/introduction-docker/

### Figma

https://www.shoeisha.co.jp/book/detail/9784798179452

### ポートフォリオ紹介記事

https://qiita.com/keynyaan/items/64a350cd409f40895bde

https://qiita.com/yusuke_blog1026/items/c68c45790a977cbd0715


上記で紹介した以外にも**Qiita**や**Zenn**など、多くの記事やサイトに本当にお世話になりました。この場を借りて、**心から感謝しています**。




## おわりに
ここまで読んでいただき、心から感謝いたします。

ReCapの開発は、挑戦の連続でしたが、その分多くの学びを得ることができました。途中で何度も完成しないのではないか、これまでの努力が無駄になるのではないかと不安に感じましたが、それでも最後までやり遂げることができました。

まだまだ改善の余地はありますが、この経験を通じて得た知識とスキルを、今後も活かしていきたいと思います。この記事が、少しでも誰かの参考になれば幸いです。

ReCapへのアクセスは、下記リンクからご利用ください。

https://www.recaplearning.com?12

また、再度のお願いになりますが、アンケートにご協力いただけると非常に嬉しいです。アンケートは、以下のリンクからご意見をお寄せください。

https://docs.google.com/forms/d/e/1FAIpQLSet5g1gv3LdmHXYNDW_crEbQExsLUcH5T4w5V7cSuVC8a3E1Q/viewform?usp=dialog

最後に、システムの不具合やご質問等がございましたら、コメントや、X([@kaseispace](https://x.com/kaseispace))、アンケートからご連絡いただけますと幸いです。

最後までお読みいただき、ありがとうございました！