レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

初心者にプログラミングを教える時の例集

 

do while

 テストと追試

  →40点以下再試験。

  テスト1回目は、全員必ず受けるが、40点以下なら再試験。

  再試験でまだ40点以下なら再再試験。40点を超えるまで繰り返し。

 

多次元配列:

 表や立方体を例えに出すと、4次元で詰むので

 リストの中にリストが入っている例として「新幹線の座席」を使う

 ABCDEの列が20列ならんでいることと、そういった配列が

 1−16号車まで並んでいる。

 そういった車両が、のぞみxxxなどと番号づけされている。

 

インスタンス・オブジェクト

 同一型のデータ集合である配列と比較して、

 各データに名前付き・型付きのデータ項目が持てる。

 おまけに、そのデータを専門に扱う処理が書ける。

 

参照型

 フォルダの実体とショートカット。ショートカットで開いて操作したら、

 サーバーの実体が更新される。

 

抽象クラス・インターフェイス

 人事部や学校の先生から配られる、日報フォーマットやテストの回答用紙。

 抽象メソッド部分が記入欄で、配られた側は記入欄のみを記載する。

 抽象メソッドを実装することが強制され、使う側はルールに乗っ取っていることを

 インターフェイスは、抽象メソッドのみの集まり、ルールセット。劣化しにくい

 抽象クラスは、式やマクロ入りのテンプレート。

 マクロ入りや式入りは経年劣化やバグの可能性あり、取扱注意。

 

メソッド

 なんどもやる仕事を名前をつけて定型化

 例えば、日直の仕事の定型化

 ホワイトボードを消す、終業後消灯する。帰宅後チェックリストによるチェック。

 掃除して()

  ぬいぐるみをタンスにしまう。

  ブロックを箱にしまう。

  拭き掃除をする。

 

メソッド引数なし、戻り値なし。

 →消灯する。(メソッド名のみ)

 

定義側

class DayDuty{

  void lightsOff(){

     // 消灯処理

  }

}

 

 

呼び出し側

 DayDuty dd = new DayDuty();

 dd.lightsOff();

 

 

メソッド引数あり、戻り値なし。

 →テスト配って()

class DayDuty{

  void passOut(Test[] tests ){

     // テスト問題を配る

  }  

}

 

メソッド引数なし、戻り値あり。

 →昨日のチェック結果を報告して()

 →テスト答案回収して()

 

メソッド引数あり、戻り値あり

 →300円で、パン買ってきて()

 →テストを配って、回収して()

 

オーバーロード

 コピーしろと命令、渡すものが紙なのかパソコンなのかで、

 仕事をする側は動きが異なる。紙ならコピー機でコピーする

 パソコンならハードディスクをコピーする。

 

カプセル化

 携帯電話の電波の3本線表示を勝手に操作できたとしても意味がない。

 内部処理を反映した結果だから意味がある。

 →操作させないことも大事。

 

インターフェイス(ルールブック)

 日直の仕事とは(ルールブック)

 人事部は、誰が日直だとしてもルールを教えたはずの前提なので、

 ルール通りに命令する。

 → 朝会仕切れ()など

  

インターフェイスの役割

 コンポーネント(再利用可能な独立部品)のつなぎ目。

  つなぎ目を規格化するもの

 

インターフェイスを複数持つ意味

 パソコンだと、USBやHDMIVGAなど複数のインターフェイスの実装を持つことができるようなもの。

 

 ポリモフィズム

 屋台街でくれと言ってまわる

 

 

 

Computational Thinking

プログラミングを学ぶことの上位目的としてComputational ThinkingCT/計算論的思考)という言葉が使われることがあります。

 

CTとは、問題解決や問題分析の手法だと捉えたほうがよく、プログラミングそのものとは切り離してあらゆるシーンで使うことができる考え方です。

プログラミングを子供達に教えることの意義は、色々と言われますがこのCTをしっかり身につけることが良いと考えています。

 

CTの分類は諸説あるながら、以下のブログで解説されている分類がとてもしっくりくるので引用させていただきます。

Computational Thinkingとは何か - 小さなごちそう

 

1. Decomposition(問題の分解)

 複雑な問題を解決可能なレベルまで分解すること。

 

2. Pattern Recognition(パターンの発見)

 周期性や法則性を見抜くこと。

 

3. Abstraction(抽象化)

 枝葉を切り落として重要な要素だけを抜き出すこと。

 

4. Algorithm Design(手順化)

 ステップバイステップで、問題解決の手順を明らかにすること。

 

 

話は少し変わって、コンピューターはちょうど、4歳の子供とそっくりだなと思います。

4歳の子供は「掃除」をしなさいと言われても、何をするべきかピンと来なかったりします。

「木のおもちゃは木箱に入れて、人形はプラスチックケースに入れて」と具体的に分解すること(Decomposition)をやってあげると、理解してきちんと動けるようになります。

 

 

私と仕事どっちが大事なの問題

「仕事と家族」(または若い人にとっては「仕事と恋人」)という2つの優先順位の違う世界をいかに上手く過ごすかという問題はとても大事だ。

 

しかし難しいことに、この2つの価値基準はまったく異なっている。

 

仕事は、利己的。

仕事は、自分の生きがいとして重要。つまり自己実現や承認やらといった、自己肯定のために重要。世のため人のためと言うのは勝手だけれど、家族や恋人と比較すると、どうしても利己的なのだ。それぐらい家族が人にとって重いとも言える。

 

家族や恋人は、社交的。

家族や恋人は、一番近くの社会であり重要。人間は人と関わるからこそ人間であり、その最重要な要素は家族や恋人。

 

これらのバランスをとるために、最も大事なのはバランスを取ろうとすることだと思う。でも完全な50:50は難しいから、51:49ぐらいの比率をもってみるのが良い。

どっちが51かを決めるのは自分。

 

いずれにしても、このバランスを取ろうとすることは両方を高みに登らせる唯一の手段だと思う。

 

バランスというのは、多分それを見ようとすることから始まると思う。

 

自分たちらしい入社誓約書

入社誓約書って、結構会社のカラーが出ると思います。そこで自分たちらしい誓約書を作ってみようかと思います。

まずは僕だけの意見で作ってみて、社員さんたちと相談して更新しながら実際に使っていこうと思います。

 

【入社誓約書】

  1. 上機嫌で仕事をすることを心がけます。機嫌が悪いところを同僚や部下に見せないようにします。
  2. 育てることを仕事にします。対象はお客さんも仲間も自分もです。
  3. 任されたら責任を持ってやり抜きます。仲間には信頼して任せます。
  4. 責任を追求せず、問題を解決します。
  5. 怒ったり叱ったりしません。一緒に問題を解決します。
  6. 失敗をチェンスと考えます。失敗した人にも必ずもう一度チャンスを与えます。
  7. 自分で判断します。
  8. やばかったら助けを求めます。やばそうなら助けます。
  9. 時間や約束は守ります。
  10. 自分と家族と仲間の健康を何より大事にします。
  11. 依頼を受けて仕事をするのではなく、提案して仕事を作ります。
  12. 常に学びます。仕事とは関係ないことを学びます。
  13. 独立心を持ちます。会社に依存せず起業も視野にいれます。
  14. タバコは吸いません。
  15. 退職してからも仲良くします。

それでは。

3期目に向けて

代表取締役の山本です。
7月1日より、レベルエンターは3期目がスタートしています。

 

2期目は、山あり谷ありの1年でしたが、新しい戦力がふえ、仕事も着実に安定してきていて、いろいろと取引の幅も広がりました。
前期は多くの旧知の方々にたすけられました。特に、いろいろな元教え子さんたちが協力してくれているのが本当に心強く嬉しいです。苦しい時に助けてくださった方への恩返しはこれから自分たちの力をつけながら日々忘れずに取り組んで行きます。


新しく知り合えた方々とも、多くは数年来の仕事仲間のような気持ちになれる人ばかりでした。
「おかげさまで」という言葉が心から湧いて出てきます。

3期目はたくさんの希望があり、いまからワクワクしております。

 

弊社では「楽しみながら」「プログラミングを学ぶ」を突き詰めてきました。
・面白い・楽しいとはなんだ?
・プログラミングを学ぶことの意義は?

同じ面白いでも「興味深さ(interst)」と「楽しい(fun)」は異なります。

学びの面白さは、興味深さ(interst)が中心ではあると思います。

 

しかしながら、楽しい(fun)でなければ気持ちが動かされず、
内容が難しくなって来ると気持ちがついていかなくなってしまうのではないでしょうか。

だからまずは楽しさ一辺倒で良くて、やれることのパズルのピースがうまっていくとだんだんと興味が芽生えて来るという、流れが楽しく持続する学びなのではないかと考えています。

 

funをたくさん用意して、interstを掻き立てるところが、後押したいところです。

より興味深くなるような遊び方を教えること
より楽しくなるような遊び方を教えること。

これらのテーマを突き詰めていくことが我々のミッションの一つです。

 

まず小学生に教えることから始めています。
彼らに面白いと思ってもらえて、熱中してもらえて、力にしてもらえたなら
次のステップに導きます。

 

ちょうどいいステップが、初心者には多くは用意されていません。
または途中で急にハードルがあがってしまうステップしかありません。
それでは持続する楽しさは生まれないと思います。
適切なステップを作り出していくことをやっていきたいです。

 

コンピューターテクノロジーの世界は、これから世界そのものになっていくように思います。

コンピューターやそれらを中心とした様々なテクノロジーは、もはや自分たちの生活を取り巻く全てに関わってきています。
だからテクノロジーとの対話の方法を知ることは、とても意義深いと考えています。

 

自転車に乗れるように、やりたいと思った人、だれでもがプログラミングができるようになる世界。そういった世界の実現を目指したいと思います。

そしてその世界が実現したあとにみえてくるのは、テクノロジーで解決するための課題を見つけ出すこと。それも面白いんです。

 

自転車に乗れるようになったら、どこか遠くへ行きたくなりませんか?
隣町に繰り出したら世界が広がります。
プログラミングを学ぶと、そういう世界の広げ方ができます。

 

テクノロジーの世界は、加速度的に広がっていて、重要度がとてつもなく上がっている。だから、広い世界を旅できるように我々は、テクノロジーの世界の語学を教えたいのです。

面白い対象は、人それぞれ異なるでしょうけれど、世界が広がる体験は、とても面白いと思います。

 

「楽みながらプログラミングを学ぶことで、新しい可能性の入り口を開きます」

プログラミング学習で、本当に論理的思考が身につくか?

プログラミングを学ぶことでつく力ということで、「論理的思考」という言葉が使われることがあります。

 

でも論理的ってどういうことでしょうか。私は、はっきり定義をしらべたり教えてもらったりしたことはなく、なんとなく理解しているつもりになっていました。

 

教育の分野では、プログラミングで身につくのは「プログラミング的思考」だとされていますが、ますますよくわからないですね。

 

とりあえず、だれかがとってつけたプログラミング的思考についてはおいといて、「論理的思考」とは何なのかをきちんと自分の言葉にしたいと思います。

 

でも最初の1歩は、Wikipediaの力をかります。

 

論理学 - Wikipedia

ここでいう論理とは、思考形式及び法則である。これに加えて、思考のつながり、推理の仕方や論証のつながりを指す。よく言われる「論理的に話す、書く」という言葉は、つながりを明確にし、論証を過不足なく行うということである。

 

論理的であるというのは「論証」がキーになりそうですね。論証は「正しく説明が出来る」と言い換えてもよいのではないでしょうか。

論理の説明に「推理」も含まれますね。推理とは何でしょうか

 

すいり【推理】の意味 - goo国語辞書

既にある事実をもとにして、まだ知られていない事柄をおしはかること。

 

あてずっぽうの予測ではなく、実験結果や法則性、根拠のある資料などの事実をもとにして、考えるということですね。

 

つまり論理的であるということは、

事実(実験結果や法則性、資料など)を基に説明を過不足なくつなげられることであり、まだ知られていない事柄であっても事実を根拠に推し量って説明ができること

のようです。

 

論理的思考能力という言葉は、ヒトくくりになりすぎていそうですね。

私なりに分解してみます。

 

・事実を導き出す力

・事実を元に考える力

・説明する力

・過不足なく説明をつなげる力

・未知の事柄を、事実を根拠に推し量る力

 

こんなところでしょうか。

 

では、プログラミングで論理的思考は学べるのでしょうか。ひとつずつ考えてみます。

 

  • 事実を導き出す力

プログラミングでは資料や短いコードにより実験によって、そのコードはどのような動きをするべきかを確認しつ組み立てる必要があります。実験的に短いコードを実行してみたり、信憑性の高いドキュメントを確認する癖をつけられれば、「事実を導き出す力」は、プログラミングを学ぶ過程である程度は学べそうですね。

 

  • 事実を元に考える力

プログラミングでは「実現したいこと」は答えが示されているわけではなく、短いコードや機能の組み合わせで作り出します。実験結果やドキュメントの組み合わせを元にどうすれば求めるものが実現できるのか?を考えなくてはプログラミングはできないので、「事実を元に考える力」もプログラミングを学ぶ過程である程度は学べそうですね。

 

  • 説明する力

プログラミングそのものでは、説明する力は身につかないかもしれません。

作ったプログラムのプレゼンテーションなどによって身に着けたいですね。

 

  • 過不足なく説明をつなげる力

作ったプログラムのプレゼンテーションをする際に、論理の飛躍がないように気をつけられればよいのですが、プログラミングを学んだからといって、過不足なく説明がつなげられるとは限りませんね。説明を過不足なくつなげるには、説明をしてみて反応のフィードバックをえることや、そもそも国語の作文などを学ぶ方が近道かもしれません。

 

  • 未知の事柄を、事実を根拠に推し量る力

プログラミングの作業中は作ったもののバグや問題が次々と発生します。それらは学ぶ人にとってはすべてが未知の事項であることでしょう。バグや問題を解決するとき、事実を元に試行錯誤していきますが、当てずっぽうからだんだんと根拠を元に推し測っていけるようになっていきます。「未知の事柄を事実を根拠に推し量る力」は、プログラミングを学ぶことで一番学べそうな領域かなと思います。 

 

それにしても、単にプログラミングが出来るようになるまで学んでも、上記のような論理的な思考が学び取れるかどうかは学び方次第といえそうです。

 

レベルエンターで行っている教育も、現時点では「プログラミングを学んで論理的思考が身につく」とはいえないので、ここを強化したいと思います。

プログラミング学習では上手な試行錯誤の仕方が学べる

子供向けのプログラミング教育では、上手な試行錯誤の仕方が学べると良いと思います。以下の記事にある内容に一部同意しつつインスパイアされて書いています。

itpro.nikkeibp.co.jp

 

上手な試行錯誤を促すには、どのようなカリキュラムが良いかを考えながら、日々3歳の我が娘と遊んでいます。

 

彼女はレゴブロックで遊ぶのが大好きですが勝手に試行錯誤していろんなものを作り出しています。

最初は、こんな形作れる?というように親が例をみせてそれを作ってもらっていたのですが、なんだかそれで作れるようになったとは思えません。

課題提示型の教育では、あまり効果がなかったと言えます。

 

一緒に遊ぶときに「できあがったものを見せる」という行為に、すごくやる気が出てきているように思います。 

できるようになったことを、褒める。誰かと比べずに、そのこの成長を褒めるということかなと思います。