"Hello World" 懐疑論
プログラミング界の通説として、プログラミングを学ぶ際にはまず「Hello World」から始めよう、というものがある。考えるより先に手を動かせというこのアプローチは、初心者にとって有益とされてきた。しかし、この発想だけで学習を続けることには私は疑問がある。
”手を動かせ”論の問題点
計算機(プログラミング言語の処理系)ならではの特異な性質だが、たとえ自分が正しく理解していなくても、それらしくコードを入力してやれば計算機はとにかく動作してしまう。これが初心者にとって問題なのである。さほど頭を使わず、手を動かしているだけなのに作業や学習が進んでいるような錯覚を起こす。
こういうことは他の工学分野ではありえない。たとえば建築において、素人が行き当たりばったり描いた設計図でまともな高層ビルが建つ可能性は1/10000もないであろう。建築工学はじめ構造力学や材料工学などの理論をきちんと学んだ人でなければ設計は不可能である。
ところがプログラミングの分野では、上記のように行き当たりばったりに言語をいじくり回して、一通りコードを動かせる程度になった段階で、その言語を「理解した」ことにして、仕事を始めてしまうケースがままあるのである。経験がある中・上級者ならこれでも良いが、初心者だと非常にまずい。
この方法で特に問題だと思うのは、設計力が高まりにくい点だ。とにかく手を動かすことだけを強調していると、しっかり考えてから手を動かすという経験が少なくなってしまう。「こうやってみたら、こうなった」という経験則だけでは「なぜ、こうしなければならないのか」という設計則にたどり着けないのだ。
理論と実践
プログラミングを学ぶときに重要なのは、理論と実践の両立であると思う。背景にある理論を知ったうえで実践すれば、段違いに理解が深まる。実践で経験したことを踏まえて理論を見直すと、新たな発見がある。どっちが先で後でもよいが、理論と実践との間を往復しつづけることが重要である。
Hello Worldプログラムも、初心者にとっては学ぶべき理論的要素が多数含まれている。コードの行や文字の並び順は何を意味するのか、記号は何を意味するのか、プログラムはどこから開始しどこで終了するのか、文字列はどのように扱うのか、どうすれば/なぜ画面に文字が出力されるのか、ライブラリとはなにか、言語処理系は何をやっているのか・・・などなど。
上記のようなことを考えながらコードを動かすのと、お手本のコードをただ丸写ししているのとでは雲泥の差があることはお分かりいただけるだろう。
そして、常に考えながら手を動かすというアプローチをとれば、設計力の向上にもつながる。
私の新人教育法(参考)
私が新人にプログラミングを教えるときの目標は「単にコードが動かせるだけでなく、良いプログラム設計者(今風にいうとアーキテクト)になってもらう」ことである。
そのために取り入れている方法は、ドキュメント駆動学習(仮称)というものである。特に第2言語を学ぶ場合に有効だと感じる方法である。
まず最初に、その言語の開発者の目的(どのような目的・動機でその言語を作ったのか?)、言語の特徴、歴史などを調べて文書レポートにまとめてもらう。数ページで良い。これにより、その言語に対する俯瞰的な理解ができるし、書いてもらったレポートを指導者がチェックすることにより、その人が何をどのように理解したかを正確に確認できる。文章によるチェックは口頭報告&確認よりもはるかに確認の精度が高くなるのでおすすめである。(第1言語の学習の場合は、ここは軽くすませる場合もある。)
その後、Hello World やサンプルコードの追試に短期間取り組んでもらう。これで環境構築とコードの動作方法が一通り学べる。
その先にやってもらうのは、段階的な設計と実装の経験である。まず一つの関数の設計と実装をやり、その後は一つのモジュールの設計と実装、複数の連携モジュールの設計と実装・・・というように、担当してもらう規模を徐々に増やしていく。設計とはもちろん設計書(主に design doc)を書くことである。そしてもちろん各ステップで指導者がレビューを行う。このアプローチにより、初心者であっても「考えてから手を動かす」という習慣を身に付けることができる。
この記事が気に入ったらサポートをしてみませんか?