非エンジニアでも分かる"私立Elm高等学校"の特徴

# 本記事のターゲット
* プログラミング未経験だけど、Elmがどんな言語かを**ザックリとだけ**知りたい人
* 駆け出しエンジニアの主張を見て、ニコニコしながら指摘をしたい老婆心のあるベテランエンジニア

# 本記事を書いた背景
今年の1月に社内転職をしてエンジニアになって、半年が経ちました。

使用言語はなんと、**Elm**と**Haskell**。

社内転職した当初、ちょっと**JavaScriptをかじった**程度で、
ほぼ**エンジニア未経験**だった僕にとっては、チンプンカンプン。

度重なる**脳内スタックオーバーフロー**を起こしながらも
なんとか半年間を乗り切った**駆け出しエンジニア**から見たElmの特徴を、
**難しい単語は極力使わずに**、**学校に例えて**まとめてみようと思います。

尚、今回は、他の言語と比較するために、代表として**JavaScriptさん**に登場してもらいました。

# JavaScript高校とElm高校の比較
## 帰宅部にも配慮してくれる
### JavaScript高校の場合
校長「うーん、高校全体の成績が伸びないなあ……」

校長「せや！放課後の部活前に、部活動毎に部室で集まって勉強会をすればええんちゃうやろか！？
　　　そうしたら仲良し同士で気兼ねなく教え合えるやろ！　早速明日から実施や！(^)(^)」

〜翌日〜

担任「かくかくしかじかなので、放課後に部活毎に集まって勉強会をしてもらいます！」

野球部「ええ〜、部活の時間縮まるじゃーん、イヤだよー」

担任「まあまあそう言わずに、15分だけだからさ！」

サッカー部「しゃあねぇなー、その変わりさ、全員の平均点が80点以上だった部活は免除にしてくれよ！」

担任「いい意見じゃないか！早速校長先生に進言しておくよ！」

みんな「やったー！先生良い奴じゃん！」

先生「こらこら、先生に向かって良い"奴"とはなんだ！笑」

ハハハハハハ(わきあいあい)


帰宅部「ところで先生、僕は帰宅部なのですがどうすれば……」

担任「帰宅部？そんなものの存在は認めません(銃殺)」


こうして大事件が起きたJavaScript学校は、
勉強会は愚か、学校運営全体の幕を下ろすことになった……
(プログラムの実行時エラーによる強制終了)


### Elm高校の場合
校長「うーん、高校全体の成績が伸びないなあ……」

校長「せや！放課後の部活前に、部活動毎に部室で集まって勉強会をすればええんちゃうやろか！？
　　　そうしたら仲良し同士で気兼ねなく教え合えるやろ！　早速明日から実施や！(^)(^)」

コンパイラ先生「お待ち下さい校長先生！」

校長「これはこれはコンパイラ先生！」

コンパイラ先生「部活動がNull、つまり部活動に所属していない生徒について考慮はしましたか？」

校長「ひえ、していませんでした！」

コンパイラ先生「みんながみんな部活動に入ってるとは思うなよボケェ！！」

校長「ごめんなさいぃ……」

〜翌日〜

担任「かくかくしかじかなので、放課後に部活毎に集まって勉強会をしてもらいます！
　　　ただし、帰宅部の方は強制参加ではなく、自由参加で好きな部活動に混じってもいいことにします！」

生徒「はーい！」

帰宅部「助かった……」

### ちょこっと解説
Elmでは、**扱うデータの種類**を厳密に扱います。

**データの種類**は、**空の可能性もあるよ！**ということも指し示せます。

**データが空の可能性もある種類**であるにも関わらず、
**データが空だった場合の処理**を書いていなければ、**コンパイラ**という**優しいおじさん**が叱ってくれます。

一方、JavaScriptでは、**扱うデータの種類**がいい加減です。
いい加減だからこそ**楽に書けちゃう**ときもあるのですが、
データが空だった場合に**学校ごと滅びる**可能性があります。

データが空だった場合の分岐を予め考えるのはちょっぴり面倒ですが、
どちらにせよ、考慮していなければ**学校が滅びる**ので、考慮した方がいいのではないでしょうか。

(厳密には、「空のデータが持つデータにアクセスしようとすると滅びる……」かもしれません。細かいことは放っておきましょう)

## 部活動の種類を統一できる
### JavaScript高校の場合
部活動への加入が強制であった世界線のJavaScript高校を考えてみましょう。

校長が、先程と同様の~~クソみたいな~~素晴らしい学力向上策を考えたとしましょう。

約束した以上は、部活動毎の平均点を出して、80点以上の部活動は免除しなければなりません。

残念ながら、校長先生は[我が国のIT大臣](https://www.buzzfeed.com/jp/harunayamazaki/reberunoigasugoi78noitgano38puroguramaitgani)ほどはITに詳しくないので、自動で算出するプログラムを書けません。

そこで、こんなアイディアが浮かびました。

1. 生徒に**テストの点数**と**所属する部活**を書いて提出してもらう
2. 小学3年生の息子に、お勉強がてら**部活毎の平均点**を集計してもらう

※生徒は正直者なので、ウソはつきません
※息子とは念のため秘密保持契約を結びました。ハンコで。

一見完璧のように思えたこの作戦ですが、実は穴がありました。
生徒が提出したデータを見てみましょう。

|氏名|テストの点数|所属する部活|
|----|---:|----|
|香川|100|サッカー部|
|中村|77|フットボール部|
|本田|79|ア式蹴球部|

小学3年生の息子には、「サッカー部」と「フットボール部」と「ア式蹴球部」が同じであることなんて分かりません！
この3人は、それぞれ別々の部活動として集計されてしまいました。

かくして、本来ならば中村くんも本田くんも勉強会は免除になるはずが、
勉強会に参加しなければならなくなりました！

あーあ

### Elm高校の場合
校長「よし、アンケート用紙を作ったぞ！」

コンパイラ先生「ちょっと待って下さい！」

コンパイラ先生「生徒を信用する姿勢は評価します。でも、これだとどんな書き方がされるか分からないですよ！？」

校長「たしかに……」

コンパイラ先生「ということで、アンケート用紙に選択肢を用意するのはいかがでしょう？」

校長「よし、早速選択肢を用意したぞ！」

コンパイラ先生「園芸部が抜けていますよ。」

校長「そんなチェックまでしてくれんのか……」

これだと、表記揺れの心配はありませんね！

### ちょこっと解説
これも厳密な例え話かというと、そうではないかもしれません。
あくまで感覚的なものとして捉えてください。

Elmでは、さっき話した**データの種類**を自分で定義することができます。
なので、誤って**自分で定義したデータの種類**以外のデータを扱おうとすると、
**事前に**、コンパイラおじさんが叱ってくれます。

**事前に**というのが肝で、これがプログラムの実行時に初めて判明すると、**学校が爆破されます**


## ルールの意味が明確
### JavaScript高校の場合
生徒「校長！なんでうちの高校では授業時間が1コマ200分なんですか！？
　　　授業時間が長すぎて集中できません！」

校長「まあ、昔からそうやったからな……。
　　　変えた方がええとは思ってるんやが、変えたら**昔からおる古参の先生方**が**混乱**しちゃうんや！TT」

### Elm高校の場合
生徒「先生！なんでうちの高校では授業時間が1コマ45分なんですか！？
　　　他の高校はもっと長いって聞きました！」

担任「それはな、多くのホモ・サピエンスの集中力は45分程度しか保たない言われているからなんやで！
　　　そもそも、うちの学校は**生徒を優秀な大学に入れることだけを目的とした進学校**や！
　　　やから、美術・音楽・書道みたいな目的に沿わない授業も徹底的に排除してるんや！(^)(^)
　　　全ての校則には**目的を果たすための理由**があるんやで！」

### ちょこっと解説
JavaScriptを批判しているわけではありませんし、
全ての仕様が**歴史を理由とする非合理的な仕様**わけではありません。

しかしながら、JavaScriptはその高い普及率が故に、
「今更変えれねえよ」的な理由で放置されている部分も多々あります。

一方、Elmは特にそういった制約がないので、
既存の価値観に囚われない、**合理的なルール**を設けています。

そして**ルールの根拠**は、**ウェブアプリケーションを作る**という目的を果たすために一貫しています。

また、根拠の詳細を、[公式ガイド](https://guide.elm-lang.jp/)にて、Elm開発者の生の声で知ることができます。
(日本語翻訳は優秀な有志によって行われています。)

逆に言えば、**高校には進学のためだけに行くわけじゃない**という人もいるように、
**1つの言語でウェブアプリ開発以外にも色んなことをやりたい**という人には不向きな言語と言えるでしょう。
(そのときは別の言語を学べばいいんですけどね。笑)

# まとめ
* Elmは実行時のエラー(地球の滅亡)を防げて安全だよ
* Elmはウェブアプリを作るためだけに存在しているからこそ、一貫したフィロソフィがあるよ(基本的には)

もうちょっと専門的なことを知りたい人は、僕の10^10倍ぐらいっょぃエンジニアの方が書いた
[こちらの記事](https://qiita.com/arowM/items/dfb38d1c5f3dfde8b8bf)とかを参照すればいいと思います。