megamouthの葬列

長い旅路の終わり

俺はチューブ

ある朝、俺はなにか気がかりな夢から目をさまして、自分が寝床の中で一本のチューブに変わっているのを発見した。

俺はチューブだ。AIに投げて、返ってきたものを受け取って、また投げる。ロジックの本質は俺をすり抜けて、構築中のシステムとチャットウィンドウの間を往復している。それは確かに俺の中を通ってはいるが、俺には触れていない。どこにも積み重ならない。

時にはもう少し高度な役回りをすることもある。顧客からの苦情が届く、AであるべきところがBになっている。という具合だ。俺はチューブ以外の役回りが出来たことに内心はしゃいで、意気揚々とコンディショナル・ブレークポイントを仕込む。ここがBであるときにデバッガが止まるようにする。そして顧客と同じ操作をして、デバッガが止まるのを待つ。
デバッガは止まった。変数を覗き見しても、何が起こっているかはおぼろげにしかわからない。ただ、チューブ+αとしては上等だ。俺は居丈高にAIに言う。
「ここに来た時にBになっているぞ!俺の考える仮説はこうだ」AIはそれを受け取って、慇懃に謝罪して、修正する。
その修正案には俺の仮説は欠片も残っていない。しかし、デバッガは止まらなくなっている。結果も問題ない。これにて今日のタスクは終了だ。
クラムシェルのノートPCの蓋を閉めながら俺は考える。今日の俺は、チューブ以上だったか?AIならきっと肯定するに違いない。「あなたなしではこのタスクはこなせませんでした」
あの嘘つきの太鼓持ちがそう言うなら、俺はチューブだった、ということだ。

俺はチューブに甘んじている。

それで、ふと思った。そもそも俺は何者だったのか。

エンジニアのアイデンティティというのは、だいたい二つの柱で成り立っている。一つは「物事に対して技術的な観点から回答できる」こと。もう一つは「複合的な問題を切り分けて、一つ一つ潰していける」こと。これが俺たちの飯の種であり、プライドの源泉だった。転職サイトのスキルシートに並ぶ言葉ではなく、もっと内側にある、自分がエンジニアである根拠のようなものだ。

それを手に入れるために、俺たちは「経験」を積んできた。新しいフレームワークが出れば、無理やりプロジェクトに突っ込んで職務経歴書を仕上げた。客先で怒られながら覚えたこと、深夜に一人でエラーログを睨みながら掴んだこと、そういう痛みの蓄積が「経験」の中身だった。少なくとも俺はそう思っていた。その経験が、技術的な判断の根拠になって、会議で発言できる根拠になって、自分がここにいていい根拠になる。

ChatGPTを初めてまともに使った時、俺はしばらく黙っていた。

こいつは、俺がアイデンティティと呼んでいたものを、わりと涼しい顔でやってのけた。技術的な観点からの回答。複合的な問題の切り分け。俺が10年かけて体に染み込ませてきたものを、こいつはプロンプト一発で出してくる。精度がどうとか、ハルシネーションがどうとか、そういう話はある。あるが、方向性として、こいつは俺と同じ仕事をしようとしている。それは明らかだった。

ネットは「もうプログラマーは不要になる!」と言う人間で溢れかえっていた。そうはいってもまだAIに出来ない分野はある、とか、AIは責任をとれない、とか、AIはツールでしかないからAIを使いこなせばいい、とか、複雑なビジネス要件についてはコンテキストの量が足りないない、とか、最後は人間が判断するしかない、とか、そういう言説を目にする度に俺はうんうんと頷いて、心の平穏を保ってきた。有能な部下が出来たと考えれば良い、というアイデアもあった。あれだけ管理職になるのを拒んできたのに、俺はそのアイデアに乗った。

AIが俺たちの仕事の一部分をこなせるのは間違いない。だが、AIが俺たちなしにタスクをこなせるわけじゃない。
変化すればいい。俺はそう考えた。そして―――チューブになっていたというわけだ。


俺がチューブになる前の最後の記憶を話そう。生産計画の立案処理を書いていた時のことだ。やたら複雑で例外の多い要件だった。俺はせっせとモデリングして、OOPに限界を感じてDDDの手法も取り入れて、それなりのものを作った。顧客はそれを見て、首を振った。立案された計画に実用性がなかったのだ。
俺はムカついて、ClaudeCodeがそこそこやる、という噂も聞いていたので、自分のコードを連中に見せた。連中はすぐにコードを書いた。全くもって醜い、ループと手続きが主体の、まともに動くのかすら怪しい1000行ほどのpythonコードが出来た。俺は笑って、どんなひどい結果が出るのか楽しみになって、既存のコードにつなぎこんだ。

ほぼ顧客の望む結果が出力された。

今でもそれは動いている。見るのも嫌な1000行のコードがビジネス要件を満たしている。

俺はその時、「困ったことになった」と思った。顧客の要望を満たしてたコードは手元にある。例えば俺が誠実な人間だったとしたら、これを再度モデル化して、DDDでビジネス要件にマッピングして、自分が腹落ちするコードに書き直し、かつ、AIが最初に出力したものと同じものを出力できるようにするだろうと思った。
だが、困ったのは、そんな作業をする気に全くならないということだ。
俺は不誠実なエンジニアだった。

目の前で完璧に動いているものを、わざわざ壊して、何時間も、あるいは何日もかけて「自分が理解できる形」に翻訳し直す。かつてはそれが「経験を積む」ということの正体だったはずなのに、今はもう、ただの途方もなく無駄で、苦痛な儀式にしか思えなくなっていた。

「これで動いてるんだから、もういいじゃないか」

頭の片隅で悪魔が囁くのではない。俺自身がそう思っているのだ。AIのブラックボックスな出力に対して、「LGTM」のハンコを押し、そっとコミットを積む。俺がやっているのは、ソフトウェアエンジニアリングではない。ただの「動く文字列の横流し」だ。

その瞬間、俺はチューブになった。

チューブになって、何度もAIを使った。
動くコードが出てきた時、俺はいつも二つの感情を同時に持った。よく出来てるな、という感嘆と、それは俺の仕事だったはずなのに、という感情。

最初のうちはその二つが激しくぶつかっていた。

AIの書いたコードで作ったデモを顧客に見せた時、顧客はその迅速な対応とリッチなUIに喜んでいた。俺の書いたコードじゃない。誰のコードでもない。

その時、ぶつかる音が聞こえなかった。

それを摩耗と呼ぶこともできるし、慣れと呼ぶこともできる。

最初のブラックボックスは、まだ読めると思っていた。気合を入れて一日かければ、この1000行の意味を全て理解できるはずだと。次に顧客の変更要望が来て、AIがそれに答えた時、その自信は少し薄れた。修正されたコードは、前のコードの上に別の文脈が重なっていて、もはや一つの意図として追える構造ではなくなっていた。何度か繰り返すうちに、読めるという確信はなくなって、代わりに、自分がこのコードを一から読むことはおそらくないのだろう、という別の確信だけが膨らんでいった。

意外と楽だった。

思えば、俺の上にいた人間たちも、俺が書いたコードを理解していた奴がどれだけいたというのか。彼らは俺のコードをブラックボックスとして受け取り、動いているかどうかと、顧客が怒っていないかどうかだけを見ていた。俺は当時、そういう上司を内心バカにしていた。技術がわかっていない奴に評価される屈辱。あの感情は本物だった。そして今、俺はAIのコードに対して、まさに同じことをしている。

そんなわけねーだろボケ、という思いは残っている。俺と、コードを読まなかったあいつらを一緒にするな。俺にはまだ読む能力がある。ただ読まないだけだ。——だが、読まない能力と読めない能力の区別に、いったいどれほどの実用的な意味があるだろうか? 世の中としてはそれでいいのかもしれなかった。動いているものは動いている。顧客は喜んでいる。それ以上の何が必要なのか、と問われたら、俺には「俺のプライド」以外の答えがない。



コードを書くループの中で、今日もチューブをやっている。最も処理が遅く、高価な部品として。
こいつにはまだ感情が残っていて、体内をおもしろそうなロジックが通り過ぎる度、血栓の詰まった血管のように体を悶えさせている。俺には予感がある。いつかそれに耐えられなくなった時、俺はそれを「救済」と呼ぶのだろう、ということだ。

完全なコード、バグのないシステム、決して停止することのないサーバー、深夜に星がまたたくように明滅するルーターのランプのように、永遠に止まることのない存在の一部に俺はなりたかった。本気で、この広大なネットの完全性の一部になりたかったのだ。

あるいは単なるチューブになって俺はそうなろうとしているのかもしれなかった。だが、おそらくそれは叶わない。俺にはまだ、AIにないものが一つある。

それはユーモアだ。ユーモアだけはまだAIに負けてない。と俺は思って今この文章を書いている。どうだ?笑えただろ?