simple-web-system technology

Webに関する技術をシンプルに扱うブログ

俺たちは雰囲気でプログラミング用語を使っている

※ chatgpt-5.4にずっと思ってた事書いてもらいました


「それ、DDDじゃないですか?」 「いや、これはクリーンアーキテクチャ寄りですね」 「RESTっぽくはあるけど、厳密にはRESTじゃないかな」 「まあでも実質マイクロサービスですよ」 「この実装、関数型っぽくてよい」 「CQRSをやるほどではないけど、CQSではある」 「疎結合にしたい」

ITエンジニア、会話の7割くらいこれでできていないか?

私はできている気がする。

いや、正確に言うと、できてしまっている

そしてこれは別に、業界全体が雑だとか、みんな言葉の意味を知らずに喋っているとか、そういう単純な話ではない。 むしろ逆で、ちゃんと勉強している人ほど薄々わかっているはずだ。

プログラミング用語、思ったより厳密じゃない。

「厳密な定義がある用語」と「現場で育った用語」は別物

たとえば「二分探索」とか「トポロジカルソート」とか「O(n log n)」とかは、かなり意味がはっきりしている。

ここにはあまり解釈の余地がない。

二分探索は二分探索だし、DFSはDFSだし、外部キーは外部キーだ。 もちろん文脈による揺れは多少あるけれど、少なくとも「人によってだいたい違うものを指している」という事態にはなりにくい。

一方で、現場でよく出る言葉は違う。

  • オブジェクト指向
  • 関数型
  • REST
  • マイクロサービス
  • クリーンアーキテクチャ
  • 疎結合
  • DDD
  • CQRS
  • モジュール性
  • スケーラブル
  • リアクティブ
  • フレームワーク
  • ライブラリ

このへん、全員がなんとなく雰囲気を共有しているけれど、いざ定義を詰めると急に足元がぬかるむ。

みんな言ってることは違うのに、なぜ会話が成立するのか

ここが面白いところで、成立してしまうのである。

たとえば「これはマイクロサービスではない」という人と、「いや十分マイクロサービスだろ」という人がいたとして、両者の言っていることをよく聞くと、別に片方が完全に間違っているわけではない。

片方はこういう意味で言っている。

  • サービス単位でデプロイされている
  • チームごとに責任境界が分かれている
  • 個別にスケールできる

もう片方はこういう意味で言っている。

  • DBを共有している
  • デプロイは分かれていても境界が弱い
  • 実質的には分割モノリスでは?

どちらもわかる。

そして、現場ではこの「どちらもわかる」が頻発する。

つまり我々は、厳密な単語の定義を共有しているというより、その単語の周辺にある問題意識とか思想とか、典型的な形を共有している

だから会話が成立する。

でも成立しているだけで、厳密とは限らない。

「CQS」と「CQRS」の話をすると全てがわかる

最近この手の話でわかりやすいなと思ったのが CQS と CQRS である。

CQS は Command Query Separation。 ざっくり言えば「状態を変える処理と、値を返す処理を分けよう」という原則。

CQRS は Command Query Responsibility Segregation。 ざっくり言えば「読み取り責務と書き込み責務を、モデルや責務として分けよう」という設計。

さて、ここで問題です。

Service を command 系と query 系で分けたら、それは CQRS ですか?

私はもうこの時点で少し笑ってしまう。

なぜなら、この問いに対してエンジニアが3人いたら、だいたい4つくらいの答えが返ってくるからだ。

ある人は言う。

それはまだただの CQS で、CQRS ではない

別の人は言う。

アプリケーションレイヤで責務を分けた時点で、軽い CQRS と呼んでいい

さらに別の人は言う。

read model と write model が別になって、非同期で同期されて初めて CQRS だ

全部わかる。

全部わかるのだが、全部違う。

これが何を意味するかというと、CQS と CQRS の間には広大なグラデーションがあるということである。

我々はたぶん、そのグラデーションに向かって「だいたいCQRS」みたいな顔をしている。

「RESTful」はだいたい褒め言葉

REST もそうだ。

厳密な REST は、かなり制約が強い。 でも現場で「REST API」と言ったとき、多くの場合それは

  • HTTPで
  • JSONを返して
  • URLがリソースっぽくて
  • GET/POST/PUT/DELETEをそれっぽく使っている

くらいの意味で使われている。

つまり「RESTful」は実質的に、

なんかちゃんとしてそう

という褒め言葉として使われている瞬間がある。

もちろん本当に REST を厳密に考えている人もいる。 でも日常会話においては、「GraphQLじゃない、gRPCでもない、RPCっぽすぎないHTTP API」くらいの感じで運用されていることがある。

それでも会話は成立する。

成立してしまう。

「関数型っぽい」は、たぶん全員違うものを見ている

「このコード、関数型っぽいですね」

これも危険な発言である。

この一言で人が見ているポイントはバラバラだ。

  • 純粋関数が多い
  • mutable state を避けている
  • map / filter / reduce を使っている
  • クラスより関数中心
  • 副作用を外に追い出している
  • monad がいる
  • for 文が少ない

全員、違うものを見て「関数型っぽい」と言っている可能性がある。

にもかかわらず、会話はなんとなく前に進む。

なぜか。

みんなが厳密な定義ではなく、その言葉が帯びている美意識を共有しているからである。

たぶん「設計用語」はほぼ全部そう

ここまで書いていて思うのだが、特に危ないのは設計用語である。

アルゴリズム用語は比較的安定している。 言語仕様の用語もかなり安定している。 DB理論や型理論も、ちゃんとやると厳密だ。

でも設計の言葉は、急に空気が混ざる。

  • 疎結合
  • 拡張しやすい
  • 保守しやすい
  • きれい
  • 責務が分離されている
  • DDDっぽい
  • クリーン
  • スケーラブル
  • モジュール性が高い

このへん、全部ちょっと危ない。

危ないというのは、「嘘だ」という意味ではない。 わかった気になれるのが危ないのである。

「この設計は疎結合です」と言われたとき、本当に知りたいのはそこではない。

知りたいのはたぶんこういうことだ。

  • 依存方向は一方向なのか
  • 実装詳細に直接依存していないのか
  • 差し替え可能なのか
  • 変更の波及範囲が小さいのか
  • デプロイ単位まで分離されているのか

でも会話の中では、それら全部を「疎結合」の一言で済ませてしまう。

ではプログラミング用語は全部ダメなのか

そんなことはない。

むしろ逆で、こういう曖昧な言葉は便利だから広まっている。

毎回、

「読み取りはDTOで最適化していて、書き込みは集約経由で行い、一部の参照モデルは非同期投影です」

などとフルで説明していたら日が暮れる。

だから「軽いCQRSです」と言いたくなる。

これは省略記法としては優秀だ。

問題は、その省略記法を定義そのものだと思い込む瞬間である。

「これはCQRSです」 「いや、それはCQRSではありません」

この会話、不毛なことがある。

なぜなら多くの場合、本当に重要なのはラベルではなくて、

  • 何を分けているのか
  • どこが同期で、どこが非同期か
  • どんな制約があるのか
  • 何を得て、何を失うのか

だからだ。

エンジニアは定義で戦いがち

インターネットを見ていると、エンジニアはよく定義で戦っている。

「それは本当のDIではない」 「いや、それはフレームワークではなくライブラリ」 「そのコードは関数型ではない」 「それはマイクロサービスではない」 「RESTを名乗るな」 「DDD警察だ」

気持ちはわかる。

定義を大事にすること自体は悪くない。 むしろ大事だ。 厳密さが必要な場面はたくさんある。

でも、設計やアーキテクチャの会話では、定義が固定されていないことが多い。 そのときに「用語の純度」で殴り合うと、話が進まない。

ここで必要なのは、たぶん厳密な単語を1個投げることではなくて、その単語を展開して説明することなのだと思う。

「疎結合です」ではなく、 「インターフェース越しにしか参照せず、ドメイン層はインフラ実装を知らないです」と言う。

「マイクロサービスです」ではなく、 「デプロイは別ですがDBは一部共有です」と言う。

「RESTです」ではなく、 「HTTP+JSONのCRUD APIで、HATEOASはやっていません」と言う。

このほうが100倍伝わる。

でも俺たちは、これからも雰囲気で用語を使う

ここまで読んで「じゃあ今後は全部厳密に言おう」と思った人がいるかもしれない。

たぶん無理である。

我々はこれからも言う。

「DDDっぽくやりたい」 「ここは関数型で」 「ちょっとCQRS寄りにしたい」 「RESTっぽく整えよう」 「モジュラモノリスがいい」 「疎結合にしよう」

そして相手もだいたいわかる。

わかるから使う。

たぶん大事なのは、自分たちが雰囲気で使っていると自覚することだ。

自覚していれば、「この言葉、人によってズレるかもな」と一歩立ち止まれる。 自覚していれば、定義の殴り合いではなく具体の話に戻れる。 自覚していれば、「それってどういう意味で言ってます?」と聞ける。

雰囲気で使うこと自体が悪いのではない。 雰囲気を定義だと思い込むことが危ないのだ。

結論

俺たちは雰囲気でプログラミング用語を使っている。

でもそれは、別に不誠実だからでも、勉強不足だからでもない。

技術の世界には、

  • 形式的に定義しやすい言葉
  • 実務の中でグラデーションを持つ言葉
  • 思想や美意識を運ぶ言葉

が混ざっている。

だから、用語は便利な圧縮でもあり、誤解の温床でもある。

たぶん必要なのは「用語を捨てること」ではなくて、用語の解像度を必要に応じて上げられることなのだと思う。

「これはCQRSです」で終わらせない。 「それ、どのレベルですか?」と聞ける。 「疎結合です」で終わらせない。 「依存方向はどうなってます?」と聞ける。

そのくらいがちょうどいい。

我々は雰囲気で用語を使う。 そして、ときどき正気に戻って具体の話をする。

たぶん、それでいい。


追記

この記事もたぶん、厳密には「雰囲気で書かれた技術記事」です。