第2章 第3話:プログラミングの授業――バグだらけの友だち
都市の朝は、画面の光で始まる。
高層ビルの窓には空の色より早くモニターの青白い光が映り、駅前の巨大な広告板では、まだ眠たそうな通勤客の頭上を数字と文字が流れていく。信号機は一定の間隔で色を変え、自動改札はカードをかざすたびに小さな電子音を返した。
街のあちこちで、目に見えない命令が動いている。
扉が開く。
電車が止まる。
画面が切り替わる。
誰かの指先が触れた瞬間、機械は返事をする。
レオンはその街が好きだった。
正確には、街の裏側で動いているものが好きだった。
アプリ。ゲーム。案内表示。検索システム。小さなボタンを押すと何かが変わる、その仕組みを想像するのが好きだった。
だから、IT教育校に入った。
自分で何かを作れるようになりたかった。
面白いものを。
誰かが笑ってくれるものを。
少しだけ、困っている人を助けられるものを。
なのに今、レオンは教室の一番後ろで、自分のノートパソコンを睨んでいた。
画面には赤い文字が並んでいる。
『Error』
まただ。
また、バグだ。
「レオン、動いた?」
隣の席からミカが聞いた。
レオンは画面を少し閉じた。
「まだ」
「また?」
「うん」
前の席にいた少年が振り返る。
「レオンのコード、昨日からずっと迷子じゃん」
悪意はなかったのかもしれない。
でも、その言葉はレオンの胸に小さく刺さった。
迷子。
そうだ。
自分のコードはいつも迷子になる。
思った場所へ行かない。
押したボタンと違う画面へ飛ぶ。
キャラクターが動かない。
点数が増えない。
条件を満たしていないのにクリアになったり、クリアしたはずなのに最初に戻ったりする。
作りたいものは、頭の中にある。
明るい色の画面。
失敗しても楽しく学べるアプリ。
子どもたちが間違えながら進めるゲーム。
でも、コードにすると壊れる。
頭の中では動いていたものが、画面の上では赤い文字になって止まる。
教室の前では、アミナ先生が生徒たちの画面を確認していた。
彼女は若く、優秀なプログラマーだった。説明は速く、的確で、エラーを見るとすぐに原因を見つける。
「ここは変数名が違います」
「括弧が一つ足りません」
「この条件式では、常に真になります」
「関数の呼び出し位置を変えましょう」
生徒たちは彼女を頼りにしていた。
レオンも頼りにしている。
でも、アミナ先生が近づいてくるたびに、少し怖くなった。
また直してもらう。
また、自分では見つけられなかった場所を一瞬で見つけられる。
また、自分は向いていないのだと思う。
「レオン」
アミナ先生が声をかけた。
レオンは背筋を伸ばした。
「はい」
「進捗はどうですか」
「えっと……まだ、画面遷移のところで止まっています」
「見せてください」
レオンはパソコンを開いた。
赤いエラー文が表示される。
アミナ先生は画面を覗き込み、すぐにキーボードを指さした。
「この行ですね。ここの名前が、定義したものと違っています」
「あ」
「それから、ここの処理は関数の外に出ています。インデントも確認して」
「はい」
アミナ先生の指摘は正しかった。
レオンが修正すると、エラーは一つ消えた。
けれど、実行ボタンを押すと、今度は別のエラーが出た。
赤い文字。
別の赤い文字。
レオンの肩が落ちる。
「また……」
アミナ先生は励ますように言った。
「一つずつ直しましょう。プログラミングではよくあることです」
「はい」
レオンは返事をした。
でも、心の中では思っていた。
よくあることなら、どうして自分だけこんなに恥ずかしいのだろう。
今日の課題は、子ども向けの学習アプリを作ることだった。
四人一組のチームで、簡単な計算や文字の問題を出し、答えに応じてキャラクターが反応するアプリを作る。
レオンのチームでは、彼が最初にアイデアを出した。
間違えても怒られないアプリ。
問題を間違えると、キャラクターが一緒に考えてくれる。
何度も戻れる。
失敗するたびに、少しだけヒントが増える。
ミカはその案を気に入ってくれた。
「それ、かわいいね。普通の学習アプリって、間違えると音が怖いし」
前の席のダニエルは笑った。
「レオンっぽい。やさしいけど、作るの難しそう」
その時は、レオンも笑っていた。
難しくても、作れると思っていた。
けれど今、画面の中ではキャラクターが変な場所に立ち、問題を解いても最初の画面へ戻り、ヒントは表示されず、点数は勝手に増え続けている。
レオンはアイデア帳を閉じた。
これ以上、新しいことを思いついても意味がない。
どうせ、作れない。
その時、教室の扉が静かに開いた。
「失礼します」
入ってきたのは、黒い上着に革の鞄を持った先生だった。
IT教育校のガラス張りの教室には少し不思議なほど、手触りのある姿だった。コートの袖口には旅の埃がわずかについていて、鞄の革には何度も使い込まれた跡がある。
「白瀬先生」
アミナ先生が顔を上げた。
「お待ちしていました」
「こちらこそ、呼んでいただきありがとうございます」
その人――白瀬灯理は、教室を見渡した。
並んだノートパソコン。
スクリーンに映るコード。
生徒たちの指先。
そして、あちこちの画面に並ぶ赤いエラーメッセージ。
「今日は、プログラミングの授業ですね」
灯理は穏やかに言った。
ダニエルが小さく呟く。
「今日はバグの授業です」
教室の何人かが笑った。
レオンは笑えなかった。
灯理はその言葉を拾った。
「それは、いい授業になりそうですね」
生徒たちは少し驚いた。
アミナ先生も首を傾げる。
「いい授業、ですか」
「はい」
灯理は黒板の前へ行き、チョークではなく、教室のタッチパネルに指で文字を書いた。
『バグ観察ノート』
教室が静かになった。
「今日の授業では、バグを直す前に、観察します」
「観察?」
ミカが聞いた。
「はい。どんなバグが出たのか、いつ出たのか、何を期待していて、実際には何が起きたのかを記録します」
ダニエルが手を挙げた。
「先生、バグは消すものですよね」
「そうですね」
「じゃあ、なぜ記録するんですか」
灯理は少し考えた。
「バグは、コンピュータからの返事だからです」
レオンは顔を上げた。
「返事?」
「はい。こちらの命令を受け取って、コンピュータが『こう解釈しました』『ここで困っています』『その名前は知りません』と教えてくれている」
生徒たちは画面の赤い文字を見た。
今まで敵のように見えていた文字。
怒られているように感じていた文字。
灯理は続けた。
「もちろん、放っておくと動きません。でも、返事を読まないまま消そうとすると、同じところで何度も迷子になるかもしれません」
レオンの胸が小さく鳴った。
迷子。
さっき言われた言葉。
自分のコードは迷子になる。
でも、もし、画面の赤い文字が道案内だったら。
灯理は生徒たちに紙を配った。
紙には四つの欄があった。
『期待したこと』
『実際に起きたこと』
『出たメッセージ』
『次に確かめること』
「今日は、このノートを使います。エラーが出たら、すぐ直す前に一度書いてみてください」
アミナ先生が少し困ったように言った。
「白瀬先生、時間がかかるかもしれません」
「はい」
「課題の締め切りは今日の終わりです」
「それでも、急いで直し続けるより、遠回りが近道になることもあります」
アミナ先生はしばらく考えた。
それから、生徒たちを見た。
何度も同じエラーに戻っているチーム。
修正を怖がって手を止めている生徒。
画面を閉じかけているレオン。
「わかりました」
アミナ先生は頷いた。
「今日は、バグ観察ノートを使いましょう」
授業の空気が少し変わった。
生徒たちは不満そうにしながらも、自分の画面と紙を見比べ始めた。
レオンも紙を前に置いた。
赤いエラー文を見る。
英語で書かれた文字。
知らない単語もある。
でも、アミナ先生にすぐ聞く前に、自分で書いてみる。
『期待したこと』
答えを押したら、次の問題画面へ進む。
『実際に起きたこと』
最初の画面へ戻る。
『出たメッセージ』
Cannot read property...
そこまで書いて、手が止まった。
意味がわからない。
やっぱり自分には無理だ。
そう思った時、灯理が近づいてきた。
「難しそうですね」
「はい」
「どこが難しいですか」
「メッセージが読めません」
「全部読めない?」
レオンは画面を見た。
長い赤い文字の中に、見覚えのある単語がある。
問題画面の名前。
ボタンの名前。
さっき自分で書いた変数名。
「この名前は、僕が作ったやつです」
「うん」
「ここで何か読めないって言ってる?」
「そうかもしれません」
灯理は答えを言わなかった。
「では、次に何を確かめますか」
レオンは紙の最後の欄を見た。
『次に確かめること』
今までは、エラーが出たらとにかく消したかった。
でも、今は一つだけ確かめればいい。
「この名前が、ちゃんと作られているか」
「いいですね」
レオンはコードを探した。
すると、定義したはずのデータが、別の画面でしか作られていないことに気づいた。だから、画面が切り替わった時に読めなくなっていたのだ。
「あった」
小さく声が出た。
ミカが隣から覗く。
「原因?」
「たぶん。ここでしか作ってないから、別の画面で迷子になってる」
「レオンのコードが?」
「データが」
レオンは少しだけ笑った。
修正して実行する。
赤いエラーは消えた。
画面が切り替わる。
今度は次の問題へ進んだ。
「動いた!」
ミカが声を上げた。
レオンの胸に、小さな光が灯る。
でも、その次の瞬間、キャラクターが画面の端でぐるぐる回り始めた。
問題を間違えると、最初に戻るはずだった。
しかしキャラクターは戻り続けて止まらない。
同じ場所に行き、また戻り、また行き、また戻る。
画面の中で、短い足をばたばたさせながら、永遠に迷子になっている。
「またバグだ」
ダニエルが笑った。
「レオンのキャラ、散歩してる」
レオンは顔が熱くなった。
でも、今度は画面を閉じなかった。
観察ノートを見た。
『期待したこと』
間違えたら、最初の画面へ一回だけ戻る。
『実際に起きたこと』
キャラクターが何度も戻り続ける。
『出たメッセージ』
エラーは出ていない。
エラーが出ていないのに、おかしい。
これはさらに厄介だった。
コンピュータは怒っていない。
困ってもいない。
ただ、レオンが命令した通りに動いている。
間違った命令の通りに。
「また僕のせいだ」
レオンは呟いた。
灯理が隣に座る。
「どうしましたか」
「エラーも出てないのに変です。つまり、コンピュータは僕の書いた通りに動いてるんです」
「うん」
「僕の考え方が変なんです」
声が少し沈んだ。
「やっぱり向いてない」
灯理は画面の中でぐるぐる戻るキャラクターを見た。
しばらく見てから言った。
「この動きは、本当に全部消すべきかな」
レオンは顔を上げた。
「え?」
「この子、何度も戻っていますね」
「バグです」
「うん。バグです」
「消さないと」
「消す前に、少し見てみたいです」
灯理は画面を指さした。
「この子は、どこへ戻っているんですか」
「最初の画面です」
「戻る時に、何か持って帰れますか」
「持って帰る?」
「たとえば、前に間違えたこと」
レオンは黙った。
前に間違えたこと。
それを持って戻る。
今のアプリでは、間違えるとただ最初に戻る。何も変わらない。だから、また同じところで間違えるかもしれない。
でも、戻るたびに少しだけヒントが増えたら。
最初に戻ることは、失敗ではなく準備になる。
迷子になった場所の地図を少し持ち帰るようなものだ。
レオンは閉じていたアイデア帳を開いた。
急いで書く。
『戻るたびにヒントが増える』
『間違えた問題をキャラクターが覚える』
『同じ間違いをしたら、別の説明を出す』
『最初に戻る=やり直しではなく作戦会議』
ミカが隣で目を輝かせた。
「それ、最初の案よりいいかも」
「本当に?」
「だって、間違えたら怒られるんじゃなくて、キャラが一緒に戻ってくれるんでしょ」
ダニエルも画面を覗いた。
「バグから機能が生まれた」
「まだ生まれてない。作らないと」
レオンはキーボードに手を置いた。
今度は、少しだけ楽しさが戻っていた。
もちろん、コードはすぐには書けない。
戻る回数を数える変数を作る。
間違えた問題を記録する。
ヒントの表示を段階で変える。
画面遷移を整理する。
考えることは多い。
それに、またバグが出る。
案の定、十分後には赤いエラーが出た。
でも今度は、ミカがすぐに言った。
「観察ノート」
レオンは頷いた。
書く。
『期待したこと』
戻った回数を一増やす。
『実際に起きたこと』
数字ではなく文字がくっついている。
『出たメッセージ』
型が違う。
『次に確かめること』
回数を数字として扱えているか。
ダニエルが横から言う。
「これ、コンピュータが『数字だと思ってたのに文字が来た』って困ってるんだな」
レオンは笑った。
「たぶん、かなり困ってる」
「ごめんって言っとけ」
ミカが画面に向かって小さく言った。
「ごめんね、コンピュータ」
レオンは修正する。
また動かす。
また止まる。
また書く。
赤い文字はまだ怖い。
でも、さっきまでのように、ただ自分を責める声には見えなくなっていた。
怒っているのではない。
困っている。
あるいは、教えてくれている。
ここが違う。
ここがまだつながっていない。
この名前は知らない。
この順番では読めない。
コンピュータは、黙って壊れるのではなく、返事をしていた。
昼休みを挟んでも、教室の熱は冷めなかった。
生徒たちはそれぞれのバグ観察ノートを広げ、画面と紙を見比べている。
「これ、昨日も出たエラーだ」
「じゃあ前のノート見れば?」
「あ、本当だ。同じ原因かも」
「このバグ、名前つけようぜ」
「何で?」
「同じやつが何回も出るから。顔なじみ」
「じゃあこれは『括弧忘れくん』」
「弱そう」
教室のあちこちで笑いが起きる。
アミナ先生は、その様子を驚いたように見ていた。
いつもなら、エラーが増えるほど教室は沈んでいく。
生徒たちは手を止め、先生を呼び、自信をなくしていく。
けれど今日は違った。
エラーはまだ出ている。
進行も決して早くはない。
それでも、生徒たちは画面から逃げていなかった。
彼らは読もうとしている。
エラー文を。
自分の意図を。
コンピュータの返事を。
アミナ先生は、レオンのチームの近くで足を止めた。
「レオン、見せてもらえますか」
レオンの肩が少し強張った。
でも、パソコンを閉じなかった。
「はい」
画面には、まだ完成途中のアプリが映っている。
丸い帽子をかぶった小さなキャラクターが、問題を出す。
答えを間違えると、キャラクターはがっかりせずに首を傾げる。
『一緒に戻って考えよう』
最初の画面へ戻る。
ただし、今度はヒントが一つ増えている。
『さっきは十の位を見落としたかも』
二度目に間違えると、別のヒントが出る。
『数字を絵にしてみよう』
アミナ先生は画面を見つめた。
「これは、最初の仕様にはありませんでしたね」
「バグから思いつきました」
レオンは少し恥ずかしそうに言った。
「キャラクターが何度も戻るバグが出て、それを使えないかなって」
アミナ先生は観察ノートを手に取った。
紙には、びっしりと文字が書かれている。
失敗の記録。
期待したこと。
実際に起きたこと。
次に確かめたこと。
「ずいぶん書きましたね」
「バグが多かったので」
レオンは苦笑した。
「でも、前より何を直せばいいか見えるようになりました」
アミナ先生は頷いた。
そして、すぐにコードを直さずに尋ねた。
「今、一番困っているエラーは何を言っていると思いますか」
レオンは一瞬、驚いた。
いつもなら、先生は原因を見つけて教えてくれる。
でも今は、問いが返ってきた。
レオンは画面を見た。
エラーメッセージを読む。
前より、少しだけ読める。
「この関数が、まだ作られていないって言ってます」
「では、次に確かめることは?」
「呼び出す名前と、作った名前が同じか。あと、ファイルを読み込む順番」
「いいですね」
アミナ先生は微笑んだ。
「続けてください」
その言葉は、レオンの中にまっすぐ入った。
直してもらうのではなく、続けていいと言われた。
それが、嬉しかった。
夕方、完成発表の時間になった。
どのチームのアプリも、完璧ではなかった。
画面のデザインが崩れているチーム。
音が出ないチーム。
点数計算が少し怪しいチーム。
キャラクターの動きが不自然なチーム。
けれど、今日はどのチームも、発表の最後にバグ観察ノートを見せることになった。
「私たちのアプリでは、ボタンを押しても反応しないバグが出ました。原因は、ボタンの名前とコードの名前が違っていたことです」
「僕たちは点数が二倍に増えるバグが出ました。最初は得だと思いましたが、同じ処理が二回呼ばれていました」
「画面が真っ白になるバグは、データを読み込む前に表示しようとしていたのが原因でした」
発表は、いつもより少し賑やかだった。
成功した部分だけでなく、失敗した部分にも話すことがある。
それは不思議なことだった。
最後に、レオンのチームの番が来た。
レオンは前に立った。
手にはパソコン。
隣にはミカとダニエル。
アプリのタイトルは、『まいごのヒントくん』になった。
ダニエルがつけた名前だ。
画面には、小さな帽子をかぶったキャラクターが立っている。
「このアプリは、問題を間違えても、すぐに終わりになりません」
レオンは説明した。
「間違えると最初に戻ります。でも、その時にヒントを一つ持って帰ります」
実演する。
問題を間違える。
キャラクターが言う。
『戻っても大丈夫。さっきより一つ、知っていることが増えたよ』
教室が静かになった。
レオンは続けた。
「最初は、キャラクターが何度も同じ場所に戻るバグでした。僕はまた失敗したと思いました。でも、戻ることを悪いことにしなければ、学習アプリとして使えるんじゃないかと考えました」
ミカが観察ノートを開く。
「これが、その時の記録です」
ノートには、赤ペンや鉛筆の跡がたくさん残っていた。
期待したこと。
実際に起きたこと。
出たメッセージ。
次に確かめること。
ダニエルが言う。
「レオンのコードは迷子になりがちです。でも、迷子になるアプリだから、迷子になった時の戻り方を考えられました」
教室に笑いが起きた。
今度の笑いは、レオンを責めるものではなかった。
レオンも笑った。
「まだバグはあります」
彼は正直に言った。
「時々、ヒントが二回出ます。あと、同じ問題で戻りすぎると、キャラクターが画面の端に寄ります」
また笑いが起きる。
「でも、直せると思います。どこを見ればいいか、前よりわかるので」
アミナ先生は静かに拍手した。
それに続いて、生徒たちも拍手した。
レオンは少しだけ顔を赤くした。
発表が終わった後、アミナ先生は教室の前に立った。
「今日は予定より進みが遅かったチームもあります」
生徒たちは少し身構えた。
「ですが、私は今日、皆さんがコードを読む時間だけでなく、自分の考えを読む時間を持てたと思います」
彼女は黒板の『バグ観察ノート』という文字を見た。
「プログラミングでは、速く直す力も大切です。でも、なぜそうなったのかを考えられなければ、同じ場所で何度も止まります」
アミナ先生は少し笑った。
「私もこれから、すぐに直しすぎないように気をつけます」
ダニエルが小さく言った。
「先生が一番速いからな」
アミナ先生は聞こえていたらしい。
「では、明日からは私が直す前に、皆さんに聞きます。このエラーは何を言っていると思いますか、と」
教室に小さな悲鳴が上がった。
「えー」
「難しい」
「でも今日やったじゃん」
「バグに話しかけるしかない」
レオンは自分の観察ノートを見た。
白い紙は、もう赤いエラーへの恐怖だけではなくなっていた。
そこには、自分が考えた跡が残っている。
間違えた跡。
戻った跡。
次に進もうとした跡。
放課後、レオンは一人で教室に残っていた。
窓の外では、都市の明かりが少しずつ増えている。ビルの窓に灯がつき、道路を走る車のライトが線のように流れていた。
画面には、『まいごのヒントくん』が映っている。
キャラクターはまだ少し変な動きをする。
時々、戻る時にジャンプしすぎる。
ヒントの表示も完全ではない。
でも、レオンは画面を閉じなかった。
アイデア帳を開く。
朝、閉じたままだったページに、新しい案を書き足す。
『間違えた回数でキャラクターの言葉が変わる』
『戻った道を地図みたいに表示する』
『友だちと一緒に考えるモード』
『バグ観察ノートをアプリ内に作る?』
書いているうちに、また楽しくなってきた。
作りたいものが、少しずつ戻ってくる。
完璧に作れるかはわからない。
きっとまた止まる。
赤い文字も出る。
キャラクターは迷子になる。
でも、迷子になったら、観察すればいい。
どこから来て、どこへ行こうとして、どこで困っているのか。
「まだ残っていたんですね」
声がして振り返ると、灯理が教室の入口に立っていた。
「少しだけ」
「いい顔をしています」
「バグだらけですけど」
「友だちもたくさんいるんですね」
レオンは画面を見た。
赤い文字。
変な動き。
止まる処理。
戻り続けるキャラクター。
「友だちって、バグがですか」
「今日のタイトルにしたくなるくらいには」
レオンは笑った。
「バグだらけの友だち」
「悪くないと思います」
「でも、友だちなら、もう少し優しくしてほしいです」
「たぶん、向こうも同じことを思っているかもしれません」
「僕の命令が雑だから?」
「困らせていることは、ありそうですね」
レオンは少し考えて、画面に向かって言った。
「明日はもう少しちゃんと書くよ」
キャラクターは当然、返事をしなかった。
けれど、画面の中で小さく揺れた。
まるで聞いているように。
「先生」
「はい」
「プログラミング、向いてないかもって思ってました」
「今は?」
「まだ、向いてるかはわかりません」
レオンはキーボードに指を置いた。
「でも、エラーが出た時に、すぐ終わりだとは思わなくなりました」
「それは大きいですね」
「あと、僕のアプリは、たぶん間違える人のために作りたいです」
「うん」
「僕がよく間違えるから」
灯理は窓の外の街を見た。
信号が変わる。
電車が走る。
広告の文字が切り替わる。
見えない命令たちが、都市のあちこちで動いている。
「よく間違える人にしか、作れない優しさもあると思います」
レオンはその言葉をしばらく黙って受け取った。
そして、照れくさそうに笑った。
「それ、アプリの説明文に使ってもいいですか」
「どうぞ」
「じゃあ、先生の名前も入れます?」
「それは遠慮します」
レオンはまた笑った。
夜、灯理はIT教育校を出た。
ビル街には雨上がりの匂いが残っていた。舗道は街灯を映して濡れたように光り、ガラス張りの建物には無数の画面が浮かんでいる。
信号待ちの間、灯理は鞄から一通の依頼状を取り出した。
封筒には、地方都市の医療系学校の名が書かれている。
『医療系学校の生徒が、患者の声を聞けずにいます』
灯理は便箋を畳み、鞄に戻した。
背後の校舎を振り返ると、まだ一つだけ明かりのついた教室がある。
窓の向こうで、レオンが画面に向かっていた。
小さなキャラクターが、何度も同じ場所に戻る。
戻るたびに、少しずつヒントを増やしながら。
灯理は信号が青に変わるのを待ち、横断歩道を渡った。
都市の夜は、いくつもの命令と返事で満ちている。
そのどこかで、今日も誰かが赤い文字に出会う。
止まり、迷い、読み直し、また動かす。
灯理は鞄を持ち直し、次の教室へ向かって歩いていった。




