じぶん対策

日々学んだことをアウトプットして備忘録にしています。

プログラミングとカードゲームは実は似ている説

はじめに

今回は完全にポエムです。
SNSなどでよく見かける、「エンジニアに向いている人は〇〇な人だ!」という投稿を見ることがあります。
たとえば、「数学が得意な人はエンジニアに向いている」とか、反対に「実は文系の方がプログラミングに向いている」といったものがあります。
他にも、「コミュニケーション能力がある人」や「集中力がある人」といった、それは大抵の仕事でも必要だろと思われるような特徴を挙げることもあります。

人によるのであまりこの論争自体に興味がないんですが、強いていうなら「カードゲームが好きな人はプログラミングに向いている」という持論があります。

今回は、その持論について書いてみたいと思います。完全にオタクの早口ですが、お付き合いいただけると幸いです。

テレビゲームが好きだったりボードゲームが好きな人がエンジニアには多いと思うんですが、私はカードゲームが好きで、かつあまり他に見ないなと思っていたので書いてみました。

大好きだったカードゲーム

2024年現在で27歳になるんですが、世代的にはデュエルマスターズのドンピシャ世代でした。
遊戯王ポケモンカードゲームは私よりは少し上の世代の人がやっていたイメージがあります。
遊戯王はちょうど5D'sが流行っていた頃ですね。

このデュエルマスターズというカードゲームが、私のプログラミングに対する考え方、と言うより言語能力に多大な影響を与えたと思っています。

この記事では特段デュエルマスターズ特有の概念については触れませんが、ほかのカードゲームと比べるとリソースの管理の仕組みがとても面白く、敗北に近づくにつれて手札リソースが増えたり、リソースなしで呪文を使うシールドトリガーという仕組みがあったりと革命的な要素が多いゲームなので、気になれば調べてみてください。

プログラミングとカードゲームの共通点

ここからは、カードゲームにおける用語をいくつか紹介しつつ、プログラミングとの共通点について考えてみたいと思います。

アド(アドバンテージ)

アドという単語はアドバンテージの略で、カードゲームにおいては、有利な状況やリソースの差を指す言葉です。
アドバンテージがある、というのは相手よりも有利な状況にあるということです。
めちゃくちゃアドバンテージが取れることを「爆アド」と言ったりします。

カードゲームにはいくつかの概念があり、それぞれに有利不利が存在するので、アドバンテージという概念も同じように種類があります。

  • 手札アドバンテージ
    手札の数が相手よりも多い状態。遊戯王のようなスペルリソースを不要とするようなカードゲームでは行動できる数に直結します。また、デュエルマスターズのような、行動にリソースを消費するゲームでも、手札が多いことで行動の選択肢が増えます。
    極端な話、手札が0枚の状態であれば、行動ができないので、手札アドバンテージがあることは非常に重要です。
  • 盤面アドバンテージ
    カードゲームにおいて、場にでているカードの数や強さが相手よりも有利な状態を指します。盤面というのは、モンスターやクリーチャーなどを出す場所、またはその場所の状況を指します。
    盤面アドバンテージがあると、相手に攻撃を仕掛ける、防御するなどといった行動の選択肢が増えます。
  • リソースアドバンテージ
    カードゲームによってはマナ(デュエルマスターズなど)やエネルギー(ポケモンなど)といったリソースを消費して行動することがあります。リソースアドバンテージがあると、相手よりも多くの行動をすることができます。
    もしくは、より大きなコストを払い、より強力なカードを出すことができます。

「アドを取る」ということは、ゲームを有利に進めるための基本的な行動です。
少しずつアドを取りながら、最終的に勝利を目指していきます。
例えば、1枚のカードを使って相手の2枚のカードを破壊するといった行動は、少ない枚数で相手のカード枚数を削ることができるので、手札アドバンテージを取ることができます。
さらに、消費するコストが小さい場合はリソースアドバンテージも取れていると言えます。

ただし、アドを取ること自体が目的ではなく、勝利することが目的なので、個々のアドバンテージに固執せず、より俯瞰的にゲームを進めることが重要です。

人生においてのアドバンテージについては下記のブログが参考になります。

言及している人のブログ記事: 「アドバンテージ」というカードゲームの概念が、人生ですごい役に立った話

プログラミングにおいてのアドバンテージを考えてみると下記のようなものがあります。

  • 手札アドバンテージ
    • 知っている知識の量が該当します。より多くの言語知識、設計方針、ライブラリの使い方を知っていれば、より多くの選択肢を持つことができます。
  • 盤面アドバンテージ
    • プロジェクトの進行状況などが該当します。プロジェクトの進行状況が良いとより多くの価値を生み出すことができます。
  • リソースアドバンテージ
    • リソースアドバンテージは、プログラミングにおいては時間や人的リソースが該当します。時間があればより多くの機能を実装することができますし、人的リソースがあればより多くの作業を行うことができます。
    • プログラミングはやや特殊で、知識があれば、リソースの効率を大幅に上げることができるので、ここでいうリソースアドバンテージの重要度は手札アドバンテージと比べると低いかもしれません。
  • その他
    • 他にも、プログラミングにおいては、アドバンテージを取るための概念があります。例えば、コードの品質を高めることで、バグを減らし、メンテナンス性を高めることができます。これは、盤面アドバンテージに近い概念かもしれません。
      • カードゲーム用語だけではないですが、レバレッジという言葉もあります。レバレッジとは、テコの原理のように、少ない力で大きな力を生み出すことができることを指します。自動テストや品質向上は将来的に無駄なリソースの消費を抑えることができるので、レバレッジが効くと言えます。

テンポ

テンポは、多くのカードゲームにおいて本質的な概念であり、もっとも奥が深いテーマの一つです。

テンポとは何か?

カードゲームにおける「テンポ」とは、試合の進行スピードやリズムを指し、プレイヤーがゲームをどれだけ効率的に、そして有利に進められているかを表す概念です。テンポを意識することで、ゲームの主導権を握り、最終的な勝利に繋がるプレイが可能になります。

言い換えると相手に対してどれだけ効率的に行動をし、主導権を握るか、というテーマです。

カードの効果やリソースの管理を通じて、自分が次の行動でより良い選択肢を得られるかどうかがテンポの良し悪しを左右します。テンポの良いプレイを続けることで、相手が追いつけなくなる状況を作り出しやすくなります。

テンポを制するための要素としては下記のようなものがあります。

  • コストの管理
    カードをプレイするためにはコスト(マナ、エネルギーなど。=リソース)が必要な場合が多く、毎ターンのリソースを効率的に使うことでテンポを保ちやすくなります。無駄なコストを使わず、最大限の効果を発揮するカードをプレイすることで、テンポが安定します。
    ただし、コストを使い切ることが全てではなく、コストを使い切るために手札を消費し、次のターンに選択肢がなくなることもあります。この場合はターンあたりの効率はいいですが、次のターンでテンポを失うことになります。

  • カードの使いどころ
    強力なカードを引きすぎて手札が重くなると、逆にテンポを失うことがあります。適切なタイミングで、適切なカードをプレイすることがテンポ維持の鍵です。場の状況を見ながら、軽いコストで十分な効果を出せるカードを使い、少しずつ有利を拡大していきます。

テンポを失うと、相手に主導権を握られやすくなります。例えば、何もしないターンが続くと、相手が自由に展開を進めてリソースや盤面の優位を拡大してしまい、追いつくのが困難になります。また、重いコストのカードばかりを手札に持っていると、リソースが足りないためにターンごとに何もできない「テンポロス」を引き起こします。

テンポを重視する戦術としてアグロデッキ(攻撃的なデッキ)というものがあります。これは、早い段階でのテンポの優位性を重視します。序盤から積極的に攻撃を仕掛け、相手が防御や展開に回る前にライフを削り切る、主導権を握り続けることを目指します。少しでもテンポを失うと試合が長引き、相手に対応する時間を与えることになるため、テンポを取り続けるプレイが求められます。

アドバンテージと似た概念ではありますが、アドバンテージは局所的に相手に対して有利な状況を作ることを目指すのに対し、テンポはより俯瞰した、試合の進行スピードやリズムを意識して、効率的にプレイすることを目指します。言い換えれば、継続してアドを取り続けることとも言えます。

バリュー

バリューとは、カードゲームにおいて、1枚のカードの効果や1つの行動の価値を表す概念です。
1枚のカードを消費して、相手の2枚のカードを破壊するといった行動は、バリューが高いと言えます。

アドバンテージとバリューは似ているようで異なる概念です。

  • 相手に対する相対的な有利さを表すのがアド
  • 1つのカードやアクションが持つ絶対的な価値がバリュー

エンジニアの判断の多くは、1つの行動によってどれだけの価値を生み出すか、という軸になることが多いので、バリューの概念はプログラミングによく登場します。

例: 〇〇アーキテクチャを採用することで、変更の影響範囲を狭めることができ、テストも書きやすくなるので、バリューが高い。

カードの「バリュー」とカード・アドバンテージ

細かい日本語の違い

カードゲームにおいては、細かい日本語の違いで裁定と呼ばれるカードの解釈が変わることがあります。
例えば、デュエルマスターズにおいては、「召喚する」という言葉と「出す」という言葉があります。

「召喚する」という行動は、マナを消費してクリーチャーを場に出すことを指します。
「バトルゾーンに出す」という行動は、クリーチャーを場に出すことを指し、召喚を含みますが、カード効果による場に出す行動も含みます。

ここで、効果の発動条件が「召喚する」という場合、他のカードの効果でバトルゾーンに出されたクリーチャーは対象になりません。

こういった細かい違いへの意識は、プログラミングにおいても重視されるかなと感じています。

また、裁定そのものが変わることもあり、プログラミングにおける仕様変更そのものです。

プロダクト開発におけるカードゲーム概念の適用

これはプログラミングというよりはプロダクト開発に近いかもしれませんが、カードゲームの概念をプロダクト開発に適用することもできるかなと思います。

例えば、プロダクトの立ち上げフェーズでは、強力で完璧な機能を1つリリースするよりも、軽いコストでリリースできる機能を多くリリースすることで、ユーザーをつけ、お金や開発メンバーといったリソースを増やすことができます。

プロダクトのフェーズが進むにつれて、CI/CDや自動テスト、品質向上などの仕組みを使い、リソースの効率を上げることができます。これは、リソースアドバンテージを取ることに近いかもしれません。

カードゲームは詰まるところ、自分のデッキの強みをどれだけ相手に押し付けることができるか、というものだと思います。

プロダクト開発も同じで、自分のプロダクトの強みをどれだけユーザーに伝え、使ってもらえるか、ということが重要だと考えています。

もちろん、プロダクト開発を他社との競争だと考えるとカードゲームと違って同時に始まるわけでもないし、そもそも1対1でもないし、勝者も1つではないので、完全には適用できないので、全然違います。どちらかというと市場だったり、環境といったものが相手になるのかもしれません。

個人的な技術へのスタンス

私は残念ながら、本当の意味でのものづくりをするクリエイターというタイプのエンジニアではないのかなと思っています。
ただ、他人の作った技術、仕組みを使って自分の作りたいものを作ることは好きです。
私にとって新しいフレームワークやライブラリは、カードゲームで言えば新弾のようなものです。

  • プログラミングにおいてビジネスという目的の上で技術を利用し、新しい技術を学び続けていること
  • 勝利するために現在の環境メタを勉強したり新弾のカードを知り、必要であればデッキに組み込むこと

似ていると思うんですよね。

あくまで技術ユーザーとしての立場なので、新しい技術の話題は「新弾の〇〇強すぎない?」みたいな話だし、漫画でいうと「今週のジャンプ見た?」くらいの感覚でいます。

まとめ

  • カードゲームとプログラミングは、共通点が多いと思う
  • アドバンテージ、テンポ、バリューなどの概念は、プログラミング、さらには人生そのものにも適用できる
  • プロダクト開発においても、テンポを意識して、適切なタイミングで適切なカードをプレイすることが重要
  • カードゲームは自分のデッキの強みをどれだけ相手に押し付けることができるか
  • プロダクト開発は自分のプロダクトの強みをどれだけユーザーに伝え、使ってもらえるか

所感

色々と書きましたが、一連のゲームにおける最初のアドを取れるポイントは手札であり、現実世界においてはカードゲームほど平等に手札が配られるものではないと思います。
行動量を増やしたり、学習量を増やしたり、すでに知識を持っている人に教えてもらったりといったアドバンテージを取る行動は他の要素にも響いてくるので、まずはここからアドバンテージを取ることが個人的には重要だと思います。

強い切り札を持っているか、というのは人によりますが、現実世界では1ターンに5回ドローするひともいれば、1ターンに1回もドローしない人もいます。
山札からドローできる回数は自分で増やしていくことができそうです。