ひらめの日常

日常のメモをつらつらと

『教育効果を可視化する学習科学』を読んだ ー 第2部 学びの基礎

前回分はこちら。

hiramekun.hatenablog.com

個人的に面白いと思った内容が多いので、今回の前半は特に分量が多めになっています。

勉強会を開催して読んでいます。参加したい方は是非一緒に読破しましょう!

connpass.com

要約

第13章 いかにして知識は獲得されるのか?

知識獲得の6つの原理

  1. 学習には時間と努力と動機が必要である。
    • 具体的には、時間、目標の設定、支援的なフィードバック、成功体験の蓄積、頻繁に復習することが必要になる。
  2. 集中できる時間は短い。
    • おおよそ15分-20分しか集中力は保てない。誰かに新しい情報を教える必要があるなら、15分以内に行う必要がある。
  3. 分散型の練習は、集中型の練習や詰め込みよりも効果がある
  4. 先行知識の影響は強固である。
    • 先行知識の影響は、IQなどよりもはっきりと優っている。
    • 優れた教師は、私たちが何を学ぶべきかについて、最初に見通しを示してくれる。これにより、先行知識を活発化させ、新しい情報を効率的に獲得することができる。
  5. 知性はマルチメディアのインプットによく反応する。
    • 人間はより多くのメディアを用いて伝えられると、より学習できる
    • 全ての生徒は、言葉とともに関連するイメージを通して最も良く学習する。
  6. 学ぶ時には知性を活発にしなければならない。
    • 受け身ではなく、活発な状態にある必要がある。

記憶保持の6つの原理

  1. 識別するのは簡単だが、想起するのは大変である。
    • (イメージ)選択式問題は簡単だが、記述式問題は難しい。
  2. 最初と最後に与えられた情報は想起しやすい。
    • 初頭効果親近効果
  3. 時間が経つにつれた忘却の程度はまちまちである。
    • 何をどのように学習したかによって、忘却の程度は異なっている。
  4. 記憶とは高次の構成的過程である。
    • 部分的な手がかりや曖昧な情報であっても、脳が意味が通るようにしてくれている。
    • 人間の脳による解釈が、記憶に影響を与えている
  5. 保存の原理:忘れられたことはまだ役立つ。
    • 完全に忘れた内容でも、また学ぶ時、無意識に素早く学ぶことができることが研究によって示されている。
  6. 記憶は干渉に左右される。
    • 逆向干渉順向干渉
    • 先行知識は一般的には学習を助けてくれるが、先行知識が誤りであった場合などは、順向干渉の原因となってしまう。

情報過多に対処する5つの側面

  1. 学習者の視点からすると学習は常に楽しい経験とは限らない。
    • 一般的には、学習は個人に満足感をもたらす。しかし、その満足感は、(1)最初に計画と目標を設定する(2)計画された目標に到達している、時に抱く感情である。大部分において、今行っている学習は楽しいものではない。
    • 生徒の多くは、この満足感に引っ張られて、「実際よりもよく技能を習得できる」「習得するのにより短い時間と努力でできる」と自信過剰に陥ってしまう
    • こうした自信過剰の状態は、適切なフィードバックによって修正することができる。
  2. 学習は精神的に大きなストレスを引き起こす。
  3. どの学習者も過負荷に対応する方略を編み出すことが重要。
  4. 過負荷の要因は特定することができる。
  5. 誰もが過負荷によって支配されている。

多重貯蔵理論

  • 感覚の認識入力を一瞬だけ保持している記憶の種類である、映像的記憶。
  • 一度に保持できる量が限定されており、すぐにシステムから消失してしまう、短期記憶 あるいは 作業記憶。
  • 永続的に情報を保持するが、このシステムに移すのが困難であり、記憶へアクセスする方略が必要になる、長期記憶。

第14章 どのようにして知識は定着しているのか

今までの章で見てきたように、前提知識は、次にどのような知識を習得できるかや、どのようにして思考するかを決定する。ここでは知識というものがどのようにして貯蔵されているかを見ていく。

大きく分けて、知識には二つの種類がある。(詳しくは原著のp127参照。)

  • 宣言的知識:単語や文章で表される知識で、細かく次の5つに分類される。
    • 知覚的認識:知覚したものの区別ができること。一回区別ができるようになると、その知覚をやめることはできなくなる。
    • 文字列:シーケンシャルに並んだ簡単な文字や情報を意味づけること。集中した状態での反復練習によって獲得できる。
    • 着想:主語と述語からなる、複数の文章(命題と呼ばれる)を通して、それらをまとめて一つの実体に結びつけること。前提知識に対して新しい知識が関連づくと、着想を獲得できる。
    • スキーマ:分断している知識を当てはめて、既存の自分の思考しうる範囲を超えて思考することができるフレームワークのようなもの。このスキーマは洗練されていく必要があり、簡単に取得できるものではなく、全く同じではない事柄について、どのようにして統一したフレームワークを作るか試行錯誤を重ねて獲得される。
    • メンタルモデル:獲得したスキーマたちを用いて、問題を解決すること。メンタルモデルは仮説思考を可能にする。しかし、これは各々が活用できるスキーマと着想に依存している。さらには、(a) 正しい知識と、(b) その知識がワーキングメモリで簡単に扱えるかどうかにも非常に強く依存している。メンタルモデルは、抽象的な概念を説明できる優秀な個々とのやりとりによって獲得につながることが判明している。
  • 手続き知識:動作を通して指標づけられる知識。どの状態でどの知識を用いるか、これを条件反射的に判断している。この知識を身につけるのに言葉は必須ではない。

第15章 学習は意識的に行われる必要があるのか。そしてジェスチャーに隠されたその役割とは。

(まとめとしては原著p143を読めば良い)

暗黙的な学習とは

学習は、必ずしも意識的に行われるわけではない。脳は私たちが自覚しているよりも多くの情報を実際に受容している。このような情報による学習のことを暗黙的学習 と呼ぶ。

暗黙的学習は、どんな時でも行われている。例えば、条件反射は意識しないで条件付けが学習された結果のものである。より一般的には、言葉や考えで簡単には説明できない学習体系のことは暗黙的学習となる。具体的には以下のような実験がある。

  • あるルールに従った文字列を提示したところ、そのルールを明確には説明できないが、なんとなく次に来る文字を当てられるようになった。
  • 被験者がアバターとジャンケンをする際、アバターは各手を出す前に微妙な態度の変化を表すようにした。被験者は明確な理由は説明できないのに、ジャンケンで44%の確率で勝てるようになった(全くランダムなら33%)。

重要なことは、学習結果は(学習者が明示的に表現できる)言語的な形で表現されるのではないという点である。

ジェスチャーの役割

ジェスチャーを通じて、暗黙的学習によって得た知識を用いることができる。ジェスチャーは暗黙的知識を評価し、それを向上させ、さらに新しい場面で用いることに効果を発揮する。生徒たちがジェスチャーを用いている時、彼らは自身の話している内容をより深いレベルで捉えようとしており、さらに学業のパフォーマンスも向上する可能性がある

さらにジェスチャーは、私たちの思考過程に対して良い影響を及ぼすことが確実である。考えている時にジェスチャーを用いることは認知負荷を軽減させ、思考能力や問題解決能力を向上させることができる。

重要なことは、知識は単語として明示的に表現される前に、ジェスチャーを用いて表現することができるという事実である。

このようにジェスチャーは重要な役割を果たしているが、子供も大人のジェスチャーに強く影響を受けている。実際の教室でも、生徒は教師のジェスチャーから知識を得ようとしているのである。

第16章 認知負荷の影響

認知負荷の研究は、教育者にとっては非常に重要な分野である。それはなぜなら、認知負荷の研究は以下のような二つの側面があるから。

  1. なぜ人間にとって学習が難しいのかという問題を扱っていること
  2. 生徒が比較的容易に新しい情報を学習し覚えることができるようになるために、教師がどのようなことをしているかを明確に説明していること

人間の認知構造

まず認知負荷理論は、人間の認知構造を明らかにするところから始まる。その中で特に自分が興味深かったものをいくつか取りあげる。

  • 長期記憶から取り出された情報を処理するとき、作業記憶に限界はない。
  • したがって、長期記憶は作業記憶内での出来事の内容や質の両方に大きな影響を与える
  • 専門的知識は、学習者が簡単なアイデアをより複雑なスキーマに注意深く組み合わせることで発達する。
  • 発達する複雑なスキーマによって知識は整理されていき、作業記憶の負荷が劇的に軽減されるスキーマは作業記憶内の単一の要素として簡単に処理できるからである。

長期記憶や知識の再構成が作業記憶に対して大きな影響を与えていることがわかる。このように知識が自動化され、実質的な労力をかけないで素早く知識にアクセスできるようになると、作業記憶システムは自発運動化の段階に達する。

認知負荷の原因

作業記憶は、新しい情報や整理されていない情報が、特に複数与えられると摩耗してしまう。与えられた情報は相互作用し、干渉し合う。さらにその干渉は与えられた情報に対して組み合わせ爆発的に増加していくため、少しの個数の増加が大きな認知負荷を生み出す。

認知負荷の原因には、「内在的な認知負荷」と「外来的な認知負荷」の2種類が存在している。

  1. 内在的な認知負荷は、与えられた課題自体の性質によって定まる。この認知負荷の主な決定要因は、個人の先行知識である。先行知識があれば、与えられた課題に対する認知負荷は軽減される。
  2. 外来的な認知負荷は、学習条件や教育的文脈によって課せられる負荷のこと。これは学習に集中することを阻害する要因のため、取り除かれることが望ましい。具体的には、必要のない情報を過剰に与えたり、生徒に不必要な要求を同時に課したりすること。特に学習が難しくなるにつれて、外来的な認知負荷の影響が大きくなる。

どのようにして認知負荷を減らすか

生徒の学びを助けるためにどのようにすれば認知負荷を減らすことができるか研究がなされてきた。結論の一つとして、未熟な学習者にとって、事前指導を受けることは価値がある。まさに反転授業が成功する理由の一つとされている。

しかし、これは知識のある人々を教える際には全く効果的ではなく時間の浪費となることには注意が必要。

問題を解くことによる学習の問題点

知識スキーマを教えようとする場合、問題を解くことは効果的な方法として成功しそうにないということが明らかになっている。問題を解くことによって学習することは、状況が単純化されているか、情報間の相互作用のレベルが低い場合、もしくは概念が十分に理解されている場合に実行可能になる。これはつまり、問題を解くことによる学習は、学習する教材が極めて単純な場合にのみ有効だということ。

一方で、グループで問題を解く活動を行わせた場合、効果的な指導ツールになることも示唆されている。一般的に一人だと負荷が高くなりがちだが、グループメンバー間で作業記憶の機能を共有することにより、認知負荷を分け合うことができる可能性があるとされている。

第17章 記憶力はどのように伸ばせるか?

人生の最初の頃を思い出すのはめったいないことで、これは 幼児期健忘 と呼ばれている。この時点では多くのことを学習しているが、ほんのわずかしかのちの人生においてはっきりと記憶することはできない。3歳頃から、特定の記憶を思い出すことができる言語と記憶のシステムが発達する。この頃から、豊かな会話が子供の記憶システムの発達において劇的な役割を果たすことがわかっている。共に出来事を思い出すように話しかけるようなスタイルを 回想スタイル と呼ぶ。質の高い言語を利用して子供が過去の出来事を理解できるように支援することができる。

学校に通う子供たちは、通わない子供たちと比べて認知スキルにおける様々な面で大きく異なることがわかっている。特に学校に通うと、生徒の認識、言語スキル、知識を蓄えるシステムを組織する方法が劇的に変わる。例として、年齢が上がるにつれて子供たちは新しい情報を覚えようとするとき、長期記憶のシステムを効果的に使用し、知識を体制化する。

さて、学校では教師は記憶スキルを教えているのだろうかというと、先生によりまちまちであるということが、以下のようないくつかの研究結果から分かっている。

  • 記憶方略の指示は、時間の2%で発生していた。
  • 教師の10%は、その方略について直接的な指示を全くしていなかった。
  • 記憶方略を直接指示した教師は5%だったが、50%がある程度の記憶作業を要するものだった。

そのほかにも、記憶術を教えることに長けた教師と、そうでない教師がいることも分かっている。

  • 記憶術を高いレベルで教える教師(high mnemonic teachers: HMT)は、学習に適した方法を直接指示したり、特定の方法がなぜ効果的なのかを尋ねたりした。
    • HMTからの学習の効果は、基本スキルのテストが低い得点で学校に登校し始めた生徒の場合に特に顕著であった
  • 記憶術を低いレベルで教える教師(low mnemonic teachers: LMT)は、知的方略に焦点を当てることが少なく、学習プロセス自体より、基本的な質問をする傾向があった。

第18章 スポーツであり、技術であり、教育的ツールでもある記憶術

記憶術には様々な側面があり、この章ではスポーツとして取り上げられるような「記憶のアスリート」について取り上げている。より多くのスキルを習得するにつれて、作業記憶内により多くを保存する能力が生まれる。しかしこのような人たちは、記憶すること自体を目標としているため、高度なスキルを習得する助けになるわけではない。

このような記憶術が教育の観点に持ってきたときに一番問題になるのは、本質的には役に立たない記憶術に対して時間を費やす点だ。優れた記憶のコツを使うことは、記憶している内容自体への理解を増やすわけではない。暗記のための明確で便利なテクニックは、積極的に教えるべきではある。ただし過信は厳禁だ。あくまでも低いレベルの表面的な知識を学ぶことに対してのみであり、深い側面の知識を高めることには役立たないことに留意しておこなう必要があるだろう。

第19章 生徒の学習スタイルの分析

俗に VAKモデル というものが存在している。これは、人は生まれながらにして持っている情報処理のためのシステムによって、3つのうちいずれかに分類されるという主張である。

  • 視覚学習者(visual learners)
  • 聴覚学習者(auditory learners)
  • 運動感覚学習者(kinaesthetic learners)

しかし、研究結果を見ていくと、「生徒たちの学習スタイルを知ってそれを分析して教える方が、知らずに教えるよりうまくいく」ことを示唆するエビデンスは何も見つかっていない。これは、人には得意とする情報入力方法があるはずだという主張が背景にあるが、神経学的に見ても、行動を見ても、こうした分類の妥当性を示す結果は得られていない。強いていうのならば、学習スタイルのようなものは自己申告によるものであり、表面的に観察される好みのようなもの以外に判断の妥当性は示されていない。

第20章 大きく誤解されている複数タスクの同時進行

人間は往々にして複数タスク(俗にいうマルチタスク)を同時進行できると考えている。しかし、これまでの研究結果を見るとそれは否定される

複数タスクの同時進行という言葉自体は、以下のいずれかを表している。

  1. 頭の中で2つ以上の仕事を同時にこなすこと
  2. 複数の仕事を切り替えて行いながら一定時間内に複数の目標を達成すること
  3. 1つの重要な目標を目指しながら、時々他の仕事をやること
  4. メールチェックなどをしながら、大したことのない用事に意識的に時間を使って取り組むこと

2つの信号が同時に入ってきた場合、人間の注意はどちらか一方に引き付けられるため、二つ以上の仕事を同時にこなすことはできないことがわかっている。また、複数タスクを効果的に同時進行する際、1つ目の目標や課題を遂行するには学習と思考が必要となるのに対し、もう一つはすでに学習済みの活動であるということが重要となる。同時に異なるものを学ぼうとすると、干渉が起きてしまい、学習が阻害される。

さらには以下のような厳しい言葉で複数タスクをこなせると主張する人を批判している。

複数のタスクをこなせると主張する人は現実を見ておらず自分の実力を過信している。未完成の仕事を次々に切り替えて取り組んでいる人たちは、全体的に効率が下がっていることにも気づけないほど低いレベルのメタ認知判断力とともに、自分の軽率さを露呈している。

その一方で、退屈だが注意力の必要な仕事にずっと取り組んでいると、疲労が出てきて仕事の効率は下がる。これはヴィジランスの低下と呼ばれている。なので、このような状況では、時々他の仕事に切り替えることで注意力低下の影響を軽減することができる。

第21章 学習者は本当に情報機器を使いこなしているのか?

デジタルネイティブという言葉が出てきて久しいが、デジタルネイティブというのはいささか誇張されがちである。

デジタルネイティブであろうと、それはただ単に生徒たちが最新の技術や機器に慣れているだけであり、人間が本来持っている能力が変わっているわけではない。

コンピュータを利用すること自体は、現代社会で生徒の役に立っていることがわかっている。しかし、あくまでもコンピュータは教師ではなく、コンピュータが可能にするのは、人間の教師が異なる媒体を使い、異なるやり方で指導案を立案し人間を指導することを可能にすることだけである。

第22章 インターネットは私たちを浅薄な思考の持ち主にしているか?

インターネットが普及してきて、生徒が強化の内容を正しく理解できていないのに、それを誤魔化すかのようにインターネットを使用するかもしれない問題がある。

「インターネットは私たちに数分の検索で得た情報の寄せ集めという形で知識を獲得させようとしているのだ」という主張まで出てきている。しかし、インターネットの使用そのものが認知能力の劣化を起こすことを裏付けた研究は存在しない。情報のインプット方法は人間の理解を決定するのに特に重要ではないことに気づくべきだ。考えたり学んだりするやり方は、近年開発されたテクノロジーよりも、幼少期から出会った言語や人間関係、本質的な文化に負うところがずっと大きい。教師は、現代のコンピュータの能力を上手に付き合うことで、教材を今の生徒たちにとってより意味のあるものにできる。

第23章 音楽はどのように学習に作用するのか?

音楽は、人間の生活の中に最も浸透している側面の一つである。昔からモーツァルト効果のように音楽と学習の関係性は議論に上がってきた。ここでは3つの観点について見解を述べる。

  • BGMの効果はなんだろう
    • 音楽以外の作業を行なっているときに、BGMのあるとなしとでは学習との間になんの関係性も見られない。
    • 一方で、音楽は場の雰囲気を変えるのに利用される。音楽を聴くことでやる気を起こさせることができる。
  • 音楽を聴くことは脳に影響するのか。音楽を聴くことで学習や成績は上がるのか
    • モーツァルト効果のようなものは、調査されているがいまだに証明されていない。クラシック音楽を聴くことは注意を喚起し覚醒させることに役立つが、知能を高めること自体はないと証明されている。
    • コーヒーを飲むことで同様の効果が得られることが示唆されている。
  • 音楽指導は音楽以外の分野を学ぶ場合にも効果があるのか
    • 音楽の練習が他の分野の学習を助ける側面があるのは心理学的に理にかなっている。(努力、自己制御、メタ認知t系観察、知的方略といった観点。)
    • 音楽に関するプログラムに参加した子供たちは、他の子供達に比べて語彙テストと抑制制御テスト(将来得られる利益のために我慢するテスト)の二つでかなり高い得点を達成した。
    • 音楽の練習は生徒にとって認知的効果があるというエビデンスが集まってきている

Scalaで競技プログラミング: 標準入力周りで調べたこと

複数変数の初期化

例えば、1 2 3のように空白区切りで3つの標準入力を受け取るために、次のようなコードをよく書きます。

val sc = new Scanner(System.in)
val v, e, r = sc.nextInt()

これは左辺の変数の個数分、右辺の式が評価されているようです。(公式ドキュメントが見当たらないので、探しています...)

scala> val a, b, c = 1
val a: Int = 1
val b: Int = 1
val c: Int = 1

scala> val a, b, c = util.Random.nextInt()
val a: Int = 2127446030
val b: Int = 1199584050
val c: Int = 638157382

これは ScannernextInt() を使うことによって実現できるのですが、Scalascala.io.StdIn.readInt() ではできません。

Scanner (Java Platform SE 8)

Scala Standard Library 2.13.3 - scala.io.StdIn

なぜかというと、ScalareadInt() は「readLine() した結果に対して toInt を呼び出している」だけだからです。なので空白区切りの入力に対しては readLine().split(" ").map(_.toInt) のように文字列を分割する処理を入れなければいけません。readInt() の内部実装は以下の通りです。

/** Reads an int value from an entire line of the default input.
 *
 *  @return the Int that was read
 *  @throws java.io.EOFException if the end of the
 *  input stream has been reached.
 *  @throws java.lang.NumberFormatException if the value couldn't be converted to an Int
 */
def readInt(): Int = {
  val s = readLine()
  if (s == null)
    throw new java.io.EOFException("Console has reached end of input")
  else
    s.toInt
}

複数行の読み込み

この記事を参考にしました。

qiita.com

AOJなどでは、行数が与えられずに、「与えられた行数分処理しなさい」という問題があります。行数が与えられればその数だけループ回せば良いのですが、そうではないので困ってしまいますね。(例えばこの問題などです:Aizu Online Judge

その際はio.Source.stdin.getLines() を呼び出すことで、次の入力がある限りは読み込み続けてくれます。

Scala Standard Library 2.13.3 - scala.io.Source

for (l <- io.Source.stdin.getLines()) {
  val arr = l.split(" ").map(_.toInt)
  ...
}

Array.fill

サイズnの入力を受け取り、配列として初期化する際に、次のようなコードをよく書きます。

val a = Array.fill(n)(sc.nextInt())

これでn回の入力を受け取っているのですが、これは Array.fill の第二引数が名前渡し引数(call-by-name)になっているからです。そのおかげで、第二引数がn回呼び出されることになり、意図した挙動になります。

Scala Standard Library 2.12.4 - scala.Array

By-name Parameters | Tour of Scala | Scala Documentation

By-name parameters are evaluated every time they are used. They won’t be evaluated at all if they are unused. This is similar to replacing the by-name parameters with the passed expressions.

Array.fill の内部実装は以下の通りです。

  /** Returns an array that contains the results of some element computation a number
   *  of times.
   *
   *  Note that this means that `elem` is computed a total of n times:
   *  {{{
   * scala> Array.fill(3){ math.random }
   * res3: Array[Double] = Array(0.365461167592537, 1.550395944913685E-4, 0.7907242137333306)
   *  }}}
   *
   *  @param   n  the number of elements desired
   *  @param   elem the element computation
   *  @return an Array of size n, where each element contains the result of computing
   *  `elem`.
   */
  def fill[T: ClassTag](n: Int)(elem: => T): Array[T] = {
    if (n <= 0) {
      empty[T]
    } else {
      val array = new Array[T](n)
      var i = 0
      while (i < n) {
        array(i) = elem
        i += 1
      }
      array
    }
  }

コメントや例が書いてあり、丁寧だと感じました。

Note that this means that elem is computed a total of n times

Scalaで競技プログラミング: ダイクストラ法

C++で書いたライブラリをScalaで書き直しています。ダイクストラ法全体として以下のようなコードになりました。

case class Edge(to: Int, w: Long)

case class Graph(n: Int) {
  val g: Array[Array[Edge]] = Array.fill(n)(Array.empty)

  def push(from: Int, edge: Edge): Unit = {
    g(from) :+= edge
  }

  def dijkstra(start: Int, Inf: Long = 1e18.toLong): Array[Long] = {
    val d = Array.fill(n)(Inf)
    d(start) = 0
    val queue = mutable.PriorityQueue.empty[(Long, Int)](Ordering.Tuple2[Long, Int].reverse)
    queue.enqueue((0, start))

    while (queue.nonEmpty) {
      val (minCost, minV) = queue.dequeue()
      if (d(minV) >= minCost) {
        g(minV).foreach { e =>
          if (d(e.to) > d(minV) + e.w) {
            d(e.to) = d(minV) + e.w
            queue.enqueue((d(e.to), e.to))
          }
        }
      }
    }
    d
  }
}

今回の主な新情報は PriorityQueue についての以下の行です。

 val queue = mutable.PriorityQueue.empty[(Long, Int)](Ordering.Tuple2[Long, Int].reverse)

Scala Standard Library 2.12.0 - scala.collection.mutable.PriorityQueue

元々ScalaPriorityQueue は降順で管理されています。今回は、(コスト: Long, 頂点id: Int) というタプルを PriorityQueue で管理します。その際は以下のように順序が規定されています。最初に第一要素を比べ、同じだったら第二要素を比べます。

def compare(x: (T1, T2), y: (T1, T2)): Int = {
  val compare1 = ord1.compare(x._1, y._1)
  if (compare1 != 0) return compare1
  ord2.compare(x._2, y._2)
}

ダイクストラで用いる際には、ある頂点までのコストが軽い順に並べ替えられていた方が嬉しいので、昇順になっている必要があります。そこで、 Ordering を引数に与えることで、並べ替えの順序を指定してあげます。降順の逆の昇順に並べたいので、Ordering.Tuple2[Long, Int].reverse を指定することになります。

他にも dequeue がpopするだけでなく要素も返すところは C++ と異なりますね。(むしろ返す方が自然だとは思いますが...)

AOJの問題でverifyしました。入出力含めた全てのコードはこちらをご覧ください。

github.com

JetBrainsのIDEを使うならSettings Repositoryを活用しよう

JetBranisのIDEの設定を、IDE間で共通化したい...!と思った人向けの記事です。 結論としてはこれを読めば解決する話ではあるのですが。 pleiades.io

JetBrainsのIDEって使いやすくて高機能で便利ですよね。自分はこれなしでは開発できない体になってしまいました。社会人は一部無料で、学生であればなんと全て無料で使うことができます。すごいですね

blog.jetbrains.com

こうしてJetBrainsの恩恵に授かっていると、ScalaIntelliJで、C++はCLionで、iOSはAppCodeで...のように複数のIDEを使い分けることになります。こうなったときに毎回設定を0からやるのは非常に面倒ですよね。以前自分は設定ファイルをexportして、それを他のIDEで取り込むことをやってました。そうなると、一つのIDEでキーマップを更新すると他が追従せずに混乱したり、会社のPCで新たに設定した項目が私用のPCには反映されていなかったりして大変です。

そこで冒頭に添付した記事を参考にしてSettings Repositoryを使いましょう。

pleiades.io

これを使えば、GitHub上に設定ファイルをまとめておき、全てのIDEはそこを一箇所参照することで同期的に設定を管理することができます。もう「あっちでは設定してあるのに、もう片方のIDEでは設定してないよ...」といったことは起きないのです。

快適なJetBrainsライフを送りましょう〜〜

Scala: Ordered[T] と Ordering[T] の違い

結論

  • Ordered[T] は自身に継承し、比較可能にする
  • Ordering[T] は自身を変えることなく、外側から変換を提供する

gist.github.com

Ordered[T]

例えば、単純に比較するだけのクラスを作る。このクラスは Ordered[T] を継承していて、compareメソッドを実装する必要がある。

参考: Scala Standard Library 2.13.5 - scala.math.Ordered

case class MyOrderedNum(value: Int) extends Ordered[MyOrderedNum] {
  override def compare(that: MyOrderedNum): Int = {
    if (this.value < that.value) -1
    else if (that.value < this.value) 1
    else 0
  }
}

こんな感じで呼び出せる。

assert(MyOrderedNum(10) > MyOrderedNum(2)) // => success!

Ordering[T]

implicitなパラメータとして Ordering[T] を与えている。クラスの外側で Ordering[T] の実装を提供することで、比較ができるようになる。この方法だと、クラス自体を変えることなく、外側から実装を追加することができる。

参考: Scala Standard Library 2.13.5 - scala.math.Ordering

ScalaInt, String などもこちらの方法を用いて比較可能にされている。これは、Int のようなプリミティブなクラスに関しては AnyVal を継承しているだけに留めたく、他のクラスを継承したくないという思想があるらしい。

参考: scala - Why does Int not inherit/extend from Ordered[Int] - Stack Overflow

case class MyOrderingNum(value: Int)(implicit ord: Ordering[MyOrderingNum]) {
  def >(that: MyOrderingNum): Boolean = ord.compare(this, that) > 0
}

implicit object MyOrdering extends Ordering[MyOrderingNum] {
  override def compare(x: MyOrderingNum, y: MyOrderingNum): Int = {
    if (x.value < y.value) -1
    else if (y.value < x.value) 1
    else 0
  }
}

こんな感じで呼び出せる。

assert(MyOrderingNum(10) > MyOrderingNum(2)) // => success!

Appendix

Numeric[T]Ordering[T] を継承していて、他にも四則演算をサポートしている。

trait Numeric[T] extends Ordering[T]

参考: Scala Standard Library 2.13.5 - scala.math.Numeric

参考

kmizu.hatenablog.com

masayuki038.github.io

3ヶ月でやった事を振り返る - 入社1年目1~3月

はじめに

3ヶ月ごとに何をやったか、社内・社外関係なくブログにまとめていきたいと思います。今回は年度の最後の3ヶ月です。新卒一年目の終わりということでなんだか感慨深いですね。

これまでの記事はこちら

hiramekun.hatenablog.com

hiramekun.hatenablog.com

hiramekun.hatenablog.com

お仕事

この3ヶ月は、主に不具合への対応や、暗黙知になっている部分のドキュメンテーションなどを行っていました。友人がプレゼントしてくれた 日本語スタイルガイド(第3版)技術者のためのテクニカルライティング入門講座 を読んで、その内容を社内向けに発表をしました。一回このようなテクニカルライティングに関する本を読むと、文章を書く時に立ち止まって意識することが増えて良いですね。まだ全然改善する余地のある文章を書いているので、日々意識して少しづつ良い文章が書けるようになっていければと思います。

社内で学習心理学の勉強会もやっています。グラフィック学習心理学―行動と認知 (Graphic text book) という本を読んでいます。教育学の基礎的な内容ですが、輪読することで理解が深まり、他の人と読むことで継続するのでとても良い時間だと感じています。

Scalaでいうと、モナドトランスフォーマーを少し使っています。OptionTEitherTなどですね。しかし、正直なところ「モナドがなんであるか」について何もわかっていないので、どこかのタイミングで時間を取らなければいけないと感じています。

お勉強

たくさん本を読みました。

教育関連

この本は分厚くて読み切るのが大変そうだったので、ゆるく読書会を開催して読み進めています。毎回2〜3人に参加していただいています。初めての試みだったのですが、読み続けるモチベーションが湧いて良いと思います。他の本でも一緒に読み進める人を作っていくことをやっていきたいです。

hiramekun.hatenablog.com

教育効果に関するエビデンスをまとめてある本で非常に面白いです。こちらから読書会参加者募集中です〜!

connpass.com

他には、学校の最前線に立つ先生方がどのような状態にあるのか知りたいと思ってこの本を読んだり、

hiramekun.hatenablog.com

hiramekun.hatenablog.com

自分にとって大きなテーマである「教育格差」について勉強したいと思って、社会的階層と学力の階層がどのように生じているか。またそれがどのように変化してきているかについて学んだりしました。

hiramekun.hatenablog.com

Scala関連

Scala関連でいうと実務で使っている技術を深いレベルで腰を据えて勉強したいという思いが強くありました。そこで、この3ヶ月では、Akkaとsbtの勉強をしました。

hiramekun.hatenablog.com

hiramekun.hatenablog.com

sbtに関しては、そのビルドが自動で並列化されていたり、インタラクティブなconsoleがどれほど便利なのかを知るなどしました。少し古い本でもあったので、より新しい本が(できれば日本語で)出版されないかなーと待ち望んでいます。

sbt in Action: The simple Scala build tool

sbt in Action: The simple Scala build tool

エンジアリング前半

まずは、ドキュメンテーションをするにあたってどのように文章を書くのが良いかを学びました。テクニカルライティングと呼ばれる技術で、「ライティング技術はセンスではなく身につけることができる」という言葉が心強かったです。

hiramekun.hatenablog.com

hiramekun.hatenablog.com

また、「エンジニアリングの組織づくりについて興味があるなら読むと良いよ」会社の先輩におすすめされた「エンジニアリング組織論への招待」を読みました。責任と権限についてどう捉えて、組織としてどのように対処していくかや、メンタリングで意識することなどが印象に残りました。

hiramekun.hatenablog.com

統計検定を受けたいなーと思っているので、その基礎的な線形代数の復習をしました。個人的には視覚的にイメージを持ちやすく、数式のお気持ちも知ることができて良い本と巡り合えたなと思います。このシリーズの「プログラミングのための確率統計」も読み進めています。

hiramekun.hatenablog.com

SQL関連も勉強をしました。2冊目は友人におすすめされた本ですが、「SQLは面白いよ!」というプッシュを受けて読んでみました。SQLの背後にある思想や、その思想がどのように SQLの文法や挙動に関係してくるかを知ることができて、技術書としても読み物としても面白かったです。2冊目を読んでいく中で、SQLに対する理解が浅いところがあったので、1冊目に戻って基礎的なところを復習したりしてました。

DockerやKubernetesは仕事で使ってはいるものの、背後でどのような物が動いているのかについて全く知識を持っていなかったので、この本を読みました。結局のところDockerはLinuxの仕組みを使って成り立っているのですが、実際にシステムコールを触ってどう動くのかを見てみたいと思いました。Kubernetesに関してはもう少し実務で触れてからの方が実感を持って読み進められそうだと感じました。

趣味

スマブラ

スマブラではスマメイトでレート1700を達成することができました。とは言っても上振れを引いただけなので、コンスタントに1700行けるようになりたいですね。ホムラとヒカリが参戦して、少し触っているのですが、全然勝てません。。。メインキャラ以外使えないのは恥ずかしいので、きちんとスマブラ力を鍛えていこうと思います。

カメラ

あまり遠出しての写真は撮れていないですね。これは以前撮った桜です。いろいろと忙しくて、今年は桜を撮りにいく前に散ってしまったなあと悲しくなっています。

『教育効果を可視化する学習科学』を読んだ ー 第1部 学級内での学び

はじめに

『教育効果を可視化する学習科学』を読みました。3部に分かれているので、3回に分けてブログにまとめます。

この本は、教育効果につながる様々な科学的知見や論文をまとめている本です。元々『教育の効果』という本で、学力に影響を与える要因を比較して論じ、話題になっていました。

教育の効果: メタ分析による学力に影響を与える要因の効果の可視化

正直和訳が難解な箇所が多いので、7章あたりから原著の『Visible Learning and the Science of How We Learn』を読んでいます。(和訳をGoogle翻訳に入れて英語に直して、また日本語に直すなどしていたので...。)

Visible Learning and the Science of How We Learn

Visible Learning and the Science of How We Learn

  • 作者:Hattie, John
  • 発売日: 2013/09/27
  • メディア: ペーパーバック

勉強会を開催して読んでいます。参加したい方は是非一緒に読破しましょう! connpass.com

※2020/04/11追記 まとめスライドを作りました!こちらの方が読みやすいかもしれません

www.slideshare.net

要約

第1章 なぜ生徒は学校で学ぶことが好きではないのか?

生徒は学校があまり好きではない。なぜそのような結果が得られるかを説明する。

元来人間は「新たに思考する」ことよりも「蓄えられた記憶から引っ張り出す」ことを優先する。「新たに思考する」ことは苦労を伴うため、「新たに思考する努力」が必要になるが、努力するには「達成できるかもしれない」という自己効力感が必要になる。さらに、「達成できるかもしれない」と感じるためには、新たに学ぶ内容に対して、自分が少しでも内容を知っていることが重要になる。

最終的に生徒は、生徒が知っていることと教師が生徒に知ってほしいことに隔たりがあると、好奇心が湧いて来ずに楽しいと思えない状態に陥る。

第2章 知識は教えることの障壁になるのか?

教え方の観点からみると、「知識に詳しい熟達者になっていても、教えることが上手とは限らない」。 しかし、生徒のモチベーションの観点からみると、「生徒は先生が熟達者のように博識な人の方が、多くを学ぼうとする」。

熟達者にまつわる諸事実

  1. 熟達者は初心者にとっての課題の難しさを過小評価してしまう。
    • 特に、人は技術を習得したのち、その技術について習得する時間を過小評価する傾向がある
  2. 熟達者のヒントやコミュニケーションは貧弱なものになりやすい。
    • 初心者が所有する知識量を正確に読み取ることが難しい。
  3. 生徒は知識が豊富な先生から学ぼうとする
    • 事実1:知識を生徒に示すことで、生徒は教師を信頼し、やる気にさせてくれると認識してくれる。
    • 事実2:どんなに知識を持っていても、教師が知っていることと生徒がその時求めている指導の間にギャップがあると問題を生じる。

「教えること」の枠に囚われずに考えると、教師の知識の深さは、生徒へのフィードバックや生徒の活動を評価する際に非常に重要になる。なので、総合的に知識は教師のためになるという主張をしている。

第3章 教師と生徒の関係

生徒と教師の良好な関係は持続的な作用がある。

生徒と教師の関係が持続する諸事実

  • 幼い生徒と教師との間の良好な関係は、反社会的な行動レベルの低下や、長期にわたる行動上の問題を改善する。
  • 生徒と教師の関係性は、初期の段階で良好だった場合はその先も良好になる。
  • 「関係性改善のプログラムを受講した教師」による授業を受講した生徒は、「そうではない教師」に比べて、翌年の成績が改善した

明記はされていないが、ここにおける「良好な関係」とは、「親密さの高い状態」であると読み取った。さらに「親密さ」とは「教師が生徒に働きかけるもののうち、感情的な側面」であると定義されている。(注:日本語がわかりずらかったのでブログ著者の解釈が入っている。元の日本語は「親密さとは、教授の相互作用の情意的文脈を表している。」)

第4章 教師としてのあなたの人柄

生徒は教師が信頼できるかどうか評価している。その評価は、教師の人柄とは関係なく、生徒に対する教師の接し方をどのように捉えているかに関連している

  1. 一番教師にとって重要なのは、ポジティブでオープンなコミュニケーションを行うことである。特に、生徒たちが、接してもらう際に大切にしているのは、「公平・威厳・個人の尊重」の3点である。この3点に対してコミットすることが必要になる。
  2. もう一つ重要なのは、教師の非言語的な振る舞い。教師が他者に対してどのように振る舞っているかを生徒はロールモデルとして捉えており、それが社会のルールから逸脱していると信用を失う。
    ※ 特に嘘をつくことは、関係性を失うことに一番大きな作用がある。

上記のような、生徒による教師の評価は、ものの10秒で始まっている。特に「何を話しているか」よりも「どのように話しているか」に生徒は注意が向けており、教師の雰囲気を10秒程度で把握している。

生徒が高い学力を達成するために必要な行動として、「援助要請行動」というものがある。これは、助けを求めようとするような意思の側面であり、内発的動機が高い生徒によくみられる。この援助要請に影響を与えるのが、生徒との信頼関係である。生徒は、教師が自分たちを好意的な姿勢で支えてくれることに気付くと、内発的動機をもとにして質問ができるようになる。

まとめると、込み入ったことを考えて奮闘しているときに、自分たちを助けてくれるような信頼できる教師を生徒は高く評価するということ。

第5章 学級学習のグローバルな指標としての時間

教室の中で何にどの程度時間を使っているかは研究対象としてしばしば取り上げられる。その際には、同じ「時間」といっても以下の4つの区分に時間が分けられることに留意する必要がある。

  • Allocated time: カリキュラムや時間割上確保された時間
  • Instructional time: 実際に指導している時間
  • Engaged time: 生徒が実際に学習対象に注意を向けている時間
  • Academic learning time: 生徒が学習し、高い達成度を得る、知的学習時間(ALTと呼ばれる)

学級内で4つの区分があり、さらに生徒や学級ごとに大きく異なる。それを教師が全て把握するのは難しく、時間がどのように使われているかについてはわかっていないことも多い

学級内の時間に関して、留意点として次のようなものもある。

  • Allocated time それ自体と、学業成績の相関関係は強くない。その一方で、同じ教科でも学校ごとに費やされる時間は大きく異なっており、生徒の学ぶ機会に対しては直接影響する重要な要因である。また、Allocated time のうち Engaged time の割合が少ない生徒は、課題の出来が良くないことも想像される。
  • 勉強に費やす時間に関しては、個々人が勉強に費やす時間と本人の成績結果の間には関連があるにはしても、異なる能力である人をそれぞれ比較する場合は関連が見えづらいものとなる。

単元を跨いで関連づけるような知識の統合には、別の題材同士を繋げるのに時間と労力が必要となる。カリキュラムを減らすなどして確保される時間が少なくなると、そのような知識の統合に時間を取れなくなる。生徒に意味のある情報を覚えていて欲しいならば、知識の統合を促すような活動が必要であり、深い学びを促す際には時間の役割は大きい

※ ある研究では、時間配分の減少は選択式テストには影響はなかったが、記述式の問題では得点が大きく下がった。

第6章 Recitation method と学級学習の性質

Recitation method は、教師が生徒に対して情報のインプット後にいくつか内容に関する基本的な内容を質問をする形式のことで復唱式勉強法と呼ぶことができる。IREサイクルやCDRメソッドとしてもよく知られている。

  • IREサイクル:initiation-response-evaluation
  • CDRサイクル:conventional-direct-recitation

この教授法は、教師の生徒に対する権威を保っていられ、かつ授業のコントロールができる丁度良い方法として捉えられることが多い。そのため、現在に至るまで多くの場面で用いられている

しかしながらこの教授法は以下のような理由から頻繁に批判されてきている

  • 観察によると、教師の質問は大半が簡単な難易度のものに留まり、単純な答えを要求している。
  • 一度に一人の生徒のみ活発になっている。大半の生徒はその間何もしていないことが多い。
  • 教育という活動が、権威ある人物からパッケージ化された知識を得るものになってしまう。
  • Recitation method によるコミュニケーションは、予測のしやすいものになるが、生徒に対して刺激の少ないものとなってしまう。

生徒が授業に対して活発な状態になっていることが大事ではあるが、それは質問した時のみ達成できるわけではない。さらに、一方的な講義時間が長ければ長くなるほど以下のようなデメリットが生ずる。

  • 生徒は授業に集中している割合が少なくなる。
    ※ ある仮説によると、高校レベルの生徒は10分までしか集中して授業を聞いていない。
  • 情報過多になると、理解していたとしてもさらに混乱を生じることがある。

第7章 基礎学力における自発運動化に関する指導

無意識に脳に負荷をかけずにできる能力のことを自発運動化と呼ぶ。本書では、特に数字情報へのアクセスや単語の認知に対する能力を取り上げる。自発運動化が欠如していると、思考・理解する能力の欠如を引き起こす。なぜなら、目的が単語を理解することに終始してしまい、全体の文脈を理解することが疎かになってしまうため。

多くの子供が、読解力の欠如の最たる原因として、単語を理解する時点で苦労していると徐々に明らかになっている。理解力の問題ではなく、それ以前の情報システムが単語の認識に対して影響を及ぼしている。単語を早く処理することができないと、例え単語の意味を理解していたとしても文章を理解することは不可能になる。このように、自発運動化が欠けていると、情報の処理に大きな負荷がかかってしまう

逆に、自発運動化により基礎的な技能が無意識にできるようになると、さらに深いレベルでの思考ができるようになる。その意味では、反復と強化は知識を取り出しやすくするための手段であり、知的成長が促進できる。

自発運動化は、子供の生活に影響を及ぼす全ての大人が子供に対して支援をする必要があり、教師にその役割を押し付けることは不適切。一方で、反復読みやMULTILTなどの教授方法により、自発運動化を発展させること自体は可能である。

第8章 フィードバックの役割

生徒は、次回に繋がるような、活動をどのように改善すれば良いかを知りたがっている。それに対して、教師は「否定的なフィードバック」を与えることでそれが満たされていると感じることが常である。否定的なフィードバックは肯定的なフィードバックよりも印象残りやすいため、注意する必要がある。

フィードバック自体は、学業の到達度に関わる最も強力な要因の一つである。生徒に対するフィードバックは以下のときに効果を発揮する。

  1. 生徒が成功とはどのようなものなのかを知り、
  2. 彼らの現在地と、目的地との間の距離を減らすことが目指されていることを理解し、
  3. 次に進む地点についての情報が与えられたとき。

フィードバックの方法として、「賞賛する」ことに関しては注意が必要だ。確かに勉強に対する快適な環境が整うかもしれないが、この賞賛を受けること自体が学ぶことに対してプラスになる調査結果は存在していない。特により簡単な作業の際に生まれつきの能力を賞賛すると、困難な状況の際には諦めやすくなってしまう。

また、教師は生徒からのフィードバックを受ければ受けるほど、教師の行動は改善し、結果として生徒は大きな恩恵を受ける。

第9章 社会的モデリングと明示的な教え方を通した複合的な技能の習得

指導する際に、何をどれだけ直接的に指導するかは重要な議論の対象となる。

教師は、学習に関して実演し、それを学習させるコーチやモデルの役割を担う。こうした実演を見るだけで、生徒が何か実現可能になるわけではない。なので、観察学習を促すためには、教師は慎重に段階を追った道筋を示し、生徒が情報を段階を追って消化できるように努めなければならない

本書で取り上げられた二つの研究によると、

  • 探究の過程は、そのステップごとに焦点を提示し、そのステップごとにどのような手法をとるかの目的を理解しやすくさせる。
  • 認知的タスク分析(CTA)に基づいた、適度に単純な作業を分解する方法で授業を行うと、授業からの離脱率が下がった。(8%→1%)

このように、どのような手法を用いて思考するかは明確に教えられることが必要であることがわかる。

以上のような見解に対して、「個人の発見的に生み出される知識はよりしっかりしたものだ」という反対意見が存在する。しかしながらこの意見は間違っている。個人的な発見それ自体が、人々の実際の学習を支援するということに根拠はほぼなく、以下のようなデメリットが明らかになっている。

  • 知能的機能にかかる認知負担の増加
  • 共有された知識には存在している、確かで体系的な知識を得ることができない
  • きちんとしたモデルなしに作業を行う人よりも、注意深く観察した方が優れた結果を得る

第10章 専門的技能とはどのようなものか

専門的技能とは、繰り返し発揮される特出したパフォーマンスのことを表す。クラスでの教授方法についても専門的技能があることが分かっている。例えば、同じ程度の期間経験を積んでいる教師を比較しても、専門的技能を身につけている人(ここでは熟達者と呼ぶ)とそうでない人がいて、教える能力には大きな違いが見られる。

熟達者は以下の7つの特徴を持つ。

  1. 専門としている領域でのみ特出している。
  2. 多くの、そしてより意味のあるパターンを知覚する。
  3. 課題解決をほとんどミスなくこなす。
  4. 専門としている領域においては、非常に大きな短期記憶を持っている。
  5. 目に見える課題を、より深く本質的なレベルで捉える。
  6. 課題を慎重に定性的に分析することに、より時間を使う。
  7. 自己管理の卓越したスキルを持つ。

また、熟達者にとっては意識していないレベルの事柄が多くなり、彼ら自身がそれを説明することは困難になっていく。この事実から、一般人に対して熟達者が説明していることはあまり信用ならない。

第11章 どのようにして専門的技能を発達させるのか

すでに獲得した技術を繰り返し時間練習すれば自ずとその技術が上がっていく、というわけではない。熟達者はより「意識的な練習(deliberate practice)」を行っていることがわかっている

まず専門的技能は、長年の絶え間ない鍛錬と、周りからの環境に恵まれている必要があることが調査でわかっている。その上で練習をする際は、ただ漫然と技能の練習をするのではなく、技能の改善に対して明示的にコミットする必要がある。このような意識的な練習は構造化されたゴールに向かうことを意味している。そしてそれを行うためには、短期的なゴールや個別最適化されたフィードバックが必要になる。

このような練習を経て、熟達者は高いレベルのスキルをほとんど意識的な努力なしに発揮することができるようになる。これは以前の章でも説明した自発運動化(automaticity)によるものである。

しかしながら、自発運動化は技能の発達を妨げる場合もあり、自発運動化に対する見解も注意が必要だ。自発運動化が獲得されると、獲得した段階の技能レベルに対して意識的な努力なしにアクセスすることができる。つまり練習を繰り返すことにより、自覚的な技術獲得段階から、より先の発達が止まった無意識段階に移行してしまうのである。

数々の研究から、天才的な技能が先天的に獲得されているかについても疑問が投げかけられた。結局のところ、幼少期に高い技能を見出された人は、そのほとんどが大人になっても技能が進歩することはあまりない。早い段階で才能のある人を選別してしまうことは、潜在的により高い才能を持つ人を排除してしまう

第12章 学級での指導領域における専門的技能

教え方の領域に熟達者はいることがわかっている。学級単位で生徒の到達度データに関する統計的な分析によってそれが明らかになった。p163にあるように、熟達した教師について発見された事項は、10章で取り上げた専門的技能の特徴と結びつけることができる。

教え方の領域の専門的技能は、実験的方法を用いて研究されることも多い。

  • 授業の映像を見せられた実験によれば、熟達した教師の場合は、著しく高いレベルで教室の様子を読み取る能力を有していることが発見された。熟達者は以下のような点を認知し用いる点で、平均的な教師と異なっていた。
    • 授業の構造についての情報
    • 自身の要求と期待
    • 生徒の活動の傾向
  • 熟達した教師は他の教師とは違い、生徒の理解を非言語的な合図から推測することにおいて極めて正確だった。
    • 画面に映る生徒と親しい時のみ上記事実が見られた。

また、熟達した教師を実際の教室で観察した実験から、熟達した教師の特徴が以下の3点浮かび上がった。

  • 生徒の努力を最適に引き出すために目標を設定したり、挑戦心をくすぐったりする。
  • 指導の方向性を決めやすくするために、生徒の学習をモニタリングしたりフィードバックしたりする。
  • 教え方をここの状況に適合させ、指導上必要な事項を素早く判断できるように、高いレベルで知識を利用する。

このように、熟達者としての教師は、生徒との対人関係において感受性を鋭敏なレベルで用いることが求められている