システムに舞い降りたリヴァイアサン
今、目の前のモニターに映し出されているエディタには技術的負債の積み上がったコードが無機質に描画されている。
設計や仕様が存在しないドキュメント、存在しても今となっては嘘吐きとなったドキュメント。
現状のシステムと乖離した内容が記載されたREADME。
マークダウン記法すら守れずフォーマットが崩れたREADME。
まともなローカル開発環境を構築することもままならないリポジトリ。
定義の曖昧なドメイン言語。
言葉の認識の揺らぎによるコミュニケーション不全。
awaitとforが幾重にもネストしたスパゲッティコード。
真偽地ではなく複雑なオブジェクトの配列を返すisXxxxxと名付けられた関数。
anyfullなts拡張子のついたJS。
実行する必要のない不要な処理たち。
そんな不要な処理の奥深くに残されているN+1問題。
そして、その問題により動かなくなった本番環境。
さらに、その問題を解決できずにあたふたするクライアント。
動かなくなった機能に対して不満を募らせるユーザ。
なぜか複数存在する同じ処理を行うモジュール。
APIを介してデータを取得する設計なのに直接DBにアクセスするモジュールの存在。
残されたままのオミットされた機能のコード。
さりとて、初期化処理は動作しているため、迂闊に削除できないオミット機能が使用しているモジュール。
リクエストヘッダを改ざんするAPIのコモンモジュール。
NoSQLなのにリレーショナルなデータ設計。
ひとまとまりのクラウド関数群と見せかけて、実は複数のリポジトリに分割されているクラウド関数群。
さらにプレフィックスで分割されていると思いきや、プレフィックスなしやサフィックス付きが混在する、破綻された命名規則。
そして、破壊された命名規則が奏でるコードの難読化。
「分からないことはなんでも聞いてください」と言われ、聞いて返ってくる答えが「分かりません!」。
そんな環境を一切改善することもなく、盲目的に仕事を行なってきた過去の開発者たち。
……そんな現実を前に、目の前のエディタと戦いながらタスクを消化していく。
ここまでで散々書き殴ってきたこのシステムは、新しく技術的連帯保証人になった自分からしたら悪意の塊でしかない。
しかし、冷静になって考えると、お金をもらって仕事している人間がそんな悪意を込めてコードを書くだろうか?
システムの所持者やレビューをする人もそんな悪意を無条件に受け入れるだろうか?
答えは否としか考えられない。
ということは、目の前のもはや殺意すら覚えるほどのコードには人間の悪意は一ミリも含まれていないのだ。
ただ、悪意がなくても、知見の足りなさや能力不足の結果起こる目の前の局所的な対応の積み重ねによって、致命的な致命傷に至ることはままある。
根本治療をせずに対症療法だけを続けても、薬やサポートに依存しなければ保てない弱い体になってしまうように。
一つ一つは悪意がなくても、局所的な対応の連鎖の結果が悪意を発するサムシングに育ってしまう。
個々人の行動の結果の総意に意思が宿ったように見える現象は、攻殻機動隊S.A.C.で描かれる「笑い男」事件に通じるものがある。
一人一人にはその意思がなくても全体として統括した場合、そこに明確な意思が宿る場合がある。
それがシステム開発運用における技術的負債という名の悪意である。
実際にはシステムそのものに悪意はないが、それを保守運用する人からすれば悪意を感じられずにはいられない。
システムの中のドキュメントやコードはただの文字列なのに、そこに悪意を見出すのはおかしいと思う人もいるかもしれない。
そんな人に分かりやすい例を用意してみた。(ちなみにブラウザのコンソールですぐに確認することができるぞ)
const isClrNum = x => x == 1 ? 1 : isClrNum(x - 1) + 1;
上記のコードは意味がない上にバグを含んでいる。
isClrNum(100000);
と、デカめの数字が入ってくると例外が発生する。
あなたが不具合調査の結果、上記のコードを見つけたら「誰だ!このコード書いたやつ!ぶち殺すぞ!」と言う気持ちが湧き上がるはずだ。
上記のような極端なコードはないかもしれない(と信じたい)が、度重なる仕様変更や作業者変更によるコンテキストの断絶の連鎖で、存在意味がない上にバグやパフォーマンス問題を含んだコードが悪魔錬成されることが稀によくある。
技術的遺産相続人でも書いたが、人の入れ替わりによるコンテキストの断絶の連鎖が積み重なって技術的負債は生まれる。
なんの対策も無しにシステム運用を続ければ、断片化された幾多のコンテキストがそのままコードに反映され、蓄積され続けることになる。
コンウェイの法則は組織体だけでなく人の入れ替わりにも適用される。
そのコードを後から参画した人が現在進行形のコンテキストだけを前提にして読むと魑魅魍魎が蔓延るパンドラの箱に映る。
そういった経緯で悪魔が宿ってしまったコードも、元は(きっと、たぶん)読みやすく意味のある真っ当なコードであったはずだ。
それが大人の事情で紆余曲折を経た挙句、歪なキメラに変貌を遂げたのだ。
個人の部分最適の積み重ねが集約されて悪意を持つかのような結果を生み出すこの構造は、何もシステム開発の世界に限った話ではない。
組織、市場、そして社会全体を見渡しても、同様のパラドックスが至る所で発生している。
例えば、ディープステイトや陰謀論でよくある、どこかしらの誰かや組織が世界を牛耳っていて、一般大衆の健康や富を脅かしている、という見方がある。
陰謀論でなくても、普通に政治家の無能さを嘆いて、自分の生活や未来の国のあり方に不満を持っている人は多い。
しかし、我々は自分の意思で社会から提供される商品やサービスの取捨選択を繰り返しているし、政治家も選挙で勝ち抜いた選ばれし精鋭たちである。
一人一人の良かれと思った日々の生活における選択の総意の結果が現実社会である。
その現実社会に不満があるなら、その源泉は陰謀や政治ではなく我々の内にある。
昔書いたブラック企業は会社がブラックなのではなく、そこに所属している人がブラックである話と同じようなものだ。
個人個人が抱えるコンテキストを全部ごっちゃにした結果、社会の裏に悪魔的な何かがあたかも存在するような幻影が浮かび上がってきただけだ。
ただの文字列でしかないコードに悪意を感じるのと同じように。
技術的負債を作ろうと思って作っているのではないのと同じように、ただ、個人個人の選択の結果が自分の意識できていないところで社会負債を積み重ねているにすぎない。
水の温度を上げたい人が追い焚きしているお風呂に、水の温度を下げたい人が氷を入れ続けるような、ルーブ・ゴールドバーグ・マシンにすらなれないような悲劇が我々の日常には潜んでいる。
……そんなことを考えながら手元ではrm -rfとコマンドする打鍵音が響いていた。