2007-11-03

K のこと

友人の話をしよう.

先達に敬意を表し, 仮に彼を K と呼ぶ. (イニシャルは便宜的なものだ; 向上心云々と罵ったこともないし, 恋人を寝取ってもいない.) ある時期, 私は K と一緒に働いていた. 今は違う会社にいるけれど, 互いに暇なのか, このごろもよく二人で管を巻いている.

1

K は優秀なプログラマだ. いつも敵わないと思う. 一緒に仕事をしていたこともあり, プログラマとしての私は K から強い影響をうけている. たとえば私が自動テストを始めた発端には K がいる. コードレビューもそう. この日記に出てくる話も K の影響は色濃い. 私は K のあとを追いかけるようにプログラマを続けている.

K と働いてはじめて, ああ, 物事とはこう改善していくものなのかと知った. 何か問題を感じると K は試行錯誤を始める. 問題は私が諦めていたものもあるし, そもそも気付かないものもある. 試行錯誤の中には, はじめうまくいかないように見えたものもある. でも調整を重ね次第に様になっていく. 気がつくといつも何かがよくなっている. 目の前の問題が次々と片付いていく感覚. K の前で開発は加速し, コードの質は上がり, 技術的困難は片付き, チームは進化していった. 私はそれを真似し, たまに手を貸せばよかった. 仕事はハードワークで辛かったけれど, 進化の手応えは愉快だった. 私は何かを学んでいると感じていた.

私より一足先に K はその会社を去った. その後もプロジェクトは開発を続けたけれど, 何かが良くなる手応えは少しずつ薄れていった. 私も少しは試行錯誤をしたけれど, うまくはいかなかった. 私には K のつくった仕組みをただ運用することしかできなかった. 凪に入った, そう感じていた.

2

しばらくして会社を移ってみると, そこには私が使ってきた便利な仕組みが色々と欠けていた. だから私はまず仕組みを再現しようとした. けれど少しも上手くいかなかった. ひどい, こんなこともできない職場なんて. そう不満だった.

部分的に再現した仕組みも運用を続けることはできず, 段々と劣化が進んだ. やがてプロジェクトが燃えあがり, 混乱が続き, プレハブのような私の環境はすっかり失われてしまった. 私はただ漫然とコードを書き続けていた. 退屈だった. 仕事や職場に失望していた.

どこかの会社にいる K は, 新しい仕事を楽しんでいるようだった. その職場にもコードレビューを導入し, 強力な自動テストのフレームワークを作り, その他にも新しい試みを進めているという. トップスピードで最先端のソフトウェア開発をしている自負を感じた. K の職場が羨しく, K が羨しかった.

会って管を巻くたびに, K の試行錯誤について話を聞いた. 私も愚痴を話した. いつも K は助言をくれたが, 私にはそれを実行できる気がしなかった. 実行してみたものもあるが, 案の定つづかなかった.

私の仕事は K の仕事と違ったし, 私達のかつての仕事とも違うものだった. 分野も違い, 売り方も違い, 同僚の顔ぶれも(当然)違っていた. 優劣以前にこうした差異が物事を複雑にするのだと私は気付き始めた. K の作った仕組みはかつての仕事に合わせた特製だった. だからそれを他で使ってもうまくいかない.


うまくいく印象が強かったせいか, 私はかつての K のやりかたを現実的な最適解だと根拠なく信じていた. K 自身は新しい職場に合わせて仕組みを変えていると話していたが, 私がその意味をつかみ, 自分の間違いを自覚するまでには時間がかかった. 失敗を環境のせいにしながらやさぐれていた. たしかに原因は環境にあったが, それは優劣より差異の問題で, 本質的に避けては通れないものだった.

3

K は以前よく <泥の中で一歩を踏みだす> 重要性を語っていた. デスマーチの混乱の中, 理想からほど遠い環境でいかに最初の改善を始めるか. その難しさと戦略を K は議論した.

仕事に正解はない, とは思わない. ソフトウェア開発について言えば, 正解の多くは教科書に書いてある. ただ現実の <泥> の中で教科書どおりに振る舞うのは難しい. 足に絡む <泥> はやる気のない同僚や無能な上司, 不条理な顧客かもしれないし, まあ多くの場合は自分自身の能力不足でもあるだろう. 教科書どおり振舞うには能力が必要で, 能力を身につけるには訓練がいる. しかしフォーマルな訓練を受ける余裕はない.

<泥の中で一歩を踏み出す> とは, そうした制限の中で実現可能な定石のサブセットを探すこと, それを実行することを言う. 高速な "単体" テストが無理でも少し時間のかかる自動テストならできるかもしれない, インスペクションが無理でもウォークスルーならできるかもしれない... フルスクラッチは無理でも部分的にならレガシーコードを駆逐できるかもしれない. 適切なサブセットが軌道に載ったらスコープを広げ, 少しずつ正解に近づけていく. こうしたプラグマティックなブートストラップを K は <泥の中の一歩> と呼んだ. K が踏み固めた足元にある泥沼を私は見ていなかった. 道半ばに満足していた.

最近の K はこの話をしない. 歩みを進め, 沼地のある森を抜けたのだと思う.

4

程度の差はあれ, どこにでも泥沼はある. 漫然と暮らしてきた私はまだ泥の中にいる. K に頼らず <泥の中の一歩> を実現しようとする私は, すぐにその難しさを思い知った.

山ほどあるサブセットから, どうやって適切な妥協点を選べばいいのだろう. 絡まりあったプラクティスをときほぐして本質に迫る根気と, サブセットの善し悪しを判断するクライテリアを K は持っていた. 私にはそれがわからない.

忙しいときでも続けられるよう, あまり面倒で複雑なことはできない. かといって簡単でも効き目がないものはだめ. 環境によって問題の在処はそれぞれだから, プラクティスの優先順位は必ずしも明らかでない. プラクティスには相互作用があり, ひとつだと片手落ちなものもある. 効き目はあるが正解に繋がらない袋小路もある. 根拠の薄いカルトも潜んでいる.

中には実際に試してみないとわからないこともある. だから試行錯誤をする. でも簡単だと思って試したら難しいプラクティスは多い. 手の動かしかたがわからず諦める.

試してみたところでその効果を判断するのは難しい. 実質的な成果がなくても手を動かしているせいで偽の達成感を覚えてしまうもの. そうしたプラクティスは形骸化する. 習熟が必要と言われるプラクティスの扱いにも困る. 下手なだけなのか無駄なのか, どうすれば上手くなるのか. 時間がかかるものも失敗する. いつも途中で挫けてしまう.

試行錯誤に挑むと, 自分がいかに自身の生産性に無頓着かを痛感する. 普段の習慣のうち, どこまでが惰性やカルトなのかわからなくなる.

こうして <泥の中の一歩> は行き詰まる. ぬかるみのなか, 私は途方に暮れる.

うまくいく <一歩> は単なるサブセットではなく, 何らかのアレンジを含むことがある. そのアレンジに使える手札の多さはエンジニアの能力の指標にもなる. K の話を聞いていると, そうした独自のバリエーションがあらわれる. 私にはそれがない.

K の手札は洞察だけでなく, 経験と知識にも裏付けられている. ここまでを読むと単なる仕事術マニアに思えるかも知れないけれど, 実際の K は OS や言語といった基盤の話題から Web のテクノロジにまで広く精通したエンジニアだ. バリエーションの中にはちょっとした運用のチップスから 真似のできない謹製ツールやライブラリまでが含まれている.

5

K は優秀なプログラマだ. いつも敵わないと思う. K の志は高い. たとえばプロジェクトのゴールの他に, 自分自身の基準を持っている. 頼まれもしないのに単体テストのカバレッジを気にしたり, 見積りのための作業記録を黙々とつけ続けたり, レポジトリやバグデータベースを叩いてプロジェクトの収束具合をウォッチしていたりする. 仕事で使うフレームワークのコードを読んでいる. 秘伝のライブラリを持っている. よく勉強もしている. 同じ本を読んでも, 私と K で内容の理解度は大きく違う. 議論の中で引用され, そんなことが書いてあったかと驚くことは多い.

私はそこまで高い意識を持っていない. 日常的に妥協や言い訳を積み重ねている. 私はそれをプロジェクトの遂行に必要だと思っているけれど, K の話を聞いたあとは単なる手抜きだったと反省する.

私が <一歩> を踏み出すのに必要なのは, 筋肉としての技能を貫く骨格としての志なのだろう. 今はそう思うようになった. 脂肪ぷにぷにで骨粗鬆症の自分を鍛え直す目処はまだ立っていない. くらやみのなか, 私は途方に暮れる.