Findy Engineer Lab

エンジニアの"ちょい先"を考えるメディア

RubyとElixirは親戚のような存在?両者の違いについて深堀りしました【イベント後編QAセッション】

f:id:findy-lab:20210907095853p:plain

1993年の誕生以来、根強い人気を誇るRuby。近年は、Rubyの思想をベースとして開発されたElixirへの注目が少しずつ高まっており、海外製のサービスでは、SlackやSpotifyなどが同言語で作られていることも有名です。しかし日本では事例が少なく情報が不足しており、国内でどの程度浸透していくのかについて未知数の言語でもあります。

Elixirが拡まると想定して今から勉強しておくべきか、圧倒的なサービス例のあるRubyを追求するべきか──。バックエンド領域に携わるエンジニアが今後学ぶべき言語とは何なのか?

本イベントでは、各言語の有識者である松田さん、森さん、中尾さん、齋藤さんの4名をお招きし、RubyとElixirについてそれぞれが持つ特徴や2つの言語が共存する方法について語っていただきました。

後編の本稿では、イベント後半に行われたQ&Aの様子をお届けします!

パネリスト

松田明さん(@a_matsuda)

20210907090542

日本人として唯一RubyおよびRuby on Railsの両プロジェクトのコミッターを務める、オープンソース・プログラマー。kaminari、active_decorator、action_argsなど、数多くのOSS作品を手がけるライブラリ作家。地域Rubyユーザーグループ「Asakusa.rb」の主催。国際カンファレンス「RubyKaigi」のチーフオーガナイザー。最後のRubyHero。

森正和さん(@piacere_ex)

20210907090545

39年前からプログラマ。書ける言語は158言語で、Elixirを「至高の言語」とした2017年以降、実務/趣味/OSSはほぼElixir製。大学で独自OS/コンパイラを開発後、大手SIerでPMと事業部長を経て、国民の約1/4が使う超大規模基盤開発の性能統括中にElixirと出会う。現在、(株)DigiDockConsultingのファウンダー兼CTOとして、VR・AR/D2C/DXによる事業指南を行いつつ、他3社のIT企業経営と、3社の技術顧問を兼任。国際カンファレンス「ElixirConfJP」および「fukuoka.ex」の創設者。「Elixir|>College」「DD.Academy」「AIジョブカレ」の3校と、北九州市立大学、北九州工業高等専門学校でプログラミングとElixirを教えている。

中尾瑛佑さん(@YOSUKENAKAO)

20210907090548

グローバルでも通用するエンジニアの育成を掲げ、自らも講師として、エンジニア育成の教材・カリキュラムの開発・講義を通して2014年からの7年間で延べ5000名以上、​4歳から社会人まで幅広い年齢層に教育を行う。​これからの日本を発展させる為には、オブジェクト指向から関数型へのパラダイムシフトに加え、従来型のマネジメントからスクラムでのマネジメントへのパラダイムシフトが重要と考えている。マネジメントと新しい言語の2つを軸に、VUCA時代と呼ばれる先行き不透明な時代に、​PMF(プロダクト・マーケット・フィット)に到達するエンジニアの育成を実現する​研修を提供。

齋藤和也さん(@mokichi_s12m)

20210907090552

福岡県出身、九州工業大学情報工学部卒。フリーランスとして2年ほど、Webサービスやスマートフォンアプリの受託開発を中心に活動。アジャイル開発を実践し、保守性・拡張性の高い設計を得意とする。独立前は研究用ソフトウェアの開発に従事しており、機械学習や自然言語処理といった分野にも明るい。2015年1月、株式会社スマートアルゴリズムを設立、代表取締役に就任。2016年10月より株式会社VookのCTOも兼任し、その他複数社で技術顧問としても活動中。

モデレーター :佐藤将高(ファインディ株式会社)(@ma3tk)

20210907090538

東京大学情報理工学系研究科創造情報学専攻卒業後、グリーに入社し、フルスタックエンジニアとして勤務する。2016年6月にファインディ立上げに伴い取締役CTO就任。

多くの現場で使われるRubyと使い心地のいいElixir

f:id:findy-lab:20210907120933p:plain

──ここからは参加者の皆さんから届いた質問に答えていただくQ&Aに移りたいと思います。まず早速ですが「森さんの発言にあった『5Gでクラウドが使えない』というのはどういった文脈ですか?」という質問がきていますね。こちらいかがでしょうか?

森さん: 一般的なキャリア5Gを使っていればクラウドを利用できるのですが、工場などで使用されているシステムなど、キャリア5Gではなくローカル5Gを使うケースや、外部アクセスを制限しているキャリア5Gの使い方では、クラウドが使えないことも珍しくありません。

あとは、モバイルエッジサーバーという5Gのキャリア網が用意するエッジサーバーがあるのですが、それを使うとクラウドを使用するよりもレイテンシーが低く、通信の行ったり来たりが短く済むんです。しかし、その環境だとクラウドを使えないケースが多く、その中でマルチクラスターやマルチマスターDBを使いたいとなった時、Elixirは標準機能で“クラウドもどき”のようなことができるので、クラウドが使えないときでも安心です。

──標準で整備されているのがElixirの魅力でもあるということですね。次に「Active RecordよりEctoの方がいいですか?」というストレートな質問がきているのですが、齋藤さんいかがでしょうか?

齋藤さん: 個人的な感想でいうと、DBから手軽にデータを抜き出したい時は、Active Recordの方が圧倒的にやりやすいです。Ectoに関しては、複雑なクエリになる場合には使い勝手がいいという印象ですね。

設計の問題もあるとは思うのですが、Active Recordを使っていて、複雑なクエリにしないといけない場合、SQLの直書きしているところとActive Recordの部分が入り混じってわかりづらくなるじゃないですか? Ectoだとそういった状態にはなりにくい。もともとSQLチックに書けるので、使い勝手がいいという印象です。

また、パフォーマンスチューニングをやる際も、Active Recordは一つインスタンスを作ると結構メモリを消費してしまうんです。そのため、Active Recordを使ってt3.microとかで動かしていると落ちてしまうことがあるんです。特にバッチ処理などは落ちてしまいがちです。一方、Ectoの場合、Ectoで取得したデータは基本的にはElixirでいうただの構造体でしかないため、Active Recordと比べてそこまでメモリを消費しない印象があります。とはいえ、私がActive Recordでたくさんのデータを扱っていたのは5.1とかだったため、今は改善しているのかもしれませんが。

──結論としては好みによるというところですね。ActiveRecordのメモリを消費する問題について、松田さんの意見をお伺いできればと思うのですが、いかがでしょうか?

松田さん: おっしゃる通りで、4.0や4.1でActiveRecordが重たくなってしまったのは事実です。Ruby on Railsが一番速かったのは多分2.3ぐらいで、バージョンアップするごとにどんどん重たくなるという時期がありました。ご迷惑をおかけしております……。しかし、コミッターたちが頑張って負債の回収に取り組んでいて、最近はとても改善しています。現在最新の6.1に上げていただくとだいぶ速くなっているはずなので試してみてください。

参加者の皆さんも、Ruby on Railsでパフォーマンス問題があると感じている場合は、ぜひバージョンアップしてみてください。Ruby on RailsだけではなくRubyについても同じなのですが、より良いパフォーマンスを実現するため、みんなが改善に取り組み続けているため、基本的にはバージョン上げるだけで改善するような仕組みになっているはずです。最新版にしたけど「まだ遅い」などの問題があれば、報告をしてくださるなり、パッチを書いてくださるなりしていただけるとありがたいです。

──これを期にOSSコントリビュートをしていただければと思います。続いてElixirについて「データ処理でElixirを使うというのは、実務だとどのようなユースケースになるのでしょうか?」という質問がきています。森さんこちらいかがですか?

森さん: 私が一番最初に魅力を感じたケースについてお話しすると、Sparkのようなものを作る時にElixirが便利だということですね。ScalaのSparkという、メモリーベースでMapReduceするミドルウェアがあるのですが、そのSparkの小さいものを作るとき等にElixirがとても活躍してくれます。「データを集めて何らかの分析や処理をしてまとめて返す」というようなタイプのものには大体適用できるのではないかなと。

フワッとした言い方になってしまうのですが、Elixirって性能もさることながら、“書き味がいい”んですよね。中でもEnumというライブラリーが、データ操作をするとき、とても使いやすいです。さらにEnumは、Flowと書き直すと、それだけでデータ処理をマルチコア並列化できるんですよ。性能をあげようと思ったら、こういった“裏技”のようなこともElixirは簡単にこなせてしまう。JSONパーサを書いたり、外部のAPIをいくつも呼んでアグリゲーションしたりする際に、こういった技を使うと、Elixirの心地よさがとても実感できると思います。あとはPythonのPandasってご存知ですか?マシンラーニングで「前処理」を書く時によく使われるものなんですが、これに相当するものを性能アップしたり、並行化したいとき、Elixirで書くのもおすすめです。

RubyとElixirは似ているようで異なる。親戚のような存在

──続けて「Rubyから来てる記法も多いですよね」「RubyとElixirは親戚というイメージが強いです」というコメントがいくつかきていますね。

松田さん: 親戚という言葉がぴったりだと思います。そもそもElixirの作者であるJosé(ジョゼ)は、もともとRuby on Railsコミッターで、彼自身の第一言語がRubyなんですよね。そもそも、Elixirは「ErlangVM上で動くRubyみたいな言語を作りたい」というところからスタートしています。

マニアックな話をすると、Celluloidの作者であるTony ArcieriがReiaという言語を作っていて、ErlangVM上で動くRubyのような言語を作っていたんですね。Joséがなにかのきっかけでそれを発見して、彼なりにパッチを書いたりするようになっていったというのが始まりです。

José自身はRuby on Rails3.0の開発をやっているくらいから、Ruby on Railsに関わり始めているんですね。彼がまだ大学生だった時に「Google Summer Of CodeでRuby on Rails3.0に向けてRailsのジェネレーターを全部書き直す」というプロジェクトが立ち上がって、それに申し込みをしてGoogleからお金もらって書き始めたというのが、僕の知る限り彼のデビュー作だったはずです。それがきっかけで、Ruby on Railsにパッチを送ってくるようになり、あっという間にコミッターにもなって大活躍。

Joséが活躍するようになって1~2年後くらいの、2012年か2011年に開催されたRailsConfで、JoséとYehuda KatzとCarl Lercheなど、Ruby on Railsコミッターの何人かでランチを食べに行ったことがあるんです。当時はRuby on Rails3.1ぐらいの時代で、Ruby on Railsコミッターが集まったらBundlerとかアセットパイプラインに関する議論をすることが多く、話題が尽きないような時代だったんです。ですが、彼らはランチをしながらErlangについてずっと話していました。本当に技術が好きな人たちが集まっているんだなと感動したのを覚えています。

少し話がそれてしまったのですが、ちょうどその時にJoséが話していたのが、「これ以上Reiaにパッチを送り続けるよりも自分でスクラッチで作った方が早いから、今作っている。Elixirっていう名前にした」と話していたんです。つまり、ElixirはRuby on Railsコミッターが片手間で作っていた言語なんですよ。

そんな話をしてから何年か経ってRubyKaigiにJoséを招待して、キーノートをお願いしたことがあって、Asakusa.rbでElixirに関するイベントをやって語ってもらうということもしたのですが、当時の日本ではElixirは全く認知されていなかったんです。それが数年前の話なので、とても早いスピードでElixirは広まっているのだなと思いました。

──僕も数年前は「Elixirってファイナルファンタジー(以下FF)のMPを回復するやつかな」と思っていました(笑)。ここ数年で急速に広まりましたよね。

森さん: ちなみにJosé自身はFFをやったことがないと言っていました(笑)。ElixirやPhoenixなど、いかにも“FFっぽい単語”が出てくるので、OSSにそういう雰囲気のある名前を付けている人もいるのですが、別に関係はないそうです。

──そうなんですね! 衝撃の事実が発覚しましたが、次の質問が来ているのでそちらに移りたいと思います(笑)。「ElixirからGCPやAWSといったクラウドサービスを使っていると、新機能向けSDKの対応がメジャー言語に比べて薄い問題は、皆さんどう対策しているのでしょう?」という質問と「RubyとElixirが似ているという話はよく聞くのですが、似ているがゆえに触っていると違和感があります。齋藤さんはどのように使い分けてますか?」という質問が届いています。齋藤さん、こちらいかがですか?

齋藤さん: 私もAWSとGCPの両方を触りましたが、AWSはそもそも公式SDKがないんです。サードパーティーのものしかないので、公式のものに比べると多少不安だと思うのですが、AWSやGCPの機能をElixirから使う時、新機能を使うという場面が私の場合はあまりないですね……。そこまで困ったことはないというくらい開発されていると思います。

言語の使い分けでいうと、結論としては“慣れるしかない”のかもしれません。これは実際にあった話なのですが、私の会社でElixirの案件をやった時に、当時いた社内のメンバーに私のタスクを振り分けたことがありました。インフラの保守をやっていて、スクールでRuby on Railsを勉強して実務に入ってきたという経歴の方にお願いしていたのですが、結果としてはあまり進捗がよくありませんでした。おそらく当時は経験1年半ぐらいで、とても優秀なエンジニアだったのですが、言語の習得には苦労したようです。

原因としては、パラダイムが違うことが大きかったのではないかと考えています。オブジェクト指向と関数型、2つのパラダイムの違いがあった時に、頭の切り替えがスムーズにできなかったのかなと。Rubyを習得しきれていない状態でElixirについても学ぼうとすると、オブジェクト指向の考え方が邪魔をしてしまうのだと思います。

ただ、RubyやElixirに限らず、複数の言語を触っていろんなパラダイムに触れていると、自然と頭の切り替えができるようになってくるため、最終的には慣れるというのが一番だと思います。

Ruby/Elixirいずれも自然発生したものではなく、個人の思いから生まれたもの

──言語の習得という点でいうと、コツコツ経験を積んでいくのが一番の近道なのかもしれないですね。ありがとうございます。最後のイベントの締めとして皆さんから一言ずつコメントをいただければと思います。中尾さんからお話いただけますか。

中尾さん: Elixirが今後どのような立ち位置になっていくのか、気にされている方も少なくないと思うのですが、興味がある方はまずトライしてみて欲しいです。教育をしている立場からすると、教育には二つの目的があって、一つは現状維持をするため。もう一つは新しい何かを始めるための教育があります。

Elixirがこれからどうなっていくのかはわかりませんが、自分たちで広めていくこともできるんです。参加者の皆さんはこれから未来を作っていく立場だと思います。「どういった言語が流行るのか」ではなく、「自分たちで正解を作っていく」という目的意識を持って取り組んでいただくと、どの言語を選んだとしても楽しめるのではないでしょうか。

──ありがとうございます。では松田さんお願いします。

松田さん: 今日皆さんにお伝えしたかったのは、RubyもElixirも自然発生して天から降ってきたものではなく、“たった1人の人間が作り出した個人プロダクトである”ということです。Elixirの作者であるJosé、Rubyの作者であるMatz、どちらも本当にナイスガイで、そんな2人の人柄が言語自体のデベロッパーフレンドリーな手触りにもすごく表れているんですよね。そういったところを頭に入れつつ触っていただくと、各言語の見え方が変わる。親近感がわくというか、毎日のプログラミングがもっと生き生きしてくると思います。

技術の話をしていると、そういった視点が抜けてしまいがちなんですが、僕自身はRubyを始めてとても意識が変わったところなんですよ。それまで「パソコンのお仕事だ」と思っていたものが、「パソコンの向こうにいる人との対話」を感じられるようになった。これはRubyを触って初めてわかってきたところです。Rubyの手触りと、インターネットと、OSSコミュニティと、そのあたりの親和性の高さみたいな要因があるのかもしれません。

「Matz is nice and so we are nice」という言葉があるのですが、これは「Matzというナイスな人が作っているRubyを使っているのだから、コミュニティ全体としてみんなナイスになっていこう」という標語みたいなもので、言い出したのはMartin Fowlerなんです。Martin FowlerはJavaでエンタープライズのイメージが強いのですが、本人はRubyが大好きなんですよ。

"Rubyist”という言葉もあるのですが、これはMatzの発明で、Rubyを使ってRubyを応援してくれている人やRubyにポジティブな気持ちを持っている人の総称なんです。そうやって自分の属性に名前がつけられると、なんか不思議な仲間意識が生まれてくる感じがあって。でも多分プログラミング言語でこんなことをやったのはMatzが最初なんです。Matzの言語センスは才能ですね。

あと、Rubyはコミュニティが活発で、開発体制もコミュニティベースですし、コミュニティ主催のイベントやAsakusa.rbなどのコミュニティもたくさんあります。今日ご参加いただいた皆さんの中には、すでにコミュニティに参加している方もいらっしゃるかもしれないのですが、今日のイベントで「OSSって個人の思いから生まれたものなんだ」ということを感じてもらえていたら嬉しいです。

また、9月9日(木)~11日(土)までの3日間、RubyKaigi Takeout 2021も開催されます。Rubyの未来に関する話がたくさん聞けるので、ぜひお越しください!

──ありがとうございます。それでは森さん、お願いします。

森さん: 2015~2016年頃は、Elixirをしている人は自分の周りには限りなくゼロに近い状況で、ライブラリーもErlangを使わないと話しにもならないという状況だったのですが、今回のイベントで、Elixirに関心のある方がかなり多いということが分かったし、「Elixirって難しい」と感じられてる方が意外と少ないことも分かり、とても嬉しかったです。

プログラミング言語は、発祥から4~5年ぐらいで海外、10年前後で日本で流行ってくるような傾向があります。そして、来年はElixirの発祥からちょうど10年です。Stack Overflowの世界高額年収では、今年、Elixirが3位で、海外ではすでにElixirの波が数年前から来ているのですが、来年くらいから国内でもだいぶ面白いことになってくるのではないかと。

実際に、2年前はElixirを使う求人は0件だったのですが、今採用サイトで調べてみると少なくとも10件ほど出てきますし、公開の求人に出ていなくても「実は仕事で使い始めている」というケースもあります。私の会社でも、社員だけではElixir開発者が足りず、Elixirで開発してくれる新たな社員と副業メンバーの募集を先月から開始しているので、もしElixirに関心があって見習いフェーズから入って行きたいという思いのある方は、ぜひお声をかけていただけたらなと思います。また、Elixir入門者向けのコミュニティElixir女子部では入門者向けの勉強会も行っているので、こちらもチェックしていただけると嬉しいです。現在オンラインでイベントを開催していて、男性ももちろん歓迎ですので、ぜひチェックしてみていただければと。

それから、パネリストとして松田さん、齋藤さん、中尾さんと楽しいお話をさせていただいて、主催いただいたFindyさんには感謝しています。

最後に「Elixirは最高です」という言葉で締めにしたいと思います。ありがとうございました。

──Elixirへの愛が伝わってきました! ありがとうございます。それでは最後、齋藤さんお願いします。

齋藤さん: 私は今33歳なのですが、同じくらいの年齢の方だと、会社の中でも責任のある立場であり、技術選定を任されるというケースも多いと思います。その場合、中長期的な視点が必要ですし、自分だけではなくチームメンバーのスキルも考慮した上で技術を選ばなくてはいけないため、合理的に考えて「Rubyでいい」という決断をしてしまうことも少なくないのかなと。それは積極的な理由ではないですよね。

選択肢の一つにElixirがあってもいいと思うし、自分の好きな言語を使ってもいいわけです。言語の流行り廃りもありますが、そんなことは気にせず、自分が好きな言語を使えばいいのではないかと思います。ちなみに私が一番好きな言語はC++です(笑)。C++の11以降は、マルチスレッドの機能が標準に入っていて、実はとても面白い言語なんですよ。

話がそれてしまいましたが、今日のイベントをきっかけに、今までRuby一択だった方も、Elixirを選択肢に加えていただけるといいなと思います。

──ありがとうございました!今回はRubyとElixirという言語について語っていただきましたが、C++など別の言語でもこういったイベントができると楽しそうですね。中尾さん、齋藤さん、森さん、松田さん、参加者の皆さん、本日はありがとうございました!