あの頃の、この仕事の愛し方
AIがエディタの中に住み着いたとき、何が変わったのか。仕事が「自分のもの」だと感じさせてくれた、6つのゆっくりとした道のりについての短い告白。
昔は、この仕事を違う形で愛していました。AIがエディタの中に住み着いたとき、何かが変わりました。今でも何度も思い返してしまう、6つの記憶があります。
デバッグが好きだった頃
Spring Bootのアプリケーションを起動し、流れていくスタートアップログを眺め、深いところにブレークポイントを仕掛け、一行ずつコードを歩いていく。自分の書いたメソッドの中に入る。そして、自分の書いていないメソッドの中にも。さらにサードパーティのライブラリに飛び込んで、本当は何をしているのかを覗き込む。バグを見つける頃には、必要以上にシステムを理解していました。
気づいた瞬間が、一番の楽しみでした。一時間ステップ実行を繰り返したあと、ふとそれが見える。ああ、これがオフバイワンか。これが誰も無効化していなかったキャッシュか。これがコミットの早すぎたトランザクションか。自分が息を止めていたことに、そこで気づく。
今はスタックトレースを貼り付けて、答えを読むだけ。プロジェクトをローカルで動かしておく必要さえありません。パッチはきれいに収まる。でも、本来なら頭の中に出来上がっていたはずのシステムの地図が、ありません。
しつこいやつ
何日経っても消えてくれないバグ。
それを抱えたまま家に帰る。恵比寿から乗った日比谷線の中でも、ずっと考え続ける。秋葉原でドアが開いても、まだ考えている。眠ろうとしながら、もう一度コードの道筋をたどる。日曜の午後、別のことをしているとき、ふと原因かもしれないものが浮かぶ。確かめるためだけにノートパソコンを開く。プロジェクトを開く。再現コードを走らせる。同じように失敗するのを見届ける。あるいは、ようやく原因が姿を現すのを見届ける。
あの期間、バグは同居人でした。一緒に暮らしました。直ったとき、なぜ直ったのか、ちゃんと分かっていました。
そういうバグを何度も抱えていると、お客様からのチケットはタイトルを読むだけで十分になります。一行読めば、プロジェクトを開く前に、コードのどのあたりが怪しいか見当がついていました。
今はエラーとコンテキストを貼り付けます。モデルが3つの原因を提案してくれる。そのうちの一つが正解。バグは昼休みまでに消えています。
もっと静かな喜び
読みやすいコードを書くこと。
必要な行だけをDBから取ってくる。Javaのストリーム。呼び出し側が欲しい形に変換するマップ。Collectors.groupingBy。collect。チェーンを左から右へと読み返して、データがその中を流れていく様子を見る。すべてのステップに名前があり、無駄なものは一つもない。改行の位置が一番きれいに見える形になるまで、3回くらいフォーマットし直しました。
Map<CustomerId, List<OrderView>> byCustomer = orderRepository .findPlacedSince(cutoff) .stream() .map(OrderView::from) .collect(Collectors.groupingBy(OrderView::customerId));
コードは一つのことだけをして、見た目もそうだった。それが大事でした。
今はモデルがチェーンを書きます。最初のバージョンでだいたい動きます。
稀な楽しみ
再帰を求めている問題。
木構造を歩く必要があると気づく瞬間。あるいは、入力の形と部分問題の形が同じだと気づく瞬間。まずベースケースを書く。それから再帰呼び出し。任意の深さに対応できる、たった3行のコード。読み返して、まだ思いついていない入力に対しても動くと分かる。半秒間だけの誇らしさが、その日の残りずっと続きました。
今はモデルが再帰を書きます。時々、頼んでいないメモ化まで付けてくれます。木は歩かれる。私は次に進みます。
もう一つの楽しみ
クエリを速くすること。
スロークエリログは、サービス開始の日から有効にしていました。それは仕事じゃなくて、本番運用の衛生管理です。楽しみは数ヶ月後にやってきます。以前は20msで返ってきた権限チェックが、joinのスケールが悪くて800msかかるようになる。負荷テストが、ボックスを溶かしている一つのクエリを浮かび上がらせる。ログがひっそりと集めてくれていたものと一緒に、午前中を過ごします。
クエリを一つ選びます。プランナーに噛みごたえのあるデータを与えるため、ローカルコピーに数十万行の代表的なデータを生成します。サブクエリを試す。CTEを試す。プランナーがずっと読み間違えるjoinに、インデックスヒントを強制する。EXPLAINを実行前と実行後で読む。2秒だったクエリが40msに落ちるのを見届ける。
半日が消えていきます。誰かに頼まれたわけではない。理由を知りたかったから。
今はクエリを貼り付けて尋ねます。モデルが3つのインデックスと書き直しを提案します。そのうちの一つが効きます。クエリは速くなる。私は次に進みます。
ゆっくりとした楽しみ
コードを一行も書く前に、何日もシステム設計に時間をかけること。
drawioに書くインフラ図。VPC、サブネット、ECSタスク、RDS。負荷が10倍になったとき、どこがボトルネックになるかを問う。ノートに書くデータベーススキーマ。アクセスパターンから割り出すインデックス。リソースのリストとして描かれるAPI面と、それぞれに付いてくるべき等性とページネーションの問い。一晩寝かせる。翌朝、半分消す。もっとシンプルな形で戻ってくる。
システムは、リポジトリに存在する前に、頭の中に存在していました。書き始める頃には、すべてのファイルが自分の役目を分かっていました。
今は欲しいものを説明します。モデルがアーキテクチャを提案してくれる。妥当に見える。私たちは始めます。
残ったもの
答えは今でもやってきます。ただ、そこへたどり着く道のりが、消えてしまいました。それと一緒に消えていったのは、本来なら頭の中に出来上がっていたはずのシステムの地図、一日続いたあの誇らしさ、私と一緒に暮らしていたバグです。私はもっと速く動きます。「考えること」を外注しています。何年もかけて積み上げてきた直感が、薄くなっていきます。脳が柔らかくなっている気がします。何かが静かになりました。どうしたらいいか、まだ分かりません。