驚愕のテクノロジー:バイブコーディングで『ストレスチェックアプリ』開発

今やAIが日常生活に浸透している現在ですが、今のAIムーブメントがブレイクしたのは、わずか2~3年前のこと。

2022年11月30日、ChatGPTはプロトタイプとして公開され、幅広い分野の質問に詳細な回答を生成できることから、公開後5日間で利用者数が100万人、2ヶ月で1億人を突破するなど注目を集めた。出典: フリー百科事典『ウィキペディア(Wikipedia)』

上記のwikiこそが、今現在をブレイクさせた『ChatGPT3.5』です。それから僅か2年半しか経っていないのですが、今やAIなくしては社会が成り立たないほど変貌を遂げています。
もともとはGoogle翻訳チームが、時系列を扱えるRNN(リカレントニューラルネットワーク)のattention機能を、全面的に主役にさせたことから始まった『歴史』になります。
翻訳システムの、他言語から他言語への自然な翻訳を追求していった結果、同一言語内での言い換え、さらには人間が話す言語に限らず、様々な『言語』に適応可能なことが理解され、プログラミングといった人造言語も自然言語からの翻訳が可能になりました。
もちろん、塩基からアミノ酸、アミノ酸からタンパク質への翻訳も、学習によって可能なことが明らかになりました。
スゴイですね!

人間が、使用目的や意義、制約等をAIに伝えることによって各種のアプリやシステムを開発できる環境が整いました。これを、バイブコーディング(Vibe Coding)と言います。

バイブコーディングは、AIに自然言語で要件を伝えることで、プログラムを自動生成する新しい開発手法です。 具体的には、開発者が「こういうアプリがほしい」といったざっくりとした要望をAIに伝えるだけで、必要なコードを生成してくれるのが特徴です。この手法は、従来の手書きコーディングやノーコード・ローコードツールとは異なり、より直感的で柔軟な開発を可能にします。出典:Microsoft Copilot

で、バイブコーディングで、ストレスチェックアプリを開発してみました。使用したAIは、Google Gemini2.5 Pro(無料版)です。次のプロンプトを指示してみました。

で、出力されたのが以下になります。

で、バイブされたコードは以下になります。ものの数分(数秒?)💦
評価点の計算方法を素点換算表を使うよう指定しているのですが、合計点数を使う方式になっています。ご愛敬なのか、何らかの致命的な欠陥なのかは不明ですが。。。

AIがノリでコーディングしてもらったUIは、以下のような感じです。なかなかではありませんか!
以下は最初のページです。名前と性別、メールアドレスを入力して、質問のページに移ります。

質問のページです。ボタンを押して選択してゆきます。

すべての質問に答えると、確認画面に移ります。

結果の送信ボタンを押すと、受検者と実施事務従事者に結果が送信されます。(もちろん、バックエンドを作らないと動きませんが。。。)

いかがでしょうか? すごいですね! AI、使わない手はありません‼
生成されたコードの意味を詳しく知りたい時も、質問しまくります。めっちゃ勉強になりますね。AIは、人類の英知の集合です。使わない手はありません。。。


管理人
管理人

index.htmlのコードについて、簡単に説明してください。

Geminiさん
Geminiさん

はい、承知いたしました。

現在表示されている index.html のコードについて、役割ごとに簡単にご説明します。

このファイルは、大きく分けて3つの部分から構成されています。

1. HTML(骨格)

<div class="container"> の中に、以下の3つの「ページ」に相当する部分が定義されています。

  • 開始ページ (#start-page): 最初に表示される画面です。氏名、性別、メールアドレスを入力するフォームがあります。
  • 質問ページ (#question-page): ストレスチェックの57項目の質問が表示される画面です。
  • 確認・結果ページ (#confirm-page): 計算されたストレスチェックの結果が表示され、メールを送信するボタンがある最終画面です。

JavaScriptによって、これらのページは1つずつ表示が切り替えられます。

2. CSS(デザイン)

<style> タグの中に書かれているコードがCSSです。これは、アプリの見た目を整える役割を担っています。

  • レイアウトと配色: 全体の色合い、文字の大きさ、ボタンのデザインなどを定義しています。
  • アニメーション: ページが切り替わる際に、ふわりと表示されるような効果(アニメーション)を加えています。
  • レスポンシブ対応: パソコンだけでなく、スマートフォンの画面サイズでも見やすいようにレイアウトを自動で調整します。

3. JavaScript(頭脳・ロジック)

<script> タグの中に書かれているコードがJavaScriptで、このアプリのほぼ全ての動作を制御しています。

  • 画面遷移: 「検査を開始する」ボタンが押されたら質問ページを表示するなど、ページの表示を切り替えます。
  • 質問の生成: 57項目の質問データを元に、HTMLを動的に作り出して画面に表示します。
  • 進捗管理: ユーザーが質問に答えるたびに、プログレスバーを更新し、全問回答されたら「結果を見る」ボタンを押せるようにします。
  • 点数計算: 厚生労働省のマニュアルに基づき、回答内容と性別から各尺度の点数や高ストレス者判定、総合判定を行います。
  • 結果表示: 計算した結果を整形して、確認・結果ページに表示します。
  • メール送信: 「同意して結果を送信」ボタンが押されたら、入力された情報と診断結果を send_mail.php というサーバー上のプログラムに送信する命令を出します。

要約すると、HTMLでページの骨格を作り、CSSで綺麗に飾り付けをし、JavaScriptがユーザーの操作に応じて計算や画面の切り替えといった全ての賢い動きを担当している、という構成になっています。

管理人
管理人

ありがとうございます。”質問の生成: 57項目の質問データを元に、HTMLを動的に作り出して画面に表示します” について、もう少し詳しく教えてください。

Geminiさん
Geminiさん

はい、承知いたしました。

index.html内のJavaScriptにおける「質問の生成」の仕組みについて、もう少し詳しくご説明します。

これは、「設計図(データ)」と「組み立て処理(プログラム)」を分けて、効率的にHTMLを作るという考え方に基づいています。

1. 設計図:質問データ(questions 配列)

まず、JavaScriptのコード内に、57個の質問すべての情報が「配列(リスト)」の形で定義されています。これを「設計図」だと考えてください。

JavaScript

// --- 質問データ (57項目) ---
const questions = [
    { id: 'q1', text: '非常にたくさんの仕事をしなければならない', isReversed: false },
    { id: 'q2', text: '時間内に仕事が処理しきれない', isReversed: false },
    // ...(中略)...
    { id: 'q57', text: '全体的に健康だと感じている', isReversed: true }
];
  • この questions というリストの一つ一つの要素が、1問分の設計情報(id, 質問文text, 点数計算で反転するかisReversed)を持っています。
  • HTMLファイルに57個の質問をベタ書きするのではなく、このデータリストだけを管理すれば良いため、後から質問を修正したり、順番を入れ替えたりするのが非常に簡単になります。

2. 組み立て処理:generateQuestions 関数

次に、generateQuestions という関数が、この「設計図」を元に実際のHTMLを組み立てる大工さんのような役割を果たします。

この関数が行っていることを手順に沿って説明すると、以下のようになります。

  1. 空のHTML入れを用意するlet html = ”;まず、最終的に完成させるHTMLコードを溜めておくための、空の文字列変数を用意します。
  2. 設計図を1枚ずつ取り出して処理する(ループ)questions.forEach((q, index) => { … });forEach という命令で、57個の質問データ(設計図)を最初から最後まで1つずつ順番に処理していきます。
  3. 1問分のHTML部品を組み立てるループの中で、1問分のHTMLコードを文字列として組み立てていきます。JavaScript// 質問の枠組みを作る html += `<div class="question-item">`; // 質問番号と質問文を追加する html += `<p>質問 ${index + 1}: ${q.text}</p>`; // 4つの選択肢を追加する // ...(選択肢のHTMLを組み立てる処理)... // 枠組みを閉じる html += `</div>`; ```q.text` の部分には、設計図から取り出した質問文が自動的に入ります。
  4. 質問の種類に応じて、適切な選択肢を組み立てるストレスチェックでは、質問によって「そうだ/ちがう」や「非常に/全くない」など、回答の選択肢が異なります。if文を使って、今処理している質問がどのグループに属するかを判断し、answerOptions や supportAnswerOptions といった、あらかじめ用意しておいた選択肢のデータを使って、4つのラジオボタン(<input type=”radio”>)とラベル(<label>)を組み立てます。
  5. 完成したHTMLをページに埋め込むループ処理が57回終わると、変数 html の中には57問すべてのHTMLコードが完成した状態で溜まっています。最後に、questionsContainer.innerHTML = html;という命令で、この完成したHTMLコードを、あらかじめHTML側に用意しておいた <div id=”questions-container”></div> という空の箱の中に一気に流し込みます。

この瞬間に、ユーザーの画面に57項目の質問がズラッと表示される、という仕組みです。

このように、データと処理を分離することで、コードの見通しが良くなり、メンテナンス性が格段に向上します。

管理人
管理人

めちゃくちゃ勉強になります。ありがとうございます!

コメント