ん？命名に日本語使いまくったらコメント不要になるの？ 思想強め上司とのトラウマを添えて

:::note warn
酔っぱらいながら書いてるので、真面目に読むのはやめてください。私は**鬼ころし**が好きです。
:::

## はじめに

こんちくわ。

皆さんコメントは書いてますか？？
<br>
私はコメント不要論者に対抗するため、ロジックの意図や補足は勿論の事、**夕飯のメニュー**や**昨日観たアニメの感想**までもコメントに書き殴るようにしています。マネは絶対にしないでください。

さて、日本のIT業界ではコメントに関する言い争いが絶え間なく発生し、幾度となく世界を滅ぼしかけていますが、私はこの手の話になると新卒研修の頃の記憶がフラッシュバックして蕁麻疹が出ます。

原因は、間違いなく**あの思想強すぎオジサン**のせいです。


## 私の新卒研修には、こんなメンターがいたわけですよ。


当時、Go言語の研修で、私はテンプレートエンジンで画面をセコセコ作ってました。

そしたら...
<br>
メンター「このHTMLは破綻している。お前はHTMLを理解していない。公式ドキュメントに準拠してるだと？いや違う。そもそもHTMLは.....（以下、持論を延々と）」
<br>
と、自分のHTML哲学を語りだされました。どうやらパーツを分けて使い回すテンプレート継承の実装に対して怒ったようです。
<br>
メンター「gohtmlとはなんだ。htmlタグがないし、HTMLの書式に準拠してないから破綻している！お前はHTMLを分かっていない！」
<br>
いやテンプレートの継承って共通パーツを使いまわすテンプレートエンジンの**基本**だと思うのですが、公式ドキュメントをエビデンスに反論するも全否定。 

こっちはgo-templateのドキュメントに準拠して作ってるんだけど...。
正直、この時点で「あ、この人ヤバいかも」って思いました。
<br>

...まあそんな感じで、ことあるごとに**思想お披露目コーナー**をおっぱじめる癖強メンターがいたわけですよ。

(てかGoっていいですよね。誰か一緒に開発しませんか？)

## 極めつけは、チーム開発研修で私が同期に言った「コメントを書け」というアドバイスを全否定されたこと。

新卒研修の期間中、私の周りはみんなプログラミング完全未経験だったわけです。コードなんてもちろん読めません。
実務じゃないしコード品質は後回し。
とりあえず、コメントを書きなぐってロジックを日本語で整理させるのが先かなと思ったわけで
<br>

私「プログラミングに慣れないうちは、コメントで処理の要約とか書くといいよ。メモ代わりでもいいからさ。」
<br>

と言いました。
すると同期はコメントを一杯書くことでリーディングを補完する技を覚えたようで、「**ちょっと読めるようになってきたかも！ありがとう！**」と報告してきて私は嬉し顔🤗。
<br>
しかし、

(◞≼◉≽◟;益;◞≼◉ื≽◟) ........ゴゴゴゴゴゴゴ

コメントを書いている同期の様子を見たメンターが反応してしまいました。あーっ。
<br>

メンター「**コメントを書くな！コメントは可読性を阻害する！お前たちは可読性の意図を理解していない！なぜなら**...（以下略）」
<br>

みたいな説法がまたまた始まりました。数時間ぐらい続きましたね。
経験者の私ならまだしも、初心者にその思想の押し付けは早すぎます。
<br>

まあ小難しい余計な理論は置いといて「**必要なコメントは良し、しかし不要なコメントは書くな**」というのは日本のプログラマーの共通認識だと思いますし、その理論を語るなら良いと思います。

しかしこのメンターが説いていたのは**コメントそのものの不要論**でした。
<br>

挙句の果てにはメンター自身が開発に乱入し、コメントを片っ端から削除して勝手にマージしやがりました。Docコメントも消されました。
<br>

同期は完全に萎縮してたし、私も「あー、うぜーし体調悪くなってきたなー。この会社辞めたいなー。」って思ってました。
<br><br>
てか、今まで新卒研修ってこんなノリでやってたんですか？


## てかコメント不要論ってなんなの？

そんな嫌～な経験を思い出して、「そもそもコメント不要論って何を根拠としてるんだ？？」と今さらながら考えました。

調べて出てくるのは、「**シンプルなロジック**」と「**明確適切な命名**」というキーワード。
これは端的に言うと、「コードはコメントを書くまでもなく意図が読めるように書けや」という思想です。
<br>
* 命名で語れ
* 構造で語れ
* コードで心を通わせろ
* しゃべるな
<br>
というジャッキーチェンスタイル。

起源は英語圏、我々プログラマーの祖先は「コードは読み手へのメッセージである」「悪いコードにコメントをつけるくらいなら書き直せ」──と言ってたようです。
中でも「CleanCode」の著者・ロバート・C・マーティン（通称：ボブおじさん）は、

> 「**コメントは嘘（Comments are lies）**」
> 
というパワーワードをブチ上げてます。

これはつまり、「コメントは放置されやすく、コードと内容がズレていく。そんなもん、むしろ害悪になるから信用するな」ということ。
彼らにとって**理想のコード**とは、**読むだけで意図が100%伝わる自己文書化コード**なんです。

英語圏では、オブジェクト指向の台頭時にクラス名やメソッド名によってコードの意図を表現しやすくなったため、「**意図を表す名前付け**」によってコメントを書かずともコードの意図を伝えやすくなった事が背景にありました。
<br>
加えて、アジャイル開発の隆盛もこの思想を加速させます。

* コミュニケーションはコードでやれ
* ドキュメントより動くソフトウェア
* 仕様はテストコードで語れ

すなわち**口よりコード、コメントよりクラス名**
<br>
これらの考え方が定期的に日本のIT業界において変質した「**コメント不要論**」を出現させる結果になったようです。

つまるところ**綺麗なロジックに英語で適切に命名されていれば、コメントが無くてもコードの意図を汲み取れるじゃんか**ということ... 
<br>
待ってください。日本人、英語ネイティブじゃないです。

「thisIsTheUserValidationController」って書かれても、**それは英検2級持ってないと解釈できません**し、いちいち考えたり訳すのも非効率です。
全角カナ混じりの命名が感覚に染みついてる我々が、英語圏ベースの「コメント不要」を目指すのは酷な話で、
言うなれば**生まれてこのかた草を食べたことない人に、納豆を無理やり食わせる行為**に近いです。

## コメント不要論... 日本語で変数名を定義すればあるいは...？

この手の議論をさらに調べていくと「**日本語で識別子を命名すれば、コメントを書かずとも日本人には直感的に意図が伝わるのではないか**」という話も出てくるわけです。
<br>
そこで、とあるメジャーな言語、PHPに目を向けてみます。🐘
体に痛々しいタトゥーを掘られた痛々しいゾウさんを飼い慣らしているPHPですが、この言語、UTF-8のマルチバイト文字での命名に「**一応**」対応しています。

実際にテストメソッドを日本語にして、テストケースを明確化する事例もチラホラ聞いたことがありましたね。今は知りませんが。

```php
// こんな感じのテストメソッド
function 〇〇が△△なときにtrue() {// assert}
```

まあこんな感じでPHPは日本語命名がイケるわけです。(ほかにも日本語命名がイケる言語はありますが、触ったことないのでPHPにしてます)
もしかして、PHPなら日本語で命名しまくってコメント不要の最強コードを作ることができるのではないでしょうか？

## 日本語変数名で命名してみる

早速、簡単なプログラムを作ってみました。

```php
<?php

class 少女
{
    private $名前;

    public function __construct($名前)
    {
        $this->名前 = $名前;
    }

    public function 名前取得()
    {
        return $this->名前;
    }

    public function ポーズをとる($ポーズ名)
    {
        echo $this->名前 . '：「' . $ポーズ名 . '～！」' . PHP_EOL;
    }
}

function ランダムポーズ取得()
{
    $ポーズリスト = ['チンアナゴ', 'さかな'];
    $選ばれたポーズ = $ポーズリスト[array_rand($ポーズリスト)];

    return $選ばれたポーズ;
}

function 水族館デート()
{
    $チサト = new 少女('チサト');
    $タキナ = new 少女('タキナ');

    echo "今日は水族館でデート！" . PHP_EOL;

    $ポーズする少女 = (rand(0, 1) === 0) ? $チサト : $タキナ;

    $選ばれたポーズ = ランダムポーズ取得();
    $ポーズする少女->ポーズをとる($選ばれたポーズ);
}

水族館デート();
```

このコード、読みやすいですか？？
少しシンプルすぎた気がしますが、まあ、コメントが無くても読解速度は上がった気がします。

ちゃんと実行もできますよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782955/66b83b3b-a116-4d09-a108-66b9f7577ed5.png)


#### ちなみに
この手の日本語命名を友人である範馬勇次郎さんがLaravelの業務プロジェクト内で試してみたところ、Laravelの命名規約や自動命名処理との齟齬・IDEの入力補完の破壊・標準ライブラリや組込関数などとの命名不整合(日本語と英語の混在による可読性低下)・外国人メンバーの発狂等によってプロジェクト内でビッグバンが発生したとのことでした。

### しかたがって

英語圏でのコメント不要論を日本語で再現する試み自体は興味深いものの、実運用に乗せる場合はデメリットがメリットを上回らないか十分検証する必要があるでしょう。

日本語識別子を使うことは技術的には可能な言語はありますが、上記の範馬勇次郎さんのように様々なところで弊害が出るでしょう。
同じ考えに至った先駆者たちが同様の理由で爆散していることがネットの海で観測できました。
それが日本語命名が流行らず、真の意味でのコメント不要論が敬遠された理由。

コメント不要論を完璧に体現することは、日本人が英語ネイティブにならない限り難しいかなと思いました。

---

...と、ここで背後から不穏な気配が...

なでしこ「ゴゴゴゴゴゴ」（←多分、日本語プログラミング言語の擬人化）

...この続きは、また別の機会に。（逃亡）


皆さんは生粋のコメント不要論者に遭遇したことはありますか？？あるならコメントで教えてください！！！！