作成日:[ Programming ]

AI (ChatGPT/Copilot/Google Gemini) は プログラマーの仕事を奪うだろうか?

最近、AI がプログラマーの仕事を奪うだろうという記事をよく見るが本当にそうだろうか?とある企業では今後のプログラマーの採用をしない( AI があるので、今年はエンジニア採用やめました  Salesforce )という記事を見かけたが、プログラムエンジニア目線から実際には問いかけたい点をいくつか紹介する。

現在の AI

言ってしまえば「プログラマー」が必要ない程、現在の AI というのは優秀で、VSCode のような「ソースコードエディタ」で AI に問いかければ思い通りのコードが返ってくるほどに、今の AI が優れている。しかしながらそれは何百万・何千万と記憶した上でのコード生成であり、それの類似性を考慮したコード生成になっているというのを頭にいれていたほうが良い。

例えば、オセロゲームを Gemini 2.5 に作らせたとする。

オセロゲーム
オセロゲーム
othello.php

session_start();

// --- 定数定義 ---

define('BOARD_SIZE', 8);

define('EMPTY_CELL', 0);

define('BLACK', 1);

define('WHITE', 2);

// 方向ベクトル (8 方向)

const DIRECTIONS = [

[-1, -1], [-1, 0], [-1, 1], // 上

[ 0, -1], [ 0, 1], // 左、右

[ 1, -1], [ 1, 0], [ 1, 1] // 下

];

// --- ヘルパー関数 ---

/\*\*

- ゲームを初期化する

\*/

function initialize_game() {

$board = array_fill(0, BOARD_SIZE, array_fill(0, BOARD_SIZE, EMPTY_CELL));

$center = BOARD_SIZE / 2;

$board[$center - 1][$center - 1] = WHITE;

$board[$center - 1][$center] = BLACK;

$board[$center][$center - 1] = BLACK;

$board[$center][$center] = WHITE;

$_SESSION['othello_board'] = $board;

$_SESSION['othello_player'] = BLACK; // 黒番からスタート

$_SESSION['othello_game_over'] = false;

$_SESSION['othello_passed'] = false; // 直前のターンでパスしたか

$_SESSION['message'] = '';

}

/\*\*

- 座標が盤面内かチェック

\*/

function is_valid_coordinate($r, $c) {

return $r >= 0 && $r < BOARD_SIZE && $c >= 0 && $c < BOARD_SIZE;

}

/\*\*

- 相手の色を取得

\*/

function get_opponent($player) {

return ($player == BLACK) ? WHITE : BLACK;

}

/\*\*

- 指定した座標と方向に、指定した色の石を置いた場合に裏返せる石のリストを取得

\*/

function get_flips_in_direction($board, $player, $r, $c, $dr, $dc) {

$opponent = get_opponent($player);

$flips = [];

$cr = $r + $dr;

$cc = $c + $dc;

// 1. 隣が相手の石か?

if (!is_valid_coordinate($cr, $cc) || $board[$cr][$cc] != $opponent) {

return [];

}

$flips[] = [$cr, $cc];

// 2. 相手の石が続くか?

while (true) {

$cr += $dr;

$cc += $dc;

if (!is_valid_coordinate($cr, $cc)) { // 盤外に出たらダメ

return [];

}

if ($board[$cr][$cc] == EMPTY_CELL) { // 空白ならダメ

return [];

}

if ($board[$cr][$cc] == $player) { // 自分の石が見つかったら成功

return $flips;

}

// 相手の石なら続ける

$flips[] = [$cr, $cc];

}

}

/\*\*

- 指定した座標に指定した色の石を置いた場合に裏返せる全ての石のリストを取得

\*/

function get_all_flips($board, $player, $r, $c) {

$all_flips = [];

if ($board[$r][$c] !== EMPTY_CELL) { // 既に石があれば置けない

return [];

}

foreach (DIRECTIONS as list($dr, $dc)) {

$flips_in_dir = get_flips_in_direction($board, $player, $r, $c, $dr, $dc);

$all_flips = array_merge($all_flips, $flips_in_dir);

}

return $all_flips;

}

/\*\*

- 指定した座標が有効な手かチェック

\*/

function is_valid_move($board, $player, $r, $c) {

if (!is_valid_coordinate($r, $c) || $board[$r][$c] !== EMPTY_CELL) {

return false;

}

return !empty(get_all_flips($board, $player, $r, $c));

}

/\*\*

- 指定したプレイヤーが置ける全ての有効な手のリストを取得

\*/

function get_valid_moves($board, $player) {

$valid_moves = [];

for ($r = 0; $r < BOARD_SIZE; $r++) {

for ($c = 0; $c < BOARD_SIZE; $c++) {

if (is_valid_move($board, $player, $r, $c)) {

$valid_moves[] = [$r, $c];

}

}

}

return $valid_moves;

}

/\*\*

- 手を実行し、盤面を更新する

\*/

function make_move(&$board, $player, $r, $c, $flips) {

$board[$r][$c] = $player; // 石を置く

foreach ($flips as list($fr, $fc)) {

$board[$fr][$fc] = $player; // 石を裏返す

}

}

/\*\*

- スコアを計算する

\*/

function calculate_score($board) {

$scores = [BLACK => 0, WHITE => 0, EMPTY_CELL => 0];

for ($r = 0; $r < BOARD_SIZE; $r++) {

for ($c = 0; $c < BOARD_SIZE; $c++) {

$scores[$board[$r][$c]]++;

}

}

return $scores;

}

// --- ゲーム進行ロジック ---

// セッションにゲーム情報がない場合 or リセット要求があった場合は初期化

if (!isset($_SESSION['othello_board']) || isset($\_GET['reset'])) {

initialize_game();

}

// セッションからゲーム状態を読み込む

$board = $_SESSION['othello_board'];

$current_player = $_SESSION['othello_player'];

$game_over = $_SESSION['othello_game_over'];

$passed = $_SESSION['othello_passed']; // 直前ターンでパスしたか

$message = $_SESSION['message'] ?? '';

$\_SESSION['message'] = ''; // メッセージは一度表示したら消す

// 手が送信された場合 (POST リクエスト) かつ ゲームオーバーでない場合

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($\_POST['move']) && !$game_over) {

list($r, $c) = explode(',', $_POST['move']);

$r = (int)$r;

$c = (int)$c;

$flips = get_all_flips($board, $current_player, $r, $c);

if ($board[$r][$c] === EMPTY_CELL && !empty($flips)) {

// 有効な手の場合

make_move($board, $current_player, $r, $c, $flips);

$next_player = get_opponent($current_player);

// 次のプレイヤーが置ける場所があるかチェック

$next_player_moves = get_valid_moves($board, $next_player);

if (!empty($next_player_moves)) {

// 次のプレイヤーが置ける -> ターン交代

$current_player = $next_player;

$passed = false;

} else {

// 次のプレイヤーがパス -> 現在のプレイヤーがまだ置けるかチェック

$current_player_moves = get_valid_moves($board, $current_player);

if (!empty($current_player_moves)) {

// 現在のプレイヤーは置ける -> パスメッセージを表示し、ターンはそのまま

$message = ($next_player == BLACK ? "黒" : "白") . " はパスしました。続けて " . ($current_player == BLACK ? "黒" : "白") . " の番です。";

$passed = true; // パス発生

} else {

// 両者とも置けない -> ゲーム終了

$game_over = true;

$message = "両者とも置ける場所がありません。ゲーム終了!";

$passed = false;

}

}

// 盤面が埋まったかチェック

$scores = calculate_score($board);

if ($scores[EMPTY_CELL] == 0 && !$game_over) {

$game_over = true;

$message = "盤面が埋まりました。ゲーム終了!";

$passed = false;

}

// 更新された状態をセッションに保存

$_SESSION['othello_board'] = $board;

$_SESSION['othello_player'] = $current_player;

$_SESSION['othello_game_over'] = $game_over;

$_SESSION['othello_passed'] = $passed;

$_SESSION['message'] = $message; // メッセージを保存

// POSTリクエストの再送信を防ぐためにリダイレクト(推奨)

header("Location: " . $_SERVER['PHP_SELF']);

exit;

} else {

// 無効な手の場合

$_SESSION['message'] = "そこには置けません。";

// リダイレクトしてメッセージ表示

header("Location: " . $_SERVER['PHP_SELF']);

exit;

}

}

おおよそ、2 分くらい待てば オセロゲーム を生成してくれる。

しかし、非プログラマーがこのコードを見て、何をしているのか理解できるだろうか?

懸念点 ①:解読の出来ない AI プログラマーが増える

作りたいものを問いかけて作ってもらう行為自体は「クリエイター」でもいいし「エンジニア」でもいい。ただし、このように AI が生成したコードを見て理解できる人は何人いるだろうか?

変数 $scores がどこに定義され、どのように使われてるのか。$_SESSION['othello_board']とは何者だ?

なぜ = ではなく ===+ などの要素があるのか?

return ってなんじゃラホイ?

これを理解できないプログラマーが増えると、機械が生成したコードをそのまま使うことになり簡単な修正もできないプログラマーが誕生する。

懸念点 ②:ツギハギコードに対応できない

AI というのはあくまで、言われた通りのものを提供したのであってサイズ感(このブログの処理のように)が大きくなるものに対して「関数」「変数」処理が大変になるということになる。

プログラミングの世界では Class が 「お店」 function (関数) が 「段ボール箱」 で $(変数) が 「商品(りんご)」 と教えられることが多いだろうが、規模が大きくになるにつれ AI に頼んでも、明後日のコードを提供されたり、全く違うものを提供されることがある。

ちゃんときめ細かに「この関数はこのように動いてて、この要素にこれを追加したい」と指示ができるようなプロダクトをつくれる人ならば可能だが、見様見真似で、知識見解無しで理解できるかというと難しいのではないだろうか

懸念点 ③:セキュリティ

もしも、Youtube をつくりたい と言って Youtube に似たものを AI がつくれるかもしれない。しかしセキュリティを鑑みたコードを生成できるのか?

AI はもしかしたらセキュリティを無視した「簡易システム版 Youtube」を生成するかもしれないが、それは、だれもがアップロードして誰もがダウンロードできちゃうようなウェブサイトになってしまうのかもしれない。それを採用できるのかというと、現時点のセキュリティにうるさい世の中では難しいのではないだろうか。

AI に頼りっきりではなく補助的に使うということ

世の中では、車やバス、電車などの自動運転システムを構築しているが、そのような認識システム(AI)が事故を引き起こさなかったという事例はあるのだろうか?

実際には、人間がハンドルやブレーキを引いて助かったという事柄のほうが多いのではないだろうか。

現時点では、「人間のような判断力を持った AI は存在しない」

AI はあくまで「補助的な存在」であり、全てを AI に頼りっきりではなく、AI を使いこなす人間が必要なのだろう。

なので、AI がプログラマーの仕事を奪うというよりも、AI を使いこなす人間(プログラマー)が必要になるのではないだろうか、そういう AI というアンドロイドに指示を出す職業が今後求められる人材になるのかもしれない。