第3回 役に立たないプログラムを書こう

入門者のうちは、練習のために、実用とは無縁の「役に立たない」プログラムをいくつも書いてきたと思います。しかし、ある程度上達してくると、いろいろな事情から「役に立つ」プログラムしか書かなくなってはいませんか?具体的には、顧客に納品するためのプログラム、作業を効率化するためのプログラムなどです。

もちろん、役に立つプログラムを作らなければ意味がありません。しかし、例えばスポーツでも常に公式試合ばかりをやっているわけではなく、日々の練習が必要なわけです。練習でどんなにすばらしい記録を出しても公式記録にはなりませんが、練習を積まなければ公式試合でもよい結果を出すことはできません。

プログラミングも、ある意味それと同じだと思うのです。確かに、スポーツに比べれば、練習より本番に取り組んでいる期間の方が長いといった違いはあります。しかし、練習なしでは本番でよい働きができないという点は共通しているはずです。

練習と実験

今回取り上げる「役に立たないプログラム」には、大きく分けて2種類があります。ひとつは、練習のためのプログラムです。一通りC言語が使えるようになったからといって、慢心してはいけません。時間の空いたときや、気分転換を兼ねて、練習のためのプログラムを書いてみましょう。

もうひとつは、実験のためのプログラムです。日ごろから、こんな場合はどんな動作になるのだろう、といった疑問があると思います。それを実験してみるのです。また、新しい手法を試してみたりするのもよい実験になります。

練習と実験は、仮に同じテーマであっても、何度でも繰り返してみることが大切です。半年前にやったことでも、半年経てば自分のスキルや知識も向上していますから、また違った結論を導き出せる可能性が高いからです。

こうした役に立たないプログラムは、大規模なものより、数十行~数百行以内の小さなものの方がよいでしょう。欲を出して大規模なものに取り組もうとすると、途中で挫折してしまいます。ササッと書いて、すぐに動かすことができるプログラムの方が向いています。

このように、日ごろから練習や実験のためのプログラミングを繰り返していれば、いざ本番で練習や実験のときに取り上げた内容とよく似た状況に出くわした場合でも、自信を持ってそれに取り組みことができます。何しろ、その内容については過去に経験済みなのですから。

自由奔放に書こう

役に立たないプログラムでは、職場やその他のしがらみにとらわれる必要はありません。堅苦しいコーディング規約や、組織内のもろもろの習慣とも無縁です。あくまでも自由奔放に、好きなように書くことができます。

実験のためにいろいろなデータを与えてみたい状況はよくあります。そんな場合、世間でどんなに「使ってはいけない」といわれていたとしても、getsやscanfを使ってかまいません。どうせ「役に立たないプログラム」なのですから。fgetsを使って改行文字を取り除いたりする手間をかけるより、扱っているテーマにこそ力を注ぎましょう。

トリッキーなコードも書いてみましょう。おそらくひどいコードが続出するでしょうが、それでもトリッキーなコードを書いた経験は、いろいろなところで生きてきます。また、ごくまれに、それまで不可能と思われていたことが実現可能だと気づくことさえあります。そうなればしめたものです。

失敗しよう

本番では失敗することは許されませんが、役に立たないプログラムを書いているときは、いくらでも失敗することができます。どうせなら、世間で「やってはいけない」といわれていることも、実際にやってみてどうなるか試してみましょう。

バッファオーバーランが起きたときどうなるか、オーバーフローやアンダーフローが起きたときどうなるか、初期化していない自動変数を参照すればどうなるか、その他、動作が未定義や未規定とされているコードも試してみましょう。

失敗したときにどんな現象になるかを体験しておけば、本番のプログラムで不具合が発生したときにも、その原因が何なのか、おおよそのあたりを付けることができるようになります。あたりを付けられる場合と、そうでない場合では、不具合を解決できるまでの時間が大幅に異なります。

何事もなく順調に進んだ経験というのは、実はあまり実力に結びつきません。失敗の経験こそ、本当にその人の経験に結びつきます。役に立たないプログラムで、失敗を恐れることなく、どんどん思い切った挑戦をしてみてください。そして、派手に失敗してみてください。

何度か実際に失敗を経験していると、同じような失敗を回避するための対策を体で覚えることができます。特に意識しなくても、反射的に似たような失敗を回避することができるのです。偉大な先人の知恵として、「やってはいけない」ノウハウというのがいろいろ蓄積されているわけですが、知識として知っているだけでは確実に活かすことができません。やはり体で覚えることが大事なのです。

必要かどうかは、できるようになってから考えよう

プログラミングにはいろいろなテクニックがあります。しかし、「仕事では必要ない」という理由を付けて、はじめから習得しようとしない人がいることも事実です。しかし、習得してもいないことが必要かどうか、どうやって判断するのでしょうか?

実際に使うかどうかは分からないけれども、いざとなれば使えるだけの技術を身に付けておくことは大切なことです。必要かどうかは、できるようになってから考えればよいのです。そのためには、やはり日ごろから「役に立たないプログラム」を書くことが不可欠です。

C言語に限っていえば、gotoやsetjmpのように、どちらかといえば忌み嫌われているものも使いこなせるようになっておくべきです。gotoを使った方がよい状況というのは確実に存在しますが、そのような状況でも、使ったことがない機能をそのときになってから慌てて使えば、確実に失敗します。

前回、前々回はC言語のかなり細かい話が中心でしたが、今回は少し違った視点から書いてみました。いかがだったでしょうか?