infomisc -ITエンジニア雑記-

某ITエンジニアの雑記および備忘録です。プログラミング教育についても触れていければと思っています。

センター試験

明日からセンター試験みたいですね。

センター試験に失敗した自分としては苦い記憶で残ってます。 大丈夫!失敗したとしてもそこそこやっていけるよ。と後輩さんたちに言っておいてあげたいです笑

受験生のみなさまが、いつも以上の力を発揮できることを祈りつつ。。

Scratchを触ってみた#1

f:id:rmatsush:20200117020450j:plain 「小学校プログラミング教育の手引」にも記載されているプログラミング言語「Scratch」をiPadで触ってみました。

scratch.mit.edu

ほんの少し触っただけですが、「すごいプログラミング環境を提供しているなー」といったのが第一印象です。 プログラミング環境と表現している理由は、元々プログラミング言語のみとしてのイメージが強かったのですが、プログラミングを組む環境としても良くできている印象で、ブロックをくっつける仕組みとか、条件分岐の表現とか、なるほど!と思えるギミックが楽しいです。 しかもマルチスレッドで動かせますし、ちょっとしたゲームなんかは余裕で作れそうですね。

#これと同じことを一般的なプログラミング言語で実現しようとしたら、どれだけ大変なことか。。^^;;

あと、プログラミングを始めるのに一切のインストールは不要です。 Webブラウザがあれば動かせますので、本当に手軽に遊べます。

プログラミング言語の位置づけ

f:id:rmatsush:20200115001027j:plain

少し脱線してプログラミング言語の位置づけについて書きます。

プログラミング言語は目的を達成するためのツールでしかないので、目的と手段を履き違えないようにしましょう。というお話です。

 

www.infomisc.netちょっと前に上のブログで、「プログラミングは、コンピュータを制御するために、コンピュータが理解できる表現で書くこと」と言いました。この表現方法というのは方言のようなもので、プログラミング言語によって異なります。プログラミング言語の種類はWikipediaなどからによると200種類以上とも言われています。

プログラミング言語一覧 - Wikipedia

 

 

プログラミング言語はツールであり手段のひとつ

プログラミング言語は目的を実現するためのツールでしかありません。

自分も同じようなことになりがちですが(笑)、ツールそのものを使うことが目的になっているケースも見かけます。例えば「オブジェクト指向でコーディングしている」とか「マイクロサービス化した」など、なぜか手段が目的となってしまっているケースです。最近では仕事でクラウドを扱っているのですが、「クラウド化」といったキーワードも至るところで耳にしていて、本当の目的が隠れてしまい、「どうやったらクラウド化ができるのか」ということに焦点が当てられてしまっているように思います。

話が脱線しましたが、プログラミング言語は目的を達成するためのツールでしかなく、どの言語を選んでも本質は変わりません。

 

現実的には。。

、、と書いてはみたのですが、現実的には「〇〇言語ができる人を募集」とかあったりしますので、世の中で広く使われているプログラミング言語を習得しておくことに越したことはありません。募集する側も「プログラミング的思考能力」を測ることは難しいので、プログラミング言語ができることを評価軸とした方がわかりやすいということもあると思います。

個人的にですが、プログラミング言語を習得する上で効果的だったのは、文法を一から学ぶのではなく、「〇〇を実現したい」といった目的を定めることでした。

自分はPythonを使っています。スクリプト言語であり、かつ、可読性が高いという特徴を持っています。仕事上大量のテキストファイルを扱うことがあるのですが、数行コーディングするだけでやりたいことが実現できるので手軽でいいです。

バドミントン桃田選手が事故で怪我

news.yahoo.co.jp

バドミントン界に衝撃的なニュースが飛び込んできました。

自分もバドミントンを月に数回やっているのですが、最近の日本のバドミントンは強くて、そのなかでも桃田選手は現在の世界のランキングで1位という選手です。 今年の夏のオリンピックでも、もちろん優勝候補筆頭なのですが、ここにきてまさかの怪我。。 最近も好調だったので、治るまでどのくらい掛かるのかとか、今と同じようなコンディションに持って行けるのかとか、心配しています。

一日も早く復帰されることを願ってます。

プログラミング教育について思うこと

f:id:rmatsush:20200113171523j:plain

www.infomisc.netの続きです。

プログラミング教育の目的として以下の3つ挙げてみました。

  1. 「プログラミング的思考」を育成する
  2. プログラミングの働きや良さを気づかせる
  3. プログラミングを実践的に活用できる

1.は「プログラミング的思考」で触れていますので、ここでは2.と3.について触れたいと思います。

 

ITリテラシーの基礎づくり

2.は生活する上で必要最低限となるITリテラシーの習得に位置付けられると考えます。これはインターネットやスマートフォンおよびタブレットの普及によって、急激にICT化が進んでいることが背景にあります。

小さい子にとっても、スマートフォンタブレットは好きなアニメや音楽が無限に出てくるオモチャとなっています。好きなコンテンツをひたすら見たり聞いたりすることができますので、そりゃ喜びますよね。。^^;

ただ、あまりに集中しすぎてしまうので、人の話を聞かなかったりすることもあります。ウチもそうです。もちろんそれを危惧している親御さんもたくさんいらっしゃいますので、利用を禁止したり、制限をつけたりしているご家庭もあると思います。ですが、まわりの友達までは制限することはできませんので、もはやこの流れは止められないのかなと思います。

こんな魔法のようなオモチャが、どのようなロジックで動いているのかを興味として持ってもらえるかは、ITエンジニアとしても次世代の人材を育てていく上では重要と思っています。自分のまわりには居ませんが、若い世代ではキーボードやマウスに慣れていない人も多くなっていると聞きます。キーボードやマウスがなくてもやりたいことが実現できるなら触らなくて当然かも。。とも思いますが、ICT化が進んでいるなかで、企業がキーボードやマウスの使い方などを教えてくれるわけもなく、やはり最低限のITリテラシーは必要という認識です。

 

プログラミング演習

3.に関してはさらなる実践となりますので、実際にプログラムを組む演習が想定されます。プログラミング教育では「Scratch」が例として出ていました。最初からコーディングを伴うようなプログラミング言語から入るのは敷居が高いので、このようなビジュアルプログラミングから入ってもらうのは良いと思います。

Scratchなどは実際のモノではない仕組みを制御する演習ですが、ロボットのような実際のモノを動かす演習も人気のようですね。ロボットの動きをプログラミングで制御するような演習になります。小学生にはプログラムした内容が実際にモノとして動くことを見ることができた方が、直感的に楽しいと感じでもらえそうです。

プログラミング的思考#2

f:id:rmatsush:20200112005344j:plain

www.infomisc.netの続きです。

少し身近な話をしたいと思います。

今3歳の娘さんはレゴで遊ぶのが好きなのですが、「レゴで家を作りたい」と言ってきます。最初は作ってあげていたのですが、今は組み立ての説明書を見て一緒にやっています。

「プログラミング的思考」と紐づけると、「家を作りたい」という目的に対して、説明書の手順を踏むことで完成させることができるということが分かります(本人はまだ分かってないと思いますが。。^^;;)。家を作るためには土台となるブロックを配置して、それを繰り返していくことになりますので、この理解はプログラムでいうところの「順次処理」を意味しますので、プログラミング的思考が含まれます。

 

プログラミング的思考能力の向上

さらにプログラミング的思考を向上させることに踏み込むとなると、急にハードルが高くなりそうです。先ほどの「レゴで家を作りたい」という目的に対するプログラミング的思考能力のゴールは「組み立ての説明書を自分で作れること」になるかと思います。

本当に求められるのはこちらの能力だとは思うのですが、普通に考えると「レゴで家を作りたい」⇒「家を作るには組み立ての説明書が必要」⇒???となって、それ以上の答えが見つからなくなってしまうかもしれません(課題の分解ができなくなる状態)。そのような場合にどうするのかというと、自分の場合は知識や同様の経験から導く、または、有識者に聞くことで答えを出していきます。

プログラミング的思考ができる人は、目的に対して必要な課題を自分の消化できるかたちまで分解できます。「この実現のためにはこれをやらないといけなくて、それをやるためにはさらに別の課題を解決できないと、、」といった具合です。

正直、小学校の教育でどこまでのレベルが求められるのかはわかりませんが、ちょっとでも気づいてもらうことが重要なのかもしれませんね。

プログラミング的思考#1

学生の頃からITの世界に触れてますが、本格的にプログラミングを学んだのは大学2年の時です。講義の名前は忘れてしまいましたが、最初の課題が「うるう年を判別するプログラムを組みなさい」といった内容だったと記憶しています。それまでは一切プログラミングの知識はなかったので最初はかなり苦労しました。今から考えるとプログラミングの考え方(プログラミング的思考能力)やプログラミング言語といった土台がない状態で一気に詰め込んだので、なかなか理解が追いつかなかったのだと思います。
#何度もプログラミングの課題で徹夜したことは覚えています。習うより慣れろを実践できた気はします^^;

 

課題の理解/抽象化/分解

プログラミングには、目的を達成するための課題の理解と抽象化、分解が必要になるような側面があります。自分はこのようなことを「プログラミング的思考」と呼んでいると理解しています。

例えば「うるう年を判別する」という目的があったとして、この目的を達成するためには、そもそも「うるう年が何か」や「うるう年となる条件」が分からなければ、うるう年を判別することはできません。ヒトが今年がうるう年かを判別するには、単純に今年のカレンダーを見れば分かりますが、コンピュータがカレンダーを見ることはできないので、うるう年と判断するための条件を教えてあげる必要があります。

国立天文台のホームページでは、質問3-6)どの年がうるう年になるの?

グレゴリオ暦法では、うるう年を次のように決めています。

(1)西暦年号が4で割り切れる年をうるう年とする。

(2)(1)の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。

という明確な条件があります。この内容をプログラミングすることができれば、うるう年の判別はできそうですね。このように「うるう年を判別する」ためには、「うるう年となる条件の特定」が必要になることが分かると思います。さらに「うるう年となる条件」が、(1)と(2)になることが具体的に分かったので、この段階でプログラムを組めるようになります。


プログラミングでは、大きな課題は小さな複数の課題に分解し、各課題をコンピュータが理解できるレベルまで落とし込んでいく必要があります。プログラムを組む上で最も難しくて重要な作業がこの部分になります。今年から必修化されるプログラミング教育もこのような思考能力を向上させることを目的としているのだと思います。この能力はIT業界だけで必要な能力ということではなく、すべての業界に応用することができます。だからこそ、プログラム教育を必修化した取り組みがスタートしたのだと考えています。