とある集まりがあってひょんなことから、とあるプログラムをその場で組んで遊んだ。 40行くらいの非常に簡素なPerlスクリプトだ。 どんなものかと言うと、そこにいたメンバーの一人が提案した小さなアイデアを叶えるもので、
- コマンドラインで実行するプログラム
- 引数に英単語を入力するとその意味を日本語で返してくれる
- ネットワークにつながれている環境を想定
ってもの。実際出来たプログラムは「eiwa」コマンド。 これを
$ eiwa apple
のように実行すれば
$ 『リンゴ』;リンゴの木
と意味が標準出力に出てくる。うん、これも十分なアプリケーションだ。 実際このように課題が設定されるとついつい熱くなってしまい小さなものでも楽しみながら作れる。 そして動いたときには嬉しいものである。
ところで、そばにいた他のメンバーにこのプログラムをどうやって作っていったか?を説明していたら面白いことに気づいた。
ところで、このスクリプトってどう考えて作ったんだっけ?俺。
どのように考えればプログラムが作れるかを説明しているはずだが、はて、さきほどはそれほど「考える」作業をしていただろうか。この40行の「eiwa」プログラムを作るのに「考える」という作業をしたか?と言われれば、 「全く考えていない」とはさすがに言えないが「はい、考えてプログラムを書きました」とも答えられない。今回の場合は既に何回も書いた事があるようなスクリプトだったのである意味「型」が自分の中で作られていて無意識的にコードが浮かんで来てたから「考える」という作業をしていなかったという具合なんじゃないかと。
そこで興味を持ったのが「プログラムを書く時に考えること」である。無意識的でもいいがどのように自分は考えてちょっとしたプログラムを普段作っているのか?前置きが長くなったが、気になったので以下にまとめてみよう。
1. 仕様を自分で解釈する
そうそう「eiwa」プログラムなんだけど、そもそも彼がアイデアを口にした段階では仕様ってのがはっきりしていなかった。だから、強引にも俺が実装出来る範疇で上記した通り仕様にまとめた。プログラムを書きだす前に、まずはそのプログラムへの要求と内部仕様や制約について「考える」もしくは「無意識的に考える」。
2. 使用技術を選定する
なるべくどんな環境でも動くようポータブルにしたかったので「eiwa」プログラムは標準以外のCPANモジュールにあまり依存しないようにした。こうした条件も実は仕様なんだけど、それにあわせて、じゃあどういうライブラリを使って実現しようか、なんてのも考える。使用言語もそのうちの一つだし、その上に乗っかるモジュール、フレームワークをそれぞれの属性を理解しつつ選択する過程があるわけだ。
3. 過去作ったコードの流れを思い出す
これって考えるって言うのか分からないけど、先ほど申した通り、コードをいくつか作っていくと似た機能に対応するコード部分が「型」のように頭の中で共通化してくる。eiwaの場合だと外部の英和辞書APIを呼んでいるので、APIを呼びだすPerlプログラミングのパターンを脳内で呼びだす感じ。
4. 手を動かす時は考えない?
小さな「eiwa」プログラムレベルだったら手を動かしている時は頭を空っぽにして、これまで解説した「考え」を元にガッとコーディングしてしまう。ただ、今回の場合、外部のAPIを呼びだすので、そのAPI仕様を理解するために試行錯誤はしたがこれも、いわゆる「トライ&エラー」を繰り返せばやり方が正確に分かるのであまり頭を使わないように思える。
5. 出来上がってから次を考える
いざ出来上がると試しに実行しながら色々考える。うん。この段階が一番考えているかもしれない。 例えば「eiwa」があるんだったら「nichiei」もしくは「waei」もあっていいんじゃないか?とか...
大きな規模になるとまた「考える」というレベルが違ってくるかもしれないが、 だいたいこんな思考を巡らせてコードを書いている。とは言ってもまとめて面白かったのは、 コードを書いている最中よりもその前後の方が考えること多いってこと。 たくさんコードを書いて使える「型」を増やしてより「高いところ」を考えれるようになりたいですね。
追記
読んでもらった方からプログラミングを「スポーツ」みたいに行ってるね、っていうニュアンスのことを言ってもらった。 確かに身体化してるかもしれないですね。