Hurry Coderと謎のコメント

# とあるWeb制作会社にて
社長「なあ、やめ太郎くん」
社長「この**PHPファイル**を修正しといてくれや」

ワイ「ええで」
ワイ「（**JavaScriptしか書けへんけど・・・**）」

# さっそくPHPコードを読んでみる
ワイ「ふむふむ」
ワイ「なるほど」
ワイ「思った通りや」
ワイ「**まったく分からん**」
ワイ「**ハリー先輩**に質問しよ」

# ハリー先輩とは
+ この会社で**唯一**のプログラミング経験者
+ まともなコーダーは彼しかおらず、いつも質問責めに
+ 常に忙しいため**ハリー・コーダー先輩**と呼ばれている

# 質問してみる
ワイ「ハリー先輩、すんません」
ワイ「この関数はどう直したらええんですか」

ハリー先輩「ここはこんな感じや」
ハリー先輩「**チョイチョイチョイ**、と」
ハリー先輩「後は頼んだで！」
ハリー先輩「あー、いそがし」

# 直してもらったコードを見てみる
ワイ「なるほどなー、この関数はこう直せばよかったんか」
ワイ「お、なんやこの関数の上のコメントは？」

```php
/**
* blackCompanyFunc
*
* @param Int $n
* @param String $text
* @return String
*/

function blackCompanyFunc ($n, $text) {
```

ワイ「ふむふむ、第1引数の**$n**には**整数を入れろ**という意味やな」
ワイ「そして第2引数の**$text**には**文字列**を入れればええんか」
ワイ「そして**返り値も文字列**と」
ワイ「なるほどなー」
ワイ「ちゃんとコメントで関数の説明が書いてあると、後から分かりやすいなあ」
ワイ「最初にコーディングした人ホンマえらいわ」

#しかし、よく見てみると
ワイ「あれ」
ワイ「引数**$n**は**整数のはず**なのに**文字列が入ってきとる**で」
ワイ「**コメントに書いてある事とちゃう**で」
ワイ「紛らわしいなぁ・・・」
ワイ「最初は整数を入れて使ってたけど、今回の修正で仕様が変わったんか？」
ワイ「ならコメントも直してくれへんと・・・」
ワイ「**先輩・・・**」
ワイ「忙しいから修正も雑やな・・・」
ワイ「**ハリー・コーダーの異名は伊達やない**な・・・」

# コメントで書いたルールに強制力はない
ワイ「せっかくコメントで引数や返り値に関するルールが書いてあっても、**守られてなかったら意味ない**で・・・」
ワイ「弊社の**闇は深い**なぁ・・・」
ワイ「コメントに書いてあるルールを守らんかった場合は**アラートが出ればええのに**なぁ[^1]・・・」

# 次の日
社長「今日はこの**Elm**のファイルを修正してくれや」

ワイ「ええで（何や**Elm**って）」

# Elmのコードを読んでみる
ワイ「ほうほう、**Elm**いうんはコンパイルすると**JavaScript**や**HTML**を吐き出してくれる**AltJS**みたいなもんなんか」

```elm
func1 x y =
    x + y
```

ワイ「なるほど、**Elm**では関数をこう書くんやな」
ワイ「ふむふむ」
ワイ「何やこの、関数の上に書いてあるコードは」

```elm
func1 : Int -> Int -> Int
func1 x y =
    x + y
```

ワイ「なんや`Int -> Int -> Int`て」
ワイ「ハリー先輩は**忙しくてピリついてる**から**グーグル先生**に聞いてみよ」
ワイ「**ブラック会社あるある**やな」

ワイ「なになに、これは**型注釈**いうもんなんか」
ワイ「この**func1**という関数は**引数として整数2つを受け取って、整数を返しますよ**いう意味なんやって」
ワイ「昨日のPHPにあったコメントみたいなもんやな」
ワイ「なになに、型注釈で書いてあるとおりに引数を渡さんと、そもそも**コンパイルが通らへん**のか」
ワイ「せやから必然的に**コンパイル前に修正**することになり」
ワイ「**実行時にエラーが出にくい**と」

ワイ「・・・**これやで**」

ワイ「これこそワイの求めとった**強制力を持つコメント**やないか」
ワイ「1人で小規模なプログラミングしてる分には、引数の間違いなんて滅多にせえへんけど、」
ワイ「仕事で複数人でプログラミングする場合はそうとも限らんもんな」
ワイ「せっかく賢い人が書いたコードを、ワイみたいな**ザコーダー**がよう分からずに修正してしまうこともある」
ワイ「そこを**型がブロックしてくれる**わけやな」
ワイ「型が無い方が好きなもんを渡せて自由度は高いのかもしれんけど」
ワイ「ワイみたいな**ザコーダー**を自由な世界に放つと**クソコード**が生まれるからな」
ワイ「**型**で縛って貰った方が**間違えにくくて安全**や」

# AltJSええやん
ワイ「**AltJS**なんて**結局JSに変換される**んやから、」
ワイ「**JS以上のことは出来ひんのやろ？**って」
ワイ「**要らんやん**って」
ワイ「**最初からJSで書くわ！**って」
ワイ「むしろ**ワイは脳内でES5に変換してから書いてんねん！**って」
ワイ「そう思ってたけど」
ワイ「違ったんやな・・・」
ワイ「コンパイラを通すことで、**コードの品質を保ってくれてた**んやな・・・」
ワイ「誤解しててゴメンな、AltJS・・・」

# まとめ
ワイ「**型**なんて面倒くさいし要らんと思っとったけど」
ワイ「むしろ**ザコーダー達の暴走運転を抑制**してくれる**ガードレール**みたいなもんやったんやな」
ワイ「自由に走り回れるより、やっぱ**ガードレールあった方がええ**わ」

ワイ「そもそも、型が明記されとる方が**何を受け取って何を返す関数なのか分かりやすい**っていう、」
ワイ「**コメント的な役割**もあるしな」
ワイ「**他の人のコードを読むとき**に助かるし」
ワイ「**自分のコードを見直すとき**もありがたいな」

ワイ「賢い人たちがよく言う、**大規模なプログラミングも型を使って堅牢に**っていうんはこういう事やったんか」
ワイ「**型、ぱねぇ**・・・」

ワイ「あと**Elmちゃん、むっちゃ易しい**」


**〜終〜**


# 追記: Elm用のAtom拡張機能を作りました
HTMLのコードをElmに変換する拡張機能やで。
[**こちらの記事**](https://qiita.com/jzmstrjp/items/f35cf85c277d035b247f)で紹介してますさかい、よかったら使うてみてや！

# 追記2: クラスタを作りました
[**なもなきくらすた**](https://namonaki-cluster.herokuapp.com)というサイトで
[**Elm で 型デビュー くらすた**](https://namonaki-cluster.herokuapp.com/clusters/68)を作りました。
よかったら参加してみてください。
（ツイッターにリストを作ってくれるWebサービスです）


[^1]: ※PHP7からは[引数や戻り値の型指定](https://qiita.com/saken649/items/fc5125db2369b548a6f0#1-%E5%9E%8B%E5%AE%A3%E8%A8%80%E3%82%BF%E3%82%A4%E3%83%97%E3%83%92%E3%83%B3%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%E6%88%BB%E3%82%8A%E5%80%A4%E3%81%AE%E5%9E%8B%E6%8C%87%E5%AE%9A)が出来るようになったらしいで！