見出し画像

ロボットを作るために必要なのは「プログラミング」だけじゃない!という話

はじめに

すでに、色々な所が報道されているとおり、2020年度から小学校におけるプログラミング教育が必修化されます。

さて、このプログラミング教育が行われると、
・「IoT」よろしく、既存のモノにいろんなセンサを取り付けることができる
・極小基盤に、様々なライブラリやAPIを組み込むことができる
・通信SIM付のクラウドを使って、オンラインサービスを実装できる
といったことができ、ロボットなどもスイスイ作れるようになるのでしょうか?

…どうも難しそうです。よほどの天才でないと無理なのではないでしょうか(※1)

とはいえ、非プログラマの方(※2)が「プログラミング教育」に期待していることって、何かこの辺のことが、うまい具合にスイスイとできるようになることのような気がしてなりません。

そこで、今回は文部科学省がプログラミング教育で何を狙っているか…は一旦置いておきましょう。「手っ取り早くロボットや電子ガジェットが作れるようになるためにはどんな分野の知識が必要なのか?」をコンピュータ歴20年のフルスタックエンジニアが考えてみたので、ご覧ください。

これだけあれば、まずはなんとかなる

色々言い出せばきりがないのですが、さしあたって、これくらいの知識を「本人が持っている」あるいは「周りがサポートできる」のであれば、簡単なガジェットは作れると思います。

1: 「したいこと」を自然言語で表現する力
2: 環境をセットアップする知識
3: 電気の知識
4: ネットワークの知識
5: コーディング(プログラミング)の知識

コーディングが5番目に来ているところがポイントです。

要求仕様の明文化はエンジニアに最も必要なスキル

まず、何よりも「プログラミングで○○するモノを作りたい」と発想し、それを具体的に表現できることが何よりも大事です。エンジニア的に言えば、「要求仕様を考え、それを表現できる力」です。

非プログラマの方は驚かれるかもしれませんが、エンジニアなら強く実感されると思います。これが一番大事なスキルです。なぜなら、要求仕様がないモノを作ることはできない(※3)からです。

要求仕様は、プログラミング的知識がなくても考えられます。要はやりたいことを自然言語で具体的に表現できたら良いのです。ただし、できるだけ具体的に「○○するモノ」を表現できる必要があります。
・前にボールが飛んで来たら…、
・腕を動かしたら…、
・データを受信したら…、
・1秒ごとに常に…、
など何でもよいのですが、とにかくやりたいことを具体的に表現する力です。あえていうなら、国語力でしょうか。

環境をセットアップできないと、モノは作れない

次に環境が用意できるかどうかを考えます。環境がないと、モノは作れません。個人でやろうとすると、ここで手が止まってしまう人が多いようです。

ここでは、特にハードウェア的な意味を考えます。たとえば
・「入手方法」がわかる
 ・家電量販店の店頭で買えるのか、アマゾンでないと買えないのか
 ・それはいくらで用意できるのか?
・組み立てにどの程度の工作が必要かがわかる
 ・市販品を買ってきて、組み合わせれば実現できる
 ・電子部品の組込みが必要なレベル
  ・ブレッドボードの結線で実現できる
  ・はんだ付け、溶接などが必要なレベル
  ・3Dプリンタなどで、成型から必要なレベル
・身体に危なそうなことがわかり、どんな準備が必要かわかる
 ・電源(強電)も取り出すなら、感電や火事(ショート)に気を付ける
 ・成型に刃物が必要なら、裂傷に気を付ける
 ・塗装時の中毒に気を付ける
  …
などなどです。

市販品を組み立てて、簡単なガジェットを作るだけなら、あまり危ないことを意識しなくてもよいですが、本格的な工作となるとそれなりに準備が必要です。○○するモノのハードルが高いと、エラいことになるので、注意が必要です。

ソフトウェア開発に必要な環境については、最近だとオープンソースの開発環境が揃ってきており、Web上にも情報が増えてきたため、こちら側はそんなに心配いらないかもしれません。ただし、クラウドを利用するような場合は、通信費やクラウド利用料などに気を付けておかないと、「使っていないときにも課金し続けている」などというリスクがあるため、十分注意が必要です。

こういったことは、学校で習う知識というよりは、ノウハウに相当します。ですので、有識者を見つけて直接指導を請うか、How-To本を買ってしまうというのも手です。

電気の知識は無視できない

2に関連しますが、「電気」の知識も、多少必要です。とはいえ、「豆電球を光らせる授業を完全に理解できているレベル」で十分です。

・家庭のコンセントから取れる100Vと、乾電池1.5Vの違いがわかる。
・最近じゃ、USBハブから5Vが取れますが、これはどちらの仲間かわかる
・そもそも電圧って何? 電流と何が違うの? あと、電力とは?
…といったことに正しく答えられたら、少なくとも電子工作をするレベルであれば問題ないでしょう。

これは小学校の理科で習いますよね。

ネットワークの知識はとても難しいが、理解が必要

完全にローカルに閉じるロボットを作るのであれば別(※4)ですが、何らかの通信機能を使うガジェットを作るのであれば、ネットワークの知識は必須です。

そもそも、IoTのIは、インターネットのIです。そして、インターネットのネットは、ネットワークのネットです。ネットワークとは、機器と端末を結ぶ仮想の「線」のことです。線は、LANケーブルのような有線と、Bluetoothなどの無線(物理的な線がない「線」)とがあります。また機器同士の接続は、直接接続されている場合(Bluetoothでスマホとイヤホンが繋がっている、みたいな場合)もあれば、クラウドを経由して繋がっている場合もあります。

クラウド経由と言っても、
・端末にSIMカードを挿してネットに出てクラウドに繋げること
・Wi-Fi(無線LAN)で繋げること
の違いも認識が必要です。「携帯キャリアに課金されるかどうか」だけでしか違いが判らないと、ちょっと困ってしまうかもしれません。

ネットワークの知識って実は相当壁が高いのですが、ここは授業でも習わないし、実は多くの「ロボットプログラミング教室」でも取り扱ってはいない(※5)のではないでしょうか? しかし、本来はこのネットワークの知識がないと面白いガジェットは作れないのも事実です。

現状は、有識者を見つけて直接指導を請うのが一番良いのですが、ネットワークというジャンルの有識者はそもそも市場的にもかなり少ないという問題があります。

コーディング(プログラミング)の知識は最後でいい

ソフトウェアは、ハードウェアと逆に形が無い「モノ」の方です。物理的なモノではないので、物理的な工作は不要ですが、モノはモノですから、モノづくりは必要です。ここでモノづくりに相当するものが、いわゆるプログラミングになります。

プログラミングとは、プログラミング言語(※6)を使って、人間の意図した処理をコンピュータに理解させるための行い(※7)になります。プログラミングはプログラミング言語を用いて行いますが、最近だと、ノンプログラミング開発(※8)の環境が沢山出てきました。

「プログラミング教育」という言葉で期待されているのがこの分野かもしれませんが、電子工作をするレベルであれば、いまやWeb上に情報もたくさんあるので、実はそんなに心配しなくてもよい分野です。

終わりに

私が思うに、プログラミング教育という言葉は、その語の定義がいまだ定まっていないように思います。そのため「プログラミング教育すれば何でもできる!」と思われがちではないか? と危惧しています。

しかし、実際にIoTでメシを食ってきた立場からすると、プログラミングだけで解決できることってそんなにない…というか「プログラミングに至るまでに必要なたくさんの準備をして初めてプログラミングができる!」という印象です。

最近では、電子工作ができる環境が本当にたくさん出てきました。是非一度それらを使って、これらを実感いただきたいと思います。そうすれば、STEM教育として行うべき施策も見えてくるのではないでしょうか?

(おわり)

脚注

(※1)よほどの天才は、学校でプログラミング教育がなくても、これは実現できるはずです。

(※2)「STEM教育を受ける子どものご両親」という場合が該当するでしょうが、案外「企業の経営層」がこういう考えをお持ちだったりします。その場合、プログラミングやAIの学習といった点で、あまり効率的ではない教育をされる可能性があります。

(※3)とはいえ、現実のエンジニアは、要求仕様がないことに苦しめられているわけで…。要求仕様を書くことは、大人でも難しいのです。

(※4)「電池で動くロボットにセンサをくっつけて遊ぶ」というレベルならネットワークは使っていません。「センサで感知したものを、スマホや他の機器に通知して何かをしたい」という場合に、ネットワークの考え方が出てきます。

(※5)現在のロボット教室/プログラミング教室は学習塾が実施しているものが多いようですが、いわゆる「エンジニアを生み出したい」というモチベーションはそんなに高くないのかもしれません。

(※6)最近だと、Pythonなどが有名ですね。一方、組込み系だとC言語とか、Web系だとJavaだとか、iPhone用アプリならSwiftだとか、とにかく色々ありますが、要は「言い方の一つ」だと思っておいたらよいです。

(※7)実際には、ソースコードだけでは、マシンは理解できません。マシンが理解できる「機械語」というものがあり、プログラミング言語は一旦「機械語」に翻訳(コンパイル)されてから、マシンで実行されることになります(そのため、※6を「言い方の一つ」と表現しています)。なので、Scratchでできる範囲のことであれば、Scratchを使えばよいし、別にPythonを使えたから偉いということでもないのです。

(※8)ノンプログラミング開発とは、「有名プログラミング言語を使わずに、別の表現方法を使ってプログラミングを行う開発手法」という理解が正しいです。「プログラミングをしなくてよい」という意味ではありません。

課金してくれるととても嬉しいです。シェアしてもらっても嬉しいです。「いいね」も嬉しいですし、フォローも嬉しいです。要するに、どんなことでも嬉しいです。