素歩人徒然 新人教育 プログラミングの能力とは
素歩人徒然
(31)

新人教育


── プログラミングの能力とは

 毎年四月になると、ある会社の新入社員を対象にして「技術者としての心構え」というテーマで半日しゃべることにしている。ソフトウェア技術者を目指す若者達への導入教育の一環である。

 話の内容は毎年少しずつ変わってきてはいるが、私が基本的に必ずやるのが「プログラミングはなぜ楽しいのか」という話である。プログラム作りの楽しい話をいろいろとした後で、次に「プログラミングはなぜ苦しいのか」という話もすることにしている。話の詳細はここでは省略するが、要するにプログラマとして長続きしてほしいという願いから、プログラミングという作業がいかに苦しいものであるかを前もって教えておこうというねらいである。

 本当はその後に「プログラミング力とはどういうものか」という話をしたいのだが、そこまで一度にやると新人は消化不良を起こしてしまう可能性があるので断念している。しかし本当のことを言えば、私が一番話したいのは実はそこのところなのである。

 昔は、プログラマといえば数学科卒の学生を採用するのが普通であった。それは多分、プログラム作りの仕事では理詰めで論理的な側面が重視されていたからであろう。数学を勉強した者なら論理的な思考ができると期待されていたのである。私も数学科卒ということで採用されたくちであるから、数学科卒の悪口は言いたくないが、正直に言わせてもらうと数学科卒であってもずぼらで非論理的な思考をする者はわんさかといる。しかしまあ、概して当たりはずれが少なかったということなのであろう。

 プログラマとしての素養に何を求めるかは昔から難しいテーマであるが「本格派の推理小説が好きな人」という説が言われた時代もあった(私もそう主張していた[「ソフトウェア設計論」『推理力』参照])。今から思うと、推理小説を「作るのが好き」というのなら分かるが、なぜか「読むのが好き」というのだったと思う。推理小説の作家の中にはいい加減な人もいて、一度殺してしまった登場人物をすっかり忘れてまた登場させてしまう(*1)剛の者もいたそうであるから、どちらにしろ推理小説“説”はあまり当てにはならない。
【注】(*1)これと同じことを我々プログラマは毎日やっている。一度解放して“不定”となったポインタデータを再び使うようなものだ。プログラマには、推理作家の行為を笑う資格はない。

 今では、プログラマは数学科に限らずあらゆる学科の出身者でしめられている。多様化したソフトウェアの開発ではあらゆる分野の広い知識が必要とされているからであろう。それから、過去には深刻な人手不足で出身学科をうんぬんしてはいられないような時代もあったことを忘れてはなるまい。

 プログラマの能力として数学科卒が求められたのには、もう一つの別の理由があった。それはコンピュータの歴史の初期の頃は、プログラムを作るといえば何から何まですべて一人でゼロから作り上げるしかなかったのである。したがって大きなシステムを一人で構築するには、綿密な計画にしたがって一歩一歩積み木を積み上げるように緻密で論理的な作業が要求された。そのために数学科卒の人達が活躍できた時代が確かに存在したのである。
 しかし今やプログラム作りの方法は劇的に変わってしまった。プログラムで必要とされる機能はこまかく部品化されている。その部品ライブラリの中から自分の必要とするものを捜してきて、ちょこちょこっと組み合わせれば簡単にプログラムができてしまう時代なのである。

 そういう作業環境では、数学を学んだ者が持つ(とされる)いわゆる論理性などは必ずしも必須のものではなくなってくる。緻密な構成力などは必ずしも必要とされないのである(無論あるにこしたことはないが)。

 新人のプログラマが職場に配属されると、いよいよ試練が始まる。職場には大抵はベテランの優秀なプログラマが生息している。彼らは(質問しない限り)何も教えてはくれない。まず彼らの行動を観察し良いところを真似ることから始めるしかない。しかし残念ながら真似ることがいかに難しいかを誰でもじきに実感するようになる。
 ちょっとした難問が提示されても彼らベテランプログラマは簡単に、しかも短時間にそれを解決してしまう。とても真似できない。すごいと思う。とても敵わないと思う。彼らに対し尊敬の念が増してくる。自分はいくらやってもとてもあそこまではいけないのではないかと思うようになる。少しずつ自信もなくなってくる(特に、今まで挫折というものを経験したことがない者にとっては自信喪失は決定的である)。

 しかし新人のプログラマ諸君よ、何も恐れることはない。あれにはコツがあるのだ。特にUNIXを使った経験のあるプログラマに多いのだが、彼らが何でもちょこちょこっとコーディングして仕上げてしまうあの驚くべき能力の秘密は、実はAPI(*2)関数と呼ばれる関数群の中から適当なものを見つけてきて、それらを単につなぎ合わせているだけなのである。
【注】(*2)Application Program Interface の略

 何だ、関数のライブラリ集を学べばよいのかと甘く考えてはいけない。ライブラリ関数の数は膨大である。各関数の説明(外部仕様)を読んでもさっぱり分からない。実際に使ってみると、期待したようには絶対に(と断言してもよい程に)動いてくれない。ただ、関数のライブラリ・リファランス(ライブラリ集をこう呼ぶ)を読んで勉強しているだけでは決して身には付かないのである。一つの関数の、ある特別な使い方を覚えるには、苦労して実際に使って痛い目に会わないと身には付かないのである。そうやっていろいろな関数を少しずつ使って自分のものとしていく以外にプログラミング力を付ける方法はない。そういう努力を積み上げていくと、ある時期から徐々に自信を持ってプログラムが作れるようになるのである。

 これからの有能なプログラマとは、“ちょこちょこっと”軽くものを作ることができる人のことを指すようになるのではなかろうか。そのためには語彙が豊富な(API関数の使い方を知っている)人になることであろう。
 ただ、“ちょこちょこっと軽く”作ると“ずっしりと重い”プログラムができあがってしまうのが、部品化によるプログラミング法の欠点なのである。しかし、これはまだ新人には言わぬ方がよいであろう。■