本記事のターゲット
- プログラミング未経験だけど、Elmがどんな言語かをザックリとだけ知りたい人
- 駆け出しエンジニアの主張を見て、ニコニコしながら指摘をしたい老婆心のあるベテランエンジニア
本記事を書いた背景
今年の1月に社内転職をしてエンジニアになって、半年が経ちました。
使用言語はなんと、ElmとHaskell。
社内転職した当初、ちょっとJavaScriptをかじった程度で、
ほぼエンジニア未経験だった僕にとっては、チンプンカンプン。
度重なる脳内スタックオーバーフローを起こしながらも
なんとか半年間を乗り切った駆け出しエンジニアから見たElmの特徴を、
難しい単語は極力使わずに、学校に例えてまとめてみようと思います。
尚、今回は、他の言語と比較するために、代表としてJavaScriptさんに登場してもらいました。
JavaScript高校とElm高校の比較
帰宅部にも配慮してくれる
JavaScript高校の場合
校長「うーん、高校全体の成績が伸びないなあ……」
校長「せや!放課後の部活前に、部活動毎に部室で集まって勉強会をすればええんちゃうやろか!?
そうしたら仲良し同士で気兼ねなく教え合えるやろ! 早速明日から実施や!(^)(^)」
〜翌日〜
担任「かくかくしかじかなので、放課後に部活毎に集まって勉強会をしてもらいます!」
野球部「ええ〜、部活の時間縮まるじゃーん、イヤだよー」
担任「まあまあそう言わずに、15分だけだからさ!」
サッカー部「しゃあねぇなー、その変わりさ、全員の平均点が80点以上だった部活は免除にしてくれよ!」
担任「いい意見じゃないか!早速校長先生に進言しておくよ!」
みんな「やったー!先生良い奴じゃん!」
先生「こらこら、先生に向かって良い"奴"とはなんだ!笑」
ハハハハハハ(わきあいあい)
帰宅部「ところで先生、僕は帰宅部なのですがどうすれば……」
担任「帰宅部?そんなものの存在は認めません(銃殺)」
こうして大事件が起きたJavaScript学校は、
勉強会は愚か、学校運営全体の幕を下ろすことになった……
(プログラムの実行時エラーによる強制終了)
Elm高校の場合
校長「うーん、高校全体の成績が伸びないなあ……」
校長「せや!放課後の部活前に、部活動毎に部室で集まって勉強会をすればええんちゃうやろか!?
そうしたら仲良し同士で気兼ねなく教え合えるやろ! 早速明日から実施や!(^)(^)」
コンパイラ先生「お待ち下さい校長先生!」
校長「これはこれはコンパイラ先生!」
コンパイラ先生「部活動がNull、つまり部活動に所属していない生徒について考慮はしましたか?」
校長「ひえ、していませんでした!」
コンパイラ先生「みんながみんな部活動に入ってるとは思うなよボケェ!!」
校長「ごめんなさいぃ……」
〜翌日〜
担任「かくかくしかじかなので、放課後に部活毎に集まって勉強会をしてもらいます!
ただし、帰宅部の方は強制参加ではなく、自由参加で好きな部活動に混じってもいいことにします!」
生徒「はーい!」
帰宅部「助かった……」
ちょこっと解説
Elmでは、扱うデータの種類を厳密に扱います。
データの種類は、**空の可能性もあるよ!**ということも指し示せます。
データが空の可能性もある種類であるにも関わらず、
データが空だった場合の処理を書いていなければ、コンパイラという優しいおじさんが叱ってくれます。
一方、JavaScriptでは、扱うデータの種類がいい加減です。
いい加減だからこそ楽に書けちゃうときもあるのですが、
データが空だった場合に学校ごと滅びる可能性があります。
データが空だった場合の分岐を予め考えるのはちょっぴり面倒ですが、
どちらにせよ、考慮していなければ学校が滅びるので、考慮した方がいいのではないでしょうか。
(厳密には、「空のデータが持つデータにアクセスしようとすると滅びる……」かもしれません。細かいことは放っておきましょう)
部活動の種類を統一できる
JavaScript高校の場合
部活動への加入が強制であった世界線のJavaScript高校を考えてみましょう。
校長が、先程と同様のクソみたいな素晴らしい学力向上策を考えたとしましょう。
約束した以上は、部活動毎の平均点を出して、80点以上の部活動は免除しなければなりません。
残念ながら、校長先生は我が国のIT大臣ほどはITに詳しくないので、自動で算出するプログラムを書けません。
そこで、こんなアイディアが浮かびました。
- 生徒にテストの点数と所属する部活を書いて提出してもらう
- 小学3年生の息子に、お勉強がてら部活毎の平均点を集計してもらう
※生徒は正直者なので、ウソはつきません
※息子とは念のため秘密保持契約を結びました。ハンコで。
一見完璧のように思えたこの作戦ですが、実は穴がありました。
生徒が提出したデータを見てみましょう。
氏名 | テストの点数 | 所属する部活 |
---|---|---|
香川 | 100 | サッカー部 |
中村 | 77 | フットボール部 |
本田 | 79 | ア式蹴球部 |
小学3年生の息子には、「サッカー部」と「フットボール部」と「ア式蹴球部」が同じであることなんて分かりません!
この3人は、それぞれ別々の部活動として集計されてしまいました。
かくして、本来ならば中村くんも本田くんも勉強会は免除になるはずが、
勉強会に参加しなければならなくなりました!
あーあ
Elm高校の場合
校長「よし、アンケート用紙を作ったぞ!」
コンパイラ先生「ちょっと待って下さい!」
コンパイラ先生「生徒を信用する姿勢は評価します。でも、これだとどんな書き方がされるか分からないですよ!?」
校長「たしかに……」
コンパイラ先生「ということで、アンケート用紙に選択肢を用意するのはいかがでしょう?」
校長「よし、早速選択肢を用意したぞ!」
コンパイラ先生「園芸部が抜けていますよ。」
校長「そんなチェックまでしてくれんのか……」
これだと、表記揺れの心配はありませんね!
ちょこっと解説
これも厳密な例え話かというと、そうではないかもしれません。
あくまで感覚的なものとして捉えてください。
Elmでは、さっき話したデータの種類を自分で定義することができます。
なので、誤って自分で定義したデータの種類以外のデータを扱おうとすると、
事前に、コンパイラおじさんが叱ってくれます。
事前にというのが肝で、これがプログラムの実行時に初めて判明すると、学校が爆破されます
ルールの意味が明確
JavaScript高校の場合
生徒「校長!なんでうちの高校では授業時間が1コマ200分なんですか!?
授業時間が長すぎて集中できません!」
校長「まあ、昔からそうやったからな……。
変えた方がええとは思ってるんやが、変えたら昔からおる古参の先生方が混乱しちゃうんや!TT」
Elm高校の場合
生徒「先生!なんでうちの高校では授業時間が1コマ45分なんですか!?
他の高校はもっと長いって聞きました!」
担任「それはな、多くのホモ・サピエンスの集中力は45分程度しか保たない言われているからなんやで!
そもそも、うちの学校は生徒を優秀な大学に入れることだけを目的とした進学校や!
やから、美術・音楽・書道みたいな目的に沿わない授業も徹底的に排除してるんや!(^)(^)
全ての校則には目的を果たすための理由があるんやで!」
ちょこっと解説
JavaScriptを批判しているわけではありませんし、
全ての仕様が歴史を理由とする非合理的な仕様わけではありません。
しかしながら、JavaScriptはその高い普及率が故に、
「今更変えれねえよ」的な理由で放置されている部分も多々あります。
一方、Elmは特にそういった制約がないので、
既存の価値観に囚われない、合理的なルールを設けています。
そしてルールの根拠は、ウェブアプリケーションを作るという目的を果たすために一貫しています。
また、根拠の詳細を、公式ガイドにて、Elm開発者の生の声で知ることができます。
(日本語翻訳は優秀な有志によって行われています。)
逆に言えば、高校には進学のためだけに行くわけじゃないという人もいるように、
1つの言語でウェブアプリ開発以外にも色んなことをやりたいという人には不向きな言語と言えるでしょう。
(そのときは別の言語を学べばいいんですけどね。笑)
まとめ
- Elmは実行時のエラー(地球の滅亡)を防げて安全だよ
- Elmはウェブアプリを作るためだけに存在しているからこそ、一貫したフィロソフィがあるよ(基本的には)
もうちょっと専門的なことを知りたい人は、僕の10^10倍ぐらいっょぃエンジニアの方が書いた
こちらの記事とかを参照すればいいと思います。