【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る

参加したイベントのメモです。

# イベント概要
- 【CTO meetup】Rust,Go,Elixir,Kotlin次世代言語の魅力をCTOが語る
- 2018/04/12(木) 19:00 〜 23:00
- https://flexy.connpass.com/event/82063/

# 言語選定について
## Elixir
- サーバーが2種類あった。
 - 使う言語を統一していこう→トップダウンでElixirに決まる。
- 1200台のサーバーを4人で運用。自動化しないと無理。
 - →GOで自動化（現場発信）
- Elixir使いたいとは思っていたが、ずっと使えずに居た。
- Railsで何のチューニングもなしだとパフォーマンス問題。
 - →Elixirだと何のチューニングもなくても10倍は違う。

### APIサーバー
- ユーザー情報保存
- ユーザーのストレージ情報
- 書き換え用API

### マルチバトルサーバー
- ずっと接続しっぱなしのサーバー。
- 言語はC#, Rなど。
- 10000台同時接続問題に対応できる言語でないといけない。


## Kotlin
- Javaの課題を解決したいということで誕生
- Androidアプリ開発
- Googleの強力な後押し
- ターゲットとしているプラットフォーム：ネイティブとJS → その領域はまだ変更が多いので、実践投入は早い。
- Javaサーバーアプリケーションの移行に向く。
- JVM上で動く
- 文法はRubyに結構近い。Rubyからの移行も選択肢になり得る。

## Go
- メディアのリプレイス案件。
- ワードプレスではアクセス多すぎて捌き切れない。
- 最終的に外部に売るCMSなのでコンパイル言語にしたい。
- Goにした。
- 学習の容易さ→ドキュメントが薄く、Cを触ってる人だと1日で理解できたりする。

## Rustの採用
- 十分に低レイヤーで安全
- 型付が充実
- …というはもはや後付けの理由。
- 書くの楽しい！　書きたかった。
- パフォーマンスと安定性の両立
- 柔軟性が高い
- 学習コストは高いがメモリセーフ、スレッドセーフ。
- コンパイルが通る安心感（バグは無くならないけど）


## ElixirやGoなどを使う理由
- 超楽しいっていうのもあるけど…
- 後々運用が楽になる。
- 少数精鋭を集めて運用できる。能力差が出にくい。
- メンテが難しい言語（例：Scala）の場合、1ヶ月間スーパープログラマーが抜けた時のメンテナンスどうする？
- 運用が楽＝**夜寝れる（重要）**

# 向いている使用方法
他の言語との違い。

## Elixir
- 黒魔術が多い。
- 読めなかったり。わからないことが多い。
- ソースは短いが、学習コストはある。
- ベストプラクティスが模索段階。
- よく使うサービスのライブラリがあまりない。
- 新しい言語なのでエコシステムがついてこない。

## Go
- devサミに載せる紙面に問題のコードが載り切れない＝ソースが長い（Elixirだと40行で済むものが90行）
- その分読みやすい
- 高速に動作する
- 高負荷環境に適している
- アクセス数に大きな変動がある環境では力を発揮する
- 自分でチューニングの必要あり
- 従来はWebアプリを書くとコンパイルに時間がかかっていたが、バージョンアップすると早くなったのでイマイチなところは無い。
- エコシステムがしっかりしている。

## Kotlin
- 好きなところ: 後発のモダン言語の割に尖ってない。移行のハードルが高くない。現場重視。負担が低い。
- イマイチなところ: いい妥協が悪い妥協だったりする。
 - nullがカジュアルに使いやすいのでバグの元→Kotlinはそれを防げるが野暮ったいコードになる。
 - そもそもnullがない世界の方がいいよね、とも思う。

## Rust
- Cの強力なマクロ言語みたいなもの
- Cと同じレベルのことが安全にできる（ポインタとか）
- シングルバイナリになる
- マイクロサービスの文脈だと有利
- Rust人口が少ない→簡単に登壇できる！
 - Rust人口を増やすことがコミュニティにおける毎年の課題になっている状態。
- 1エンジニアとしてはあり。
- 学習コスト高い。コンパイラが何言ってるかわからない。そこを乗り越えた者にのみ見える地平がある。
- よくあるライブラリもコミュニティが小さいので自作するしかない
 - 逆にいうとその実装を業務中にできる。
- 毎年コミュニティを大きくすることが目標になっている。
- C言語にバインディングできるので、Cの資産は使える。

# 社内での普及方法
## Elixir
- Pythonを使ってた時も、採用できた試しがない
- ならElixirで採用できるか？→採用厳しい。
- Elixir知ってますか？→知らない
- 教育担当者2人専任で立てている。
- 専用のブースで手取り足取り教えてる
- とある会社へのElixir導入プロジェクトとして、3ヶ月かけて教育したけど「面白くない言語」という反応でとりやめになった事も。
- 日本語の書籍を渡して乗り切った。
- できる人は1〜2週間くらいでキャッチアップしてくれた。

## GO
- 最初はマイクロサービスで分かれている部分をGoで書いた。
- 実際上手くいった。
- 転職してからはそのノウハウを活かした。
- 学びやすい言語なので、社内勉強会。
- 若い人ができるとどんどんいい影響が。
- 他のweb言語やってたらあまり関係ないのかなと。

## Kotlin
- 業務で導入したきっかけ→Androidアプリのリプレイス
- 上司に背中を押された「Kotlinエバンジェリストがいるなら使えばいい」
- 詳しい人が1人いると、導入するときにありがたい（退職するけど）
- JavaとKotlinは共存可能→テストだけKotlinで書いてみる。
- 段階的に導入して広めていく。

## Rust
- 採用なめてた。
- 「業務でRust書けるなら人来るだろ」→こない！
- 採用者にRust経験者はなし→Cなどの低レイヤー経験者を採用している。参照系を知らないと辛いので。
- あまり教育に手は回ってない。

## 一般論としての社内への普及方法
- 勉強会を開いてみる→公式ドキュメントを読んでみる。輪読してみる。
- 小さいところから段階的に導入して広めていく。
 - まずテストから導入など。 

# 開発言語のトレンドは？
- コアを安全に簡単に扱える言語
 - CPUの処理速度が頭打ちになってきているので。パフォーマンス性が求められている。
- 今来ている波は静的型付言語。
- 大きいシステムの開発→コンパイラに守られたい。
- 型をいちいち書かないといけない→最近はコンパイラが肩代わりしてくれる→静的型付言語の面倒さがなくなって来ている。
- もしかして、JavaScript一強の時代に？
- アーキテクチャがどんどん変わって来ている→学習が難しいけど堅牢な言語が生まれている
- 一方で生産性が高い言語も生まれている
- 堅牢さと生産性のトレードオフ
- Rustは
流行らないと思う。
業務で無理やり使わされて初めてわかる
- トレンドを追う必要はない。Rustやっていると大したことやってなくても壇上に座れる。
- Rustは組み込み系、車載システムなどでこれから来そう。→それは流行ってると言えるのか？
- Web界隈では堅牢・安全な言語よりも生産性の高い言語が好まれるので、Rustは流行らなそう。
- エンジニアとしてのキャリア、生存戦略として、トレンドを追うことに意味はあるのか？
- どういう風にキャリアを積みたい？
- 今トレンドに乗っている言語は使っている人が多いので沢山安く採用できる。安い兵隊でいいならトレンドに乗ればいい。
- マイナー言語なら勉強会で発表できる。自分ならではの発表ができる。自分はKotlinに掛けて、人口0の時から勉強してたが、投資した分は回収できている。
- 技術的チャレンジを求めて。
- 自分が好きなだけの言語を取り入れるのは辞めた方が良い。事業目標を達成するためという観点が必要。

# 所感
- 徹頭徹尾言語の話を聞いていた。
- マイナーな言語をやるのはリスクもあるが、人口が少ない分すぐトップレベルに立ちやすい。
- 安い兵隊になりたいのか否か。
- 新しい言語はどれもパフォーマンスや安全性が高い。
- ElixirとRustの学習コストは高め。
- 新しい言語を業務で書きたかったら彼らの所属する会社に転職しよう！
- 次世代言語経験者の採用は難しいので、どの企業も教育するのは覚悟している。
- 高い魅力と険しい山道。
- 自分が好きなだけでプロダクトに使う言語を選んじゃダメ。
- 夜寝れる技術選定大事。

# 外部リンク
やり取りの書き起こしがそのまま載っているので、こちらの方がより詳しいです。

- [Rust, Go, Elixir, Kotlin 次世代言語の魅力をCTOが語る](https://flxy.jp/article/1831)