岐阜だからさElixir

試していることなど...需要がないかもしれないけど細々とアウトプットしてます

適当なきっかけで関数型言語(elixir)を始めました

適当なきっかけ

今まで新米のエンジニアとして頑張ってきたつもりです
色々なものを書いた気がしますね... フロントやったりバックやったり...
色々な業務を経験させて頂いていることには感謝しかありません

そんな中で同じ業種の人達を見ていると、まぁ大体の人は

の何ならかが書けてお金を稼いでいます
最近は機械学習やらDeepLeaningでpythonが猛威を振るっている印象ですね
文法も親しみやすく書きやすく最初の言語の選択に選ばれる理由も分かります
上記については自分もgo以外は触ったことがあり、書けるはずです

ただ、ある時に

「あー、何か人と違う言語やりてぇなー」

って変なことを思ってしまいました
普通の理由&適当な理由ですみません。タイトル通りです
昔から僕は人と違ったことがしたくなる性格だったんです(後付け
というわけで何か面白い言語を探してみようかなーってなったんです

世間の動向を調べてみる

矛盾してますけど、人と違う言語がやりたいとはいいつつも世間の動向は重要です
需要のないものや役に立たなそうなことを始められる歳でもありませんので
エンジニア業界でどんな言語がきているかをちょっと調べてみました(2019年現在)
ざっくりまとめてみると...

ふむふむ...

goは確かに色んな人に結構進められます。googleが作ってるし良いものに違いないですねぇ!
でもやってる人も結構多いんですよね... ふぅ...
pythonはまぁ書けないことはないですが、人口が多いので業務レベルで習得できていればいいわけです

となると残りは... 関数型言語か。いいじゃん!!
あ、すんません。僕、関数型言語についてほとんど何にも知りません

ざっくりと分かるかもしれない関数型言語がクールな理由

何かすごいらしいですよ(無責任

開発をしている中で一番しんどいところってどこかというと
バグが出た時です

実体感的にはコードを書いて新機能とかを追加している時間よりバグ潰している時間の方が長いような...
この時間って本当にしんどいです

const tmp = {"number": 1}
console.log(tmp.number); // 本当に1が出力されるのか

だいたいの原因はいつ値がどのように変更されたのかブラックボックス化していることかと思います
あ、こんなところで値が変わっとるやん!ってのが本当に多いです
上記のコードはおそらくconsole.log()によって1が表示されるでしょう
しかし、その間にいくつもの処理が挟まれたらどうですかね
tmpの変数が変化していないことを証明するためにその処理を辿る必要があります

参照透過性

関数型言語には基本的に参照透過性ってのがあります

参照透過性とは
値が変化しないことを保証するで

つまり先ほどの例で言えば変数tmpの値は不変なわけです。絶対に1が出力されますよって!!
やりました。コードを全て辿る必要はなさそうですよ!!

参照透過性があると...

const tmp = {"number": 1}
console.log(tmp.number); // 絶対に1を出力するマン

美しき再帰関数

詳しいことは別の記事に書こうと思います。触りだけ
オブジェクト言語でループ処理を書こうと思うと

  • while
  • for

とかを書きます。僕はfor文は好きですね
しかし関数型言語には基本的にループ処理としてforは書きません(てか無い)
再帰関数というものを使います
言語に用意されたメゾットは使わずに配列の合計値を求める処理を書いてみます

pythonだとこんな感じ

lst_data = [1,2,3,4,5]
total = 0
for num_in_lst in lst_data:
  total += num_in_lst

print(total) // result: 15

elixirだとこんな感じ

defmodule Calc do
  def sum(lst), do: _sum(lst, 0)
  defp _sum([], accum), do: accum
  defp _sum([head | tail], accum) do
    _sum(tail, head + accum)
  end
end

IO.puts(Calc.sum([1,2,3,4,5])) # result: 15

見れないものだと思うので気持ち悪いですよね。僕もそうです
伝えたいことは関数が自分自身を呼び出して(再帰)
条件に一致した時に停止するということです。美しいですね
この誰にでも書けそうに無い感じが好きです(アホ

elixirについて

数ある関数型言語がある中でなぜelixirという言語を選んだというと

  • 名前がかっこいい
  • 速い
  • 並列処理すごいらしい
  • 日本だとまだやってる人少ない
  • とあるきっかけで紹介された(また別記事にて...)

とまぁ、本当に適当です。正直なんでも良かったんですけど運命的なものです
後付けの理由も一応書いておきます
1. 現在はBigDataがゴロゴロと転がってる
2. DeepLearningのモデルやらはtensorflowやらkerasやらでどんどん簡略化されていく
3. ということはデータの質をあげる作業が重要になるんじゃない?
4. おそらく同じことををする人はたくさんいるので速さが重要になる

お、並列でゴリゴリ高速で処理できるelixirくるな と思ったんです
後付けにしては上出来ではないでしょうか?

まとめ

長くなってすみません。1000文字を目安に書いてるんですが3000文字行きそうです
とにかく僕はelixirに可能性を感じたので始めてみようと思います
少しでも興味を持ってもらえる && 共に始めていただければ光栄です

あと自分は田舎に住んでいるんですが、 田舎でelixir使って最先端技術を持つ町 みたいなのを夢に見てます

妄想は以上です