CodeIQ MAGAZINECodeIQ MAGAZINE

Scalaにまつわる疑問や誤解に一問一答!Scalaは難しくない!?─by Scala福岡2017

2017.11.10 Category:勉強会・イベント Tag: ,

  • 109
  • このエントリーをはてなブックマークに追加

Scala福岡2017の本セッションの最後に登壇したのは、ドワンゴの水島宏太さん。Scalaにはさまざまな神話や誤解があるという。世間でよく言われているScalaにまつわる疑問や誤解について、水島氏が一つ一つ丁寧に回答した。 by 馬場美由紀 (CodeIQ中の人)

Scalaに関しては次のような噂がある

ドワンゴ水島宏太さんは、Japan Scala Associationの代表理事。水島さんは自らを言語オタクと語り、Scala以外にもNemerle、Rust、Standard MLなど数々の言語を愛しているという。また、Klassicというプログラミング言語の作者でもある。

まず水島さんは、世間でよく聞くScalaにまつわる疑問や誤解の例を挙げた。

  • Scalaって使われてるの?
  • Scalaは難しすぎて実用にならない?
  • Scalaを使うには圏論の知識が必要?
  • Scalaを使うには関数型プログラミングの知識が必要?
  • Scalaは記号メソッドが濫用されている?
  • Scalaは遅い?
  • Scalaはコンパイルが遅い?

上記の中には正しいモノもあれば、正しくないモノもある。今回はそれを整理をして、水島さんの解説から情報を得た上で、Scalaを使うかどうか判断し、導入するための障壁を下げていただきたい。

株式会社ドワンゴ 水島宏太さん

Q1. Scalaって使われてるの?

A.世界中で使われている。
海外では、Twitter, Starbucks, Verizon, Goldman Sachs, Foursquare, MorganStanleyなど、国内ではドワンゴ, はてな, サイバーエージェント, ヌーラボ, エフ・コード, セプテーニオリジナル, Maverick, DMM.com, ビズリーチほか、Scalaを採用している企業はたくさんある。

IEEE Spectrumの調査によると、ScalaはWeb系の言語のランキングにおいて8位。このランキングを見ても、そこそこ信頼されて使われている言語であり、マイナーな言語では決してない。

Q2.Scalaは難しい?

A.はい、難しいです。
Scalaは世界でも難しいと思われているが、トレーニングのための適切な資料と講師さえいれば育成することは十分可能。実際ドワンゴでは自分たちが作ったScalaを使い、水島さんたちが講師となり、新人研修を行っている(※以下、参考資料1)。

はてなでも研修をやっている(※以下、参考資料2)。また、Scalaエンジニアを育成するサービスを提供している人(企業)もあると思われる。

Q3.Scalaを使うには圏論の知識が必要?

A.これは断じて、いいえ。
そうしたイメージはあるが、それはScalazCatsなど、一部のライブラリが名前を圏論の用語から拝借したことからくるイメージでしかない。もちろん、先のようなライブラリを使うときでも圏論の知識は不要であり、ほとんどのライブラリは圏論とは関係がない。

Q4.Scalaを使うには関数型プログラミングの知識は必要か?

A.必要。
ただし、高度な知識は必要はない。必要な知識・技能としては、Scalaの標準(不変)コレクションライブラリの使い方、不変オブジェクトの作り方や活用方法。あると便利な知識・技能としては、モナドの使い方といったところ。

不変オブジェクトの扱い方やテクノックがわかっていれば、あとは派生的なこと。特に高度な知識は必要ない。

Q5.Scalaは記号メソッドが乱用されている?

A.そういうライブラリ(昔のDispatch)も過去はあったが、今は昔より乱用傾向は減っている。
過去のDispatchは真似すべきではなく、最近のDispatchを使うこと。つまり適切にライブラリを選べば、問題はない。

Scalaコミュニティでは、過去の反省を踏まえ、昔のDispatchのような記号を濫用したライブラリは減っている。

Q6.Scalaは(Javaより)遅いのでは?

A.いいえ。ただし、プログラミングスタイルによる。
ScalaのコードはJava同様、プリミティブ型を使ったコードにコンパイルされる。つまり同じスタイルで書けば、ほぼ同じ速度ということになる。

例えば、

for(int i = 0; i < 100; i++) {
  doSomething(i);
}

(Java)の生成コードは

var i = 0
while(i < 100) {
  doSomething(i)
  i += 1
}

(Scala)の生成コードとほとんど同じとなる。

ex.
Java版のバイトコード

public static void main(java.lang.String[]);
  Code:
     0: iconst_0
     1: istore_1
     2: iload_1
     3: bipush        100
     5: if_icmpge     18
     8: iload_1
     9: invokestatic  #2
    12: iinc          1, 1
    15: goto          2
    18: return

Scala版のバイトコード

public void main(java.lang.String[]);
  Code:
     0: iconst_0
     1: istore_2
     2: iload_2
     3: bipush        100
     5: if_icmpgt     20
     8: aload_0
     9: iload_2
    10: invokevirtual #22
    13: iload_2
    14: iconst_1
    15: iadd
    16: istore_2
    17: goto          2
    20: return

ただし気をつけたいのは、関数型プログラミングのスタイルで書いた場合。この場合はより遅くなる傾向がある。従って、性能と相談の上で適切なスタイルを選択すること。たいていは設計を見直すと解決できると考えている。

Q7.Scalaのコンパイルは(とても)遅い?

A.はい。ただし、以下の方法で緩和することができる。

  1. 金の弾丸(お金の力で解決でする)。Core i7クラスがあればだいぶ快適になる。

  2. sbtを立ち上げっぱなしにする。sbtは使い回してコンパイルをすることが前提の環境であり、毎回立ち上げると時間が無駄になる。sbtを立ち上げっぱなしにすることで、問題を回避する。

  3. IntelliJ IDEAを利用の場合は、sbt shellを使う(sbt 0.13.15以降)。ただし、sbt shellはまだ未完成なところがある。その点は留意しよう。

  4. Scala 2.12.3にバージョンを上げる。こうすると、20%~30%のコンパイル時間削減になる。例えば30秒コンパイルで30%だと9秒削減、20秒で20%だと4秒削減される。コンパイルのたびに削減されるので、コンパイルにかかっていた時間がかなり削減される。

Q8.Scalaを使えるメンバーがいないけど、採用して大丈夫?

A.Scalaを使えるメンバーが1人はいた方がいい。

Scala人材は未だにあまり人材市場に出ていない。いてもすぐ他の企業に捕まえられてしまうので、採用は非常に難しいのはわかっている。

しかし、1人はScalaをある程度できる人が必要なので、最低でも1人雇用するか、トレーニングして育成する必要がある。Scalaエンジニアのトレーニングサービスの需要もありそう。

Q9.implicitという機能が怖いらしい。どうすればいい?

A.利用する上での規約を定めれば問題ない。

implicitには次の2種類がある。

  • implicit conversion
  • implicit parameter

implicit conversionは一部を除いて推奨されないが、implicit parameterはより積極的に使ってよい。型クラス的な使い方に則っているか調べる必要はある。難しいと思ったら、詳しい人に聞くことをオススメする。

Q10.Scalaは後方互換性を軽視している?

A.部分的には正しいところもあるが、総論いいえ。
真実はマイナーバージョンが変化しても互換性は維持される。例えばScala 2.11.x~Scala 2.11.yの間では互換性を維持される。xとyは任意のバージョン番号(マイナーバージョン)とする。

ただし、メジャーバージョンが変わると互換性は維持されない。つまりScala 2.a~Scala 2.b の間では互換性は維持されないということ。aとbは任意のバージョン番号(メジャーバージョン)とする。ただし、クロスビルディングにより、問題を軽減可能になっている。

クロスビルディングとは、同一のソースから複数のメジャーバージョン向けバイナリを生成するsbtの機能のこと。

Q11.Scalaコミュニティって怖い人が多いんでしょ?

A.いいえ…であるはず。いろいろな人が気軽に質問に答えてくれる。怖くはない。

Scalaコミュニティの例

  • Gitter:scalajp/publicにはガチな人もいっぱいいる(でも優しい)。
  • Slack:scala-jpは、scalajpとは別の人が管理しているコミュニティ。

質問にガチで答えてほしい人は前者のGitterコミュニティに問い合わせることがお勧めだ。

Q12.sbtって難しくない?

A.難しい。ただ、最初の一歩はむしろ簡単だと思う。

organization := "foo.bar"
name := "hoge"
scalaVersion := "2.12.3"

なぜなら、上記ぐらい書けば始められるからだ。最初の学習コストは、キーに対して値を入れればいいと言うことだと教えること。これぐらいは容易にいけるはずだ。

既存プロジェクトのsbtの設定ファイルで学ぶ。そして、sbt newで適当なプロジェクトを生成して学ぶ。近年はわかりにくい演算子を廃止してユーザーフレンドリーになっているので、sbtも使いやすくなっている。

会場からの質問

ここで会場からも質問が投げかけられた。

Q.ScalaプログラマとJavaプログラマが1つのチームにいるときに、読めない、やりにくいということがある。その辺はどのように合わせていけばいいのか。

A.これはScalaやJavaという言語の問題ではなく、チームとしてどちらの流儀に合わせるか合意をとれば解決するという問題。合意をとれない状態で開発を始めるのが間違い。

Q.東京や関西でのScalaエンジニアのニーズについて。

A.TwitterでScalaエンジニアが「会社を辞めます」とつぶやくと、Scalaを使っている東京の会社から声がかかるという。それくらい需要はある。

Q.サーバーサイドでScalaを使う場合に、Javaと違って気をつけることについて。

A.運用するツールがsbtになるので、そこに注意が必要になる。ScalaでもServletベースのフレームワークはあるが、ほとんどはそうではない。

今日のセッションでScalaへの疑問が解決できた人は、ぜひ、Scalaを使ってみてほしい。

  • 109
  • このエントリーをはてなブックマークに追加

■関連記事

ヌーラボ福岡で開催された「Scala福岡2017」に参加してきました(セッションレポートまとめ)... 「Scala福岡2017」レポートまとめ Scalaを福岡・九州で盛り上げていきたいということで、福岡のヌーラボさんで開催された「Scala福岡2017」。 ▲ヌーラボ福岡のお隣には、安くて美味しい立食いすし屋さんも! 登壇したのは、Scalaのエキスパートなエンジニアの皆さん! Cod...
Scalaプログラマから見た機械学習サーバー「Apache PredictionIO」とは?─by ... 機械学習の課題 竹添直樹さんはビズリーチでScalaのプログラマを務めながら、OSS開発や技術書(「Scalaパズル」「Scala逆引きレシピ」)の執筆、さらにはPredictionIOやGitBucket、Scalatraのコミッターを務めている。 今回は、セッションではScala製機械学習サ...
ドワンゴ塩谷啓氏が明かす──アンチパターンから探る、採用担当者が読みたくなる職務経歴書って?... フォーマットに気をつける 今回のセッションテーマは「採用担当者が読みたくてたまらなくなる職務経歴書を書くために絶対に外せない3つのポイント」。このようなテーマを掲げてはいるが、実は「読みたくてたまらなくなるポイント」というものはない。 それは応募書類自体に、価値があるわけではない。価値があるのは...
はてな粕谷氏が語る、安全なPlay Frameworkのバージョンアップのコツとは─by Scala... なぜ、バージョンアップが必要なのか ご存知の方も多いと思うが、サーバ管理・監視ツール「Mackerel」を直訳すると、「サバ」という意味。それをもじって名付けた。現在、粕谷氏は同ツール開発チームディレクターとして、開発メンバーをマネジメントしている。 ▲株式会社はてな Mackerel開発チーム...
Direct Manipulationとプログラミング環境をScalaで書いてみる─by Scala... DMに関心を持った背景 福岡を拠点に高速分散処理技術を生かしたスマートデバイス×ビッグデータ領域に強みを持つスタートアップ、グルーブノーツのRockstarエンジニア、花田恒一氏は、Direct Mnipulationとプログラミング環境をScalaで実装した話を発表した。 Direct Man...
Scala/Spark/Mahoutでレコメンドエンジンを作る─by Scala福岡2017... 今はデジタルマーケティングが中心。レコメンドエンジンが売上を左右する TechJINの創業は2016年10月。マーケティングプラットフォーム「b→dash」を開発するフロムスクラッチのグループ企業として、マーケティングテクノロジー領域の基礎研究・開発などの事業を展開している。 b→dashはMa...

今週のPickUPレポート

新着記事

週間ランキング

CodeIQとは

CodeIQ(コードアイキュー)とは、自分の実力を知りたいITエンジニア向けの、実務スキル評価サービスです。

CodeIQご利用にあたって
関連サイト
codeiq

リクルートグループサイトへ