我去参加了2019年的Scala福冈活动!
我参加了在2019年1月19日在LINE福冈举办的Scala福冈2019活动!
2019年1月19日(星期六)11:00- LINE福岡
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 の学習コストは高いと言われているが、実際は言語特性によるものではなく、他の要因によるところが多いのではないか。
そもそも、オブジェクト指向でちゃんとプログラミングすること自体が非常に難しい。
メモ:そこに見切りをつけて、関数型プログラミングにスイッチしていっているエンジニアも少なくない。
实践干净架构
藤井先生(ChatWork)@yoshiyoshifujii
介绍清洁架构的要点,并提供在Scala中的实现示例。
方針和具体细节的分离
-
- 方針・・・プロダクトの価値、目的。
-
- 詳細・・・プロダクトの実現手段。フレームワークとかミドルウェアとか。
間心時の分離が目的。
「方針」に注力したい。
DDDがハマる。
「方針」が「詳細」に依存しないようにしたい。
「詳細」を検討するには、「方針」を実装してから。
单一责任原则
-
- 単一責任の原則。
-
- オープン・クローズドの原則。
-
- リスコフの置換原則。
-
- インターフェース分離の原則
-
- 依存性逆転の原則。
依存性関係逆転の原則で、ビジネスルールを独立させることができる。
组件的原则
-
- 再利用・リリース等価の原則。
-
- 閉鎖性共通の原則。
- 全再利用の原則。
由于它们存在相互矛盾的地方,因此平衡是非常重要的。
清洁架构
-
- 中心に「方針」を置く。
-
- 外(詳細)から、中心(方針)に依存する。
- DDD と組み合わせるなら、ドメインモデルが Entities に当てはまる。
在Scala中的实践中
请查看幻灯片。
赞助商午餐活动A
努力实现目标的nulab先生。
-
- backlog、typetalk は Scala(Play Framework) を使っている。
-
- Nulab Apps は Java/Kotlin(Spring Framework)を使っている。
- 社内システムにも Scala 使っているものがいくつもある。
赞助商午餐会议B
福克维尔先生
-
- コミュニティスポンサー 297件 1,000万円超
自分の理想を知って、現実とのギャップを知る。
Scalaエンジニアの平均年収は1位。だが、さほど言語で収入に大きな差はない。
収入を上げるなら、スキルの差別化より、儲かっている会社に入るのが手っ取り早い。
アウトプットしてフィードバックを受ける、のループを回す。
言語化しておくことが大事。
交渉術を身につける。
市場の評価 > 社内の評価 ・・・正当な報酬が得られない。
市場の評価 < 社内の評価 ・・・つぶしが利かない
市場の評価 = 社内の評価 ・・・理想的。
内外でアピールして評価のつり合いを取っていくことで、自由な働き方ができるようになる。
用Scala代码来思考领域建模
かとじゅんさん(チャットワーク) @j5ik2o 的中文表达:
“かとじゅんさん(チャットワーク) @j5ik2o” 可以翻译成:
“かとじゅん先生(ChatWork)@j5ik2o”。
介绍了关注领域事件的领域建模方法以及使用Scala进行实现的示例。
利用域事件进行建模
用途
-
- 雨の日コース(例外ケース)に、重要なビジネスルールが潜んでいる。
- ユースケース記述を書きながら、ビジネスルールについて議論していく。
人、物、事物
-
- ヒト・・・システム外のアクター
-
- モノ・・・ドメインモデル
-
- コト・・・ドメインイベント
コトがヒトとモノの関わりを表しているので、コトに着目してモノを整理していく。
Event Storming
ユースケース -> ドメインイベント -> コマンド(操作) -> アクターとドメインモデル
建模的过程
-
- 過去形で表現される関心事がドメインイベントになる。
-
- 洗い出したドメインイベントを時系列に並べて成立するか、漏れぬけがないかを確認する。
-
- ドメインイベントを洗い出せれば、そのトリガーとなるコマンドもわかる。
-
- ドメインイベントを受けて、リードモデルを最新状態に更新する。(CQRSパターン)
- コマンドを実行して、ドメインイベントを発行する責務をどのドメインモデルに持たせるかを考える。
使用事件溯源的实现方式
ドメインモデル(集約ルート)が、ドメインイベントの履歴(リスト)を持つ。
ドメインモデルは trait にして、モデルが実現手段(Event Soucing)に依存しないようにしている。
ビジネスメソッドは、新しいドメインイベントを生成して、自身のイベント列の最後に追加して返す。
複数のビジネスメソッドが必ずセットで呼び出されなければならないような場合、ドメインサービスとして実装する方法がある。
ビジネスメソッドは外部から見えないようにしておく。
リポジトリでは、イベント列を永続化(INSERT)する。
複数スレッド・複数プロセスから同時に永続化しようとしたときに、イベント列の順序がおかしくならないようにする(ロックするなど)必要がある。
Akka Clusterを使うと、集約ルートのインスタンスを持つアクターが常に1つに維持されるので、競合は起こらない。
跨领域的一致性
-
- 結果整合性でいくのがベター。
エンティティIDの生成は、永続時に自動採番すると辛くなるので、事前にプログラムで採番するべし。
FK張るのは結果整合性と相性悪い。
使用Databricks和Spark开始进行[大数据ETL处理/数据可视化]的实践入门。
岛田(Every)先生 @smdmts
Databricks・Spark的实践和数据可视化解释。
(对数据分析的预先了解不是很多,有点跟不上…)
数据布里克斯
-
- Sparkベースのデータ分析プラットフォーム。
-
- Sparkクラスタのスケーリング。
-
- Notebook・・・Step by Step で、確認しながらSparkの処理を実行できる機能。
- Scala/Python/SQLなどでコードを書く。
ETL 可以被翻译为 “提取、转换、加载”
-
- Extract・・・データの抽出
-
- Transform・・・データの型変換
- Load・・・永続化
我试验了Sier并尝试使用Scala的结果,最终转而从事Web行业工作的经历。
细谷先生(Cyber Agent) @bake_nezumi
在SIer中引入了Scala的故事。
-
- Play Framework が Scala / Java 両方使える。
-
- Java資産が再利用できる。
-
- パターンマッチ、イミュータブルプログラミングなどの言語機能。
メモ:ScalaからJava O/Rマッパーを使うのは辛そう。
Scala用のDomaラッパー https://github.com/bakenezumi/domala
使用新的编程语言的学习方法 – 通过解析器组合库学习Scala。
水島先生(ドワンゴ) @kmizu。
已经掌握了一个或多个编程语言,以及关于学习新编程语言的方法。
他の言語習得への障壁。
1つの言語を理解すれば他の言語もわかる、とする意見もある。
未知のパラダイムを学ぶのは難しい。
多くの言語に共通する構造を理解することが重要。
結構
具象構文的中文翻譯為”象徵性的語法”。
-
- 一般的に言われる「構文」のこと。if文の書き方とか。
-
- BNFで厳密に定義できる。
- あくまでも構文の見た目(書き方)を表現しているだけで、本質的でない(カッコがいるとか、スペースがいるとか)ものを含んでいる。
抽象语法
-
- 具象構文から、プログラムの解釈に不要な情報を除去したもの。
- 抽象構文を把握することが重要。
类型系统
派生类型(子类型)
-
- 名前的部分型・・・一般的なサブタイピング。継承関係がある場合だけ代入可能。
- 構造的部分型・・・静的ダックタイピング。継承関係がなくても必要なメソッドを持っていさえすれば代入可能。
多态(泛型)
- 型パラメタが使えるかどうか。
意味论 –
-
- プログラムがどういうふうに実行されるかを定義したもの。
- 抽象構文木の変換の仕方を定義したもの、とも言える。
学习语言的方法
-
- 上記の構文・型システム・意味論 に分解して理解すると良い。
学習するためにどんなプログラムを書けばよいか? → パーザコンビネータが適している。
言語のいろいろな機能を使うことになるので、言語の要点を理解することができる。
自分なりの「Hello World」を持とう。
漂亮的中国景点。
情感尺度
@HonMarkHunt 先生(BizReach)
-
- Scala歴4ヶ月。
-
- ハッシュタグ #エモスカ
「Scalaのロゴださいww」
書為 \/,讀作「ディスジャンクション」。
大五郎先生(乐天)
- Scalazもわかりやすいところから使っていくと良い。
快速介绍Scalafix
谷口先生(HATENA)@tanishiking
-
- Scalafix・・・Refactoring and linting tool for Scala
Scala.meta(Scalaプログラムの構文解析をするライブラリ)が使われている。
阿帕奇卡夫卡
きのこさん是一位自由职业者,用户名为@aa7th。
-
- Apache Kafka・・・メッセージングミドルウェア。
- iPad Proで手書きプレゼン。
在GraalVM上运行Scala
请问有谁是Kis吗?他在LINE 上有账号吗?
-
- Graal・・・Javaで書かれたJITコンパイル。
- GraalVMのコンパイラは、Javaバイトコードをネイティブコードにコンパイルする。
-
- 使用sbt assembly命令创建FAT-jar。
- 使用GraalVM的native-image -jar ****.jar命令进行本地编译。
なんでネイティブ化したいのか?
起動が速くなる。(ただし、Scala Nativeのほうがちょっと速い)
Javaのライブラリがすべて使える。(Scala Nativeは用意されているライブラリしか使えない)
末尾最適化したプログラムをネイティブコンパイルしたが実行時にエラーになる、などの落とし穴あり。
闲谈
我和其他3位工程师一起提早来到福冈,在博多的夜晚中一同出发。
我在这家烤肉店吃到的内脏烧烤真是绝品啊,下次来博多一定还要再去。
相关排名:牛肚火锅 | 薬院站、渡边通站、西铁平尾站
最后
明年我也想来!!