YYTypeScript#10「TSを自分のスキルにしようと思ったキッカケは？」「publicは省略する派ですか？」「Auth0ってどうなの？」「GraphQLを使ってみての感想」「Javaを忘れてTSを書くべきか？」「テストって先にやります？ あとにやります？」

これは2019年11月22日に開催したTypeScriptイベント[YYTypeScript#10]のイベントレポートです。

[YYTypeScript#10]: https://yyts.connpass.com/event/152323/
[YYTypeScript]: https://yyts.connpass.com/

[YYTypeScript]は一言で「TypeScripterの部室」です。発表者の話を聞く「一方向的な勉強会」とは真逆で、TypeScriptについて、雑に・ゆるく・ワイワイ話しながらTypeScripter同士の交流を深める「双方向的な座談会」の形式になります。集まった人たちで「今日話たいこと」「聞きたいこと」をいくつか挙げていき、それをテーマに雑談していきます。

__今回の配信動画__

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今日の <a href="https://twitter.com/hashtag/YYTypeScript?src=hash&amp;ref_src=twsrc%5Etfw">#YYTypeScript</a> 第10回の配信録画がアップされました😌 <a href="https://t.co/7wD2SUlX8g">https://t.co/7wD2SUlX8g</a></p>&mdash; suin (@suin) <a href="https://twitter.com/suin/status/1197850520678879232?ref_src=twsrc%5Etfw">November 22, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

__過去回の配信動画__ → [YouTubeプレイリスト「YYTypeScript」](https://www.youtube.com/playlist?list=PLpOeTEye3Bg4N8f7GSaeqM0p2dcdiZHv_)
__前回__ →  [YYTypeScript#9「TS初心者がハマりやすいところ教えて 」「執筆中の『マンガでわかるTypeScript』 に意見欲しい！ 」「英語で書かれている有益なサイトある？ 」「EventListenerとIndexedDBの型周りについて」「eBookを共同編集する上でのベストプラクティス」 - Qiita](https://qiita.com/suin/items/09631c9450a56c8c7c4e)

## 雑談

### TypeScriptを自分のスキルにしたいと思ったキッカケを教えて

* フロントエンドもバックエンドも同じ言語で書けるというのが魅力的。
* 3年ぐらい前にTSがあまり有名じゃなかったときに、プロジェクトでTSを使うことになったのがキッカケ。
    * なぜ導入されたんですか？
        * Javaに詳しい人がいて、その人がTSを選んだ。
        * なぜかは分からない。
    * その後自分でTSを使うようになった。
        * 型の恩恵というのは、前からJavaやっていたので分かっていた。
    * 「型はいいぞ」
* やっぱり型？
    * コンパイラが型をチェックしてくれる
    * なので、安心感がある
    * Javaやってたので、型の安心感が嬉しい。
    * しばりが無いより有ったほうが良いという感覚はある。
* TSから離脱した人の話も聞く
    * 型が複雑になるとたしかに難しいかも
    * もともと型に馴染みがないなど
* リファクタリングのしやすさ
    * 適当に書いていって、あとでガシガシ直しても、コンパイル時に壊れてないことが確認できる。
* 型があって、それをIDEが理解してくれているってのがすごくいいですよね
    * . (ドット)を打つと候補をどんどん出してくれるのが、いちいちリファレンスを参照しなくていいのがいいです 
* おすすめのエディタは？
    * vscode
        * さくさくしてる
        * リファクタリングとかIDEとしての完成度はIntelliJのほうに軍配が
    * IntelliJ
        * ちょっと重い
        * ごくまれに、エラーじゃないところでコンパイルエラーの警告が出たりする
            * 開き直すと直ったりするので、あんまり不満はない
    * Eclipse
        * Javaメインなので
* 型が決まってると、複数人で意思疎通するときにしやすい

### public省略する派？しない派？

* classのプロパティを、他のクラスから参照できるようにするかどうかの修飾子。
* 観測範囲だと、省略する派が多いような気がしますが、どうですか？

・・・

* 省略する派: 4人
* 省略しない派: 1人
* 省略しない派
    * Javaではpublicをちゃんと書いていたので、その習慣をTSでも受け継いだ
        * Javaだと public 書くと書かないで可視性に若干の違いがでますね
            * [【解決Java】アクセス修飾子(protected、privateなど) | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/22679)
* 省略する派
    * Javaのときは絶対かいてたけどTSのでは省略してるな・・・
* Javaがバックエンドなら、付けたほうがいいかも？
    * 混乱しないために。

### Auth0ってどうなの？どういう仕組なの？かんたんにつかえるの？どういう人、アプリが使ったらいいの？

Auth0とは、認証プロバイダとか認証に関わることすべてをやってくるSaaS(IDP)

たとえば、SNS認証とか、OpenIDとか全部提供している。

認証を自分でやるのはとても大変。

・・・

* 認証を自前でやるリスク
    * 認証がしくっていると、公開サービスだと不安だったり。
    * 認証を気にして、どうにかするのもコストがかかりすぎるので、Auth0でサービスを買ったほうが安い
* Auth0料金っていかほど？
    * フリーもある。
    * 1,000アクティブユーザで、23ドル/月
    * 社内に認証チームを作るより安いと思う。
* SAMLとかActive Directoryとも連携できる。
* 使い出すのに認証の知識がある程度必要。
    * 共通鍵認証がいいのか、公開鍵認証がいいのか、など分かっていて、その設定がちゃんとできないとハマる。
* だいたい1ヶ月でみんな導入できてるらしい。
* サーバレスでSPAなアプリでも使えるが、サーバがあるクラシックなウェブアプリでも使える。
* いろんなユースケースでの実装方法を細かくドキュメントで説明しているのがすごい！
    * たとえば、ReactでSPAだったら、こうやるというのがちゃんっと説明している。
    * これがないと、認証そのものが複雑なので、導入が難しいかもしなかった。
* Auth0+Expoを使って実装してみた
    * 認証の知識があんまりなくても、ドキュメントがちゃんとしていたので実装はできた。
* 失敗経験
    * Nextの情報がない。
        * Auth0もSDKを作り込んでいる状況なので、むちょっと待ってればNextにも対応されるはず。
* ユーザ情報はAuth0側に溜まっていく。
    * Auth0のAPIを叩くと、プロフィール情報を取れる

### JWTどうなん？鍵の管理大変じゃない？

JWT = JSON Web Token(ジョット)

* 認証情報をJSON形式をBase64にして受け渡しする方式。

・・・

* JWTは、改ざんされていないことを証明できるだけで、復号は誰でもできる
    * （そういうサイトも普通にある）ので、何を入れるかがセンス必要ですね

### GraphQLの使用感ぶっちゃけどうなの？

* 悪くない
* URL作ってJSON返す
* スキーマがある、というのが大きい
* Goのライブラリとしてgqlgenが一番良かった
    * [GitHub - 99designs/gqlgen: go generate based graphql server library](https://github.com/99designs/gqlgen)
    * スキーマ定義から、型を生成してくれる
        * リゾルバーを実装するだけ
            * リゾルバーとはデータを取得する部分
* GraphQLとは？
    * グラフ構造のデータをクエリーするランゲージ。
    * グラフ構造といえば、Neo4Jとか
    * FacebookのGraph APIをもっと汎用化したやつ。
* N+1問題はめっちゃある
    * SQL EXPLAINみたいに、GraphQLのクエリーのコストを測るツールもある。
    * それぞれのリゾルバーにかかっている時間を計測するSaaSもある。
* うまく使いこなせば便利だと思う。
* AWSのAppsyncを使うと、DynamoDBとかとつないでGraphQLのサーバを生やしてくれたりする。
    * リゾルバを書かなくていい。

### Javaを忘れてTSを書くべきか？

JavaプログラマでこれからTSを始めるのだが、JavaのマインドでTSを書いていいのか、一回リセットしてからTS使ったほうが良いのか？

・・・

* リセットする必要はないけど、違いは把握しておいたほうがいいと思う。
* 型は癖がある。
* Javaはクラスが基本。TSはクラスは書かなくていい。
* フロントエンドは関数型がいいとか、バックエンドはオブジェクト指向がいいとか、そういう意見があった。
* Java経験者ですが、TSはJavaの影響はまちがいなく受けているはずなので、知識の流用はできなくはないですね


### テストって先にやります？ あとにやります？

* テストって先にやります？ あとにやります？
* 作るものとタイミングによる
    * タイミング = ビジネスのフェーズによる。
    * つまりどれくらいコストを掛けてよいのかによるということ
* テストの種類にもよる
    * 単体、結合〜E2Eテストなど
* 絶対にバグが許されないプロダクトならテストは厚くしなくてはいけない
* 効果的なテストを書くべき
    * 全て書けば良いというものではない
    * コアドメイン部分とか
    * ちゃんと分析して把握したほうが良い
        * 勘でやると失敗する
* ユニットテストを増やしすぎると何十分もかかるので、気をつけたい
    * ユニットテストなのにユニットテストになってなくてDBがくっついてるとか
    * ローカルの開発環境だけでやれる範囲
    * 実行時間は最大3分くらいの感覚
* BDD的観点からいうと、テストはふるまいなので、先に定義されている（先にテストがあるべき）なのかなとは思いますが、難度が上がることも考えられるので、できる方からやって、テストは忘れず書いてねというゆるさでなんとか持たせてます。
    * すごく雑に言うと、BDD = TDD + DDD
    * テストの手法と思われているが、実は開発の手法
    * アジャイルを具現化したような手法

## 参加してよかったこと(参加者の感想)

* 最近よく聞くこと（Auth0やGraphQL）の話が聞けたこと
* 濃いメンツと話せる！
* 色々な物をかいつまんで聞けて、ネタが貯まってきました!!!!!
* 知らない単語がいっぱい知れるところ

## YYTypeScriptは毎週やってます

YYTypeScriptについてワイワイ話したい方は、[YYTypeScriptのイベント情報](https://yyts.connpass.com/)をチェックしてみて下さい。

以上、YYTypeScriptのレポートでした。次回もワイワイやっていきたいと思います！ では、また来週！