Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

1分間プログラミング

今すぐ書ける 1分間プログラミング
『1分間プログラミング』は、初心者未満の人を対象とした書籍だ。書籍冒頭の説明から察するに、特に初めてプログラミングを学ぼうとしたものの、諦めた人を意識しているように感じた。

おそらく多くの人は、プログラムを学び始めるに際し、漠とした成果物として、何らかのwebサービスや、日常的に利用しているソフトウェアのようなものを想定しているはずだ。現実を知る者からすれば、それはプログラミング未経験者が直近の目標とするには、遥かにスタート・ラインからかけ離れたターゲット、と理解できるのだが、初めてプログラミングを経験した初学者からすると、学習初っ端の無味乾燥、地味さ加減や、自身の理解の及ばなさ、ターゲットと現実との乖離に幻滅し、意欲を減退させられるのだろう。そして挫折する、諦めるのが典型的なbad patternだ。

この書籍では、後述するライブラリを用いて、この無味乾燥、地味さ加減を解消しようとしている。端的に言えば、ライブラリのメソッドを呼び出しすることで、初学者ではとても実現できないことを肩代わりし、1行で複雑なことを実現させ、モチベーションを維持させようとする試みだ。

作業環境

この書籍では、次の環境で作業することを前提としている。

作成するプロジェクトは「.NET Framework」のコンソール・アプリケーションだ。「.NET Core」の場合は、使用するライブラリを変更する。これはMacで作業する読者のために用意されたものだが、Windowsユーザーでも利用できる。
使用するライブラリは、次のように異なっている。

MagicWandWin .NET Framework
ローカル音声認識
MagicWandCore .NET Core版
クラウド音声認識→Azure連携
MagicWandEasy 簡易版

MagicWandと学習スコープ

プログラミングの学習に際し、専用ライブラリを用意するのは珍しいことではない。例えば、東京大学教養学部のプログラミング入門でも、「ita」というライブラリを用意している。*1

本書でも「MagicWand」というライブラリを用意している。とはいえ、あくまでも目的はプログラミング学習であり、このライブラリの機能説明ではない。それを強く意識しているのか、該当ライブラリについての情報は公開されていない。本書で紹介されるのは、特別なメソッドについての内部ロジックを説明するのみだ。

このライブラリは、あくまでも1行で複雑なことを実現するためのツールなのだ。ライブラリを参照し、複数行のコードを記述して目的の機能を実現するのは、初学者に対応できることではないだろう。それを1行で実現することで、読者の興味を引き付け、モチベーションを維持させる仕掛けでもある。

例えば、変数に文字列を格納し、コンソールに1行の文字列を表示するだけの、地味で無味乾燥な「Hello World」が、音声認識を介したものになる。このような具合だ。

Magic.Speak("hello world");

引数に指定された文字列を音声出力するのだ。あるいは、このようなサンプルだ。

Magic.Recognize();

これは、いうなれば「Console.ReadLine();」の音声認識版だ。音声入力で認識した言葉を文字列にして返す。

このライブラリは、次の機能をサポートしている。そして、それらは教材となる題材に直結している。

音声入出力 Chapter 1
音声入出力版「Hello World
livedoor天気予報API連携 Chapter 2
Siriのような天気予報
Wikipedia連携 Chapter 3
穴埋めクイズ作成

これらの開発を通じて、読者は次のことを学ぶ。

  • 変数、データ型、配列
  • 分岐、ループ
  • Dictionary

ライブラリが提供する機能に比して、学習スコープはとても簡素だ。また、1行ごとにコメントで記述すべきコードが指示される。読者は、そのコメントの指示に従ったコードを記述する。具体的には、このような具合だ。あくまでも初学者を挫折させない配慮が感じられる。

//何かキーを押す。すると答えが表示される。
Console.ReadLne();
Console.WriteLine("A:" + qa.Value);

ちなみにMagicWandはC#だけでなく、PowerShellからも呼出しできる。このライブラリの機能に興味があれば、PowerShellからメソッドを呼び出して動作確認するのが手軽だろう。次の投稿で、この話題を取り上げている。
未知のDLL(ライブラリ)の調べ方-IL DASMあるいはコマンド”ildasm” MagicWandWin.dllの場合 - Technically Impossible
PowerShellからDLL(ライブラリ)を呼び出す-Add-TypeとGet-Member MagicWandWin.dllの場合 - Technically Impossible

本質的に求められるのはメンタル面での支援ではないか?

社会人の目標設定では、「ストレッチした」ターゲットを設定することを求められる。目標達成の過程、それによる貢献を通じて、個人だけでなく組織にも成長をもたらすためだ。この「ストレッチ」とは、現状では届かないものの、少し背伸びすれば届きそうな範囲を意味している。
一方、現状ではとても届かない課題を、意図的に設定することもある。それは「ムーンショット型」と呼ばれるような、遠大な目標への到達を強いることで、必ずしもそれが達成できなくとも、大きな飛躍を伴う成長、成果を期待している場合の話だ。

冒頭で触れたようなプログラミング初学者の抱きがちな目標成果物は、どちらに属するものだろうか。

ストレッチ 背伸びすれば届く目標
ムーンショット 遠大な目標
勘違い 背伸びすれば届く(と思った)目標
何も分からないが故の、意図していなかった現実との乖離。

初めてのことに挑戦するにせよ、成長を求めるにせよ、共通するのは「comfort zoneを出る」ということだ。そのための支援、特にモチベーションを維持させ、挫折を回避するための仕掛けとして、MagicWandのような支援ライブラリは機能するだろうが、その範囲や効果は限定的だ。テーマや題材毎に、常にライブラリを提供することは現実的ではないし、結局のところ、初学者未満を脱するための支援程度に機能するのが、その限界ではないだろうか。
もちろんMagicWandがサポートする範囲を脱し、その応用的活用や内部機構に関心が向き、学習が発展、継続すれば大成功なのだが、それはライブラリが導くものではなく、学習者の意欲に依存する問題だ。
モチベーション維持、挫折回避、そして学習の発展継続を恒常的にサポートするには、ライブラリのようなツールではなく、コーチングのようなメンタル面での支援が、暗に求められているのではないだろうか。
むしろ、そのようなライブラリだけを提供し、後は学習者の意欲に任せるというのは、体良く学習支援を放棄しているようにも見える。

自炊プログラミング

ITの普及に伴い、その社会的影響力が増大し、今や義務教育でさえプログラミングを取り入れる時代となった。プログラミングに関心を示す人たちは多そうだ。そして、その多くの人たちが「エンジニア」を目指して、プログラミングを学んでいるようだ。この点について、いつも気になるのが、どうしてプログラミングだけは、いわゆる「プロ」を目指そうとするのか、ということだ。
例えば、家庭科を習ったからと言って、誰もが料理人、パティシェ、あるいは手芸、裁縫を生業とするわけではないし、技術を習ったからと言って木工などを生業とするわけでもない。これらはいずれも社会生活上必要とされる能力や知識の習得が主眼であるはずだ。義務教育を離れ、生活の一部や趣味として料理やDIYを始める人たちもいるのだろうが、それにしても必ずしも「プロ」を目指すものではない。プログラミングも、この程度で十分と思うのだ。
例えば、カレーを食べたいと思えば、いろいろな対応方法がある。それは、プログラミングで言えば、次のように対応することだろう。

スパイスから自分で調合して作る 全て自分でプログラムする。
ルーを買ってきて作る 必要なライブラリを見つけて、一部をプログラムする。
レトルトを温める 必要なライブラリを見つけて、呼び出す。
ほとんどプログラムしない。
外食 ソフトウェア・パッケージを買う。

この程度のことが状況に応じて判断でき、対応できる程度のプログラミング能力が身につけば、それで十分ではないだろうか。