# 初心者向けの単純なルールを作る

最近趣味でポーカーを始めました。その中で感じたのは、なにか新しい物事を始めるときは複雑な理屈は抜きにして、単純なルールが規定されていることが初心者にとって大切だということです。多くの初心者向けのルールは「やってはいけないこと」であったり、「複数の選択肢を単純化する」ということに主眼が置かれています。

具体的な例として、ポーカーの初心者に向けて以下のような守るべきルールがあげられています。

- コツ①参加する回数を減らす
- コツ②自分より前に参加者がいなければレイズ
- コツ③レイズ金額は 3 倍を目安に
- コツ④強いと思ったら必ず額を上げる
- コツ⑤ベット額はポットの半分を目安に
- コツ⑥最後にしたアクションがコールの場合必ずチェックする

https://www.youtube.com/watch?v=2Ubyv9FbphM

これらのルールはポーカーを数学的に考えたときに導き出せる基礎的な戦術です。しかし、初心者に対していきなり複雑な理屈を含めて教えようとすると、自分が参入するには過度に困難なゲームだと思われてその場でリタイアされてしまう可能性が高いでしょう。

そこで、機械的に守っていれば勝てるようになるルールを伝授することが大切なのです。まずは初心者に勝つ喜びを与えることが重要だからです。この戦術は非常にシンプルに考えられているため、当然大きく勝つことはできないと思います。ですが、初心者同士の対決でだいたい 80% くらい勝てるようになれば十分なのです。

このようなルールを提示したとき、中級者 ~ 上級者の中には「いや、その戦術はどんな場面にも当てはまるものではない」「それだけやっても勝てるわけがない」「ポーカーはそんな単純なゲームではない」と思う方もいらっしゃるかもしれません。このような意見はある意味で的を得ています。

しかし、初心者にとって大切なのは守破離で言うところの守をまず学ぶところです。基本的な部分の学習をスキップして、それが当てはまらない場面をいきなり学ぶことは不可能なのです。この複雑な部分を抜きにして基本的な部分を学習させる、という観点が抜け落ちている意見をよく耳にします。なぜこの基礎の理論が成り立つのかといった理屈の部分だったり、この理論だけでは勝つことができない応用的な場面は後から学習すればよいのです。

前置きが長くなりましたが、これは開発時の設計やコーディングルールにも当てはまると思います。例えばフロントエンドのエキスパートのみでチームが構成されているのであれば、複雑なルールを規定しても皆が理解してコードを書くことができるでしょう。しかし、領域ごとに職種が規定されておらず、複数の領域をカバーするエンジニアが集まっているチームであれば、経験が乏しい言語のコードベースを触ることが多いかと思います。

## 「やってはいけない」単純なルールを規定する

ここで出てくるのが初心者向けの単純なルールです。守らせるべき複雑なルールを規定しても、あまり効果的に働きません。「やってはいけない」単純なルールを規定して、80% くらいの完璧さを目指しましょう。ポーカーの初心者向けのルールで出てきた「参加する回数を減らす」「最後にしたアクションがコールの場合必ずチェックする」に相当するものです。

例えば、アクセリビリティに考慮したフォームを書く場面を考えてみましょう。

100% に近い完璧なフォームを書こうとすると、以下のようなコードになるでしょう。

```tsx
<div>
  <label for="email">Email</label>
  <input
    id="email"
    type="email"
    name="email"
    // エラーがある場合には aria-invalid 属性を true にする
    aria-invalid="true"
    // エラーがある場合には aria-describedby 属性にエラーメッセージの id を渡して関連付ける
    aria-describedby="email-error"
  />
  /** エラーメッセージは role="alert"
  でスクリーンリーダーにすぐに知らせるべき要素だと教える */
  <div role="alert" id="email-error">
    Email is invalid
  </div>
</div>
```

よく見慣れない `aria-` 属性がいっぱい出てきてなんだか複雑ですよね。ここまで完璧なフォームを書かせるようなルールを規定するのは、結構ハードルが高いです。

もう少し単純なルールを作るのであれば、「ボタンに `<div>` タグを使わない」はどうでしょう。なかなか単純で理解しやすい
「やってはいけない」ルールですし、これを守るだけでもアクセシビリティ上の効果は大きいです。

ところで、これくらい単純なルールであれば Lint ルールとして設定するのがいいでしょう。単純なルールは機械的にチェックしやすいというメリットもあります。

## 物事を単純化する

もう 1 つ、物事を単純化するルールを定めるのもいいでしょう。ポーカーの例で言うなら「レイズ金額は 3 倍を目安に」や「ベット額はポットの半分を目安に」とに相当するものです。ポーカーではレイズやベットする額を細かい単位で調整できるため、初心者からすると無限の選択肢があるように感じてしまいます。

そこで、最適なベット額がわからない場合には常にポッドの半分を入れるというルールに従うことで、大きな間違いを犯さないようになりますし、その他のより大切な判断事項に集中できるようになります。

これはコーディングで言うところの抽象化あるいは隠蔽に近いのではないでしょうか。先程あげたアクセシビリティに考慮したフォームを書かせるのではなく、あらかじめコンポーネントとして定義して複雑な部分を隠蔽しておけば、以下のように単純に利用できます。

```tsx
<Input name="email" label="email" errors={["Email is Invalid"]} />
```

開発者はこのコンポーネントを利用するだけで、アクセシビリティに考慮したフォームを書くことができます。このように物事を単純化するルールを規定することで、全ての開発者にとってコードをコミットしやすくなります。

## まとめ

- なにか新しい物事を始めるときは複雑な理屈は抜きにして、単純なルールが規定されていると参入しやすい
- 初心者向けの単純なルールを規定は大きな間違いを犯さない 80% くらいの完璧さを目指す
- 設計や開発のルールを規定するときには「やってはいけない」単純なルールを規定する
  - Lint で機械的にチェックできるとなお良い
- 物事を単純化するルールを規定する（コンポーネント化などによる抽象化や隠蔽）ことで、全ての開発者にとってコードをコミットしやすくなる
  