Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
2019/05 Scala導入を検討したい人に向けた情報をまとめてみた

2019/05 Scala導入を検討したい人に向けた情報をまとめてみた

Scalaとは?

  • The Scala Programming Language
    • 開発元はLightbend 社 と EPFL(Odersky先生がいるスイスの大学)
    • 2019/05 現在、最新バージョンは 2.12
  • Dottyと呼ばれる新しいScalaコンパイラが開発されている
    • Scala3
    • 2019/05 現在0.15.0-RC1
    • 2系との互換性はなく、移行ツールが用意される
    • いつ出るのかもまだよくわからないため、おそらくこちらがメインストリームになるのはまだ数年先であると言われているが・・・?
  • 特徴
    • JVM言語
    • オブジェクト指向と関数型言語両方の特性を併せ持つ
  • 個人的にScalaの好きなところ
    • 環境構築が簡単
      • JDKとsbt(ビルドツール)さえあればいい
        • Scalaのコンパイラもsbtがインストールしてくれます
          • Scalaのバージョン管理もsbtが行ってくれる
    • sbtによる差分コンパイル機能
      • よくScalaは「コンパイルが遅い」と言われますが、sbtには差分コンパイル機能があります。
        • sbt を常駐させて、~compile コマンドを実行することにより、ソースを変更すると差分コンパイルが実行される
      • フルコンパイルは確かに時間がかかりますが、差分コンパイルは早いので、感覚的にはコードを書きながらリアルタイムでコンパイルエラーがわかる。みたいな感じ。
    • 可読性が高い、すっきりしたコードを書きやすい
      • ここは後ほどまた

何に向いているの?

  • 一般的には、並行・分散プログラミングに強く、大量処理を捌く必要があるシステムに向いていると言われている
    • 副作用を局所化したプログラムを書きやすい
      • 非同期処理を書くことに対して構えなくなる。
      • 自然と非同期処理を書いている。みたいな。
    • 非同期ライブラリの存在
      • Future (標準)
      • Akka
      • Monix Task
      • 最近は他言語でも非同期ライブラリが充実してきているし、以前ほどの優位性はないような印象がある(※個人的見解です)

Kotlinと何が違うの?

OpenJDKは何を選択すればいい?

  • 運用のことも踏まえて、OpenJDKは今何を選択すればいいのか?

❗️注意

JDKリリース・モデル変更の影響により現在情報が錯綜しており、判断が難しい状況です・・・。下記、ご参考にどうぞ。

Webフレームワーク・ライブラリ

  • Play Framework - Build Modern & Scalable Web Apps with Java and Scala
    • フルスタック Webフレームワーク
    • 多分一番有名
    • 現在 バージョン2.7
      • 2系でマイナーアップデートを繰り返しているけど、2.x <- このx のマイナーアップデートは結構大きい変更が入るので注意が必要
        • (5/31 追記) PlayFrameworkはsemantic versioningを採用していないため、Playの定義としては 2.x のxが変わるのはメジャーアップデートなのだそうです。詳細はコメント欄参照。
        • 実質メジャーアップデートみたいなものなので、マイグレーションガイドをしっかり読んで移行する必要がある
          • リリース周期
            • ここのところ、1〜2年に1回?
          • 2.3 -> 2.4 の変更が特に大きかった
          • 2.5 -> 2.6ではバックエンドのサーバーがNettyからAkka HTTPに変更
            • Nettyもまだサポートはしている?
    • ORM、テンプレートエンジンなど、各ライブラリは好きなものを使うこともできる
      • が、標準が推してくるライブラリが癖が強いという罠がある・・・
        • Slick
          • 「Slickが難しい、わからない・・・」と言う悩み相談をうけるたびにScalikeJDBCがおすすめです」と答えてます
        • play-json
  • Akka HTTP
  • 現在、AkkaHTTPに好きなライブラリを組み合わせて使う方法が主流っぽい
    • PlayFrameworkもAkkaHTTPがベースとなったのと、結局やりたいことに合わせてライブラリを自分で導入することになるので、「AkkaHTTPでいいじゃん」という意見をよく聞く
    • 個人的にはPlay好きで、実はAkkaHTTPそんなにがっつりさわったことないです
      • API開発ならたしかにAkkaHTTPでいいなってなるけど、画面もいる場合、Form周りのAPIはPlay便利だと思っている 🤔
      • AkkaHTTPとTwirl(テンプレートエンジン)組み合わせて画面も作っているよ!という人のご意見求む

学習教材

ここ1、2年で初心者向けコンテンツが充実してきたような気がします

  • Scalaスケーラブルプログラミング第3版
    • 通称「コップ本」
    • 言語設計者のMartin Odersky 先生による、Scala使いのバイブル的な本
    • めっちゃ分厚い
    • 網羅的なので分量に圧倒されるが、決して読みにくい本ではないです
  • 実践Scala入門
    • 「コンパクトなコップ本」
      • コップ本から「実務でScala使うために必要そうな知識」を抽出しました!という感じ
    • 分量的にも読みやすく、 おすすめ!!
  • Scalaをはじめよう! ─マルチパラダイム言語への招待─ (技術の泉シリーズ(NextPublishing))
    • 元・Scala関西スタッフ amaya(@amaya382)さん | Twitter によるScala入門本
    • 「とりあえずScalaを触ってみたい」という場合、個人的には一番おススメ
    • チュートリアル形式となっており、本に沿って進めていく形でScalaを試すこがきる
    • 薄い
    • 「式と文」という、Scalaで肝となる部分を、最初に丁寧に説明している
      • 私は「 {} がブロック式」ということを最初の頃理解しておらずつまづていので、私がScalaはじめた頃にこの本があればよかったのに・・・ってっている
    • 2019/05 現在、 Kindle Unlimited で読める
  • Scala逆引きレシピ
    • やりたいことから逆引きでScalaの文法を調べることができる
    • 内容が古いため手放しでおススメ!というわけではないが、「これどうするんや・・」となったときに、さっと辞書的に引くことができて便利
  • Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)
    • Scalaによる関数型プログラミング本
    • 難しいし、この本の内容を知らなくても実務に影響はないです
      • 私はPart2挫折しました
    • いわゆる「初心者におススメできない」本ですが、ただ、最初の方は(特に1章)関型ログラミングの考え方を知る上でわかりやすい説明がなされているので、無理のない範囲でむというのはアリだと思います
  • Akka実践バイブル アクターモデルによる並行・分散システムの実現
    • Akka in Action 和訳本
    • 私はまだ未読なので内容について言及できないのですが、Akka本として今一番おすすめされている本

サイト

  • Documentation | Scala Documentation
    • 公式ドキュメント
    • なんかいつの間にかとても充実している
      • 私がはじめたころはこんなのなかった
    • TOUR OF SCALAは、ScalaFiddleによってオンライン上でコードを実行して動をながら読み進めることができる
  • Scala研修テキスト
    • ドワンゴさんのScala研修テキスト
  • Scalaメモ(Hishidama's Scala Memo)
    • ひしだまさんによる、Scalaの網羅的なメモ
    • Javaメモもある
  • Scala関西Summit 過去スライド・動画 へのリンクを掲載しているので、そちらもぜご活用ください

Scala初心者あるある

「sbtでプロジェクトの初回ビルドの遅さにビビる」

  • Scala自体が入っていない場合、Scalaのインストールからはじまる
    • ライブラリ依存関係の解決に時間がかかる
      • めちゃくちゃかかる
  • 大きいプロジェクトだと、コンパイルに時間が(ry
    • でも、初回だけです
      • 依存ライブラリはキャッシュされる
  • 大きいプロジェクトだとコンパイルに時間はかかるけど、差分コンパイルで動かしながら開発することになるので、特に気にならない

「Javaとかと全然コードの見た目からして違う・・・全く読めない怖い><」

  • わかる。わかるよ。
  • でも、おさえるべきポイントは少ない
    • よくある初心者つまづきポイント「中置記法」
  // 下記は同じ処理
	1 + 2
	1.+(2)

	// 仮に、Intにaddメソッドがあるとする
	1 add 2
	1.add(2)

Scala の省略ルール早覚え

「関数型プログラミングできないと書けないんでしょ?」

  • そんなことはないよ!!!!
  • ラムダ式がわかるレベルで大丈夫です
    • JavaやKotlinと変わらない
  • 関数型プログラミングの力により提供される便利ライブラリを、関数型プログラミングの知識がなくても利用できる

「Javaの知識がなくてもはじめて大丈夫???」

  • 私自身はJava経験がある状態でScalaをはじめたので、Twitterでいろんな人の意見をきいてみました
  • とりあえずはじめる分にはなくてもなんとかなる
    • 調べながらJavaのことはふんわり理解しながらで大丈夫
      • オブジェクト指向言語の知識はあった方がいいかもしれない
    • ひしだまさんのページやIntelliJ IDEAが教えてくれて助かったという声多数
    • がっつり実務で書くとなると、JavaのAPI(日付など)の知識が必要になってくる
    • 運用でJVMの知識が必要になる

結局、Scala使うと何が嬉しいの?

今日のテーマでもある「表現力の高さ」

  • 例えばfor式
for {
  i1 <- Some(1)
  i2 <- Some(2)
  i3 <- Some(3)
} yield i1 + i2 + i3
@xuwei-k

This comment has been minimized.

Copy link

commented May 24, 2019

  • Lightbend 社 のところは、EPFL(Odersky先生がいるスイスの大学)も書いても良い気はした。昔も今もずっと関わってるし、ソースコードのcopyrightも Copyright EPFL and Lightbend, Inc. なので
  • dottyが 2019/05 現在RC1 だと、どのversionのRC1なのか全くわからなく、なんならRCというと "release candidate" なので "もうすぐ完成"というイメージにもなるが(?)あくまで 0.15.0-RC1 であって、0.15のあとは0.16も0.17普通に出ると思うし、0.99までいくのか、0.999までいくのか、おそらくあまり詳細に決まってないので、ちゃんと0.15.0-RC1って書いたほうがいいと思う( RC1なら もうすぐ完成 なのかな?と勘違いされないように。まぁすぐ下に いつ出るのかもまだよくわからない とも書いてあるが)
  • JDK11対応はある程度twitterなどで話したので略
  • コンパイル8推奨 は、個人的には、Scala公式ページの説明がちょっと足りないというか、あれは条件付きというか、11でも8でも動かされる可能性があるライブラリ作者などは(できれば11でもテストしつつ)8でコンパイルしてpublishしたほうがいいが、プロダクションコードを最初から11で動かす予定なら、どちらかというと11でコンパイルして11でローカルでテストしたほうがいいと思う。(8でコンパイル、11でローカルでテスト、なんて分けるのだるいし、8だけでローカルでテストして11でいきなり本番動かす、も危険なので)
  • playが 2系でマイナーアップデートを繰り返している は、semantic versioning的にはx.y.zのyが変わるのが マイナーアップデート だが、そもそもplayframeworkはsemantic versioningを採用していない(中の人が明確にそう言っていたことはある)ので、2.6から2.7などを マイナー とよぶか メジャー と呼ぶか?は、用語を説明というか定義してからでないと、勘違いが発生する可能性があり難しい。ここ https://github.com/playframework/playframework/blob/97b988130a46605583d5d71d3f0a915dd296aedb/documentation/manual/releases/Releases.md には Since Play 2.0.0, Play is versioned as *epoch.major.minor*. Play currently releases a new major version about every year. Major versions can break APIs, but we try to make sure most existing code will compile with deprecation. Each major release has a Migration Guide that explains how to upgrade from the previous release. と書いてあり、この定義が今も有効なら、どちらかというとplay側の定義としては2.6から2.7は "メジャー" アップデート、である
@daiksy

This comment has been minimized.

Copy link

commented May 24, 2019

はてな教科書もよろしくね☆
https://github.com/hatena/Hatena-Textbook

@SAMMY7th

This comment has been minimized.

Copy link
Owner Author

commented Jun 6, 2019

@xuwei-k @daiksy

お二方ともありがとうございます、反映しました!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.