はじめに
大学生の息子が授業での課題のプログラミングに生成AIを使用したと聞いた。
生成AIにプログラミングさせてプログラミングの勉強になるのか。それが頭に浮んだ素朴な疑問でした。
プログラミング教育において生成AIを利用する意義について、日本の実情などについて調べ、自分なりの答えを出してみようと思いました。
以下は、その調査と考察の過程を記録したものです。
息子に聞いたこと
面倒くさがる息子に食い下がって、何をどんな風に利用したのか等聞いてみました。(聞き取りはほぼLINEで)
- 授業内容
- プログラミング言語を用いて物理学の問題を計算機上で解く。
- 使用した生成AI
- Code Copilot
- 生成AIの利用は可なのか
- 息子曰く「グレイ」。先生は何とも言ってないらしく、学生も「生成AIを使ってもいいでしょうか」などというようなやぶ蛇な質問はしていないようです。
- 念のため大学の生成AIの使用についてのガイドラインを確認してみると、いくつかの留意事項はあるものの、「積極的に活用することを基本とする」とあるので利用することは問題ないのでしょう。
日本の実情
日本の教育を所管する文部科学省はどう考えているのだろう。
文部科学省は、初等中等教育においては「初等中等教育段階における生成AIの利用に関する暫定的なガイドライン」を、大学・高専においては「大学・高専における生成AIの教学面の取扱いについて」を示しています。
なぜか高等学校向けガイドラインは見つけられませんでした。
初等中等向けガイドライン
主として対話型の文章生成AIについてまとめたものであり、プログラミングについて言及されている箇所はありませんでした。
ガイドライン中の「生成AIの概要」は、利用する上での姿勢や懸念事項を含めわかりやすくコンパクトにまとめられており、私のような生成AI初心者にはとても参考になりました。
ガイドラインに「暫定的な」とある通り、教育現場での活用・利用については文科省としてもまだ試行錯誤中というところでしょうか。
大学・高専向けガイドライン
本記事のテーマである「プログラミング教育において生成AIを利用する意義」に関係する以下の記載に注目しました。特に太字箇所。
- 生成 AI を利活用することが有効と想定される場面としては、例えば、ブレインストーミング、論点の洗い出し、情報収集、文章校正、翻訳やプログラミングの補助等の学生による主体的な学びの補助・支援などが考えられる
大学入学時に父から「大学は高校と違い自分から進んで勉強、研究する場所であるから勉強を怠らないように」という手紙を受け取ったが、まったくできなかったことを思い出しあらためて反省
- 生成 AI は、今後さらに発展し社会で当たり前に使われるようになることが想定されるという視座に立ち、生成 AI の原理への理解、生成 AI へのプロンプト(質問・作業指示)に関する工夫やそれによる出力の検証、生成 AI の技術的限界の体験等により、生成 AI を使いこなすという観点を教育活動に取り入れる
- 学生がレポート等に生成AIを利活用した場合には、適切に学修成果を評価するため、利活用した旨や利活用した生成AIの種類・箇所等を明記させること
自分でも使ってみた
恥ずかしながらこれまで生成AIを使用したことがありませんでした。
ITで飯をくっている人間としてあるまじきこと
一番手軽と思われるMicrosoft Copilotの無料版を使用しました。
試しに、元号と西暦を変換するWebアプリを作成してください
と入力してみると、
HTML、JavaScript、CSSをまとめたHTMLファイルが作成にされたので、以下を順番に入力してコードを改良しました。
① javascriptとスタイルのファイルを分けてください
② 入力をプルダウンとしてください
③ 西暦から元号への変換は月を考慮してください
④ かっこいいスタイルにしてください
⑤ 西暦から元号への変換と元号から西暦への変換の入力を分けてください
⑥ 日付を考慮してください
⑦ 元号の日付までの範囲はWikipediaに記載の公式を参照してください
これは「自分で確認して」と言われたので、確認して以下を入力。
⑧ 元号の日付までの範囲は以下としてください
明治:1868年1月25日から1912年7月29日まで
大正:1926年12月24日まで
昭和:1989年1月7日まで
平成:2019年4月30日まで
「チャットGPTに礼儀正しくすべきか」という、ウォール・ストリート・ジャーナル日本版の記事を読んでいたので、すべて丁寧語で入力しました
使い慣れた人だとこんなに手数いらないのでしょう
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>元号と西暦変換アプリ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<h1>元号と西暦変換アプリ</h1>
<h2>西暦から元号への変換</h2>
<label for="yearInput">年:</label>
<input type="number" id="yearInput">
<br>
<label for="monthInput">月:</label>
<input type="number" id="monthInput" min="1" max="12">
<br>
<label for="dayInput">日:</label>
<input type="number" id="dayInput" min="1" max="31">
<br>
<button onclick="convertToEra()">変換</button>
<p id="resultEra"></p>
<h2>元号から西暦への変換</h2>
<label for="eraInput">元号:</label>
<select id="eraInput">
<option value="明治">明治</option>
<option value="大正">大正</option>
<option value="昭和">昭和</option>
<option value="平成">平成</option>
<option value="令和">令和</option>
</select>
<br>
<label for="eraYearInput">年:</label>
<input type="number" id="eraYearInput">
<br>
<label for="eraMonthInput">月:</label>
<input type="number" id="eraMonthInput" min="1" max="12">
<br>
<label for="eraDayInput">日:</label>
<input type="number" id="eraDayInput" min="1" max="31">
<br>
<button onclick="convertToWestern()">変換</button>
<p id="resultWestern"></p>
</div>
<script src="script.js"></script>
</body>
</html>
function convertToEra() {
const yearInput = parseInt(document.getElementById("yearInput").value, 10);
const monthInput = parseInt(document.getElementById("monthInput").value, 10);
const dayInput = parseInt(document.getElementById("dayInput").value, 10);
const resultElement = document.getElementById("resultEra");
let result = westernToEra(yearInput, monthInput, dayInput);
resultElement.textContent = result;
}
function convertToWestern() {
const eraInput = document.getElementById("eraInput").value;
const yearInput = parseInt(document.getElementById("eraYearInput").value, 10);
const monthInput = parseInt(document.getElementById("eraMonthInput").value, 10);
const dayInput = parseInt(document.getElementById("eraDayInput").value, 10);
const resultElement = document.getElementById("resultWestern");
let result = eraToWestern(eraInput, yearInput, monthInput, dayInput);
resultElement.textContent = result;
}
function westernToEra(year, month, day) {
const date = new Date(year, month - 1, day);
if (date >= new Date(1868, 0, 25) && date <= new Date(1912, 6, 29)) {
return `明治${year - 1867}年${month}月${day}日`;
} else if (date >= new Date(1912, 6, 30) && date <= new Date(1926, 11, 24)) {
return `大正${year - 1911}年${month}月${day}日`;
} else if (date >= new Date(1926, 11, 25) && date <= new Date(1989, 0, 7)) {
return `昭和${year - 1925}年${month}月${day}日`;
} else if (date >= new Date(1989, 0, 8) && date <= new Date(2019, 3, 30)) {
return `平成${year - 1988}年${month}月${day}日`;
} else if (date >= new Date(2019, 4, 1)) {
return `令和${year - 2018}年${month}月${day}日`;
} else {
return "無効な西暦年月日です。";
}
}
function eraToWestern(era, year, month, day) {
let westernYear;
switch (era) {
case "明治":
westernYear = 1867 + year;
if (new Date(westernYear, month - 1, day) < new Date(1868, 0, 25)) return "無効な元号年月日です。";
break;
case "大正":
westernYear = 1911 + year;
if (new Date(westernYear, month - 1, day) < new Date(1912, 6, 30)) return "無効な元号年月日です。";
break;
case "昭和":
westernYear = 1925 + year;
if (new Date(westernYear, month - 1, day) < new Date(1926, 11, 25)) return "無効な元号年月日です。";
break;
case "平成":
westernYear = 1988 + year;
if (new Date(westernYear, month - 1, day) < new Date(1989, 0, 8)) return "無効な元号年月日です。";
break;
case "令和":
westernYear = 2018 + year;
if (new Date(westernYear, month - 1, day) < new Date(2019, 4, 1)) return "無効な元号年月日です。";
break;
default:
return "無効な元号です。";
}
return `${westernYear}年${month}月${day}日`;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f4f7f6;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.container {
background: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
text-align: center;
width: 300px;
}
h1 {
font-size: 24px;
color: #333;
margin-bottom: 20px;
}
label {
font-size: 16px;
margin-bottom: 10px;
display: block;
color: #555;
}
input, select, button {
width: 100%;
padding: 10px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
}
button {
background-color: #007BFF;
color: white;
border: none;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
p#result {
font-size: 18px;
color: #007BFF;
font-weight: bold;
}
PCのユーザー/ドキュメント配下に上記コードをコピーした3ファイルを配置し、index.htmlをブラウザで開くと以下が表示されました。
試しに平成と令和の境界の日付を変換してみました。
デザイン的にはイマイチどころかイマ3、イマ4くらいで改良の余地おおいにありです。
おそらく私の生成AIに対するプロンプトが拙いせいでしょう。
実際に使ってみてシンプルに思ったこと
- ここまでできるんや、すごいなあ
- でも、けっこう穴あるなあ
「プログラミング教育における生成AI利用のメリット、デメリットを教えてください」と聞いてみた
いくつかのメリットとデメリットを示しながら結論として以下の回答でした。
生成AIをプログラミング教育に導入することは、多くのメリットをもたらしますが、それに伴うデメリットも認識しておくことが重要です。効果的な教育を実現するためには、生成AIを補助ツールとして適切に活用し、学習者の自立性と創造性を促進するバランスが求められます。
私なりの答え
以下が「プログラミング教育において生成AIを利用する意義」の私なりの答えです。
生成AIの回答は誤りを含む可能性が常にあることを認識し、最後は自分で判断して主体的に利用することを旨として、生成AIを使いこなせるようになること。
おわりに
「テクノロジーの進歩は人類を幸福にするのか」
これは長年IT業界に端くれとして携わってきた私の疑問でした。
生成AIの誕生とそれを多くの人が利用できることは、人類に幸せをもたらすのか。
生成AIに限らず、テクノロジーの進歩は生活の質と利便性の向上をもたらす一方で、テクノロジーの恩恵を受けられる人とそうでない人の間で社会的格差を拡大するリスクがあり、「闇バイト」のような、これまでにはなかった形態の犯罪も生み出しています。
また、便利になることは本来人間が持つ能力をアウトソーシングすることであり、生成AI利用により思考能力の低下、作ることの喜び、達成感が奪われるのではないかと危惧します。
生成AIをはじめとするテクノロジーの進歩が人類の幸福につながるよう、私も微力ながら貢献したいと思います。
「すべての表現には勇気が伴う」(今日着て行く服でさえ)
これは誰かがテレビで言っていた言葉です。
この記事は私の初Qiita投稿でしたが、そのことをあらためて実感しました。
今後も機会があれば投稿したいと思います。