Scala福岡2019 に行ってきました！

2019/1/19 に LINE Fukuoka さんで開催された **Scala福岡2019** に参加してきました！

2019/01/19（土）11:00-　LINE Fukuoka
https://scala-fukuoka.org

# オープニング

* 初参加者けっこう多い。
* 九州外からの参加者も多い。
* 福岡ではScalaエンジニアがまだ少ないが、CfPには多数応募があった。

# 基調講演 - いつScalaを使い、いつ使わないのか

がくぞさん（Tech to Value） @gakuzzzz

Scalaの言語特性と周辺環境のまとめと、Scalaの向き不向きについて。

### Scalaの言語特性

* 静的型付け言語。
  * クリティカルな用途には、静的型付け言語のほうが向いている。
  * 動的型付け言語は、一部に問題があったとしても全体が動かない状態を避ける思想。
* 型の表現力は、Javaと比べて高い。
  * ドメイン駆動設計（DDD）にも向いている。
* メタプログラミング（リフレクションとか、マクロとか）のやりやすさは、Javaと同等。
  * ScalaのマクロはまだExperimentalな機能で、今後変わる可能性高い。
* パラダイムは、オブジェクト指向と関数型の統合。
* サブタイピングは Nominal Subtyping。
  * 他に、Go は Structual Subtyping、Ruby は Duck Typing。

* 継続的に変更を加え続けるプロダクトに向いている。
変更がない作りっぱなしであれば、too much かもしれない。

### ライブラリ事情

* GitHub上のリポジトリ数では、JavaScriptが圧倒的。Javaも多い。
Scala や Go はまだまだ少ない。

* Scala製では Spark や Akka がある。
  * Akka を利用するために Scala を選択するケースも多い。

* Scala は Java のライブラリをそのまま利用できるのがメリット。
  * だが、Java向けのライブラリはミュータブルな設計が多く、イミュータブルを基本とするScalaからはやや使いづらいこともある。

### ランタイム周り

* Scala は JVM 上で動作する。
  * 静的型付けの関数型言語の中でも、枯れたランタイム・豊富なプロファイルツールを使うことができるのは有利。
  * JVMの起動の重さがデメリットになることもある。（AWS Lambadaのようなクラウドサービスとか）

### コミュニティ

* Scalaエンジニアは少ない。
* Scala の学習コストは高いと言われているが、実際は言語特性によるものではなく、他の要因によるところが多いのではないか。

* そもそも、オブジェクト指向でちゃんとプログラミングすること自体が非常に難しい。
  * メモ：そこに見切りをつけて、関数型プログラミングにスイッチしていっているエンジニアも少なくない。


# 実践CleanArchitecture

藤井さん（チャットワーク） @yoshiyoshifujii

クリーンアーキテクチャのポイントの解説と、Scalaでの実装例の紹介。

https://speakerdeck.com/yoshiyoshifujii/shi-jian-clean-architecture


### 方針と詳細の分離

* 方針・・・プロダクトの価値、目的。
* 詳細・・・プロダクトの実現手段。フレームワークとかミドルウェアとか。

* 間心時の分離が目的。
  * 「方針」に注力したい。
    * DDDがハマる。
  * 「方針」が「詳細」に依存しないようにしたい。
  * 「詳細」を検討するには、「方針」を実装してから。

### SOLID原則

* 単一責任の原則。
* オープン・クローズドの原則。
* リスコフの置換原則。
* インターフェース分離の原則
* 依存性逆転の原則。
  * 依存性関係逆転の原則で、ビジネスルールを独立させることができる。

### コンポーネントの原則

* 再利用・リリース等価の原則。
* 閉鎖性共通の原則。
* 全再利用の原則。

これらは相反するところがあるので、バランスが大事。

### クリーンアーキテクチャ

* 中心に「方針」を置く。
* 外（詳細）から、中心（方針）に依存する。
* DDD と組み合わせるなら、ドメインモデルが Entities に当てはまる。

### Scalaでの実践

スライド参照。


# スポンサー ランチセッションA

nulabさん

* backlog、typetalk は Scala（Play Framework） を使っている。
* Nulab Apps は Java/Kotlin（Spring Framework）を使っている。
* 社内システムにも Scala 使っているものがいくつもある。


# スポンサー ランチセッションB

forkwelさん

* コミュニティスポンサー 297件 1,000万円超

* 自分の理想を知って、現実とのギャップを知る。
  * Scalaエンジニアの平均年収は1位。だが、さほど言語で収入に大きな差はない。
  * 収入を上げるなら、スキルの差別化より、儲かっている会社に入るのが手っ取り早い。

* アウトプットしてフィードバックを受ける、のループを回す。
  * 言語化しておくことが大事。

* 交渉術を身につける。
  * 市場の評価 > 社内の評価 ・・・正当な報酬が得られない。
  * 市場の評価 < 社内の評価 ・・・つぶしが利かない
  * 市場の評価 = 社内の評価 ・・・理想的。
  
* 内外でアピールして評価のつり合いを取っていくことで、自由な働き方ができるようになる。


# Scalaコードとともに考えるドメインモデリング

かとじゅんさん（チャットワーク） @j5ik2o

ドメインイベントに着目したドメインモデリングのやり方と、Scalaによる実装例の紹介。

https://speakerdeck.com/j5ik2o/scalakodototomonikao-erudomeinmoderingu

### ドメインイベントを使ったモデリング

####  ユースケース

* 雨の日コース（例外ケース）に、重要なビジネスルールが潜んでいる。
* ユースケース記述を書きながら、ビジネスルールについて議論していく。

#### ヒト・モノ・コト

* ヒト・・・システム外のアクター
* モノ・・・ドメインモデル
* コト・・・ドメインイベント

* コトがヒトとモノの関わりを表しているので、コトに着目してモノを整理していく。
  * Event Storming
  * ユースケース -> ドメインイベント -> コマンド（操作） -> アクターとドメインモデル

#### モデリングの流れ

* 過去形で表現される関心事がドメインイベントになる。
* 洗い出したドメインイベントを時系列に並べて成立するか、漏れぬけがないかを確認する。
* ドメインイベントを洗い出せれば、そのトリガーとなるコマンドもわかる。
* ドメインイベントを受けて、リードモデルを最新状態に更新する。（CQRSパターン）
* コマンドを実行して、ドメインイベントを発行する責務をどのドメインモデルに持たせるかを考える。

#### Event Sourcingによる実装

* ドメインモデル（集約ルート）が、ドメインイベントの履歴（リスト）を持つ。
  * ドメインモデルは trait にして、モデルが実現手段（Event Soucing）に依存しないようにしている。

* ビジネスメソッドは、新しいドメインイベントを生成して、自身のイベント列の最後に追加して返す。

* 複数のビジネスメソッドが必ずセットで呼び出されなければならないような場合、ドメインサービスとして実装する方法がある。
  * ビジネスメソッドは外部から見えないようにしておく。

* リポジトリでは、イベント列を永続化（INSERT）する。
  * 複数スレッド・複数プロセスから同時に永続化しようとしたときに、イベント列の順序がおかしくならないようにする（ロックするなど）必要がある。
  * Akka Clusterを使うと、集約ルートのインスタンスを持つアクターが常に1つに維持されるので、競合は起こらない。
  
### 集約をまたがる整合性

* 結果整合性でいくのがベター。
  * エンティティIDの生成は、永続時に自動採番すると辛くなるので、事前にプログラムで採番するべし。
  * FK張るのは結果整合性と相性悪い。


# DatabricksとSparkではじめる [ビッグデータETL処理/データ可視化] 実践入門

島田さん（エブリー） @smdmts

Databricks・Sparkの実践とデータ可視化の解説。
（データ分析の事前知識があまりなくて、ちょっとついていけず...）

https://speakerdeck.com/smdmts/databricks-and-spark-with-etl-and-visualization

### Databricks

* Sparkベースのデータ分析プラットフォーム。
* Sparkクラスタのスケーリング。
* Notebook・・・Step by Step で、確認しながらSparkの処理を実行できる機能。
Scala/Python/SQLなどでコードを書く。

### ETL

* Extract・・・データの抽出
* Transform・・・データの型変換
* Load・・・永続化


# SierでScalaを試した結果Web系に転職した話

細谷さん（サイバーエージェント） @bake_nezumi

https://www.slideshare.net/bakenezumi/sierscala-web

SIerでScalaを導入した話。

* Play Framework が Scala / Java 両方使える。
* Java資産が再利用できる。
* パターンマッチ、イミュータブルプログラミングなどの言語機能。

* メモ：ScalaからJava O/Rマッパーを使うのは辛そう。
  * Scala用のDomaラッパー https://github.com/bakenezumi/domala


# 新しいプログラミング言語の学び方 ~パーザコンビネータライブラリで学ぶScala~

水島さん（ドワンゴ） @kmizu

http://kmizu.github.io/scalafukuoka2019/#/

すでに１つ以上のプログラミング言語を習得していて、さらに新しいプログラミング言語の学び方について。

* 他の言語習得への障壁。
  * １つの言語を理解すれば他の言語もわかる、とする意見もある。
  * 未知のパラダイムを学ぶのは難しい。

* 多くの言語に共通する構造を理解することが重要。

### 構文

#### 具象構文

* 一般的に言われる「構文」のこと。if文の書き方とか。
* BNFで厳密に定義できる。
* あくまでも構文の見た目（書き方）を表現しているだけで、本質的でない（カッコがいるとか、スペースがいるとか）ものを含んでいる。

#### 抽象構文

* 具象構文から、プログラムの解釈に不要な情報を除去したもの。
* 抽象構文を把握することが重要。

### 型システム

#### 派生型（サブタイピング）

* 名前的部分型・・・一般的なサブタイピング。継承関係がある場合だけ代入可能。
* 構造的部分型・・・静的ダックタイピング。継承関係がなくても必要なメソッドを持っていさえすれば代入可能。

#### 多相型（ジェネリクス）

* 型パラメタが使えるかどうか。

### 意味論

* プログラムがどういうふうに実行されるかを定義したもの。
* 抽象構文木の変換の仕方を定義したもの、とも言える。

### 言語の学習方法

* 上記の構文・型システム・意味論 に分解して理解すると良い。

* 学習するためにどんなプログラムを書けばよいか？ → パーザコンビネータが適している。
  * 言語のいろいろな機能を使うことになるので、言語の要点を理解することができる。
  
* 自分なりの「Hello World」を持とう。


# LT

## Emotional Scala

@HonMarkHunt さん（ビズリーチ）

* Scala歴4ヶ月。
* ハッシュタグ `#エモスカ`
* 「Scalaのロゴださいww」

## \/と書いてディスジャンクションと読む

だいごろうさん（楽天）

* Scalazもわかりやすいところから使っていくと良い。

## Quick introduction to scalafix

谷口さん（はてな） @tanishiking

https://speakerdeck.com/tanishiking/quick-introduction-to-scalafix

* Scalafix・・・Refactoring and linting tool for Scala
  * Scala.meta（Scalaプログラムの構文解析をするライブラリ）が使われている。

## Apache Kafka

きのこさん（フリーランス） @aa7th

https://speakerdeck.com/sammy7th/apachekafkanituitetiyotutomian-qiang-simasita

* Apache Kafka・・・メッセージングミドルウェア。
* iPad Proで手書きプレゼン。

## GraalVMでScalaを動かす

きしださん（LINE） @kis

http://d.hatena.ne.jp/nowokay/20190120#1548011826

* Graal・・・Javaで書かれたJITコンパイル。
* GraalVMのコンパイラは、Javaバイトコードをネイティブコードにコンパイルする。

1. `sbt assembly`で FAT-jar 作る。
1. GraalVMの `native-image -jar ****.jar` でネイティブコンパイルする。

* なんでネイティブ化したいのか？
  * 起動が速くなる。（ただし、Scala Nativeのほうがちょっと速い）
  * Javaのライブラリがすべて使える。（Scala Nativeは用意されているライブラリしか使えない）

* 末尾最適化したプログラムをネイティブコンパイルしたが実行時にエラーになる、などの落とし穴あり。

# 余談

福岡には前乗りして、仲良くしていただいているエンジニア4名で博多の夜にくりだしました。

ここのモツ焼き屋さんがそりゃもう絶品で、博多に来たらまた行きたいなーと思いました。

<div><strong><a target="_blank" href="https://tabelog.com/fukuoka/A4001/A400104/40049915/">もつ焼 塩田屋 白金</a></strong>
<script src="https://tabelog.com/badge/google_badge?escape=false&rcd=40049915" type="text/javascript" charset="utf-8"></script>
</div>
<p style="color:#444444; font-size:12px;">
<strong>関連ランキング：</strong><a href="https://tabelog.com/rstLst/motsu/">もつ鍋</a> | <a href="https://tabelog.com/fukuoka/A4001/A400104/R10122/rstLst/">薬院駅</a>、<a href="https://tabelog.com/fukuoka/A4001/A400103/R10884/rstLst/">渡辺通駅</a>、<a href="https://tabelog.com/fukuoka/A4001/A400104/R7484/rstLst/">西鉄平尾駅</a></p>

# おわりに

また来年も来たいっす！！