自分がやってみて、良かった事の共有
##プログラミングの入門の入門(追記)
・プログラムとは何かの説明として、「「入力」された情報を「加工」して「出力」するもの」だと言ってしまう。
・メカニズムの説明やサンプルコードの解説、改修のあとで、演習課題を出すときも、「入力」と「出力」を提示して、それを実現するように指示する。入力と出力の間を埋めることがプログラマーの仕事なのだと伝える。
##プログラミングの入門
・処理フローを考えることとコーディングは分けてやらせる
・やってはいけないのは、「変数」とか、「変数の宣言」、「データ型」、「コンパイル」といった新しい概念を利用することと処理フローを考えることを同時にやらせること。
自分がやるのは、
1.英語として読めば何となく分かる簡単なIF分岐のコード(C言語)を見せて、コンパイルして実行させる。
➡ソースコード、実行バイナリの区別をつけてもらう。
2.コード1行毎のざっくりした解説をして、処理フローをフローチャートにしたものを解説。
・プログラミングの行為の脳内構成要素として、「処理フローの設計」と「言語の文法を利用して、処理を実現する」の2つがあることを理解してもらう。
3.IF-ELSE分岐までは、フローチャート課題を出して、解かして、でOK。個々人が「簡単」って思えるぐらいまで繰り返す。
4.LOOPは、分からない人は分からないので、インタラクティブにファシリテーションしながら、やる。
・ここらあたりで、問題定義➡解決策の立案(アイデア出し)➡検証っていう問題解決のプロセスを体感してもらうといい。「フラグの利用」みたいなものも、知らない人にとってはイノベーションに近い「アイデア」
・また、「フラグ」みたいな定石の存在も伝える。
☆最初は手続き型でいい。最初にちょっとプログラムを見せるのは、学習の目的を理解させるため。最初にCを使うのは、他の言語を学ぶ導入がし易いから。Javaの実行環境とは何か、をCと比較しながら説明できる。Rubyとかを教えるのでもそうだろう。
##変数と代入を馬鹿にしない。
変数、データ型の概念と代入は、簡単だからさらっと終わらせてしまう人もいそうだけど、これは、しつこいほど、説明し、実際にコード書かせて実感させなければ、後で死ぬ。意外と分かっていない事多い。コンパイル、Hello World,変数とデータ型で1.5日くらい使っていい。
特に代入演算子「=」を算数と異なる。代入する処理であることを強調する。日本語で声に出して読ませて、必ず「右辺の結果から左へ代入する」と意識させる。
あと、演算子の評価ってこともイメージさせた方がよい
x=10
は分かっても、
y=5
x=10 + 20 + y
だとまた、「=」を「イコール」と脳内で解釈してしまうことが多い。人は混乱すると古い、自分が慣れた考え方に戻りたがる。
処理に利用される場合は、変数の中身が扱われることも教えるのと、演算子が評価される動きも丁寧に教えた方がいい。
「10 + 20 + y」は演算子が順に評価され、「30+y」⇨「35」となって、最後に「x = 35」が実行される、と脳内で処理の流れを追えるまで説明した方が良い。
※変数を評価すると値を返すタイプの言語はここら辺が統一的に理解できるから、初心者にはわかりやすいと思う。
##最初は詳細はいらない。
例えば、データ型は、intとStringぐらいでいい。あまり多くは教えない。小数とか、細かく説明しだすと、何が重要か、分かんなくなる。本よめ、でいい。
##簡単なことでも、同じ事をくりかえさせる。
例えば、コンパイル、変数の代入、IF分岐とか、は結構説明して、やらせればすぐできる。だからといって、すぐ次にいってはいけない。同じ事を何度もくりかえさせて、何も考えずできるぐらいまで体にしみ込ませてからじゃないと、進むにつれて、「一度に考えること」が多くなり苦しくなる。
##新しい概念を教えるときは、困らせてから、それを解決するアイデアとして教える。
メソッドを教えるときは、教える前にコピペで処理を書けるコードを書いてもらってから教える。問題を認識してもらってから、それを解決するアイデアとして教えるとすんなり入る。オブジェクト指向が難しいのは、小規模で単純なプログラムの場合、オブジェクト指向が解決する(しようとする)問題を認識するのが難しいから。
メソッドを教えるときに、メソッドの名前をサンプルでは分かり易くする。文章のように読めるように書けることを実感させる。加えて、時間があれば、ダメな命名(あいまい、間違っている、別の事をしている)、ダメなメソッドの作り方(副作用や、複数の事をしている等)を実例で示す。時間があれば、いい名前を考えるプチ演習や、ダメで、誤解を生む名前を考えさせるプチ演習をやると楽しい。
##オブジェクト指向入門
・オブジェクト指向とは、を最初に教えない。
手続き型等のプログラミング言語の経験のない初心者にとっては、余り意味はない。帰って混乱させるだけ。。。
・オブジェクト指向は、オブジェクトを使わせて、そのメリットを理解させる。
最初にクラスを作って。。。オブジェクト指向とは、って言ったって、何が便利なのか分からない。それよりも、ライブラリを使わせて、Stringを「文字列クラス」とそのインスタンスと説明したり、Listを「リストクラス」とそのインスタンス、と説明した方がすぐ分かる。
オブジェクトを作って、使うのが、OOPと理解させる。
・理解してもらってから、自分で、作ってみましょう、としてクラスの定義等をやる。できれば、最初に、完成したクラスを提供して、使ってみてから、クラス定義の解説等をやるのがいい。
・オブジェクト指向の諸概念はクライアントコードの立場を考えないと、意味が分からない。。。使い手にとって便利で、間違えにくくするために、クラスを定義することを教える。setterを公開するか否か、という簡単な問いについてはセンスのある新人なら考えられる。
##意図的にエラーを発生させる
学校の優等生的な新人は、間違いを犯さないことを過度に重視する。だから、エラーを恐れる。ただ、意図的にエラーを起こす事が結構有効な技術検証の手段であったりする。だから、正解を問う演習だけでなく、エラーを起こす演習も取り入れると理解が深まるし、学校のお勉強の呪縛を解くのにもいいと思う。
##こんなやつも
プログラミングを最初に学ぶ時に知っておきたいテーブル駆動方式