プログラミングどうしてできない?

日経パソコン9月25日号の投書欄:大学でプログラミングの授業を受けていて,言われた通りにすれば確かに動くのだけれど,「どうしてそうなるかという理論が理解できないので応用することがなかなかできません」。この学生さんに何かアドバイスしてあげてください>皆様。

出されてる課題の内

出されてる課題の内容/レベルが分からないので
こっちの勝手な憶測で適当に無責任な発言をすると

1. Syntaxの段階で分からないのか
2. 使用言語の標準関数の意味、使用方法がわからないのか
3. アルゴリズムが理解できないのか
4. 公開されてる再利用可のライブラリを拾ってきたけど使い方分からん

などのように何が分からないのかをまず分析し
基本部分からより高度な方向へ理解できているかを順番にチェックしていくべし。

1の場合は言語設計者/研究者への暴言だけど、
構文を「なぜ」、「どうして」そう書くかなんてことは考えるな。
「そういうもんだ」で慣れろ。
母国語と同じ感覚になるべく近づくようにとにかくひたすら慣れろ。
学校で日本語の文法構造や英語の文法構造はなんでそうなってるか
と考えさせながら学ばないのと一緒。
言語をマスターして、思いついたことはどんどんプログラムで書けるようになってから
興味があれば設計者が何でそう設計したかを探求すべし。

2の場合も1に同じくマニュアル読んでこれはこういう関数で使い方はこうなんだで覚えろ。
ひたすらmanを使って調べろ。
英単語のスペルや慣用句が何でそうなってるのか考えるのでなく感じるようになれ。

3の場合は数学的手法としてわかんなければまずは数学をみっちり勉強。

1~3に共通して
講義で指定され購入した本の内容が難しすぎてちんぷんかんぷんなのであれば
それとは別に自分でHowToとして良書とされる本やWEBページを探そう。
高校以下のは教科書は「分からん奴にもなんとかして簡単に分からせよう」
という本がしのぎを削りあったものの中から選別されているのに対して
大学の場合は教授が自分に印税が入るカラクリになっている本を指定する場合があり
特定分野について深く掘り下げた高度な本なのは間違いないけど、
「なんとかして分からせよう」という競争を勝ち抜いた本ではないので
「分かりやすさ」がともなっている本ということは保障されていない。
(両立させている本もいっぱいあるよ)
なので必要に応じてHowTo本として良書とされるものを入手して、
HowTo本で掘り下げられていないディープ名部分は指定教科書で補完しよう。

HowTo系,Tips系は本よりWEBの方がいいかも。
図書館は最新の本がおいてないことあるし、
本屋めぐりは歩くの結構疲れるし、
立ち読みしすぎると足しびれるし、
トイレ行きたくなる体質の人もいるし。
WEBならお手軽だし、
情報に速報性あるし、
座ってPCいじれば立ち読みよりは疲れないし、
PCとネットがある環境ならトイレに困ることないだろうし。

4については、付属のドキュメントを読もう。
でも、ドキュメント不備・無い場合もあるから
ソースがドキュメントと思ったほうがいいかも。
ソース読んだほうが他人のコーディングテクニック盗めるし。
BSDやLinuxのディストリビューションでOSをインストールしたら
当たり前のようについているコマンド類のソースはどんどん読め。

いちおう職業としてこれで飯食ってるけど
学校でプログラムって習った経験ないので
とんでもな学習方法かも。。。

当然

> 言われた通りにすれば確かに動く

言われた通りにしかしない(コピーペーストしかしない)から学べないんですよ。

>言われた通りにすれ

>言われた通りにすれば確かに動く
最近のプログラミングの講義って質が高いんですね。
私が学生の頃は講義で配られたプリントにソースと実行結果が載ってましたが、どう見てもコンパイルすればエラーになるのに実行結果が存在してました。おかげで「言われたとおりにすれば」なんて発想は今もって持てません。ある意味いい講義だったのかもしれない :-)

という話は置いといて…

プログラミングに理論の理解なんて必要ですか?
プログラミングに必要なのは思想の理解じゃないかと。だから経典(K&R etc...)を隅々まで読んで「どう書くのか」でなく「なぜそう考えるのか」を感じる必要があるわけで。単なるコーディングだけならBNFでも見ながら適当に書いてもなんとかなるし。emacs用の適当なmodeがあると文法なんてあまり考えなくてもそれなりに書けるもんね。

ゴミレス

上にコメントされている名無しさん(出されてる課題の内)のリストのどれとも違いますが、

オブジェクト指向ってのが、底辺から全く理解できません。そうじゃないならなんとなくわかるんですけど。
プログラミング以前の問題です。
そういった人はどうしたらいいんでしょうか?

単純に興味がないの

単純に興味がないのではないでしょうか。
独学で覚えた人がかなりいる業界だとおもうのですが。指示通りにすればできるのは当然のことで、指示されるのが当たり前と思っていると、同じことを何度やったとしても覚えないとおもいます。
よほどレベルの高いことをやっているのであれば、話は別ですが、習うより慣れよということだとおもいます。
興味があっても・・・というのであれば、動作の分解や組立が得意ではないのかもしれませんね。
人間に指示を出す場合とくらべて、プログラムのほうが細かい指示を与えるじゃないですか。
例:「メモをとりなさい」を、「紙を用意して、鉛筆をもって・・・」のように。
すぐに適応できるかどうかはセンスの問題としても、数多くのロジックを見ていればそのうち慣れるものだとおもいます。見ているだけで頭を使わないと何もかわりませんが、○○処理の「おまじない」として覚えるだけでも前進するとおもいますし、処理内容を日本語で書かせて理解を促すという方法もあるかとおもいます。

オブジェクト指向は、難しく考えないのが一番ですね。
テレビ、ビデオといったオブジェクトがあって、どちらにも「電源を入れる」というメソッドがある。1つのものを構成するものが、そのオブジェクトのなかに入っているので、それを部屋(プログラム)に配置して・・・って、そういうレベルの問題ではない?(^^;

やらないからできない

本当に大学のプログラム関係の演習・講義はコピー&ペーストで終わってしまうんです。それなのに単位を出す教員サイドに問題があるのも事実です。単位が出ているから、やっという事実があるにも拘わらず、何も出来ない。学生が自分で考えて何が何でもやらないとまずいという状況でないとできるようにならないでしょうね。プログラムも言語の一つですので、英語が出来ないというような問題とよく似ています。
 まあ、JABEEの影響が悪い方に出ている典型だと思います。学科の中で高校生の時に趣味でプログラムをやっていた人には、それ以上の知識をつける授業になっていなくて、やったことのない人には最後まで何か何だか分からない授業になっているのをつくづく感じています。
 でも、高専の学生,高専から大学に来た学生は、コピー&ペーストでは試験が通らないので、出来るようになっています。

アドバイス

「応用」をする必要がないので応用できないのではないかと思います.
プログラミングの適性の高い人はさておき,そうでない人にとっては,
差し迫った必要もないのに習った知識を他のことに応用する,
というのはそう簡単ではないはずです.
ですので,プログラミングをせざるを得ない状況に追い込まれるまで,
もう少し待ってもいいのではないですか.学生さんには,勉強すべきことが
それ以外にもたくさんあるのですから.

#これじゃ後ろ向き過ぎますかねえ.

素人による適当な回答例

単位さえ取ればOKという人が多く見受けられる中でずいぶんと真面目な思想をお持ちの学生さんのようですね。

何人かの方が言っておられますがまずは何が無くとも数です。
1に数。2に数。

>どうしてそうなるかという理論が理解できない
というのはその次の段階ではないかと推測します。
まさか「printfがどのように動作しているのか」といった事ではないと思います(もしそうならお手上げ状態です)。
何をするとどうなるかを理解するには何をしないとどうならないか、なぜならないかを考える必要があると思います。

プログラムというのは数値の演算の塊ですから小さいプログラムをトレスするのも理解に役立ちます。

プログラムを壊し、再構築しと繰り返すと理解が深まるでしょう。ただしコレには情熱も必要になってきます。

>理論が理解できないので応用することがなかなかできません
順番が違います。応用して理論を体になじませろ。
少し無理な目標を立てる。情熱を維持するといい結果が出やすいので簡単なゲームか何かを一本作成する。そのときに必要なものを吸収しながら馴染ませ覚える。あまり人に聞かない。出来上がるまで模範解答を見ない(そもそも模範解答などというものは無い状態が普通なのだからこれでよい)。
スパルタですが独学で覚えた人は大抵こんなものではないでしょうか。

オブジェクト指向も数をこなすとなんとなく見えてくるような気がしますが学習法としては粗悪ですのであまり本気にされると困ります(^_^;
オブジェクト指向も理解の段階があるでしょうから詳しく段階わけをしてみるといいのではないでしょうか。

コメントの表示オプション

お好みの表示方法を選択し、「設定の保存」をクリックすると、表示方法を変更することができます。