Sphereとともに

scalaとかplayframeworkとか。技術ブログにしたいなと。環境は Windows7x64, mac です。たまに声優さん情報が混ざります。最近ちょっとClojure触りました。

Consumer-Driven Contractの雑なまとめ

Consumer-Driven Contractとは

用語

Consumer サービスを使う側(リクエストを投げてレスポンスを受ける側)

Provider サービスを提供する側(リクエストを受けてレスポンスを返す側)

Contract Consumerが期待するリクエストとレスポンスの定義

Mock Service Provider Consumerのテストを実施する際に利用するもの

Pact Broker https://github.com/bethesque/pact_broker ConsumerとProviderでのpact共有の課題を解決する

仕組み

ConsumerがProviderに期待する振る舞い(Contract)を提供し、Providerはそれに準じた挙動をしているか検証する。 Providerの挙動がContractと異なる場合にProvider側での検知が可能となる。 サービス間の振る舞いを、より大きな枠で担保する仕組み。

Consumer側が主導権を握っている。

Mock Service Providerを利用するので、テストコードにいちいちMockを書かなくても良い。

pact brokerを用いた仕組み

  1. CIでConsumerのテストを回す
  2. テストを実施するとjson形式のpactファイルが出力される
  3. Pact Brokerにpactを送信する
  4. Pact Brokerの最新のpactでProviderのテストを回す

なぜCDCが必要か

  • それぞれの単体テストでMockを書いたとして、そのMockが本当に正しい振る舞いをしているかが保証されていない

pactとは

consumer-driven contract testing tool.

example project

http://io.itv.com/scala-pact/examples/index.html

pactStubber で簡単にスタブサーバーを立てることが出来る。 CI用にスタンドアローンにすることも可能。

コスト

  • すべてのサービスを立ち上げて結合テストを回すことと、CDCでテストを回すことのどちらがコストが高いのか
  • contractのすべてをまかなえるのだろうか?

プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化

プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化

Elixir ecto で bigint を使う

↓のように bigserial を使えばOK

def change do
    create table(:users, primary_key: false) do
      add :user_id, :bigserial, primary_key: true

      timestamps()
    end

  end

※ コマンドでbigserialを指定するのは無理っぽい

$ mix phx.gen.schema Accounts.User users user_id:integer
** (Mix) Unknown type `:bigserial` given to generator. The supported types are: array, binary, boolean, date, decimal, float, integer, map, naive_datetime, references, string, text, time, utc_datetime, uuid

プログラミングElixir

プログラミングElixir

npm runとはなにか

package.jsonに記述しているscriptsに定義されたタスクを実行させるためのコマンド

npm run {scriptsに定義されたタスク名}

という感じ

例えば以下のような定義があれば

// 略
"scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
  }
// 略

npm run dev と叩くことでタスクが実行される

WebRTCをいろいろ調べてまとめてみた

www.slideshare.net

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

B to Cサービスの難しさとその崩壊 - ビジョンを失うということ -

夢に満ち溢れた初期

初期段階は、サービスを作って誰かの役に立つこと、社会へのインパクトを夢にサービスを作りはじめる

その夢が正しいかどうかわからない

だからいかに早く市場へ出すかに注力する

多少汚いコードであっても、後々に負債になることがわかっていても

この時のファースト・プライオリティはサービスを世に出す事である

市場に受け入れられるか受け入れられないかがわからないものに時間と金をつぎ込み続けるのは愚かである

少人数のメンバーで全員がそれを理解してスピード感を持って開発に臨む

どんなに大変だったとしてもそこには希望がある

社会のために

世の中をより豊かにするために

自らの手でイノベーションを起こすことへの高揚感にあふれ

世界の革新を胸に秘めて

ローンチ

ある程度形になった段階でローンチされるサービス

まだまだ未熟ではあるが、その思想や未来に期待したイノベーターが付く

顧客は契約の段階では、思想や未来に胸を膨らませて契約を行うが

いざ業務において使い始めると、不足していることがたくさん目についてくる

すると、はじめは要望として様々なものがあげられてくる

開発者たちは自分たちの目指す思想・未来と照らし合わせて

取捨選択を行い

時には大胆な方向転換を行う

初期段階は少人数での開発であり、コードもまだまだ少ないためそれほど難しくはない

顧客の増加と売上

様々な要望を取り入れていくと、細かい部分では気になるところはあるものの

大枠では使えるサービスが出来上がってくる

この頃にはアーリーアダプターもそこそこの数になり

アーリーマジョリティが付いてくる

そうなってくると、このサービスはどんどん伸びていくものであると経営的判断がなされる

すると何が起きるか

急速な人員の増加と、売上伸長へ意識偏重

エンジニア、セールス問わず急拡大が行われる

新規採用・他部署からの異動

人を集める方法はいくらでもある

急速な組織の拡大

少人数で壮大なビジョンを掲げて開発して来たところに

急な転換

なにが起きるか

少人数で図れていた意思疎通ができなくなる

コードが崩れはじめる

初期メンバーはどこが負債になるかを理解しているし

なぜその負債が生まれているかは十分な理解をし共通認識として受け入れている

けれども、急拡大にて配属された人にはそういった共通認識もない

目にするのは人の手垢まみれのコードだ

そこに思い入れはない

そうこうしているうちに別の新規事業立ち上げで初期メンバーは引き抜かれていく

残るのはほんの一握りの初期メンバーと、出鼻を挫かれた途中入場のメンバーだ

途中入場者は初期メンバーの残した負債に苦しむことになる

負債に足を取られながらも売上を上げるために

開発スピードを落とさないために努力する

しかし、そこには行き場のない怒りと虚しさがある

途中入場者も初期メンバーの残した負債の理由を理解できるからだ

理解できるからこそ、その怒りの矛先をどこに向けることも出来ず

苦悩する

徒労でしかない

コードに限界が来たときに

大きなテコ入れをしようとしたときに

どれほどのメンバーが快く手を挙げるだろうか

売上伸長

売上を伸ばすためにトップが変わる

どんなにエンジニア経験のあるトップであって

エンジニアの心を理解しようと努めても

経営層から売上を求められている以上、思いはどうしても売上へ変調し偏重する

そして次第に

壮大なビジョンは失われる

そのトップにとっては、今自分が抱えているサービスの売上を伸ばすことがファースト・プライオリティだから

最初のビジョンがどうあろうと関係ない

最初のビジョンを理解していたとしてもそれを推し進めるだけの推進力はない

なぜなら最初からそこに携わっていないからそのビジョンに対する熱量がない

その熱量の違いから何が起きるのだろう

顧客が求めるものを作り続けるだけの日々

ときに自らの発想でものを作るが続かない

もどかしい

誰のための

一体、誰のためなんのためにサービスを作っているのか

組織の急拡大に向けて採用された人物は

少人数でやっていたころのビジョンやその組織のあり方に突き動かされて来た人たちばかりだ

それがいざ足を踏み入れるとそこにはあの頃の輝きはもうない

見えない敵と戦う日々

暗闇でもがく日々

崩壊

少人数でのマネジメントは大人数には使えない

破壊して構築しなおすか

構築し直すだけの希望はパンドラの箱に残っているだろうか

夢見るその先は

エンジニアはものを作ることがゴールではない

その先になにを夢見るのか

www.youtube.com

www.youtube.com

Elixir ecto の自動生成IDをUUIDにする

blog.fourk.io

プログラミングElixir

プログラミングElixir

Elixir/Phoenix 初級?: はじめの一歩 (OIAX BOOKS)

Elixir/Phoenix 初級?: はじめの一歩 (OIAX BOOKS)