WirelessWire News Technology to implement the future

by Category

初心者AIハッカソンver0.4 / プログラミングへの苦手意識をどう克服するか

2025.01.27

Updated by Ryo Shimizu on January 27, 2025, 06:35 am JST

今週は二回目の初心者AIハッカソンを開催した。女性限定と、男女混交の二回に分けたが、いずれも100人を超す応募者の中から抽選で選ばれた人たちが平日の夜と休日の昼から、秋葉原プログラミング教室に集まった。
昨年11月に実施した女性限定の初心者AIハッカソン、さらには昨年初頭に新潟県長岡市で実施した長岡市長及び市役所職員向けのプログラミング講座からブラッシュアップを重ねて、いわばバージョン0.4にまで上がってきた。

この活動に関しては完全にボランティアであり、筆者が設立に関わった「秋葉原プログラミング教室」は週末しか子供達を入れないため、その空き時間を利用してハッカソンを行った。

筆者としては、2011年頃から提唱しはじめた、「一億総プログラマー国家化計画」に基づいた活動となる。そのためのグランドデザインとして、2020年からのプログラミング教育の義務教育化を推進した。この計画は始まりにすぎず、早い学校では2016年頃から小学校でプログラミングの授業が必修化されたため、今年大学二年生の世代が最初のプログラミング教育を受けた世代となる。プログラミング教育を義務教育化する際の最大の問題点として、教員とその知識が不足していることが挙げられたが、曲がりなりにもプログラミングを経験した子どもたちが教育実習として教育の現場に戻ることで、プログラミング教育はより強化されていくはずだ。

筆者が思うに、プログラミングは算数を学ぶ前から始めるのが理想的だ。
筆者自身がそうだったからだ。

算数、及び似た学問である数学は、プログラミングとの相性がそれほど良くない。数学を先に学んでしまうと、プログラミングを学ぶときに大きな障害になるのだ。
例えば、プログラミング初心者が最初にまずつまづくのは、「=(イコール)」の扱いについてだ。プログラミング言語で「=」が出てきたら、それは「等しい」という意味ではない。「代入する」と言う意味なのである。

数学的には、本来「←」で示したいところだが、初期のコンピュータには矢印記号がなかったため、最初は「<=」と代用しようとしたが、これは不等号(≦)と同じ意味になって返って混乱するので「:=」と書く言語もあったくらいだ。しかし、そもそもこの「代入」と言う操作はプログラミングの基本中の基本であり、あまりにも頻繁に出てくるので、単に「=」と省略される。

代入であるため、次のように「a=a+1」と書いても矛盾しない。

まず、ここでほとんどの人が脱落する。
多くの人が「自分の知らない数学的体系がある!難しい!」と勘違いするのである。

これは全く未知の数学的体系の話ではない。
単に書き方が数式に似てるだけで、プログラミング言語における「式」は数式ではない。

もっと言うと、プログラミング用語には、変数や関数、引数(ひきすう)といった「○数」という言葉が頻繁に出てくるが、これは実際の数学の変数とも関数とも関係ない。引数なんていう概念は数学にない。

コンピュータは伝統的に内部では全てのデータ、プログラムも音楽も画像も文章も、もちろん数字も、全て、二進数で表現されている。ただし、この二進数を意識することはほとんどない。今、本職のITエンジニアを名乗る人でも、二進数を直接みたり意識したりする人は一部の特殊な業界を除いてはほとんどいない。

プログラミングには英語と数式(に見えるもの)がつきものというイメージがあるが、これはバブル期にパソコンを売り込む言い訳として、「プログラミングを学べば英語や数学の勉強になる」という誇大広告をあちこちのメーカーが打ちまくったせいだ。

この広告宣伝文句を考えている広告代理店のコピーライターは、もちろんプログラミングなんかできない。だから、よくわからない消費者を説得するために、もっともらしい嘘をついて売り込んだわけだ。
このせいで、僕の世代の多くは、親が英語や数学の勉強になると思ってパソコンを子供に買い与え、子供はひたすらゲームしかしないという一種の共犯関係が成立してしまった。

親に聞かれたら、僕だって子供の頃は「英語や数学の勉強になるんだ」と嘘をついていた。実際にはそのどちらとも関係ない。確かに、プログラミングを入り口にすることで数学的概念や英語に触れることになるので、大きな意味では嘘ではないのだが、プログラミングをするのに英語の知識が必要なわけではない。それを英語や数学の知識が先に必要だと考えるのは、スノーボードをするのに同じものが必要だと考えるくらい滑稽である。しかし、スノーボードの用品は、ウェアやらゴーグルやらリフトやら全て外来語ではないか。むしろ日本語は外来語であることがわかるようにカタカナになっていることで、それは「メガネとは違う新しい道具なんだ」と認識するのに役立つ。同じように、プログラミング用語もそうすればよかったのだが、何か高尚なことをしてるとアピールしたい高度経済成長期のエリートどもが、無理矢理ヘンテコな漢字を割り当てたために、日本では長く混乱が続くことになった。

スノーボードを滑るのに数学的知識がないよりはあったほうがいいのと同じように、プログラミングにおいてもそれはないよりはあったほうがいい。だけど、数学が苦手な人でもスノーボードが得意ということはあり得る。僕は数学は苦手だがプログラミングは得意だ。
これを謙遜していると捉えられることがあるのだが全く心外である。そもそも僕は謙遜しない。時間の無駄だからだ。

敢えて恥を忍んでいうが、僕は子供の頃から自分が天才だと知っていた。それは僕がそう思ったというよりも周りの大人にそう言われ続けたからだ。本物の天才も知らないような無知な田舎者の大人たちに。しかしいつまで経っても数学の授業が頭に入ってこなかった。高校はもっとそれが悪化した。連立方程式のLU分解も漸化式もいまだによくわからない。なぜよくわからないまま曲がりなりにも国立の夜間学部に進めたのか謎だ。とにかくそれがすごいコンプレックスで、大学の数学の授業を受けたとき、僕は生涯その知識を実用的には使わないだろうと思って大学に通うのをやめた。それほどまでに数学は苦手である。断言するが、プログラミングを始めるのに数学の知識は全く必要ない。

とにかく、数学も英語も、プログラミングを始めるには全く不要である。
これが必要かもしれない、何か関係があるかもしれないという先入観が、全ての入り口を阻んでいる。

そういう意味ではScratchは、僕は入口としては悪くないと思っている。プログラミング言語としては致命的な問題がいくつかあったが、今は解消されているかもしれない。ただし、Scratchから入るとScratchから先に行きにくいという問題がある。キーボードを使ったプログラミングが全くの別物に見えてしまうのだ。

僕も昔、ビジュアルプログラミング言語を設計したことがある。MOONBlockという。これは今でも秋葉原プログラミング教室をはじめ、いろいろな教育機関で使われている。
MOONBlockは、Scratchと同じくらい手軽であるが、JavaScriptコードに変換したものを確認できる。自分が置いたブロックがより低レベル(プログラミング用語ではよりハードウェアに近い、難易度の高い概念を低レベルと呼ぶ)なコードに書き換わったとき、自分が何をしようとしていたのかわかるように設計されているのだ。

昔、アラン・ケイとMOONBlockに関して議論したときに、「君たちはコードを書き換えたら、それがブロックに反映されるようにしているのか?」と聞かれ、「それは不可能だと思う」と答えたら、アラン・ケイとその同僚は「我々も挑戦したが、全く不可能だと悟ったよ」と笑った。

しかし今ならAIがあるから可能かもしれない。

ブロックとコードの対応関係は、上流工程と下流工程にちかい(下流に行くから低レベルなのである。仕事としてはより高度だ)。
下流工程での微調整が上流工程の仕様書として反映させることができれば、実は齟齬が少なくなる。

そろそろMOONBlockの次の世代を考えてみるべき時期かもしれない。
今僕は死ぬほど忙しいが、自分の死期も意識すると、今できることはやっておいたほうがいいかもしれない。

なぜそんなふうに思ったかと言えば、Replit Agentのようなえージェンティック開発環境が出てきたからだ。
Replit Agentは凄い。

「こんなの作って」と言えば作ってくれる。
一発で完璧なチェスゲームが出てきたときには驚いたが、もっと複雑なものを作らせようとすると、ひたすら「ノー」を言い続けなければならない。
プログラミング経験がゼロのスタッフにReplit Agentを使わせたら、ひたすら「ノー」というだけの仕事であるにも関わらず、彼女はその仕事に夢中になり、自分なりの創意工夫で「ノー」を言い始めた。

Replit Agentの最大の欠点は、(まあ本来は欠点ではないのだが)コードを直接見せてしまうということだ。
これはプログラミングの知識が少ない人にとっては苦痛である。というかプログラミングの知識がある僕でも苦痛だ。

なぜなら凄い勢いで画面が流れていってしまうからだ。
いくらプログラミング経験40年の筆者でも、これを目で追えるほど視力は良くない。むしろ視力は年々低下するばかりである。

こういう時こそ、全体構造をブロックで表現するような、上流工程が必要になる。
上流工程としてブロック図のようなものが変更されれば、「怪しいのはここ」とプログラミングの素人でも指示できるだろう。

少し話が脱線した。

プログラミングを教えるときに、必ずつまづくポイントというのがあるのでまとめてみた。

特に最後の「自分がやりたいことと、自分が立っている場所の差分がわからない」というのは非常に深刻だ。

例えば漠然と「こんなアプリが作りたいなー」と思っていたとする。
しかし、どうすればいいのかわからない。

とりあえずプログラミングの入門書を読んでみるが、何が書いてあるかすらさっぱりわからない。

「とりあえずiPhoneで動くアプリを作ってみたいな」と思っても、iOSのプログラミング入門はさっぱりわからない。まず、プログラミングする前に、プロビジョニングだとかホゲホゲだとかホゲホゲだとかで訳がわからない。そこでまた挫折する。
安心してください。僕だってiPhoneのプログラミングは一番ワケがわからないと思っているんだから。

iPhoneのプログラミングは、おそらく現時点で最高難度のプログラミングだと思う。VisionProもiPadもそう。とにかくiOSで動くアプリを作るのはめちゃくちゃ面倒くさい。その理由は主にセキュリティやApple経済圏を守るためという、割としょうもない理由からきていて、プログラミングそのものは全く難しくないのに、環境構築が地獄である。

ここから入門しようとすると100%失敗するので、まずは簡単なWebアプリを作ればいい。

今回のハッカソンで使った教材は、パブリックドメインとする。自由に使っていただいて構わない。

今回は、前回の反省を踏まえ、「一通り教えてからハッカソンに移行」するのではなく、「教えた知識まででショートハッカソンに移行」するという手法を採用した。
これは長岡の初心者AIハッカソンでもやった手法で、有効な手法だった。

今回の教えた順番は、まずDeepSeekのセットアップ。実はここが一番の難関だった。これは次回に向けて解決すべき課題とする。

次に、まず変数の使い方。代入という概念を教え、変数には数以外が入ることを示す。
文字列の作り方を説明し、ここでaiという関数にプロンプトを渡すと、どういう結果が得られるか説明する。

この時点で最初のショートハッカソン(スプリントと呼んでいる)をスタート。3人チームになって、与えられたテーマに沿ったプログラムを作る。20分。
今回は12人で4チーム。発表は10分もあれば終わる。

次に、リストの扱い方について教える。リストは、プログラミング初心者が最初に躓く「これなんに使うの?」というやつなのだが、AI向けのプロンプトを書くことを考えるとリストは最低限使いたくなる機能だ。

最初からランダムな数字を得られる関数を用意してあげて、リストの中からランダムに一つ選ぶ関数も用意してあげる。
そうすると、まず誰でも簡単におみくじが作れる。

おみくじが作れるようになったのと、input関数でユーザー入力が受け付けられるようになったところで、再びショートスプリント。15分。
ここで頭の使い方が「実は数学と全く無関係」であることが叩き込まれる。

最後に、どうしてもWebアプリまで行きたかったので、AIの出力同士を掛け合わせるところは軽く流して、GradioによるWebアプリ開発まで踏み込む。Gradioのレイアウトとか画像の扱いとか、チャットボットの作り方まで一気に説明したが、これは正直いうと時間が足りなかった。もっと丁寧にやりたかった部分ではある。

ラストは30分。ちょっと話が複雑になりすぎたので、本当は5回くらいのスプリントをやりたかったが、午後2時集合で5時半終わりの日程では3回が限界だった。

反省点として、制御構造の説明は別にしなくてよかったなと思った。
結局、if文は全く使わなかったので、教育効果としてはあまり高くない。

ただ、プログラミングは水泳やスノーボードと同じで、考えるより手を動かすほうが上達が早い。目的を小さめにもって短時間で駆け抜けたほうが理解度は高い。
木曜日の夜に開催した女性限定のイベントでは、ラストの10分でWebアプリを開発するようにしたが、それでもみんなできていたのは驚いた。

懇親会で話を聞いてみると、やはり女性限定にすると、家族の理解が得られやすく女性一人でも参加しやすいという感想を頂いた。世の中には奥さんがどこかに出かけていくとヤキモチを妬く旦那さんというのが一定数いて、そういう人を安心させるためにも、今後も女性限定のイベントは続けていくべきだと思った。

もし次回やるとしたら、まずDeepSeekのAPI設定みたいな面倒なことは、自分でWebサービスを作って代替しようと思った。幸い、僕はMemeplexというWebサービスをやっているので、あれのAPIとしてDeepSeekやその他のLLMに繋ぎこめるようにすればいい。そうすればついでに画像も生成できる。

次に、最初にGradioを使わせて、「Webサービスが簡単に作れるんだ」と信じさせてから、基礎的な内容に掘り下げたほうがいいと思った。
やっぱりそこに満足感があるから。

Gradioのいいところは、自分で書いたプログラムが、曲がりなりにも自分のスマートフォンで見れるようになるところだ。
これは非常に感動的だし、嬉しい。

そういえば僕がどうしてコンピュータに興味を持ったのか思い出した。
僕はキーボードを叩くとテレビの中に入り込めるという体験に感動したのだ。今の人には、それはスマホのアプリを作ることなのかもしれない。

次回は三月頃の開催を予定している。
ご興味のある方は、以下の動画の詳細欄からアンケートにお答えいただくと、次回の予定を通知させていただきます。

WirelessWire Weekly

おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)

登録はこちら

清水 亮(しみず・りょう)

新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。

RELATED TAG