プログラミングを始めてから今日に至るまで、
様々なタイプのプログラマーと開発を共にしてきたが、
驚くべき速度で高い品質のソフトウェアを作り上げるプログラマーには、
一つ共通の特徴があるように思える。
それは、「はまる」時間が極端に短い、ということである。

私自身、「風のプログラマー」を指向しており、開発速度を重要視している。
例えば平成14年未踏ソフトウェア創造事業「PICSY」では、
発表直前に知人でプロジェクトリーダーの鈴木健にレスキュー隊として呼ばれて
2,3日でGUI全般と、クライアント/サーバー通信部分の設計と実装を終わらせたのだが、
このときなどは、大体の要件を口頭で聞いた後は、
ほぼまったく手が止まらずコードを書き続ける感じで開発をしていた。

「はまる」時間の長さは開発速度に直結するわけだが、
プログラマーが「はまる」場合にはある程度の傾向があると思うので、
今日は「はまる」プログラマーの傾向と、その対策を考えてみたい。

1. クラスやメソッドの命名が不適切
先日ネットで「きれいなソースコードを書くために必要な、たったひとつの単純な事
という記事が話題になったが、この内容には私も全面的に賛成で、
クラスやフィールド、メソッド、名前空間など、とにかく文字として表れる名前には、
必ず、例外なく、正しく誤解のない命名を徹底することが非常に重要だ。

不適切な名前は、クラスやメソッドの機能の誤解を招き、まさかこの名前でそんな
動作をするとは思わなかった、という類のはまり方は本当に最悪で、
時間も無駄になるしモチベーションも減退するし、そのコードを書いたプログラマーに
対しての信頼も失われてしまう。

一人でコードを書いているときでさえ、コード規模がある程度以上になると、
自分がつけた適当な名前に自分自身ではまる、という三流パロディーのような事態が
起こりえるが、複数人で開発しているときに適当な名前をつけてしまうと、
各所で「はまる」事態が発生し、開発効率が激減する。

2. 「とりあえず」書いたコードが悪さをしている
命名と同様に、どんな忙しい状況でも、「自分でも納得でき、人に見せても恥ずかしく
ないコードしかコミットしない」ことを守り続けることが重要である。

「今回は時間がないのでとりあえずこのままコミットします」といってコミットしたコードは、
多くの場合次回以降に発見が難しいバグの原因になるし、
場合によっては「今回」もその箇所が原因となって他の箇所で問題が発生し、
はまる原因となる。

「とりあえず」書いたコードとは、例えば次のようなものだ。

- エラーを根本解決せず、外側で例外を強引に捕捉して凌いでいる
- 「理由はよくわからないんですが、とりあえずこうやって書くと動くので...」
- 「危険な臭い」のするアルゴリズム
- 明らかにリファクタリング対象となるような、見た目が極端に汚いコード

期日が迫っており、とにかく時間がない、というような状況だと、
つい「とりあえず」書いたコードをコミットしたくなるかも知れないが、
忙しいときこそ、「適当に書いたコードはコミットしない」ことを死守すべきだ。

ソフトウェアが完成した後に見つかった問題に対応するには、
ソフトウェア完成前の何倍もの手間がかかることを、
私たちは経験的に知っているわけだから。

3. 「このままでは何かがおかしい」と感じながら作業を続けている
これは例えば、「もっといいやり方があるはずなんですけどね...」とぼやきながら、
あまり望ましくないと思われるやり方で開発を続けてる、というようなケースである。

「もっといいやり方がある」と感じるのは、今のコードの書き方だと、
同じような処理の記述を複数箇所に分散せずるを得ない、という状況だったり、
依存関係的にここにこんなコードが入るはずないんだけど、という状況だったり、
意識する必要がないはずのインターナルなクラスや構造を意識しないと問題が解決
しないような状況だったりする場合である。

そして、たぶん、その直感は合っている。

何かがおかしいなら、時間をかけてでもそのおかしさの根本原因を最初に確認しないと、
後ですべてをやりなおすことになる。「何かがおかしい」状態で作業を続ければ
続けるほど、後で必ず修正することになるコードを積み足して行くことになる。

4. ツールに振り回されている
ときどき、いざ問題を解決せん、ということで、頭で考えて大体の当たりを付ける前に、
突然デバッガーを起動して色々なところにブレークポイントを置いてみたり、
プロファイラーを起動したり、ソースコード間を行ったり来たりして
ディスプレイの前で腕を組んで首を傾げ、一向に開発が進まない、という人がいる。

もしこういうはまり方をしやすい人がいたら、
その人に対するアドバイスとして、一度ツールを使うのをやめてみることを提案したい。

そもそも、最近のIDEに搭載されているような便利なツールが存在しなかった頃から、
先人達はデバッグを行ってきたのだ。

はまった時にまず最初に行うことは、ツールを立ち上げることではなく、
「どの辺りに問題があるのか」について、頭で考えて当たりをつけることだ。
そして、その関連箇所のソースコードを読んで処理内容を確認することだ。

問題箇所を頭で考えることに慣れてくれば、
大抵の場合、テキストエディタさえあれば問題は割とすぐ解決できる。
そして、ツールが本領を発揮するのは、当たりを付けていないプログラマーに対してではなく、
当たりを付けているプログラマーに対してである、ということを忘れてはいけない。

頭で考えて当たりをつけることができないプログラマーにとっては、
デバッガーは単に速度の若干遅い実行エンジンでしかない。

5. 「よくあるつくり」に対する理解が乏しい
一つの言語をある程度の深さで習得した人は、
「あの言語でいうXXを実現するにはこの言語ではどうすればいいのかな?」
といった要領で異なる言語に対しても理解が早いものである。

同様に、「pluggableな機構を用意しているフレームワークだったらこの辺りに拡張ポイント
がありそうじゃない?あ、ほら、あった」といった要領で、たくさんのソフトウェアの
「つくり」に触れたことがあるプログラマーは、他のソフトウェアに対する理解が格段に早い。

「つくり」を理解するには、単にソフトウェアを使っているだけではダメで、
使うことになったソフトウェアに「深入り」することが重要だ。

例えばIDEを使っているだけでは、IDEの「つくり」のほんの一部しか理解できないが、
IDEのプラグインを何個も作っていけば、そのIDEの「つくり」についての理解を深めて
行くことができる。

「最近ではXXというフレームワークがあって」というような表層の情報をたくさん
集めることよりも、少なくても良いので、これは面白そうだ、というものについて深入りして、
内部の構造や拡張ポイント、設計の指針などを理解する方が、
速く美しくコードを書けるプログラマーになるための近道だと思うわけである。

6. クラスライブラリの存在を認知できていない
慶応大学の頃、理工学部のとある研究室で、そこにいた助手の人が、
「僕は新しい言語を勉強するときは必ずクラスライブラリのリファレンスにざっと目を通すよ」
と話していたことがあった。

これは新しい言語を学ぶときのとても効率の良い学習方法だと思う。

「頑張って作った後に、言語の方で既に用意してくれているクラスライブラリがあることがわかった」
というのも一種の「はまっている」状況であると言える。

また、単に開発工数が余分にかかるだけでなく、すでにクラスライブラリの存在を知っている人から
見ると、「わざわざ作ったからには何か違う処理が必要だったのでは」という風に見えて
しまい、考える時間を使わせてしまうこともあるので、注意が必要だ。

私は、「あるものは使い、無いものを作る」ことはソフトウェア開発の大原則の一つ
だと考えているが、その観点から言っても、よく使うであろうということですでに言語の方で
クラスライブラリを用意してくれていたり、よく使われるライブラリがあったりする場合には、
何か特別な理由がない限りクラスライブラリを使うべきだし、また、「どの辺りを見ればどの類の
クラスライブラリ群がある」という頭の中のインデックスを、言語習得時に最初に頭に入れてしまうと、
こうした問題は起こりにくくなってくるだろう。

他にもいろいろとあるものの
他にも、ソースコードが世代管理されていないとか、自動化されたテストケースがない、
といったようなジョエルテスト的な話もあるだろうし、プログラマーとしての「読み書きそろばん
のスキルにまず磨きをかける必要がある、という場合もあるだろう。
また、ウェブの情報に頼りすぎて、自分で解決する能力に磨きをかけられていない、という
ような話もあるだろう。


が、今回、上に書いたようなことにテーマを絞りたかった理由は、

(1) 適当に書いたコードは後でとても大きな被害をもたらす可能性が高い
(2) たくさんのソフトウェアの「つくり」に触れ、APIを熟知しよう

という二点を強調したかったからである。

もちろん、ソフトウェアのコンセプトを考えるときなどは、
むしろ、「はまる」ことの連続だし、それが健全な姿だろう。

が、ひとたび作るべきものが見えてくれば、そこから先の開発で
「はまる」時間は極力少なくすべきだし、上に書いたようなことを
気をつけながら開発を進めるように習慣をつけていけば、
頭の中で設計しながらサクサクとソースを書く、という感じで
プログラムが書けるようになってくるものだ。

■ 関連エントリ
プログラマー面接時の技術的な質問事項(アプレッソ版)
そして、ペアプログラミングが始まる
ソースコードのコメント率は20%を切ることが望ましい



アート・オブ・アジャイル デベロップメント<br>
―組織を成功に導くエクストリームプログラミング
James Shore Shane Warden
オライリージャパン
売り上げランキング: 15793
おすすめ度の平均: 5.0
5 現時点で最良のアジャイル解説本
5 アジャイルなやり方の具体的なガイド
5 アジャイルのための練習曲集