Entry

日本のC言語入門書を読んでもプログラムを書けるようにならない理由

2011年03月05日

あたしは定番の K&R でC言語を身に付けたので,これまで他の入門書をよく読んでいなかったんですけれど,先日,新人君の教育(春休みにインターンで来ている)で読ませてもらう機会がありました。どんなの読んでたの?てな具合で。

プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 12914

新人君が読んでたのはこちら。割と定評があるそうです。なんでも,入門編やら実践編やらと,複数の書籍に分かれているんだとか。

新版 明解C言語 入門編
柴田望洋
ソフトバンククリエイティブ
売り上げランキング: 4370

で,入門編と実践編を一通り読んだんですけれど,率直な印象は「これでプログラム書けるようになるんかいな?」といったものでした。この入門書,C言語の言語仕様は(かなり詳しく)学ぶことができるだろうけれど,プログラムを書けるようになるとは思えない。少なくとも,プログラムを書けるようになるには,本書とは別の経験が必要です。ちなみに,これは入門編も実践編も同じ。くだんの新人君は,別途教育を受けていたので,本書とは別のパスでプログラムを書けるようになったようです。

なぜ日本のC言語入門書では,プログラムを書けるようにならないのか。それは,言語仕様を説明することのみに終始して,一般的なプログラミングのプロセスをまったく考慮していないからです。もっと具体的に言うと,こゆことになる。

ほとんどすべてのサンプルプログラムが main 関数のみで書かれている。

現在のプログラムは,それがオブジェクト指向プログラミングであれ構造化プログラミングであれ,まとまった機能を組み合わせることで表現されます。つまり,「プログラミングする」ということは,ソフトウェアの機能を「機能単位で」実装していくことなんですね。「機能単位」というのは,C言語で言うと,主に関数単位あるいは翻訳単位になります。

さらに,機能単位にプログラムをまとめるということは,ソフトウェアの機能を抽象化するということでもある。それがプログラミングの醍醐味であり,かつエンジニアリングの中核なわけですけれど,main 関数の中に閉じこもっていては,そうした基本的なプログラミングプロセスがまったく分かりません。

結局のところ,main 関数だけでプログラミングを説明してしまうということは,親切に見えて,プログラム全体を構成する力を削いでしまっていると思うわけです。仮に例題が全体として動くプログラムだったとしても,おもちゃプログラム以上の意味はない。ある程度プログラミングの経験を積んでいる人なら,ソフトウェアにおける機能分割-抽象化の方法論を心得ているだろうから問題ないけれども,初心者がこの通りにプログラムを組んでいると,変な癖がついてしまうはずです。

変な癖というのは,例えば,

  • ひとつの関数が異常に長いプログラムになってしまう(通常,ひとつの関数は多くても40ステップ程度が目安)。
  • 一部パラメタだけが異なる同じような処理があちこちに出現するプログラムを書いてしまう。

といったもの。こゆのは,プログラムを機能単位に分割し抽象化する力のない向きに典型的な症状です。

くだんの K&R はというと,関数の書き方を説明した後は,ほとんど main 関数でない関数として実装しています。プログラミングの初心者は,当初こうした抽象化に戸惑うところがあるかもしれないけれども,必ず通らないといけない難所だったりする。おじさんとしては,むしろそうした難所を避けて通ろうとする邦書の入門書に性質の悪さを感じてしまいます。

入門書を読んでもプログラムを書ける気になれず,また別の入門書を探す……なんて向きは多いそうだけれども,そゆ向きはまず自分でプログラムを作ってみる他に,K&R を読んでみたらどうだろう。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN