はじめまして、この度、2月に入社した 有澤 と申します。
バックエンドエンジニアとして、カルテットに貢献していきます。よろしくおねがいします。

さて、入社した翌日にカルテットの研修を受けました。 自分の場合、実技試験で提出したソースコードのリファクタリングから始まりました。
その際に、はっきりとしないモデリングをこちらから指摘したり、メンター役のエンジニアとディスカッションをしながら進めていきます。

自分だけで設計・実装をしたソースコードを、他者の意見を取り入れながらリファクタリングできるのは、 趣味のプログラミングにはない貴重な体験でした。

そんなリファクタリングの中で、自身が「うれしい」と感じた物事を、たとえ話で共有 します。

また、試験問題で出てきたシステム化する対象を ソリティア と定義させてください。

人によって思い浮かぶソリティアは違っている

Aさんは実技試験のために、ソリティアをプログラム化する必要がありました。
そもそもソリティアとはなにかを調べてみると、Wikipediaではこのように解説されています。

ソリティア(英: solitaire)は、一人で遊ぶゲームのこと。 ソリテール、ソリテア、ソリテアーともいう。

ボードゲームやカードゲームなどのうち、一人だけで遊ぶことのできるゲームの総称であるが、 代表的であるカード(トランプ)ゲームのそれを指すことも多い。

参照元:ソリティア - Wikipedia

ソリティアとは、1人で遊ぶことができるカードゲーム のようです。

皆さんにとってソリティアと聞くと、どんなソリティアを連想しますか?
Aさんは「Windowsに付属されていたアプリのソリティア」を思い浮かべました。

もっと深堀りすると、ソリティアには種類があるようです。
たとえば、Windowsに付属されていたソリティアは クロンダイク と呼ぶようです。


Aさんが思い浮かんだ「ソリティア」

  • ソリティアは、クロンダイクという種類
  • ソリティアは、カードを使う
  • ソリティアは、プレイヤーが1人
  • ソリティアは、必ずしもクリアできるとは限らない

Aさんは上記のソリティアを真っ先に思い浮かべました。
なんとなくですが、このソリティアを思い浮かべる人は多いのではないでしょうか?

ですが、人の考えは多様なので、もっと他のソリティアがありそうです。
AさんはBさんへ聞いてみたところ、以下のソリティアが思い浮かんだみたいです。

Bさんが思い浮かんだ「ソリティア」

  • ソリティアは、スパイダーという種類
  • ソリティアは、トランプを使う
  • ソリティアは、プレイヤーが2人
  • ソリティアは、必ずクリアできる

おや? Aさんのソリティアとは違っているようです。
Aさんからしてみれば「ソリティアは1人で遊ぶものなのに、2人も出てるから変だ」と思うかもしれません。

さっそく、2人はソリティアの認識を共有し合いました。

Aさんの「ソリティア」

  • ソリティアは、クロンダイクという種類
    • Windowsに付属されていた「ソリティア」というアプリを連想したから
  • ソリティアは、カードを使う
    • ソリティアはカードを使って遊ぶゲームだから
  • ソリティアは、プレイヤーが1人
    • ソリティアは1人で遊ぶゲームだから
  • ソリティアは、必ずしもクリアできるとは限らない
    • セッティングされたカード状況によって、詰んでしまう可能性があるから

Bさんの「ソリティア」

  • ソリティアは、スパイダーという種類
    • Windowsに付属されていた「スパイダーソリティア」というアプリを連想したから
  • ソリティアは、トランプを使う
    • ソリティアはカードゲームだが、カードの内のトランプを使って遊ぶゲームだから
  • ソリティアは、プレイヤーが2人
    • プレイヤーが1人、審判が1人、合計2人になるから
  • ソリティアは、必ずクリアできる
    • セッティングされたカード状況は、クリアできる状態を事前に作ってスタートするから

「ソリティアは1人で遊ぶものなのに、2人も出てるから変だ」

先程Aさんはこのように思っていたようですが、ここでAさんは「1人多かったのは審判のことを言ってたんだ!」と気が付きました。
Aさんにとって「審判」という物事は盲点だったようです。

他にも違う箇所があるようですが、
こうしてわかるのは、「ソリティア」という物事は、人によってこれだけのズレが生じるようです。

目標に沿って、2つのソリティアを合わせてみる

Aさんは2つの意見で右往左往しているようです。 というのも、ソリティアを合わせようにも、どういった基準で合わせたらよいのかわからないようです。

そこで、AさんとBさんは目標を考えました。その結果 クロンダイク形式で、不正できないソリティア と目標を定めました。
すると、以下のリストが自然とできあがりました。

  • ソリティアの種類を「クロンダイク」とする
  • カードの名称は「トランプ」とする
  • プレイヤーの人数は「プレイヤー1人」とする
  • セッティングされたカード状況は「クリアできるように予めセッティングしておく」
  • プレイヤーの不正を監視するために「審判」を配置する

Aさんは、Bさんの認識のズレの要因だった「審判」を使って、不正ができない という目標をカバーしていますね🎉

認識のズレはポジティブになりうる

一見、認識のズレはネガティブな物事と捉えられがちですが、 物事の仕組みを共有することは、認識のズレの発見に繋がります。 さらに、そのズレは物事の仕組みをより具体的にするキッカケにもなるとわかりました。

具体的になった仕組みを周りの人に共有すれば、その仕組みに詳しい人が増えます。
単純なことを言ってるようですが、これが実現できたらうれしいシーンは多くあるのではないでしょうか?

このことから、認識のズレは決してネガティブな出来事でなく、ポジティブな結果を生むからうれしい のではないのでしょうか?

最後に

よくビジネスシーンにおいてシステム化する領域を「ドメイン」、物事の仕組みを「モデル」と言ったりしますが、 OOPはその仕組みをソースコードで表現するのに便利な考え方だと研修の中で気づきました。

たとえ話の「ソリティア」も、ぼんやりとしていた仕組みが具体的になったことで、クラス図が浮かんできませんか?

カルテットでは、OOPを使ってシステム化していくことを当たり前にしているので、 この「うれしい」は、業務をしていく上で役に立つことが来るでしょう。