Comparators―比べてみればわかること

第5回体力vs.スキル

最近、ジム通いをはじめました。最初は億劫(おっくう)でしたが、慣れてくると体を動かすのも良いですね。ただ、自分の体の輪郭がだんだん気になりはじめ、ジムを闊歩(かっぽ)する筋骨隆々の男たちを眺めながら申し訳ない気持ちになったりしています。

職業プログラマである私にスポーツ選手のような筋肉がなくても、それは仕方がありません。代わりに専門たるプログラミングでならそこらの非専門家には負けないはずです……と言いたいところですが、どうでしょう。スポーツ選手の筋肉に並べて恥じないプログラミング力を、どれだけのプログラマが持っているのでしょう。そもそもプログラミングで筋肉にあたるものは何なのでしょうか。

筆者の勤務先には競技プログラミングの出身者が多くいます。競技プログラミングとは、与えられた問題に答えるコードを書いてコーディングの速度や正確さを競うゲームです。TopCoderICPCInternational Collegiate Programming Contestといった大会がよく知られています。

競技プログラマにはプログラミングの筋肉がありそうです。彼らは難しいアルゴリズムをバグなく書き上げます。既存のコードに潜む込み入ったバグを、どこまでも追いかけて仕留めます。複雑な問題を速くバグなく書き上げる力。複雑さの重みを押し返す力。これらはプログラミングの筋力だと言えるでしょう。

筋力と心肺

プログラミング力を身体能力にたとえるなら、筋力だけを引き合いに出すのでは不十分です。もう一つの身体能力である持続力、心肺能力について考えてみましょう。大雑把に言えば短距離走に対する長距離走の能力です(不正確さはご容赦ください⁠⁠。

コードをたくさん書くプログラマがいます。朝から晩まで集中力を途切らせずに書き続け、次々とコードをコミットしていきます。長続きする集中力を糧にたくさんのコードを書き上げられること。これをプログラマの心肺能力と言うことができるでしょう。

体力とスキル

プログラマの筋力や持続力を、まとめてプログラマの体力と呼ぶことにします。一方、私たちプログラマはよくスキルについて考えます。

スポーツの世界では、体力とスキルは別のものです。スキルは、たとえば野球の投手が狙った位置にボールを投げ込むこと、サッカーの選手が鮮やかなフェイントで相手を抜き去ること、身体のパーツを巧みに制御して目的を成し遂げる技能、その技能を司る脳の働きです。これは体力とは違います。たとえばどれだけ強靭な筋肉や心肺があってもストライクゾーンの隅を攻められるとは限りません。

とはいえ、スキルの実現に一定の体力が必要なのも事実です。体力がなければ体を動かせませんし、長く激しい訓練に耐えることができるのも体力あってのことです。

プログラマにも同じことが言えます。特定のプログラミング言語やプラットフォーム、問題領域に関する知識や経験。こうしたプログラマのスキルは、同じプログラマの体力とは必ずしも一致しません。複雑なアルゴリズムを書き下ろせるからといって、たとえばiOSの流儀に合わせたアプリケーションを作れるわけではないのです。

しかし体力のあるプログラマなら、より短い期間で多くのスキルを身につけることができるでしょう。込み入った問題に怯(ひる)まず多くのコードを書き、試行錯誤を重ねることができるからです。

訓練と勉強

新しいプログラミング言語を勉強する。新しいプラットフォームについて勉強する。プログラマはたびたび「勉強」を口にします。一方、スポーツ選手は日々「訓練」をしています。

「勉強」という言葉には知識を身につける含みがあります。一方の「訓練」には体力やスキルを高める狙いがあります。とはいえ実際のところ、プログラマの勉強は知識の獲得だけが目的ではありません。プログラマの勉強は知識だけでなく、訓練のようにスキルを高める狙いもあります。よく「手を動かして覚える」と言いますが、これはスキルの獲得そのものです。

けれど体力はどうでしょう。プログラマは勉強を通じ、筋力や心肺を鍛えようとしているでしょうか。たとえば勉強の一環として競技プログラミングに取り組むプログラマはどれだけいるでしょう。多くのプログラマにとって勉強は知識とスキルを高める営みであるように見えます。

しかしスキルにつながる訓練は体力が支えています。体力に目を向けずスキルにばかり気を取られるのは、スポーツでいうなら筋トレやランニングなしに実戦練習だけつまみ食いするようなもの。⁠SLAM DUNK』注1の三井君みたいに、後半で息切れしたりしませんか。

プログラマの訓練

幸い、プログラマの中にも訓練による体力アップを重くみる人々はいます。ここではそうした人々が好む訓練方法をいくつか紹介しましょう。

競技プログラミング

問題を解く速度を競うスポーツとしてのプログラミングです。TopCoderやICPC、国内ではAtCoderなどが知られています。大会によって、筋力を重視する短期決戦型の試合と心肺を重視するマラソン系の試合があります。

プログラミングパズル

競技プログラミングから勝敗を取り除いたのものをプログラミングパズルを呼ぶことにします。ただ問題を解くだけですが、勝敗のプレッシャーがないぶん気楽です。代表格であるProject Eulerのほか、コードゴルフどうかく?99 Lisp Problemsなどが知られています。コーディング面接の参考書[2]なども問題集とみなせるでしょう。

Code Kata

数年前、訓練のために作られたプログラミングの問題集をCode Kataと呼ぶ流行がありました。空手の「Kata」というわけです。一見どうということのない課題が大半ですが、人々は「少し頭をひねる」ことに訓練としての意義を見いだしました。Web上には多くのバリエーションを見ることができます。

写経

各種サンプルコードを自らタイプしなおして動かす作業を「写経」と呼びます。比較的負担の小さい、ウォーキングやキャッチボールのような訓練です。慣れない環境で、普段使わない筋肉を動かすには良い方法です。

養成ギプス

『ThoughtWorksアンソロジー』注3で紹介されている「オブジェクト指向養成ギプス」は、コードに特定の制限を課す訓練です。たとえば「else 節を使わない」⁠2段より深いインデントをしない」といったルールでコードを書きます。こうしたルールに従うとコードがオブジェクト指向的になると著者は主張しています。日常に訓練を紛れ込ませる意味で、⁠テレビを観ながら腹筋しよう」といった「ながら訓練」の仲間でもあります。

再発明

普段使っているライブラリ、テキストエディタからプログラミング言語まで、すでにあるプログラムを再発明するのも良い訓練です。筋力に偏りがちな多くの訓練に対し、再発明はたくさんのコーディングが必要な心肺系の訓練です。コーディングに没頭したいなら再発明はもってこい。オリジナリティや仕様策定といったコーディング以外の雑事に気を取られなくて済むからです。

訓練のコツ

どうすれば効果の高い訓練を続けることができるのでしょう。周囲にいる訓練好きの人々を見ているうちに、いくつかのコツがわかってきました。

効能を絞る

漫然と訓練してもつらいだけです。目的を意識し、ほかのことに気を取られないようにしましょう。特定のスキルを鍛えるなら、そのスキルの登場するコードを重点的に書き、慣れたコードは省きましょう。筋肉を鍛えたいなら保守性など心肺機能的な指標に惑わされず、入り組んだ制御構造と向かい合いましょう。心肺能力を鍛えたいならライブラリを探す前にコードを書きましょう。

用意された題材を使う

競技プログラミングやCode Kataなど、誰かが用意してくれた問題を使ってみましょう。プログラミングの題材を考えるのは必ずしも簡単ではないからです。下手に決めると目的から外れた脇道に入り込みがち。スポーツにたとえるなら、既存の題材に便乗するのはジムでランニングマシンを使うのに似ています。信号や坂や歩行者に邪魔されることなく走りに集中できます。

コードを捨てる

訓練で書いたコードは何かの役に立てようとしないことです。デザイン、バージョン管理、リリース、チームビルディングに広告。役に立つソフトウェアを作るにはコードを書く以外にもやることがたくさんあります。訓練としてプログラミングに集中するなら、そうした雑事は減らす必要があります。書いたコードを捨てると決めれば、役に立つコードを書きたい誘惑を退けることができます。訓練用ディレクトリを作り、安直なファイル名のファイルにコードを書きましょう。公開目的で整理したりせず、散らかしておきましょう。なお心肺を鍛える大量のコードを書く際はこの限りではありません。大きなコードに構造は必要ですし、意欲を保つために公開をゴールにするのは悪くない方法でしょう。

仕事と訓練

職業プログラマは仕事でコードを書いています。それは訓練の足しにならないのでしょうか。筆者は多くを期待していません。

まず心肺機能について考えてみましょう。あなたが新しい小さなプロジェクトで働いており、毎日たくさんのコードを書いているなら、そのプログラミングは心肺の訓練と言えるでしょう。けれど大きなプロジェクトで既存のコードを少しずつ変更しているとしたら、心肺への負荷は訓練として不十分です。そしてプロジェクトが大きくなるほど、仕事の中でプログラミング以外に占められる時間は大きくなります。

筋肉はどうでしょう。筋力を鍛えるには複雑なコードを書かなければいけません。きわどいエッジケース、入り組んだデータ構造とループ。そんなコードを詰め込んだソフトウェアの複雑さは極めて大きなものになるでしょう。複雑さはソフトウェアの敵です。訓練はともかく、仕事でそんなコードを相手に成功できるでしょうか。おそらく複雑さが限界を超え、プロジェクトは破綻するでしょう。そうならないよう、現実のソフトウェアは注意深く複雑さを抑えています。要するに、筋力への負担を下げているわけです。

このように、仕事の、あるいはソフトウェア開発でのプログラミングは必ずしも訓練の足しにならないことがわかります。

スキルだのみ

筆者は仕事でよくブラウザのクラッシュバグを直しています。クラッシュバグの修正は難しい仕事です。再現ケースを絞り込み、メモリ破壊の原因を推理しながらバグを追いつめていきます。大変なのは調査に限りません。時には修正自体にも複雑なコーディングが求められます。

2年前の筆者にとって、クラッシュバグの修正はプログラミングの筋肉に負担がかかる仕事でした。そのうえバグは次々と割り振られてきます。複雑さも量もたっぷり。これなら訓練不足の心配はない、筆者はそんな風に考えていました。ところがあるとき、筆者は淡々とクラッシュバグを直す自分に気づきました。1日に数個の修正を済ませることもあります。今や筆者にとってクラッシュバグは簡単に直せる部類のバグとなったのです。

何が起きたのでしょう。筋肉がつき、バグの重みをもろともしなくなったのでしょうか。残念ながらそんな様子はありません。おそらく、向上したのはスキルです。修正を重ねる中でコードへの理解が深まりました。典型的なクラッシュのパターンに詳しくなりました。分析用のツールも手に馴染みました。こうしたスキルを身につけた結果、クラッシュバグの修正は筆者にとって簡単な仕事となったのです。

スキルがついたのは良いことですが、筋肉への負担は消えてしまいました。同じ種類の仕事を繰り返した結果、筋肉の訓練がスキルの訓練に入れ替わってしまったわけです。同じことは心肺の訓練にも起こります。同じようなWebアプリケーションを何度も作っているうちに、心肺に負担をかけていたたくさんのコーディングが紋切り型コードのタイピング作業に変化した経験はありませんか。このとき、体力を鍛える訓練はスキルに転化しています。職業プログラマとしては正しい成長です。とはいえ訓練が消えてしまったのは問題です。このままでは運動不足になってしまいます。そして運動不足による体力の衰えは、やがてスキルを蝕(むしば)むのです。

バグトレ

クラッシュバグはさておき、バグ修正一般は筋力を鍛える良い題材になりえます。規模が小さく、けれど規模の割に手応えがあるからです。他人の書いたコードを直すのが訓練向きです。見慣れないコードのクセが、普段使わない筋肉を刺激してくれます。オープンソースプロジェクトのバグはもってこいの訓練材料だと言えます。ただしパッチが取り込まれなくても落ち込まないこと。これは筋トレなんですからね。

汗を流す

本稿ではスポーツのメタファでプログラミングの体力について考え、体力とスキルの違いを議論しました。そして職業プログラマが陥りがちな体力不足に目を向け、体力を鍛える訓練をいくつか紹介しました。

スポーツのメタファは体力だけでなく、プログラミングの楽しみにも広げることができます。職業プログラマとしてソフトウェア開発が生活の糧になると、ソフトウェアの完成ばかりに気をとられがちです。そのとき私たちはプログラミングそれ自体の楽しみを忘れかけてしまいます。日々の仕事でこなす客先巡りに疲れ果て、いつの間にか週末の草サッカーから足が遠のいたスポーツ好きの会社員を想像してください。

スポーツで汗を流すのは、やってみれば気分が良いものです。同様に、気兼ねなくコードを書くのもまた楽しいものです。プログラマならそれを知っているはず。訓練を通じて体力をつけ、コーディングの楽しみを取り戻しましょう。

おすすめ記事

記事・ニュース一覧