初級者と中級者の壁に関して、認知レベルで何が異なっているか
前提としてこれは認知に対するアプローチで心理学要素を含む時点でポエムかもしれません。
なぜ、初級から中級なのかという点について実際にコードを書きさえすれば向上するケースとしないケースは適正は存在しているのです。しかし、工夫という概念に落とし込んだ時に「工夫の方法」として既存の認知パタンでできることには言語的に個人が持っている手法に依存してしまいます。この差は何が課題なのか、という点で疑問になったために文字にしました。
科学的に実証する範囲について
認知科学や教育心理学の観点で認知負荷理論やスキル習得の段階というケースがありますが、
以下など参考になるかもしれません。
調査して、コードへアプローチしていく話は多く、検索したコードを理解せずにそのまま利用してしているという話をよく聞きます。それは問題で、改善点は把握することができます。そこから、関数などは把握できても、コードに対して変化が見られないケースはないでしょうか。
プログラムの学習因子については、オブジェクト思考やカリー化、高階関数など中級のような課題はたくさんあります。プログラミングの学習サイトから競技プログラミングなどのようにいろいろなプローチすることができるようになりつつあります。
ここで疑問なのが、イメージや認識処理で記憶している情報をどのように使っていくケースがあるのか、という点です。
類似の学習プロセスに関しては、物理学や数学などがありそうですが、個人が個別に違うイメージを使っていくことに関して、言語化しながら内在的な概念を使っていくための情報処理構造が存在します。
心的イメージを使って認知負荷をかけて記憶を別の記憶と紐づけるという内容が存在します。
まさにいろいろな手段が存在しています。では「自分にマッチしている学習方法」は何か、という疑問に繋がっていくわけですが、これには現状自身の課題でいくつか問題があります。それが以下です。
- マッチする記憶術の評価基準とは何か(時間軸、実証した文字列の情報レベル、効果となるエビデンスレベル)
- 一度形成した評価基準のフィードバックサイクルとは何か
- 記憶した内容を適切な形式でアウトプットするの改善基準とは何か
負荷をかける例
話は脱線しましたが、情報の認知対してどのような負荷をかけていくことがいいのかという課題になります。
例えば、オブジェクト指向のコーディングを課題にしていきます。内容はjavascriptです。
厳密なオブジェクト指向とは何かという話とは別なのでサンプル程度に考えてください。
class moduleA {
constructor(name, age, className) {
this.name = name;
this.age = age;
this.className = className;
}
setName(name) {
this.name = name;
}
getName() {
return this.name;
}
}
実際に使うケースでは、これらをイメージしながら組み込み実装していくことになると考えますが、この時に記憶しているコードでイメージと負荷をかけるのは以下のようなパタンもあります。
- 抽象化 (Abstraction): 複雑な処理を単純なインターフェースで表現する
- 継承 (Inheritance): 既存のクラス (オブジェクトの設計図) を基に新しいクラスを作成する
- ポリモーフィズム (Polymorphism): 同じメソッド名で異なる振る舞いを実現する
- カプセル化 (Encapsulation): オブジェクトの内部状態を外部から隠蔽する
[継承]
class moduleB extend moduleA {
constructor(name, age, className) {
super(name, age, className);
}
setName(name) {
this.name = name;
}
getName() {
return this.name;
}
}
[カプセル化]ES2020以降
class moduleC {
#name;
#age;
#className;
constructor(name, age, className) {
this.#name = name;
this.#age = age;
this.#className = className;
}
setName(name) {
this.#name = name;
}
getName() {
return this.#name;
}
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
setClassName(className) {
this.#className = className;
}
getClassName() {
return this.#className;
}
}
これは、理論だと認識できると考えていますが、実際に個人で情報をパタンとして認識しながらアウトプットする時に意識する人は稀だったりするか、平均的な「厳密に評価する」を定義することが難しいため個人で検証し続けるしかないという話になるのでしょうか。
もちろん個人で情報を共有していく時には、抽象的なために相手がわかる範囲での言語化を求められます。ただ、現状は機械学習で確認できるのでより詳細の質問するプロセスが求められることが考えられます。
言語情報の定義と学習における認識からの学習プロセス
学習に関連した「認識と情報設計」に関して、認知負荷に対して対象と関連性の情報から個人の記録しやすい学習データに紐づいて学習コンテンツの提供をしていくこと、を考えている人はおそらくいるでしょう。それでも実際にプログラミング学習でも5教科など基本的な学習にしてもあまり聞いたことがないのでどこかに情報があるのでしょうか。
調べてみると対象は異なりますがチーム単位から、個人に至るまで認知負荷に関して考えている人はいます。
参考になりました。
ありがとうございます。
それで何が課題なのか
結局「何が課題なのか」ですが、コードパタンを記憶するまでの認知負荷の工程から、分解して目的に沿ってコードを調整してき、その環境下でベターからベストとなるような答え定義して、抽象化された知識と環境下の情報を使ってコード化することをどのようにして「成長」や「向上」という概念に個人が落とし込んでいくのか、というところです。
これが今回の題材になってしまうところがポエムだと判断してしまう理由になります。主観的な言語情報のシンボルとなる題材や模範となるコードは存在しています。しかし、学習したコードを実務のリファクタリングや研究もしくはOSSでのアルゴリズム開発へ関与させていくためには、どんな認知負荷をどの時間軸で提案されれば最適になるのかという効果を定義する必要があります。この効果に関して定量的に計測する術が現状なく個人単位での感覚になります。これは、よく数学でひらめき型のような比喩で計算式を解く人に似ているかもしれません。
経験に対して、個人が保持する言語の背景
最終的に個人が持つ経験に対して、向上することの定義を業務効率を上げることや対象者の能力を向上するために検証していくことで実証しながら、適切な情報の提供プロセスを確立するということになるのですが、これを変化させることはできないでしょうか。コーディングしていきながらイメージやロジックを「成長する期間」にのみ機械学習からいくつか提案されていくことで変化への関与は可能になり、記録が取れればエビデンスになりそうです。
コーディングそのものが価値がなくなる時にその経験をどう使うのか
実際にコーディングそのものは価値がなくなると言われています。作業なので、FAXのように機会は少なくなるのかもしれません。しかし、その学習と連続性に対して目的に自身の能力を必要となる情報を構造化をして、成長の定義しながら行動していくことに変化はないと考えます。目的に対して無意識に必要な情報を構成して解決するためのプログラムを形成していきます。その解決までの構成を形成することは問題解決上で使うことになるためです。
デフォルトモードネットワークというものがありますが、それに近いかもしれません。
認知する情報の設計を結果からフィードバックしていく情報量について
結局初級の人が中級のようなレベルになることや上級の人に対して異なることは何が違うのか、という話についてはどのような情報量が違うのでしょうか。私は課題に対して解決策に対するコードパタンと最適さに対する考慮可能な前提情報量になると考えています。その時に学習する情報と目的に対してどのようなアウトプットに構成できるかを自身で「工夫」の概念に対して評価を作り、常に成長しながら変化させ続けることになると考えています。
さらにポエムになってしまうのですが、漠然とした「成長」というシンボルで能力が上がっていく個人の差もあり、最小のリソースで最大のアウトプットをすることが何よりも望ましい状況です。私の場合は、認識処理に関与して能力を高めていくには、行動の継続をするしか現状は方法がありませんでした。
イメージとアウトプットを結びつけたり、コーディングしていく質を高めるという情報量を蓄積して改善していくしかありません。テクノロジーが発展していって目的までの最適なロードマップを提供してくれることを願わないばかりです。
Discussion