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

第5回 体力vs.スキル

この記事を読むのに必要な時間:およそ 3.5 分

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

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

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

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

筋力と心肺

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

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

体力とスキル

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

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

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

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

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

訓練と勉強

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

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

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

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

注1)
井上雄彦 著,集英社

プログラマの訓練

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

競技プログラミング

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

プログラミングパズル

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

注2)
Gayle Laakmann McDowell著/Ozy訳/秋葉拓哉,岩田陽一,北川宜稔監訳『世界で闘うプログラミング力を鍛える150問 ──トップIT企業のプログラマになるための本』マイナビ,2012年

Code Kata

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

写経

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

養成ギプス

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

注3)
ThoughtWorks Inc.著/株式会社オージス総研,オブジェクトの広場編集部訳『ThoughtWorksアンソロジー ── アジャイルとオブジェクト指向によるソフトウェアイノベーション』オライリー・ジャパン,2008年

再発明

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

著者プロフィール

森田創(もりたはじめ)

平日はWebブラウザの開発,休日はWebブラウザの利用に従事。最近の趣味は/etc/hostsファイルに中毒性の高いWebサイトをリストし,127.0.0.1にリダイレクトすること。現在7サイト。スマートフォンの勉強をしなければと思いつつ/etc/hostsにアクセスできない端末を持つのが不安で躊躇している。

http://steps.dodgson.org/

コメント

コメントの記入