by shigemk2

当面は技術的なことしか書かない

JSON ライブラリの歴史、マイクロサービス、およびスキーマの進化について #reactive_shinjuku

https://reactive-shinjuku.connpass.com/event/49818/

  • @eed3si9n
  • Lightbend
    • に入るまでは独学でScalaをやっていた
  • Lightbend Production Suite
    • 技術サポートもやっている

開発プロセスをスケールさせるにはどうしたらいいか

  • 組織をスケールさせるのがいちばんはやい
    • 1000人問題
      • エンジニア10人→100人→1000人と増えていくにつれて全員がコードを書くのが難しくなっていく
      • 企業そのものをスケールしていくしかない
      • その方策としての マイクロサービス
        • ただの技術アプローチではない
      • ジェフ・ベゾス http://homepages.dcc.ufmg.br/~mtov/pmcc/modularization.pdf (AWSが出る前)
        • メールをだした
        • developmentそのものをスケールすること
        • マネジメントにもささる

Brief history of JSON libraries

2008

  • 文学的解析
    • 文字を読むだけではなく背景をさぐるのが文学の楽しみ
    • それを読み解くのがいちばん楽しいのがJSON という持論
  • Programming in Scala/Real world Haskell in 2008
    • それまでは論文を読み漁るしかなかった
    • Scalaでは10行でパーサコンビネータが作れる
    • Haskellは1章を割いてJSONを解説している
    • ASTをデータとしてあらわす
    • JSONをデータとしてあらわす
  • Dispatch JSON
  • literaljson
    • literaljsonをLiftへ寄付する
  • sjson
    • それまではプログラミングのASTにあらわすだけ
    • sjsonは型クラスを定義する
    • アドホックなポリモーフィズムを実現するのが型クラス
  • typeclass
    • e.g. trait Eq[A]
      • ===の実装

2011

  • spray-json
    • Dispatch JSONの後継
    • sjsonの後継
  • Play JSON

ウェブフレームワークごとにJSONライブラリがあるようなかんじ

2012

  • Arngonaut
    • Scalaz/猫をつかっている
  • json4s
    • Lift-json Liftがなくなったけどこのライブラリの出来はよかったのでforkされた
    • ウェブフレームワークには使われなかった

2014

  • Jawn
    • Erik Osheim
    • Scala最速のパーサ
    • カリカリかつfunctionalなコードを書くのが好き
    • 型クラスの抽象化
    • いろいろなウェブフレームワークで使える
    • backend independent
  • Rapture JSON
    • Jawnより高機能をめざした
  • Circe
    • Argonautのport
    • パーシングのぶぶんはJawnに影響をうけている
    • 機能が豊富

2016

  • SLIP-28(Scala JSON AST)
    • ASTが使えるといってもライブラリが分かれているのはしんどい
    • Scalaのモジュールをめざす
  • sjson-new
    • 著者作
    • 独自の型クラスにいろいろマッピングしたい
    • 意識しないで抽象化できる

Contract-first approach

  • 永続化(serialization)
  • data binding

    • XML/Apache Thrift/Google Protocol Buffer/Facebook GraphQL
  • データをScalaで表現する

    • sealed traits
    • case classes
    • データの表現方法としてはあまりよくない
    • ひとつフィールドを足すと型が変わってしまう
    • バイナリ互換性の点で、APIを進化させることができない
    • (それでもcase classは便利 便利メソッドを自動的に生成してくれるから)
  • contraband
    • 擬似case classをJava/Scalaで表現する
    • GraphQLを実装
    • Enum
    • Interface
    • annotation
    • record type
  • contraband can derive sjson-new codecs
    • 擬似case classを定義すると、JSONにも行き来できる

contrabandのおもしろいところ

  • JSON以外にも使える
    • message packでのバイナリ生成
    • Int型(Murmurhash support) IntがJSON ASTであるかのように振る舞う
    • Builder API is used to build on-way hash

IDL