見出し画像

エンジニア三十路環境で戦う為の「意思の力」の使い方 あるいはテスト駆動生活

私の誕生日は1990/5/21。

この文章を書き出した2020/5/20 22:08の約2時間後、晴れて三十路に突入する。

大学時代の自分にとって、そこは死後の世界と同意義だった。「人生設計」という言葉がめっぽうニガテで、「三十路に入ったら見る」と乱雑にリマインダを設定して、普段目につかないフォルダに放り込んで忘れることにしていた。しかし、そのリマインダがあと1時間半で発火する。

ふらふらと気ままに、やりたいことだけやって漂った30年だった。しかし、私にはどうも人と環境と好機に恵まれる才能があったようで、いつのまにかとある会社に辿り着き、日々楽しくプログラマとして働いている。総合的に見ると満点に近い。

しかし「このままではよくない」という漠然とした不安が残っている。それは今の境遇にではない。自分自身に対してだ。

私が愛してやまないカードゲーム、MTG(マジックザギャザリング)には、「意思の力」というカードがある。重いコストと引き換えに、実現したいことを無理やり実現させることができるカードだ。

Force of Will / 意志の力
あなたは、この呪文のマナ・コストを支払うのではなく、1点のライフを支払うとともにあなたの手札にある青のカードを1枚、追放することを選んでもよい。
呪文1つを対象とし、それを打ち消す。
「私の運命は私が決める。」

連発するとゲームに勝てなくなるデザインも含めて、かなり好きなカードだ。意志の力ってそういうものだと思う。イラストもかっこいい。

俗に「下の環境」などと呼ばれる、強いカードがひしめき合う環境で戦うには、なくてはならないカードの一枚だ。

三十路の入り口を散歩していたら「あー、三十路ってことは俺も下の環境かなー」というフレーズがふと浮かんだ。ここから先ではこのカードの使い方が鍵になる気がするので、そんな切り口でここに書きなぐってみようと思う。

ちなみにこの記事には技術の話は一切出てきません。たぶん。

スパゲッティコードみたいな20代の生活

あと1時間。書き切れるかな。

私の20代は、人生における設計という概念をまるまる放棄して、とりあえず動くものを「意志の力」で無理やり動かす毎日だったと思う。

全くわからん仕組(注1)で実装された自分を、全くわからん仕様(注2)の社会で、ランタイムエラーを吐き散らかしながらとりあえず動かす、というのをひたすら繰り返してきた。人生にもtab補完が効く静的型があればいいのに。

(注1)夢とか知識とか野望とか欲とか嫉妬とか見栄とか依存とか理想とか
(注2)大学とか会社とか友達とかシェアハウスとかエンジニアコミュとか

寝る前にやらかしたことを思い出してデバックする毎日。今日も明日も明後日も、吐き出されるエラーログの多い生涯を送っている。とはいえ冒頭でも話したように、私は外部要因に恵まれたサービスだったようで、社会に新卒リリースされた頃からは想像出来ないくらいにスケールすることが出来ている。あの時は死ぬかと思った。主に自分のせいで。

この「とりあえず動くもの」主義の生き方は、結果論だが、私の性格まで加味すると20代の戦略としては実は間違ってなかったのではと思う。運で上振れた実力で得点をかさねつつ、致命的な現象を直感と理性で弾く。カードゲームで言うところのクロックパーミッション的な生き方(この辺はまた別で記事を書きたい)だ。

あと全くの余談だが、20代の間にスパゲッティのソースは作るのが随分得意になった。

自家製ボンゴレロッソ。うまいよ。

三十路を行くための設計

ここまで書いて12時を回った。三十路突入である。

前段の通り、20代は中身の実装の割にはそこそこ上手くいっていた。しかし、現在の行き当たりばったりムーブはおそらくこれからの環境では通用しないだろう。サービスなら上場を考えるタイミングだ。責任が重くなる時期。いい加減「なんかエラーだすまん」でなんとかするわけには行かない。何より今のままだとスケールしない。

アーキテクチャが必要だ。

スパゲッティコードと向き合うために必要なこと。そう、テストを書くことだ。TDD(テスト駆動開発)は、私が愛してやまない開発技法の一つだ。大まかに説明すると、以下のようなサイクルを繰り返す技法だ。

【レッド】これから作る物に、今の実装では失敗するテストを書く

【グリーン】そのテストが動くようにとりあえず実装する

【リファクタ】作ったテストが動く状態を維持しつつ、設計を調整する

これは大変効率が良い。「最初から成功するようにしよう」「最初から綺麗に設計しよう」というような「意思の力」を極力使わず実装できる。短いサイクルを繰り返すため、開発にテンポができる。カードゲームの「フェイズ」みたいなものだ。アンタップ、アップキープ、ドロー。考えることの多いMTGのゲーム進行でも、手癖になるまで繰り返した習慣は考えずに行うことができる。CIツールが大事なことからわかる通り、習慣は強力な品質改善ツールの一つだ。

しかし、ここでひとつ、お恥ずかしい話がある。私は20代中盤まで、おおよそ習慣と呼べる物を何一つ何も持っていなかった。気分重視でなんとなく、気が向かなかったらまた今度、気分が向いたらそろそろやろう。何かにつけて、それこそ朝起きて顔を洗って歯を磨くことすら、やらねばならないことをいちいち考えて生活していた。

これは大変効率が悪い。何かをする度に「意志の力」が必要だ。「意志の力」は強力だがコストが重い。歯磨きをするのに1枚手札を捨てて1点ライフを支払っていてはゲームにならない。そして何より「意志の力」を使ってゲームに勝てないと、だんだん使い方自体がわからなくなってくる。

行動のたびにかかるコストを踏み倒すこと。「意志の力」を切る回数を減らして戦えるようになること。反復する強力な習慣を手に入れること。これが、私が三十路環境で戦うために必要なカードだと思う。

Force of Schedule / 予定の力

TDDは設計のないものに段階的に導入して段階的に改善することができる。これこそ今私が導入すべきものであろう。そんなわけで、明日から私はこんなカードを毎朝切ろうと思う。

Force of Schedule/ 予定の力
あなたは、今日1日気分で動くのではなく、すこしの手間を支払うとともに、googleカレンダーに今日1日の予定すべてを書き込んでも良い。
予定にない行動を対象とし、それを打ち消す。

つまり、テストを先に書く。毎日のすることを、毎朝日記に先に書いておく。そしてそれを続ける、ということだ。人によっては当たり前なのかもしれないが、少なくとも今の私にはできていない。

これはとても強力だが脆く「急な飲み会」やら「なんとなくの憂鬱」などでたやすく無力化されてしまう。

しかし、これを維持することができれば、「歯磨き」「洗濯」「読書」「ブログを書く」などの、後続の通したいアクションを「意志の力」なしで通すことができるようになる。三十路環境で戦うにはこういう戦略が必要だと思うので、これを通すために私は「意志の力」を切っていこうと思う。

** FAIL 2020/5/20/writeNote.spec.ts**

さてはて。

20代のうちに描き切るつもりだったが、結局3時間以上オーバーしてしまった。予定の力失敗である。1時前には寝るはずだったのだが。

だが仕方ない。テスト駆動開発は必ずレッドから始まる。最初はテストが失敗するものだ。ここから実装を進めて行けば良い。

大切なことは、テストが落ちてもへこまないこと、テストが落ちている状態で他の実装をしないこと、そして、TDDをやめないことだ。

「予定の力」で最初に手に入れるべき習慣は「予定の力」。

Kent BeckのTDD本によれば、テストライブラリの開発には、開発中のテストライブラリ自身を使って、自己参照的にTDDをすることができるらしい。なので多分、最初はこれでよいのだろう。

レッド、グリーン、リファクタリング。

私の1日は、私が決める。

とはいえ、カードゲームには対戦相手、テストコードにはレビュワーが必要だ。そんなわけで「積極的に遊ぶ時間」は当面減らすつもりがない。リモート飲みなどなどのお誘いはください。できればたくさん。だいたい行く。よんでね。

そんなわけで、これから三十路の入り口で、テスト落としまくって右往左往していきます。

アンタップ、アップキープ、ドロー。

メインフェイズだ。

いいなと思ったら応援しよう!