ライク・ア・サブマシンガン

スピードのあるコーディングについて、Travis Dunn氏の記事を引用しつつ、私見を整理する。

導入

「コーディングの生産性は人によって大きな開きがある」ということが色々なところで言われています。処理の難易度やバグの量、可読性や拡張性の高さなども考えると、一概に定量評価するのは難しいですが、それでも「速い人と遅い人では10倍ぐらい違う」と言われると、それなりに納得観があるように思います。端的に言えば、速い人なら1日で作ってしまう画面を、遅い人だと2週間位(10営業日)かかるということですね。


開発速度にもっとも影響を与えるのは「調べないと分からないか、もともと知っているか」だと思います。普通のWebアプリケーションで業務部分しかつくっていなければ、ファイルやXMLの操作、リフレクションなどを実装する時に調べないといけないでしょうし、逆にJavaに精通している人でも、初めて使うライブラリには戸惑うこともあるでしょう。


しかし、この記事で問題にしたいのは、そういった長期的な生産性ではなく、「トップスピードに乗っている時に、実際どこまでスピードが出ているのか」というお話です。トッププログラマと呼ぶべき人が書いたコードを読める機会は多くありますが、実際にコーディングしているところを見れる機会はほぼないため、なかなか実感がわかない部分だと思います。筆者も少なくても遅い方ではないと思いつつ、実際には井の中の蛙なのではないかという不安が無くもありません。

サブマシンガン

ここで興味深いフレーズを引用します:

Sub-Machine Guns
Prolonged white-knuckled programming is an unsustainable weapon in the developer’s arsenal, and must be used properly. By properly I mean “like a sub-machine gun”: sustained fire in short, controlled bursts. With ass on seat and fingers on the keys, dump as much code as possible onto the screen, but stop periodically to cool down and re-aim. The pause is only to gather your resolve for another assault and it mustn’t last long, merely long enough to ensure that you’re hitting your target and to crack your knuckles.


サブマシンガン
長期に渡って冷や汗をかきながら行うプログラミングは、開発者の武器庫にあって持続性のある武器ではありません。だから、適切に使われる必要があります。適切にというのは「サブマシンガンのように」ということ、つまり、コントロールされた短い間だけ弾丸を撃つということです。椅子に座ってキーボードに指をのせ、できる限りのコードをスクリーンに打ち込みます。しかし定期的に手を休め、クールダウンして改めて狙いをつけましょう。この休憩は次のターゲットに対する解法を集めるためだけのもので、長く続けてはいけません。対象を撃ち抜くことができることを確信し、指を鳴らす程度の時間です。
Programming at Full Speed: Accelerating the Central Nervous System, Reducing Brain Resistance

これはもうベストのタイピング速度に近いスピードでコードを書いている感じです。TDDの「レッド・グリーン・リファクタリング」サイクルにおいて、レッドからグリーンにするところであれば、この位のスピードが出せるような気がします。また、このレベルのプログラマペアプログラミングを行った時の生産性は恐ろしいものになりそうです。


ここでもう一つ大切なのが、クールダウンを長く続けてはいけないということ。メールを読んだり、ましてやTwitterなどを覗くのはもっての他ということですね。

より深く、より正確に

このスピードで書かれたコードは、直感的には可読性が低いものであるような気がしますが、実際のひどいコードはもっとゆっくりと開発されているケースがほとんどだと思います。つまり、「とりあえずどこかからコピーしてきて、気がついた所を直してみて、動かしてみて、ダメな所を直してみる」というスタイルですね。外から見ると一応ちゃんと動いているように見えるのに、実は中には無駄な処理が多いというのがこのテのコードの特徴です。またコピペが主体のため単位時間当たりのステップ数が意外と多く、一見生産性が高いように見えることが厄介さを上げていると言えます。これに対して、サブマシンガンのようにコードを書くためには、当然コードの最終形についてのビジョンが出来上がっている必要があります。

Head Programming
The quickest way to program is to embark with firm goals and implementation plans, programming the project in your head before you ever touch the keyboard. Formal specs take too long and impulsive programming leads to wasteful back-stepping, so the idea is to develop a balanced mental tour that gives you just enough context and boundaries so that, at any given point as you code, you’ll know what precisely what the next step should be.


脳内プログラミング
プログラムを最も速く行う方法は、はっきりとした目的と実装計画を持って着手すること、キーボードに触れる前に頭の中でプロジェクトをプログラミングするということです。正式な仕様書にはあまりに時間がかかりますし、場当たり的なプログラミングは無駄な手戻りを生みます。重要なのは、必要十分なコンテキストと境界を与えてくれる、バランスの取れたメンタルツアー("mental tour")を展開させ、それによってコーディングをしているどんな瞬間にも、次のステップで何をすべきなのかを正確に把握することができるようにすることなのです。

頭の中でイメージが出来上がっていれば、コーディング速度はほぼタイピング速度とほぼイコールです。そうなると次の問題はイメージをどこまで深く、正確に作り上げることができるかということになるでしょう。ここでいう「深さ」とはリファクタリングの結果現れる最終形にどこまで近づけるかということです。「正確さ」とは実際のコードにどこまで近づいているか、考慮漏れなどをどこまで減らせるか、ですね。

最後に

ポイントは2つです:

  • コーディングを始める前に、頭の中で正確にコードをイメージしておくこと。
  • イメージしたコードは集中して一気に書き出すこと。

こういったことは当たり前のようにやっている人もいれば、まだとてもそこまではできない人もいると思いますが、一つのスタイルとして実践する/目指すのはアリではないかと思います。知的なものと身体的なものを高度に融合させることそれぞれの能力を最大限に引き出すためのリズムを作り上げていくこと、こういったことはどちらかというとスポーツに近いですね。仕事の中にスポーツ要素を見いだしていくことは、品質を高めるためにも、効率を上げるためにも結構重要なのではないかと思うのです。


※なお、サブマシンガンのリズムは短期的なものでしたが、同じことはより長いスパンについても言うことができます。一日の中でのリズム作りについては、こちらをご参照ください。