エンジニア的なネタを毎週書くブログ

東京でWebサービスの開発をしています 【英語版やってみました】http://taichiw-e.hatenablog.com/

新しいサービスを引き継ぐにあたって「ドメインナレッジ」は必要か

今年の二月ころ、ある会議の中で、
ドメインナレッジが不要なプロダクトを作りたい」
と発言した。

他の参加者の皆さん(偉い人多め)からは、総じて「ポカーン」とされてしまった。

実は、その時の私は、なぜ「ポカーン」とされているのか、よくわからなかった。


正直に言うと、二月のその会議で、一体自分は何を言いたかったのか、
その時は自分の中でもうまく言語化できていなかった。

それがついさっき、急に、ちょっとだけ分かった気がしたので、忘れないうちに言語化しておきたい。


私は、

ほぼドメインナレッジを持たない状態のエンジニアが
初めてそのプログラムを読んだ時に(あるいはコンポーネント図などシステム全体の構成を知った時に)
システムの設計からドメインナレッジ(どういうビジネスを代行するシステムなのか)を知ることができる

そういうプロダクトを作りたかったのだと思う。



いま同僚と、こちらで紹介されている、オブジェクト指向エクササイズに取り組んでいる。
qiita.com

お題になっている自動販売機のソースはこんな感じ。
https://gist.github.com/i-takehiro/3ccb2ece25c89d4ed41c

(エクササイズのお題として)非常に素晴らしいコードだ。
このコードを見て、
自動販売機とは何か
・そもそもこのプログラムが何をしたいのか
理解するのはかなり難しいと思う。


「ポカーン」とされた、会議の話に戻る。
当時の私は二年ほど、上記のような「自販機」のメンテナンス(新規の追加機能開発含む)をしている状況だった。

意図が全くわからないコードに対して手を入れなければならなかった。

作った人たちは既にほとんどいなかった。あるいはいらっしゃっても(失礼ながら)元の業務を知らないか、忘れているか だった。
(あるいはご存知なのに私が決めつけて聞かなかった時もあったかも。この点は反省)

業務に詳しい人はいたので、どういうビジネスモデルなのかは教えてもらえた。
しかし、そこから当時のエンジニアが何をどう思って今のコードに至ったのか
そのコードに手を加えるとしたら何が正しいのか

は必死に過去のエンジニアの考えに想像を巡らせる必要があった。


過去に作られたシステムの運用なんて大体そんなもんかもしれない。
とは言えその時私が見ていたシステムはあまりにビジネスそのものとプロダクトが複雑で、自分のキャパを超えていて、正直辛かったし病んでいた。


それでも。
私は、

私が作ったシステムを引き継ぐ人がほぼ背景の知識が0であってもシステムの意図を理解でき、その後変更が加えられる

そんなシステムが理想的だと思う。

当然、そんなシステムを開発するためには
・背景にあるビジネスへの理解
が欠かせなく、
更に、
・そのビジネスを「理解できるシステム」に落とし込むことができる設計力が必要だ。


だから、「ドメインナレッジが要らないシステム開発」のようなことを言って「ポカーン」とされたんじゃないかな、と
今になってみれば思う。


おまけ:当時見ていた「自販機」はこんな感じ

「自販機」はすごく複雑なものだ。

・「喉が渇いたな- 甘くて冷たいのが飲みたい」というユーザのリクエストを受け…
・まずは原料を調達。香料や砂糖などを生産している会社に在庫を問い合わせ、仕入れる。
仕入れてきた材料を混ぜ混ぜして製品を作成。コーラとか、ソーダとか、お茶とか いくらかの商品が完成する。
・商品を陳列。ユーザに選んでもらう

というような機能を持っていた。

なお、
・材料を生産・売っている会社
・ジュースを作る会社
・ジュースを販売する会社
は全部違う会社で、それぞれの会社が利益を出すために会社間の取引の際に
 ・原価に利益率を掛けて卸したり
 ・販売戦略に合わせて原価割れするくらい値引きしたり
するのだけど、この3社の、そういったお金に関する計算も全部一台の自動販売機がやっている。

「境界づけられたコンテキスト」なんてクソ食らえな、スーパー自販機だ。

※そんな自販機、今日も元気に稼働しています。毎日ぼくのお給料を稼いでくれてありがとう。
 そしていまメインで見てくださっている担当者の皆さん、本当に有難うございます。