RSGTの精神( #RSGT2020 でお話をしてきました)

RSGT2020に参加しました。楽しかった。

2020.scrumgatheringtokyo.org

色々なことがあって、沢山の人とお話できて、何から書いたら良いか分からないので、思いついたものをざーっと書いてみます。

## 発表した

f:id:bufferings:20200112081020j:plain

Photo by あらたさん(ありがとうございます!)

スライドはこちら

色んな人に「よかったよ」って言ってもらえたし、見られなかった人も「話聞きたい」って質問してくれたし、Twitterでも色んな人が「いいね」って言ってくれてて、嬉しい。

当日は、小野さんが部屋担当で「いつもの感じっすか?」ってやってくれたのでありがたかったし、知ってる人たちが最前列で見てくれてて安心したし、真ん中らへんや後ろの方でセッション中にうなずきながら見てくれてる人がいたので喋りやすかったです。ありがとうございます。

## ポジティブ

プレゼンのヒントにと思ってこの本を読んだのでした。

books.rakuten.co.jp

「聴いた人がハッピーになる」ってあって、あぁ、これまでメッセージを届けることは意識してたけど、ハッピーになるかどうかまでは考えてなかったな。確かにそうだな。と思って「ポジティブな一歩」を意識してつくりました。

「あぁ、いいな。明日からこういうこと考えてみようかな」と前向きな気持ちで思えるようなセッションになってたかなぁ?もし、そんな風にちょっとでもポジティブな気持ちのきっかけにしてもらえてたらいいなぁ。

## すごくあたたかい

色んな人に「よかったよ」って言ってもらえてとても嬉しい。でも、勘違いしないようにしたいのは、それって自分がすごいんじゃなくて、僕のセッションから何かを感じてくれようとしてくれる人たちがすごいってことです。

いつでも、自分がなんかすごいんじゃないかな?と思うときは、自分がすごいんじゃなくて、周りにいる人たちがそういう風に思わせてくれてたり、それを支えてくれる動きをしてくれてるからで、あたたかい。

## 正解はない。自分で考える。

突然RSGT自体の話になりますが、2つの対象的なキーノートが印象的でした。1日目はコープさんのスクラムの精神のお話。2日目はサホタさんの誰も見捨てずに前に進むお話。2日目のキーノートを聞きながらニヤニヤしてしまった。これはRSGTの主催者からのメッセージだなと。

どちらか一方だけだと「自分は全くスクラムから遠いところにいるなぁ」と思ったかまたは「スクラムはいいけど、目の前の一歩を踏み出そうかな」と思いそうだけど、その2つを見せつけられることで「正解はない。両方を受け入れて自分で考えてください」というメッセージだなと僕は受け取りました。

そう。セッションを聞いてると「この人が言ってるからこれが正解なんだ」と思ってしまう自分がいて。それと違うことをしてたら「自分は間違ったことをしているんじゃないか?」と悩んだりするんですけど。そういうのを減らしていきたいな。自分の目で確認しながら進みたい。

## コミュニティ

3日目の高橋さんのクロージングキーノートを聞いてて、そっかそんな風にして試行錯誤を繰り返してこのコミュニティは大きくなってきたんだなぁと感慨深かった。僕にとってのチームはコミュニティだなということも再確認できた。

## セッション

いくつか印象的だったセッションを。

CI&Tさんのセッションで「テスターからスクラムマスターに昇進しました」って話を嬉しそうにしてて「この会社はいい会社なんだなぁ」と感じました。テストエンジニアは高いスキルが必要なので上下の話ではないとは思うけど、入り口としてテスターというロールを用意していて、その次のステップの1つとしてSMがある、というのを明確に定義しているんだろうなぁと。楽しそうに仕事をしてるのが伝わってきて、良いな。

あらたさんのセッションはしくじりのお話だったんですけど、しくじる前の成功のお話もとても勉強になりそうだったので今度ゆっくりそっちも聞いてみたいです。しくじり自体も、そうやるとよくなさそうな気はしてたけど、実際にそうやるとそんなことになるのか・・・というのを学べて良かったし、最後のメッセージもとても勇気づけられたし、この人にしかあんなことできないなーと思ってみてました。相変わらずすごい。

きょんさんのセッションは、チームがばらばらになったというのが衝撃でした。だけど、それでもあきらめずに、今まで培ってきた知見を活用しながら自分たちにしかできない形で新しい形でチームを形作っているのが、優しいなと思いました。優しすぎて少し心配。内容とは別に勉強になったのが、スライドの構成やセリフの入れ方、歩くタイミングや目線、ねのさんとのタイミングの合わせ方、などすごいなぁと思いながら見てました。

後輩のキムさんの軍隊の話は自分が全く知らない世界の話だったので興味津々で面白かったし、半谷さんの話は、同じ会社で仕事をしてる人として尊敬しかない動きで、あれはとても人間力が必要だし、実現させてるのが単純にすごいなぁと思いました。

およべさんのセッションは聞けなかったんですけど、会って少し話をするだけで、相変わらずすごく勇気を僕にくれました。こんなところに僕がいていいんだろうか?と思うときがあるんだけど、およべさんと話をしていると「いいんだよ!」って言ってもらえる感じがして、安心する。

## RSGTの精神

色々な人たちとお話をする中で、考え方や目指すものは違うけど、自社サービスだからとか、受託だからとか、SIerだからとか、Web系だからとか、組み込みだからとか、大企業だからとか、スタートアップだからとか、そういうの関係なく、その場を改善しようとして頑張ってる人たちとお互いに支えあいながら敬意を払いながら歩いていきたいなと思いました。

## 成長のベクトル

RSGT2019でおよべさんと素晴らしい後輩たちが投げかけてきてくれたメッセージ「成長のベクトル」をこの一年間たまに思い出しながら取り組んできました。自分は自分が全力でやってきたことを信頼しているし、それで成長のベクトルも後輩たちにも負けないようにやってきたと思うので、そういう気持ちでまたここに戻ってこれて良かった。

英語圏の人たちと話をするのにまだ勇気が出ないので、今年は英語を頑張ろうかな。と思い中。そもそも日本語でも勇気がかなり必要とされているので別な問題の気もするけど。

まとまりないけどこの辺で。今年こそは少し手を抜いてがんばるー。スタッフのみなさん、参加者のみなさん、最高でした!ありがとうございました!

#kanjava で Micronaut の紹介をしました。そのときに使ったアプリのコードを公開しました。

関ジャバでお話する機会をいただき、Micronautの紹介をしてきました。Java最新フレームワーク特集ということで、Quarkusのお話を聞くことができてとても面白かったです。

kanjava.connpass.com

当日は、GKEにサンプルアプリをデプロイして、Stackdriverで状況を見たのですが、ローカルで動かせるほうがいいかな?と思ったので、先日少しだけ触ってたk3dで動かせるようにして

bufferings.hatenablog.com

コードを公開しておきました。READMEに書いてある通りにやったらローカルでIstioとアプリが動くと思います。CPUとメモリを結構使うかも。

github.com

Istioのbookinfoサンプルをバージョン切り替えをなくして、Micronautで簡単に書き直しただけのアプリなんですけど、こんな感じ

https://github.com/bufferings/kanjava201911/raw/master/image/bookstore.png

Istioの上で動くようにしてあるので、kialiでServiceGraphを見てみたり

https://github.com/bufferings/kanjava201911/raw/master/image/kiali.png

Grafanaのダッシュボードもいっこ作って、Istioのインストールスクリプトの中に入れておいたので、こんな風に確認したりできます

https://github.com/bufferings/kanjava201911/raw/master/image/grafana.png

普通のJAR実行と、ネイティブイメージの両方のDockerコンテナを用意したのですが、比較するところまではいけませんでした。

また、確認していきたいな。それとGraalVMの19.3が関ジャバが終わったその日くらいにリリースされて

GraalVM 19.3.x

Native Image周りも変わったっぽいので、そのあたりも触ってみたいなと思ってます。ありがとうございました。

Javaのコンテナのメモリ割り当ての考え方をまきさんに教えていただいたので記録

何度か教えていただいているので、今度こそしっかり覚えておきたくて、まきさんからのコメントを記録。

## メモリサイズの考え方

SpringBootのアプリをコンテナとして動かす場合には768MB以上必要で、1GBくらいは割り当てる必要があるのではないかという僕のコメントに対していただいたコメント。

## Build Pack

上記のようなメモリサイズの計算をやってくれるツールも教えてもらった。

ありがとうございます!

ローカルでk8sを試してみたいときはk3dが使えそう。Istioも動きそう。

## ローカルでk8s

ちょっと試してみたいときとかに、ローカルでk8sを動かしたくて。以前だとMinikubeとかDockerについてくるk8sとかを使ったことがあるけど、今だとまた何か出てるかな?と思ってたらこういうスレッドを見つけた。

K3s, minikube or microk8s? : kubernetes

  • Minikube
  • Microk8s
  • K3s
  • Kind
  • Desktop Docker
  • K3d
  • Kubeadm

が紹介されてた。へー。と思って、なんとなくk3dが面白そうかなと思ったので試してみた。

## k3d

https://github.com/rancher/k3d

紹介されている一覧の中にあるk3sをDockerで動かしてくれるのがk3dということみたい。Dockerを動かすプラットフォームをDockerの中で動か・・・す?こんがらがる。

僕はUbuntu使ってるんだけど、Dockerで動くならWindowsでもMacでも動きそうで良さそうね。

READMEに書いてある通りにインストールして(brewも対応してるみたい)

$ curl -s https://raw.githubusercontent.com/rancher/k3d/master/install.sh | bash

READMEに書いてある通りにクラスターを生成してからConfigを設定したら

$ k3d create
$ export KUBECONFIG=$(k3d get-kubeconfig)

へー。ほんとに動いてる。

$ kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-58fb86bdfd-kvmdh   1/1     Running     0          3m40s
kube-system   coredns-57d8bbb86-grbbr                   1/1     Running     0          3m40s
kube-system   helm-install-traefik-4qr7t                0/1     Completed   0          3m40s
kube-system   svclb-traefik-j8c49                       3/3     Running     0          3m5s
kube-system   traefik-65bccdc4bd-vtk9r                  1/1     Running     0          3m5s

$ kubectl get svc -A                                                                                                                                                                                   
NAMESPACE     NAME         TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                                     AGE                                                                                
default       kubernetes   ClusterIP      10.43.0.1      <none>         443/TCP                                     5m57s                                                                              
kube-system   kube-dns     ClusterIP      10.43.0.10     <none>         53/UDP,53/TCP,9153/TCP                      5m56s                                                                              
kube-system   traefik      LoadBalancer   10.43.80.235   192.168.48.2   80:30107/TCP,443:31822/TCP,8080:31373/TCP   5m5s   

traefikをLoadBalancerサービスとして使ってるってことなのかな。ふむふむ。

## Istio?

ふと。k3dでIstio動くんかな?と思って見てみたら

[HELP] 1 node(s) didn't have free ports for the requested pod ports · Issue #104 · rancher/k3d · GitHub

どうやらこの人はtraefikとIstioのポートがぶつかってたからtraefikを使わないようにしたらIstioが動いたっぽい。へー。

やってみるか。

### traefik抜きでk3dクラスターを生成

# さっきのクラスターを削除して
$ k3d delete

# traefik抜きのクラスターを作成
$ k3d create --server-arg --no-deploy --server-arg traefik

# 設定を生成して
$ export KUBECONFIG=$(k3d get-kubeconfig)

# チェック
$ kubectl get pod,svc -A
NAMESPACE     NAME                                          READY   STATUS    RESTARTS   AGE
kube-system   pod/local-path-provisioner-58fb86bdfd-h6npn   1/1     Running   0          13m
kube-system   pod/coredns-57d8bbb86-zkjkq                   1/1     Running   0          13m

NAMESPACE     NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP                  13m
kube-system   service/kube-dns     ClusterIP   10.43.0.10   <none>        53/UDP,53/TCP,9153/TCP   13m

これでIstio入れてみるかな。

### Istioのインストール

・・・ってもうバージョン1.4か。こ、今月出たばっかりだし、1.3使っとこうかな。なんとなく。

https://github.com/istio/istio/releases/tag/1.3.5

からダウンロードしてきて、このページを見ながらインストールする。helm templateを使う方で入れる。Helmは既に入れてある。

https://istio.io/docs/setup/install/helm/

# Istio用のネームスペース作って
$ kubectl create namespace istio-system

# CRD入れて
$ helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -

# CRDの生成が終わるのを待つ
$ kubectl -n istio-system wait --for=condition=complete job --all

あw。これまではwcコマンドつかって23個になるのを待ってたのに、wait使うようになってる。良い。で、Istioのインストール。

$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -

ありゃ。さくっと入ったっぽい。

kubectl get svc,pod -n istio-system
NAME                             TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                                                                                                                                      AGE
service/istio-galley             ClusterIP      10.43.10.191    <none>         443/TCP,15014/TCP,9901/TCP                                                                                                                   2m21s
service/istio-policy             ClusterIP      10.43.86.131    <none>         9091/TCP,15004/TCP,15014/TCP                                                                                                                 2m21s
service/istio-telemetry          ClusterIP      10.43.11.107    <none>         9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       2m21s
service/istio-pilot              ClusterIP      10.43.126.19    <none>         15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       2m21s
service/prometheus               ClusterIP      10.43.41.148    <none>         9090/TCP                                                                                                                                     2m21s
service/istio-citadel            ClusterIP      10.43.91.217    <none>         8060/TCP,15014/TCP                                                                                                                           2m21s
service/istio-sidecar-injector   ClusterIP      10.43.117.133   <none>         443/TCP,15014/TCP                                                                                                                            2m21s
service/istio-ingressgateway     LoadBalancer   10.43.69.0      192.168.96.2   15020:30845/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31842/TCP,15030:32247/TCP,15031:32685/TCP,15032:31093/TCP,15443:30499/TCP   2m21s

NAME                                          READY   STATUS      RESTARTS   AGE
pod/istio-init-crd-10-1.3.5-28hj7             0/1     Completed   0          5m40s
pod/istio-init-crd-11-1.3.5-vmwmw             0/1     Completed   0          5m40s
pod/istio-init-crd-12-1.3.5-84q77             0/1     Completed   0          5m40s
pod/istio-security-post-install-1.3.5-jb66j   0/1     Completed   0          2m21s
pod/svclb-istio-ingressgateway-ww22d          9/9     Running     0          2m21s
pod/istio-citadel-5c67db5cb-hmhvb             1/1     Running     0          2m20s
pod/prometheus-6f74d6f76d-tpjpc               1/1     Running     0          2m20s
pod/istio-policy-66d87c756b-hf4wx             2/2     Running     3          2m21s
pod/istio-galley-56b9fb859d-7jmsq             1/1     Running     0          2m21s
pod/istio-sidecar-injector-5d65cfcd79-lhh6k   1/1     Running     0          2m20s
pod/istio-pilot-64478c6886-9xm7b              2/2     Running     0          2m20s
pod/istio-telemetry-5d4c4bfbbf-g4ccz          2/2     Running     4          2m20s
pod/istio-ingressgateway-7b766b6685-5vwg5     1/1     Running     0          2m21s

こんなにスムーズに進むなんて・・・(疑い

サンプルアプリ動かしてみるか。

### bookinfoサンプルアプリをデプロイ

動作確認のために、Istioについてくるbookinfoサンプルアプリをデプロイしてみる。

https://istio.io/docs/examples/bookinfo/

# サイドカーの自動インジェクションを有効にして
$ kubectl label namespace default istio-injection=enabled

# デプロイして
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

# watchでもしながらしばらく待つ
$ kubectl get pods -w
NAME                              READY   STATUS            RESTARTS   AGE
details-v1-78d78fbddf-5db8b       0/2     PodInitializing   0          37s
reviews-v1-7bb8ffd9b6-rdgjc       0/2     PodInitializing   0          37s
ratings-v1-6c9dbf6b45-p7567       0/2     PodInitializing   0          36s
productpage-v1-596598f447-nj6wx   0/2     PodInitializing   0          36s
reviews-v3-68964bc4c8-qrhc4       0/2     PodInitializing   0          37s
reviews-v2-d7d75fff8-65f4q        0/2     PodInitializing   0          37s

# bookinfo用のIngressGatewayを作成
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

LoadBalanerサービスのExternal IPを確認して

$ kubectl get svc  -n istio-system istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
192.168.96.2

それをブラウザで開いたら・・・ありゃ。動いた。

http://{そのIPアドレス}/productpage

f:id:bufferings:20191117113617p:plain

メモリ使用量はbookinfoをデプロイしただけだと2GiBくらい。

$ docker stats --no-stream
CONTAINER ID        NAME                     CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
598bd6d07c85        k3d-k3s-default-server   52.24%              1.909GiB / 15.4GiB   12.40%              819MB / 21.7MB      1.41MB / 818MB      899

何か起こったときの問題解決は難しそうだけど、ローカルでちょこっとためすのにはお手軽で良さそう。

何かに取り組んでいるときにはステージがあるなぁ

何かに取り組んでいるときにはステージというものがあるなぁ。と思っている。

 

例えば僕は仕事をするときに英語を使っているけど、文法とか言い回しとか変なところがめちゃくちゃいっぱいあると思う。だけど、そこはあんまり気にしてない。僕は「英語を上手に話す」というステージにいないから。

 

今僕がいるステージで一番大切なのは、下手でも無茶苦茶でもなんでもいいから、とにかく自分の考えを英語で伝えること。それから、とにかく頑張って相手の言ってることを理解すること。

 

ほんとはもっとかっこよく喋りたいし、ネイティブの人たちの速い会話の中で"I'm sorry?"って会話を止めてもう一度ゆっくり説明し直してもらったりしないでいたいんだけどな。今はそのステージにいない。

 

そして、そういうところにいると、もっとうえのステージにいる人から「ここができてない」とか「あれはこうしたほうがいい」とか何個かうえのステージのアドバイスをもらうときがある。それには感謝しつつ、でも今はいったん気にせずに、心のバックログにおいておく。

 

それで(あぁ、今日は自分の考えをしっかり説明できたから良かったなぁ。ビール買ってかえろー)って思ったりする。

 

技術的なこともそうだし、色々そうかなぁ。そういう感じかなぁ。って思ったりする。

聞いてくれてありがとうございます

ふりかえりの最後で「何かある人はいますか?」って聞いたときの話。

 

「椎葉さんにひとつ聞きたいことがあります」

 

はい。

 

「私は今、自動化に時間をかけていますが、これは正しいでしょうか?」

 

ほほー。というと?

 

「はい。自動化をするかわりに、手で作業していればもっと早くに作業は終わっていたはずです。プロジェクトのことを考えると手で作業をした方が良かったのかもしれないと思いました」

 

そうですね。早くは終わったかもしれないですね。

 

「自動化をすることで作業ミスをなくすことができるし、繰り返し何度も実行をすることができるので、できるだけ取り組みたいと考えてやっているのですが、そのせいで、今回は椎葉さんに迷惑をかけてしまいました。これは正しかったのだろうか?と疑問に思いまして」

 

あぁ。なるほど。

 

正直なところ、正しいかどうかは分かりません。何を選んでも良いところと良くないところがあるし、何が正しいかなんて僕にも分かりません。

 

「そうですか…」

 

でもね、いつも迷ったら聞いてくれますよね?そうしたら僕は、もし疑問があったらそこであなたに質問しますよね?例えば「それは手作業の方が早く終わると思うけどどう思う?」って。

 

「はい」

 

それで、あなたは自分の中でよーく考えて「やはり今後のことを考えて自動化しようと思います」って説明してくれますよね。

 

「はい」

 

僕は、そのあなたの考えを尊重したいなと思っているんです。

 

「そうでしたか」

 

実際に今回は自動化しててくれたおかげで、あなたがいないときに僕が作業を進めることができたんだから、とても良かったと思います。面白かったし。

 

「ありがとうございます」

 

自動化をするというあなたの決断に僕も納得をして取り組んでいるわけですから、もしそれによって遅れが出そうだったら、僕がカバーするというのも自分で決めたことなんです。だから気にしなくて良いです。

 

「そうですか…」

 

僕はこんなふうに、意見を尊重したいなと思える人たちと仕事をできていることを嬉しいと思っています。

 

「はい!」

 

聞いてくれてありがとうございます。

「できない」の種類

やったことないからできない

 

誰かに「それはできないんじゃない?」と言われたからできない

 

時間がないからできない

 

Q&Aサイトのとおりに書いたけど動かないからできない

 

ちょっと調べてやってみたけどなぜか動かないからできない

 

結構調べて色々試してみたけどもうこれ以上調べ方が分からないからできない

 

公式サイトにサポートしてないって明確に書いてある、または、ソースコードをチェックしたら対応してないことが分かったからできない

 

とかとか。これを区別して話を聞くのが最近の自分の中の流行り。

 

最近ちょっと寒くなってきて好きな感じ。今日も頑張る。(๑•̀ㅂ•́)و✧