ゴールデン・ウイークも終わり,そろそろ読者の皆さんにも,新入社員を教育する役割が回ってくるころではないだろうか。あるいは,これをお読みのあなた自身が新入社員かもしれない。そこで今日は,「広く深いコンピュータ技術を,これからこのコンピュータ業界に入る人たちに,どのようなことを,どんな順番で教えるのが良いか」,という“難題”に挑戦してみようと思う。

 初級,中級プログラマ向けに情報を提供する雑誌「日経ソフトウエア」の記者である私自身にとっても,これは日ごろからあれこれ頭を痛めている切実なテーマである。ITプロフェッショナルの皆さんにどこまで共感を感じてもらえるだろうか。「甘い,甘い!」と言われてしまうだろうか。自信はないが,ともかく私の考えていることをご紹介させていただきたい。

“コンピュータがなぜ動くのか”を知るのは楽しいこと

 最近,日経ソフトウエア6月号に「プログラミング書籍 読むならこの本!」という特集を書くために,キャリア2年程度で最初に学んだプログラミング言語がJavaという若いプログラマから,SEとして約20年のキャリアを持ち,企業を興した取締役まで,様々なプロフィルの方々に取材をしてきた。「これまで読んだプログラミング書籍で,感銘を受けた本」をお聞きするのが目的だ(特集で紹介した書籍はこちら)。

 取材のなかでは当然,「新人SE,プログラマにコンピュータをどう教えるか」にも話題が及ぶ。取材先の方々の経験をお聞きし,また私が日ごろ考えていることを聞いていただいているうちに,改めて感じたのは,「コンピュータはなぜ動くのか,その仕組みを知ることの大切さと面白さ」をいかに伝えるか,ということだった。

 取材のなかで,あるベテラン・プログラマは,C言語を学ぶときにB.W.カーニハン/D.M.リッチーの名著「プログラミング言語C(共立出版)」を読んで感銘を受けたときのことを語ってくれた。「例えばメモリーのアドレスを変数として使える仕様です。メモリーのコピーをするにはこれでいいのか,なんて驚きつつ,頭がいいんだな,この人たちって,と思いながら読んでいました」

 あるデータベースの専門家は,「いろいろなコンピュータとその技術に触れてきましたが,どれも好きで興味を持ち,調べ始めて,その本質,概念,思想などを理解できると,感動できる。その繰り返しでコンピュータを学び,経験を積み重ねることで,自分のスキルを蓄えてこられたように思います」と語ってくれた。

 こんな風に,コンピュータやプログラムが動く仕組みに素直に感動し,それを知ることを楽しみながら基礎知識――コンピュータやプログラムを動かすレイヤー(層)構造――を学んできたのが,彼らの強みになっているのだと思う。

コンピュータの基礎を知る面白さが味わいにくくなってきた

 翻って,これからプログラマやSEになろうと志す人たちはどうだろうか。この人たちにとって不幸なことは,前述のベテラン・プログラマやデータベースの専門家が味わってきたコンピュータの仕組みを知る面白さや感動を,なかなか味わいにくくなっていることではないかと思う。その理由は,学ばなければいけないことが昔よりずっと増えていることである。

 例えばかつて筆者がC言語で本格的にプログラミングを学ぼうとした時,プログラムの動作環境はMS-DOS,テキスト・エディタ,Cコンパイラの使い方だけ覚えればよかった。これに加えて,Cの基本構文,両手で数えられる程度の命令のグラフィックス・ライブラリ,MS-DOSのシステム・コールをマスターすれば,一通りのプログラミングはできるようになった。

 今はどうだろう。Windows上で,プログラミング言語にVisual BasicやJavaで開発する場合を想定してみる。動作環境は,とりあえず操作するのは簡単だが仕組みを理解するのは難しい。それよりも,複雑になったWindowsや,米MicrosoftのVisual Studioや米Sun MicrosystemsのForteのような統合開発環境の使い方を覚えることを優先されがちだ。

 これらの使い方をなんとか覚えた後に,オブジェクト指向という難しい概念が導入されたプログラミング言語で,膨大なクラス・ライブラリを駆使しながら,イベント・ドリブンというプログラムがどこから始まるのかわかりにくいスタイルでコーディングする。

 仮に猛勉強の結果,これらをうまく手に入れたとしよう。とりあえず仕事はできる。しかし,予期せぬ動作やトラブルに遭遇すると,どう対処してよいのかわからず,うまく解決できない。ひとまず仕事をできるようになるために覚えることだけでも多く時間がかかるのに,全体的な構造が見えてこない。うまく動かないときは原因が分からず,気分が悪くなるだけである。

 原因が分からず問題が解決できない理由は,知識と経験に“深さ”がないからだ。ここで言う深さとは,下位のレイヤーで動作するものの仕組みである。プログラミング,サーバーやネットワークの管理,どんな仕事であってもこの知識の深さがないとうまく解決できない。

 前述のベテラン・プログラマやデータベースの専門家が,現在の複雑になったコンピュータ・システムの全体的な構造や技術を理解し,高い問題解決能力を発揮できるのはなぜだろうか。小さいシンプルなもので学び始め,コンピュータ技術の進歩とともに,これまでの経験で体得したレイヤー構造に当てはめながら,その技術の位置づけや概念を理解してこれらからではないだろうか。

すぐ仕事ができるよりも,楽しいと思えるように

 さて,こうしたことを踏まえて「広く深いコンピュータ技術を,これからこのコンピュータ業界に入る人たちに,どのようなことを,どんな順番で教えるのが良いか」というテーマに戻ろう。結局は「急がば回れ」。先人たちが経験してきたような,コンピュータやプログラムの動く仕組みを知る楽しさや大切さを知ってもらうことが一番大切だと思う。ポイントは3つある。

 一つ目は,まず学習の最初で,複雑で見えにくくなったコンピュータ技術の全体的な構造とその基礎を伝える。具体的な内容は,ハードウエアとソフトウエアの関係,OSが備えるべき機能などである。自分が今どの部分を学んでいるかがわからないと,知識を体系化しにくく,迷う原因にもなる。最初に地図を渡しておくのは重要なことだと思う。

 二つ目は,何かをするためにはどうするかの説明よりも,どうしてそうなっているのか,技術の概念,思想の説明を重視することである。たとえばVisual Basicで“イベント・ハンドラを作成するにはどうするか”よりも,“なぜイベント・ハンドラというものがこの世に存在するのか”をじっくり説明することだ。

 様々な技術の根底にある思想の面白さを伝える。そしてその技術がいかに便利なものであるかを理解してもらう。そうしない限り,学ぶ人は本心からイベント・ハンドラを使いたいとは思わないだろう(仕事で使えるようにはなるかもしれないが)。

 三つ目は,常に下位のレイヤーにある技術がどうなっているかの解説を怠らないこと。たとえばファイルを扱うプログラミングを教えるのなら,ファイル・システムをちゃんと解説する。ディスクI/Oの競合や,ファイルのロックなどの状況で,やってはいけないことを理解できるし,トラブルが発生したときも原因を推測しやすい。

 どれを伝えるのも時間がかかって面倒で,難しい仕事である。単に早く仕事ができるようにするためだけなら,これら三つのことは考えず,特定のツールや統合開発環境などの“使いこなし”を中心にすれば,時間を節約できるだろう。

 でも,もしあなたがコンピュータを好きなら,遠回りでも,あなたと同じようにコンピュータを好きな人を増やしたほうが楽しいと思う。相手が自分が伝えたいことを分かってくれたとき,それを楽しんでくれていることが分かったときはうれしいものだ。そうして相手がコンピュータを好きになってもらえれば,自分も楽しく仕事ができるではないか。少なくとも自分は,そう仕事したいものである。

 雑誌を作る仕事は,幸運なことに,多くの人にこの楽しさを伝えることができる。楽しんでくれた瞬間に立ち会えないのがちょっと悲しいところなのだが。

(矢崎 茂明=日経ソフトウエア編集)