Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2015-11-09

あなたやあなたの子供がプログラミングすることができると、どんなに素晴らしいことが起きるか 09:07

 2015年の前半はプログラミングに関して自分の思ったことをまとめた日々だった。

 そしてこれまでにプログラミングまたはプログラマーという言葉がタイトルに入った本を5冊出した。


 僕の中では、プログラミングというネタに関して、ある程度はやり尽くしたと思う。



 最後にもう一冊だけ「プログラミング」という言葉の入った本を現在準備している。

 といっても、原稿は既に書き上がり、編集を待っている段階だ。


 そのテーマはズバリ「教育とプログラミング」である。


 プログラミングは全ての教育の軸に成り得る。その大きな可能性を秘めていると思う。


 まず第一に、プログラミングとは表現手段である。

 誰でも自分の考えを、絵にしたり文章にしたりするのと同じようにプログラミングできれば、それは素晴らしいことだ。


 そしてその一部は、既に大人がごく当たり前に生活の中に取り入れているのである。


 たとえばパワーポイント。

 

 パワーポイントでスライドを描いたりアニメーションを設定したりするのは、パワーポイントのご先祖様であるHyperCardの頃はスクリプティング(簡単なプログラミングの一種)と言われていた。


 たとえばエクセル。

 エクセルで表を作ったり、セルとセルの間の関係性を利用して計算させたりする行為は、一種のプログラミングである。そもそも表計算ソフトは、登場したばかりの頃は「簡易プログラミングソフト」と呼ばれていたのだ。


 たとえばアクセスやファイルメーカー。

 これは完全にデータベースプログラミングソフトである。HyperCard自身もその名の通りカード型データベースを祖先としていたように、アクセスやファイルメーカーを使うというのはプログラミングしているに等しい。


 つまり、既に多くの人はプログラミングを日常的にしていて、その入口には立っているのだ。

 しかし、その向こう側に超えられない壁があるのである。しかもこの壁は進撃の巨人の世界のように何層もある。

 図にしてみよう。


https://i.gyazo.com/71bc43b8516bbc3c62e5205795e24ea6.png

 プログラミング要素が最も低いものが下、プログラミング要素が高いものが上に配置されている。

 最下層はマイクロソフト・ワードやインターネットエクスプローラー(IEはJavaScript開発環境でもあるが、ここでは説明を簡単にするためここに配置している)だ。


 ここではあまり大きな表現は必要とされない。

 

 人間が昔からやってきた、原稿用紙やタイプライターに文章をタイプするのと大差ない。


 ついでパワーポイント。

 人間は自分の考えをアニメーションや紙芝居で表現することが簡単になった。


 さらにエクセルやアクセス。

 この2つは第一の壁の内側では最も高度なことができる道具といえる。


 エクセルやアクセスが第一の壁を突破するためのファストパスをマイクロソフトは用意している。それがVBAマクロだ。VisualBASICというプログラミング言語でエクセルの表やアクセスの動きをカスタマイズできる。


 マクロという名前でごまかしているが、実際にはプログラミングそのものである。


 ただし、VBAマクロは第一の壁は突破するが、限界が低いという問題がある。


 VBAマクロを組むだけが仕事のプロのプログラマーというのも、昔は珍しくなかった。

 しかしなんでもできるということは、それだけ面倒くさいということでもある。

 何でもできるが、それをするためには周到な予備知識が必要なのである。

 ここに関してはマイクロソフトはあまりサポートする気配がない。

 

 第一の壁の内側では、こういうことが起きている


  • ユーザは自分の考えをアプリケーションを通じて表現することができる
  • しかしユーザは自分の考えが正しいか確認したり、コンピュータに自動的に何かをさせることはできない

 Excelを使えばあるいは簡単な仮説の検証をすることはできる。

 だが、検証プロセスそのものが自動化できるわけではない。

 

 自分の考えを表明できる、表現手段としてはMinecraftを忘れてはいけないだろう。


 第一の壁を乗り越える方法として、ビジュアルプログラミング言語や簡易言語が多数考案された。


 Scratch1.0は、Squeakで実装されていて、ハックするとSmalltalkそのものを書き換えてScratch自身の機能拡張ができるようになっていた。実際、このヒミツに気づいた子供は夢中になってScratchをハックしたのを見たことがある。しかしそこにたどり着けるのはごく一握りの人間であり、全ての人がそこを駆け上るレールを持っていたわけではない。そのせいか、Scratch2.0では実装がFlashにかわり、そういうハックができなくなってしまった。


 Minecraftに於いては、まず第一の壁を突破する方法としてレッドストーン回路がある。

 レッドストーン回路にしろScratchにしろ、我々のMOONBlockにしろ、第一の壁と第二の壁の間にある言語群(これを第二階層と呼ぼう)が実現しているのは以下のことだ。

  • 論理構造をコンピュータに表明し、自分の考えが正しいか確認することができる
  • ある程度の自動処理をコンピュータにプログラミングし、自律的に動作させることができる
  • ただし論理環境そのものを創りだすことは出来ない

 Scratch1.0の先にあるのはSqueak環境とSmalltalk言語だった。

 ただし、Smalltalk言語の明らかな問題は、素晴らしい言語であるもののいかんせん古くなりすぎていて実用的に使えるチャンスがあまりないこと。要するにSmalltalkの達人なっても就職先がないことだった。 


 僕が大学院で学んで、最も重要だと思った授業は浜野保樹先生のロジスティクス論だった。


表現のビジネス―コンテント制作論

表現のビジネス―コンテント制作論


 浜野先生曰く、「なぜハリウッド映画には数百億の予算が投じられ、日本映画にはその百分の1しか予算が認められないのか。いくつか原因はあるが、日本は兵站(ロジスティクス)に大きな問題がある」


 日本の映画産業は、ひじき産業よりも規模が小さいと言われる。

 その背景には、優れたクリエイターが居てもそれを活かし切ることの出来ないロジスティクスの不全がある。


 この場合のロジスティクスとは何か。

 ロジスティクスとは、軍隊において戦闘員による直接戦闘以外の全てを指す。つまり、炊事洗濯はゆうに及ばず、通信、補給、徴兵、訓練といった戦闘準備の全てだ。

 

 プログラミング言語におけるロジスティクスとは、ある言語を習得したとき、利得ができるだけ大きく、できるだけ長く持続することだ。そこを意識してプログラミング言語やプログラミング環境を設計する必要がある。


 たとえばプロプライエタリな言語よりも、オープンな言語の方が持続性が高いと期待できる。

 だから今の世の中は新しい言語はオープンソースコンパイラがなければ流行らない。


 ライブラリやフレームワークも同様で、秘伝のタレ、みたいなプロプライエタリなライブラリはできるだけ敬遠される。あとあと面倒くさいことになるのを嫌うからだ。


 そして習得コストが同じならば、利得が大きい方がいい。

 この場合の利得とは、それによって得られる成果である。その成果とは、自分自身の満足感でも、お金でもいい。


 Scratchを含めたSmalltalk圏が惜しいと思うのは、素晴らしい可能性を秘めながら、それでお金儲けをしようという人がほとんど居なかったことである。


 大学の先生方が集まって作っているせいか、とにかくお金の匂いを感じない。お金の匂いがしないところにはお金に興味がない子供しか集まらない。


 大人が自発的に勉強するようなものは、いずれそれが自分の利得に繋がる場合だけだ。たとえば商売だったり、老後の楽しみだったり、なんでもいいんだけど。趣味として楽しめる、でもいい。そのときに、C#やそれに類する言語(JavaやJavaScript、C++、Swiftなど)を学ぶのと、それと全く理論体系を異にする言語系(Scratch、Smalltalkなど)を学ぶのとではモチベーションに天と地ほどの差がある。


 そこが惜しい。

 その思いから作ったのが、JavaScriptの入り口としてのビジュアルプログラミング言語であるMOONBlockである。


 Scratchとの類似性をよく指摘されるが、MOONBlockの目的はScratchとは全く違う。

 Sctatchは子供にプログラミングを教えるために設計されたが、MOONBlockは子供ではなく大人にプログラミングを教えるために設計された。大人に教える方が子供に教えるよりもずっと難しいからだ。


 大人はあたまが固く、子供よりも遥かに飽きっぽい。子供は絵が動くだけで喜んでくれるが、大人は絵が動いても「それがどうした」としか思わない。白けているのである。もっと本格的なプログラミングを教えてくれ、金になるような、とすぐに言ってくる。難物なのだ。あたまの堅い大人が使えるなら、逆説的に子供はもっと簡単に習得できるはずである、という理屈から大人向けのプログラミング講座で磨きをかけ、子供にはコロコロゲーム工作ブロック(http://www.corocoro.tv/corocoro_block/)として小学館から提供している


 だから大人に教える時はお望み通りにまずJavaScriptを打たせる。するとみんな混乱して打てない。

 キーボードでのプログラミングが桁違いに難しいということをまず体感させる。


 そのあと、MOONBlockで概略から教える。すると、驚くほど真面目に勉強してくれる。

 これは僕たちが長年の経験から導いたメソッドである。


 MOONBlockで組んだプログラムがJavaScriptに変換されるところも見せてあげる。すると自分たちがやっていることが正真正銘のプログラミングであることを感覚的に理解する。ブロックをどう組み替えると、どういうプログラムになるのか確認することができるからだ。そうやって感覚で掴んでいく。



 MOONBlockには部分的にJavaScriptブロックというブロックがあり、これにJavaScriptを直接書くことができる。これが第二の壁を突破するための小さい窓だ。


 MOONBlockの教習課程には必ずこのJavaScriptブロックの使用が入っている。品女の一年生に教える授業ですらそうだ。


 これが次の世界への入り口になるからだ。



 正しい教育過程のもとでは、MOONBlockは有効に機能することを何度も確認している。

 MOONBlockからenchant.js、つまりJavaScriptへの以降はそれほど難しくは感じられないはずだ。

 

 なぜならMOONBlockとはJavaScriptそのものだからだ。


 MinecraftのRaspberry Pi版、Minecraft PiもPythonによるカスタマイズに対応している。

 レッドストーンで飽きたらなくなった子供がプログラミングに入門するための近道だ。

 

 実際、MODやプラグインの開発からプログラミングに入門した今の大学生くらいの子供は少なくない。

 もうそういう時代なのである。


 第二の壁を突破すると、どんなことができるようになるか、第三階層で実現するのは以下のようなことである。


  • 自分自身でプログラミング言語環境そのものを開発できる(メタ言語の実現)
  • プロと遜色のないプログラムを書くことができる
  • これで飯が食える

 たいていのプロのプログラマーは、この第三階層に属する言語しか使わない。


 第三階層までのプログラミング言語が使いこなせれば、大学を卒業している必要すらない。事実、僕は卒業してない。二回も行ったのにね。


 もしもそれより上を目指すなら、第三階層を突破することだ。

 第三階層を突破するとどういう世界が待っているのか


  • ハードウェアを直接駆動できる
  • ハードウェア自体を創りだすことができる
  • ハードウェアの性能を限界まで引き出すことができる

 第四階層は天井知らずのトップノッチだ。


 ハードウェア自体を作り出し、ハードウェアの性能を限界点まで引き出すことができる。本物の一流である。

 この階層の言語を使いこなす人は引く手あまただ。ただしこの階層の言語を使いこなすにはプログラミングの知識だけでは到底足りない。高度な数学や物理学の知識も必要になる。

 

 しかし任天堂の故・岩田社長やビル・ゲイツ、慶應の古川享教授は当然のように第四階層のプログラマーである。というか昔のプログラマーには階層がなかった。第四階層しかなかったので全てのプログラマーがトップノッチであり、従って誰でも億万長者になれるチャンスがあった。


 

 あなたやあなたの子供たちがプログラミングができると何が素晴らしいのか。

 まず飯が食える。とりあえず今のところは。


 次に、コンピュータに自分の代わりに働かせることができる。

 どういうことか。

 たとえば村上福之というあやしいおっさんがいる。


中国の爆買の転売価格を比較検索するサービスつくりました。国慶節なので。:村上福之の「ネットとケータイと俺様」:オルタナティブ・ブログ

http://blogs.itmedia.co.jp/fukuyuki/2015/10/url_2_5_sk22_1020.html


 この人は、いわばネオニートのようなものである。

 大メーカーのエンジニアを引退して(といってもまだ30代のはずだ)、だらだら生きてる。


 「仕事したい」


 と言ってるけどしない。

 

 「金がほしい」


 と言ってるけど、既に持ってる。

 彼はどうやって金を手にしているか。


 なにか世の中におかしなこと、不思議なこと、なぜか誰もやってないことがあるととりあえずそれを自分でプログラミングしてしまう。

 そしてそれを誰か他の会社に売ったり、そうでなくても自分でサービスを立ち上げたりして小銭を稼いでいる。


あなたにピッタリのApple Watchを選んでくれるサイトをつくったよ。:村上福之の「ネットとケータイと俺様」:オルタナティブ・ブログ

http://blogs.itmedia.co.jp/fukuyuki/2015/03/apple_watch.html


 なんかAppleWatchを代わりに選んでくれるとか、かなりどうでもいいサービスを半日くらいで作って広告で小銭を稼いでる。


 金儲けが目的なわけではもちろんない。

 彼ならもっと遥かに効率的な金の儲け方ができる。


 そうではなくて、自分の考えを表明するため、自分の考えを確かめるためにプログラムを書いて、それを公開しているだけだ。ついでに小銭を稼いで酒を飲みに行く程度である。


 AppleWatchを選ぶサービスというのは彼なりのジョークなのだ。

 プログラマーはジョークさえプログラミングするのである。


 プログラミングができるというのはそういうことなのだ。


 たとえば最近、僕も身近にそういう問題に直面したことがある。


 とあるプロジェクトで、「こういうときはこう、ああいうときはこう」という説明を繰り返しているうちに「紙でも言葉でもジェスチャーでも表現できないから、プログラムを書いて何をしたいか説明してください」と言われてしまった。


 これはいずれ僕だけの特殊な事情ではなくなるだろう。


 「こういうものが欲しいのに」というのを高次で定義できるのがプログラマーである。

 「こうして欲しいのに」というのを厳密に説明できるのがプログラミングという行為である。


 説明のためにプログラミングをしなければならないような時代が来る。

 というか今僕のところには来てる。


 なぜ他の人には来ないか。

 それはプログラマーでない相手には「どうせこの人は言葉であーだこーだいう以上のことはできないでしょう」という諦めがあるからだ。


 プログラマーに対しては、より高度なコミュニケーションが期待される。

 そう、プログラミングとはコミュニケーションの一形態なのだ。


 たとえば、子供に「どうして月は地球に落ちてこないの?」と聞かれたとする。プログラマーでない人はネットで調べろと言うか、自分がどこかで聞きかじった知識で必死にわかったふりをするしかない。



 どれだけ数学と物理が得意でも、実際の天体の軌道シミュレーションなど面倒すぎるし、それを理解させるためにまず子供に微積分を教えなければならない。


 しかしプログラマーである私は、子供にそう聞かれた時に、まずF=maを教え、次にF=G*Mm/R^2を教える。

 そして加速度を積分して速度に、速度を積分して位置にするという単純なプログラムを書く

//地球は原点に固定とする
earthMass = 600
moonMass = 100
G=0.01 //事実上の時間調整の役割しかない
R2 =moon.x*moon.x+moon.y*moon.y //どうせ自乗するのでこれでいい
F = G*earthMass*moonMass/R2;
R = Math.sqrt(R2);
 Fx = -dx/R*F; Fy = -dy/R*F;
moon.ax = Fx/moonMass   // F=maを解くと a=F/m
moon.ay = Fy/moonMass
moon.vx += moon.ax
moon.vy += moon.ay
moon.x += moon.vx
moon.y += moon.vy

(実際に試してみたい人はこちら→ 月はなぜ地球に落ちてこないか、実際にMOONBlockでプログラミングして確認してみる - shi3zの長文日記)

 ピタゴラスの定理がいかに役に立つか、この瞬間に教えることができる。


 積分記号など使う必要はない。

 時間積分ほど解りやすい微分積分の教え方はないのだ。



 これでプログラミングしてシミュレーションすると、月は地球にまっすぐ落ちてくる。


 子供も私も混乱する。

 

 「どうしてこういうことになるの?」


 そこで地球と垂直な初速度を月に与える。すると楕円軌道を描いてやはり地球に落下する。


 しかしさっきのように直線的に落下するよりは明らかにマシだ。



 そこで初速度をもっと大きくする。

 初速度を大きくすればするほど月は円軌道に近づき、さらに大きくすると月は地球を振りきって宇宙の彼方へ飛んでいってしまう。



 これが「月が地球に落ちてこない理由」を本質的かつ体感的に理解できる瞬間であり、人類が数百年かけて辿り着いた叡智を一瞬にして自分のものにできる快感である。


 

 プログラミングができるというのは、このように他の人に知識や考えを共有することができるということでもあるのだ。


 そして自分の考えが正しいかどうか確認することでもある。



 だからこそ、プログラミングができるというのは本来、素晴らしいことなのだ。



 けれども、プログラミングができることの素晴らしさだけに目を奪われて、だから子供にプログラミングを教えれば万事解決すると考えてはいけない。


 なぜなら、プログラミングを学べば全ての人がこのような論理展開を身につけることができるわけではないからだ。


 プログラミングを学ぶ、学ばせる、ということにもひとつの兵站(ロジスティクス)戦略が必要なのである。


 モチベーションを与え、適切な目標を設定し、いろいろな人が様々な方法でいろいろな教え方を試行錯誤しなければならないし、今はまさにプログラミング教育はその過渡期にあることを自覚しなければならない。


 今、世の中にプログラミング教室は星の数あれど、目的も教え方もバラバラの中で、ひとつの方向性を探し求めたい。



 これだけたくさんプログラミングに関する本を書いたので、僕としては、未来の子どもたちのために還元したい。僕がかつてそうだったように。プログラミングに青春を賭けた自分があるから今があるように、子どもたちが挑むべき目標を設定したい。



 そこでこれらの本で得た著作印税を投じて、子どもたちのためのプログラミングコンテストを開催することに決めた。


 それが久々の9leap(ナインリープ)、ジュニア・プログラミング・チャレンジである。


9leapジュニア・プログラミング・チャレンジ2015

http://9leap.net/2015jr/


 審査員として、スマートニュースの鈴木健氏やBio_100%の戀塚明彦氏を始め、プログラマーとして名を馳せた人々を集めている。

 

 優勝するとMacBookAirがプレゼントされるほか、準優勝でもiOSの動く8インチタブレット(なぜかクパチーノの会社この端末だけは商品名を書いてはいけないらしいので)がプレゼントされる。


 冬休みでどれだけの参加者が来るかわからないけれども、とにかくやると決めたので、やってみる。


 大人からは寄付やボランティアも募っているので興味のある方は Facebookで連絡ください。

https://www.facebook.com/shi3z


続き 月はなぜ地球に落ちてこないか、実際にMOONBlockでプログラミングして確認してみる - shi3zの長文日記