ikuo’s blog

育児やエンジニアリングについて

"コンテナファースト" Java フレームワーク Quarks を試してみた

Quarksとは

https://ja.quarkus.io/

今更ぼくが紹介するまでもないと思うんですが、Redhat さん主導で開発されている新気鋭の Java フレームワークで、コンテナ環境での実行をメインターゲットにしている点が特徴ですかね。 会社で話題になっていたので試してみました。

ちょっとにわかには信じがたい性能のふれこみですね!

https://ja.quarkus.io/assets/images/quarkus_metrics_graphic_bootmem_wide.png

TL;DR

  • Native 版実行コンテナを作って起動するまで
# 雛形作成
❯ mvn io.quarkus:quarkus-maven-plugin:1.12.2.Final:create \
      -DprojectGroupId=org.acme \
      -DprojectArtifactId=getting-started \
      -DclassName="org.acme.getting.started.GreetingResource" \
      -Dpath="/hello"cd getting-started
# install Extension
❯ ./mvnw quarkus:add-extension -Dextensions="container-image-docker"
# build
❯ ./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true
# go!
❯ docker run -i --rm -p 8080:8080 ikuo.suyama/getting-started:1.0.0-SNAPSHOT
  • エコシステム含め開発体験◎、実戦投入に向けてより詳細に使い込んでみたい

開発

とりあえずチュートリアルをやってみます。ドキュメントは多くがすでに日本語化されていて気合を感じますね。 ちょっと分かりづらい気もする、、とくに初学者にはつらそうです(けどおそらくそこはターゲットではなさそう

ja.quarkus.io

セットアップ

❯ mvn io.quarkus:quarkus-maven-plugin:1.12.2.Final:create \
      -DprojectGroupId=org.acme \
      -DprojectArtifactId=getting-started \
      -DclassName="org.acme.getting.started.GreetingResource" \
      -Dpath="/hello"

mvn コマンド一発で雛形と Hello world, test 一式が生成されます。 .gitignore も含まれていて、IntelliJ の設定ファイルもちゃんとかいてある!

ああちゃんと使う人のことが考えられているなぁと感じます。 細かいけどこういう配慮があるプロダクトは信頼できますよね。

起動

開発モードで起動

cd getting-started
❯ ./mvnw compile quarkus:dev
:
istening for transport dt_socket at address: 5005
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-03-13 22:48:41,751 INFO  [io.quarkus] (Quarkus Main Thread) getting-started 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.12.2.Final) started in 1.098s. Listening on: http://localhost:8080
2021-03-13 22:48:41,754 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2021-03-13 22:48:41,754 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy]

curlしてみます。いいですね!

❯ curl localhost:8080/hello
Hello RESTEasy⏎

もちろんホットリロード対応で、変更を加えるとアプリケーションが高速にリロードされます。

コードはこんなノリです

@Path("/hello")
public class GreetingResource {

    @Inject
    GreetingService service;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello RESTEasy";
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("/greeting/{name}")
    public String greeting(@PathParam("name") String name) {
        return service.greeting(name);
    }
}

サンプルはCRUDEすら無いシンプル(すぎる)アプリケーションだけど、 まんま JAX-RS だし Java で Backend やってる人はだいたいふんいきでわかるんじゃないでしょうか。

Native Build

目玉のネイティブ実行ファイルを作成してみます。

ja.quarkus.io

ここをなぞるだけです。 ビルド時に、native プロパティを指定すると GraalVM なネイティブ実行ファイルが作成できます。簡単。

❯ ./mvnw package -Pnative

めんどうくさそうなところは飛ばして、とりあえず実行すると当然死にます。

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.12.2.Final:build (default) on project getting-started: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Cannot find the `native-image` in the GRAALVM_HOME, JAVA_HOME and System PATH. Install it using `gu install native-image`
[ERROR]     at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.getNativeImageBuildRunner(NativeImageBuildStep.java:306)
[ERROR]     at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:102)
[ERROR]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[ERROR]     at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
[ERROR]     at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
[ERROR]     at java.base/java.lang.Thread.run(Thread.java:829)
[ERROR]     at org.jboss.threads.JBossThread.run(JBossThread.java:501)
[ERROR] -> [Help 1]
:

ふむ。GraalVM をインストールしてないからですね。それはそうだ。ドキュメント読みましょう。でもインストールするのは面倒くさいです。

どうやら GraalVM をインストールしなくても、ビルド用イメージを引っ張ってきてコンテナ内でビルドしてくれるオプションがあるみたいです。すばらしい。 もちろんMacOS用の実行ファイルにはならないですけど。

❯ ./mvnw package -Pnative -Dquarkus.native.container-build=true

今度は違うエラーで死。OOMだそう。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  31.431 s
[INFO] Finished at: 2021-03-13T23:19:52+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.12.2.Final:build (default) on project getting-started: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]     [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to build native image
[ERROR]     at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:282)
[ERROR]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[ERROR]     at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:920)
[ERROR]     at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2415)
[ERROR]     at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
[ERROR]     at java.base/java.lang.Thread.run(Thread.java:829)
[ERROR]     at org.jboss.threads.JBossThread.run(JBossThread.java:501)
[ERROR] Caused by: java.lang.RuntimeException: Image generation failed. Exit code was 137 which indicates an out of memory error. Consider increasing the Xmx value for native image generation by setting the "quarkus.native.native-image-xmx" property
[ERROR]     at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.imageGenerationFailed(NativeImageBuildStep.java:439)
[ERROR]     at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:254)
[ERROR]     ... 10 more
[ERROR] -> [Help 1]
:

quarkus.native.native-image-xmx を指定するといいよ、とあるけど、追加しても同様。 いま Docker コンテナ内でビルドしてるはずなので、 Docker 側の設定の問題じゃないかと踏んで確認してみたら、案の定何故か Docker のメモリ制限が 2G とかになっていました。 アップグレードされた際にリセットされてしまったのかな。とにかく適当に大きめに設定します。

:
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=1 -J-Duser.language=ja -J-Duser.country=JP -J-Dfile.encoding=UTF-8 --initialize-at-build-time= -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy\$BySpaceAndTime -H:+JNI -H:+AllowFoldMethods -jar getting-started-1.0.0-SNAPSHOT-runner.jar -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:-AddAllCharsets -H:EnableURLProtocols=http --no-server -H:-UseServiceLoaderFeature -H:+StackTrace getting-started-1.0.0-SNAPSHOT-runner
[getting-started-1.0.0-SNAPSHOT-runner:26]    classlist:   4,692.18 ms,  0.96 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]        (cap):     538.10 ms,  0.96 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]        setup:   2,192.05 ms,  0.96 GB
14:22:21,626 INFO  [org.jbo.threads] JBoss Threads version 3.2.0.Final
[getting-started-1.0.0-SNAPSHOT-runner:26]     (clinit):     528.50 ms,  1.95 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]   (typeflow):   9,915.57 ms,  1.95 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]    (objects):   9,587.44 ms,  1.95 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]   (features):     519.44 ms,  1.95 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]     analysis:  21,527.90 ms,  1.95 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]     universe:   1,069.14 ms,  2.67 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]      (parse):   2,067.55 ms,  2.67 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]     (inline):   3,448.59 ms,  3.37 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]    (compile):  13,496.82 ms,  4.52 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]      compile:  20,469.25 ms,  4.52 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]        image:   2,609.89 ms,  4.52 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]        write:   1,690.58 ms,  4.52 GB
[getting-started-1.0.0-SNAPSHOT-runner:26]      [total]:  54,532.52 ms,  4.52 GB
[WARNING] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] objcopy executable not found in PATH. Debug symbols will not be separated from executable.
[WARNING] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] That will result in a larger native image with debug symbols embedded in it.
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 60944ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:07 min
[INFO] Finished at: 2021-03-13T23:23:01+09:00

はいはい、今度は成功しました。メモリは5Gくらい食ったみたいですね。

いつもどおり target/ 下に実行ファイルができています。

❯ ll target
total 57632
drwxr-xr-x  14 ikuo.suyama  staff   448B  3 13 23:38 ./
drwxr-xr-x  14 ikuo.suyama  staff   448B  3 13 23:42 ../
-rwxr-xr-x   1 ikuo.suyama  staff    28M  3 13 23:23 getting-started-1.0.0-SNAPSHOT-runner*

... 28MB??

いやいやご冗談でしょう。。Javaですよ?いくら Hello World だけとはいえ。 linux 用にビルドしたものなので当然Macでは動きませんけど。。

Image作成

せっかくなので Docker Image も作成してみましょう。 package に -Dquarkus.container-image.build=true オプションが用意されていてスムーズです。 Document が少し分かりづらいけど、今は3通り Image ビルドする方法が用意されています。

ja.quarkus.io

どれかのエクステンションは追加しないと Image ビルドできないみたいですね。 こんなWARNが出ていることに気づかず、Image が生成されないなーとしばらく悩みました。

2021-03-13 23:33:07,289 WARN  [io.qua.config] (main) Unrecognized configuration key "quarkus.container-image.build" was provided; it will be ignored; verify that the dependency extension for this configuration is set or you did not make a typo

とりあえずDockerでビルドすることにして、quarkus-container-image-docker エクステンションを追加します。

❯ ./mvnw quarkus:add-extension -Dextensions="container-image-docker"

Native 版

ビルドするコマンドは以下。

❯ ./mvnw package -Pnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true

できました!

❯ docker images | grep getting-started
ikuo.suyama/getting-started                                                              1.0.0-SNAPSHOT        4e99006a3194   25 seconds ago   132MB

132MB! いやー小さいですね。Golang とかに比べたらまだ大きいのかも知れませんけど... ちなみに BaseImage には Redhat さんの ubi ってやつが使われてるみたいです。38MBくらい。

起動してみましょう。
※ グループ名は自分のものに置き換えてください。ビルド時のオプションで指定もできます。

❯ docker run -i --rm -p 8080:8080 ikuo.suyama/getting-started:1.0.0-SNAPSHOT
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-03-13 15:20:51,266 INFO  [io.quarkus] (main) getting-started 1.0.0-SNAPSHOT native (powered by Quarkus 1.12.2.Final) started in 0.017s. Listening on: http://0.0.0.0:8080
2021-03-13 15:20:51,266 INFO  [io.quarkus] (main) Profile prod activated.
2021-03-13 15:20:51,266 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]

早つ。1s かからない。いいかんじですね!

jar 版との比較

せっかくなので jar 版も作って、サイズなど比較してみましょう。 -Pnative せずにビルドします。GraalVMがいらないので -Dquarkus.native.container-build=true も不要です。

区別するために Image の名前を適当に変えておきます。こういうオプションがちゃんと用意されているところにも好感が持てます。

❯ ./mvnw package -Dquarkus.container-image.name=quarks-getting-started-jar
❯ d images | grep getting-started
ikuo.suyama/getting-started                                                              1.0.0-SNAPSHOT        4e99006a3194   9 minutes ago    132MB
ikuo.suyama/quarks-getting-started-jar                                                   1.0.0-SNAPSHOT        c0281da22b67   46 minutes ago   380MB

やはりjarだとサイズがおおきいです。約2.8倍!いや、ネイティブ版が小さすぎるんですけど。 起動してみます。

❯ docker run -i --rm -p 8080:8080 ikuo.suyama/quarks-getting-started-jar:1.0.0-SNAPSHOT
exec java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -XX:+ExitOnOutOfMemoryError -cp . -jar /deployments/quarkus-run.jar
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2021-03-13 15:27:38,805 INFO  [io.quarkus] (main) getting-started 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.12.2.Final) started in 0.673s. Listening on: http://0.0.0.0:8080
2021-03-13 15:27:38,830 INFO  [io.quarkus] (main) Profile prod activated.
2021-03-13 15:27:38,830 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]
^C2021-03-13 15:27:45,104 INFO  [io.quarkus] (Shutdown thread) getting-started stopped in 0.076s

java経由で起動するのでネイティブ版よりワンテンポ遅く感じます。

まとめ

ネイティブ実行ファイルの作成、コンテナイメージの作成まで非常にスムーズに実施できました。 おそらく本格的なアプリケーションを開発し始めるとそれなりに詰まるポイントがあるんでしょうけど、それでもかなり可能性を感じますね。
特にやはりGraalVMによるネイティブ実行ファイルのイメージサイズの小ささや実行速度はかなり魅力的に感じます。つぎはk8sとも組み合わせてみようかな。
実戦投入に向けて、よりディープに使い込んでみたいなと思えるプロダクトでした!

サイバーエージェントを退職して、スマートニュースにJoinしました

f:id:martin_lover_se:20210215223225j:plain

あっという間に過ぎ去りましたが、11月にサイバーエージェントを退職し、スマートニュースにJoinしまして、3ヶ月が経ちました。 試用期間も終わってどうにかこうにかやっておりますので、所謂退職エントリというやつを書いてみようとおもいます。

TL; DR

  • サイバーエージェントでなにしてたの
    • 広告プロダクトの開発
      • Tracking, DMP, AdNetwork, DSP
    • いろんなロール
      • バックエンドエンジニアとか
      • エンジニアリングマネジャーとか
      • プロダクトオーナーとか
      • スクラムマスターとか
    • ゼミ
  • なんでやめるの
    • 大好きだったチームが解散してしまった
    • のもあるけど、天啓だったような気もしている
  • なんでスマートニュースなの
    • 「ピンときた」から
    • 迷ったので楽しそうな方を選んだ
  • スマートニュースでなにするの
    • 広告プロダクトの開発
      • 広告おもしろいよ広告
    • エンジニアリングに軸足を置く

誰ですか

すやまといいます。 バックエンドをベースに、ソフトウェアエンジニアをかれこれ15年ほどやっております。 アジャイルとかスクラムとかモブプログラミングとかが好きです。

サイバーエージェントに入社して、インターネット広告が大好きになりました。

サイバーエージェントでなにしてたの

あ、はじめに断っておきますが、サイバーエージェントは素晴らしい会社ですよ。嫌になってやめたとかでは決してないです。

間違いなく国内最高クラスのテックカンパニーであり、インターネット広告では言わずもがな先頭をひた走る存在です。 やりがいのある面白い仕事が山程ありますし、優秀でやる気のあるエンジニア/ビジネスの人達に囲まれて仕事ができます。 そんなにたくさんの環境で働いたわけではないですが、おそらくエンジニアにとっては国内トップクラスの環境と言えると思います。

やめたけど今でもサイバーが大好きですし、機会があればまた働きたいですね。

サイバーで働いた中で一番印象的なのはやっぱり育児休業をとったことですかね。

martin-lover-se.hatenablog.com

にも書いたように、2度の育児休業を取得しましたがみんな気持ちよく送り出してくれましたし、 当然のように復帰して変わらず重要な仕事をまかせてもらっていました。 この点だけでもこの会社の文化のすばらしさがわかるかと思います。

5年半の仕事を通じてエンジニアとして大きく成長出来たと思っています。本当に感謝しかありません。

すこし何をやっていたかを思い出しながら綴ってみます。

広告計測プロダクト / EM

初めて配属されたのは広告効果を計測するプロダクトでした。 すごいシンプルに言うと、広告を配信してクリックされた数とかコンバージョンが出た数を数えるためのプラットフォームです。

どんなキラキラした開発が待っているのかとおもっていたら、 SubversionとJava6 + Servlet(SpringかSeasarだったかも?) + Tomcatみたいなかんじで 「お、おう」と同時に「ハイ!いけます!!」みたいな気持ちだったのをよく覚えています。

体制変更やらで組織が色々ゴタゴタしている時期でもあって、入社して半年もしないうちにエンジニアリングマネジャーをやることになってしまい、 マネジャー向いてないと感じてSIerやめたのにまたマネジャーをやるという。コードも書きながらみたいなプレイングマネジャーのスタイルでしたけど。

この後しばらくエンジニアリングマネジャーをやるんですが、この頃の僕は典型的なマイクロマネジメントスタイルで、 当然チームも全然うまく行かなかったし僕も疲弊していたように思います。

技術的にもいろいろチャレンジさせてもらいました。 このころ組織全体でScala押しで、僕もScalaを始めました。今でもScalaは結構好きな言語です。

ほどなくして広告計測プロダクトを新しく作ろうというプロジェクトが立ち上がって、 そこでゼロからアーキテクチャの設計をさせてもらう機会にありつきました。 Scalaはもちろんakka-streamingやsparkなど当時モダンと思われたものを片っ端から詰め込んで、挑戦的で楽しかったです。

あと300台くらいあるMySQLを含めたシステム全体のデータセンター移行とかもやりましたね。もちろん無停止で...。 これはすごい大変でしたけど楽しかったですし、良い経験になりました。

DMPプロダクト/ EM, PO

その後の体制変更などの流れで、DMPのプロダクトのEMをやるようになりました。 すごいシンプルに言うと、広告を配信するためのユーザー属性とかのデータベースみたいなものですね。

ここではプロダクトオーナーの役割を経験させてもらいました。

データサイエンティストのマネごとのようなデータ分析をしたり、競合の調査をしたり、 スクラムを本格的にやっていたのでプロダクトバックログを作ったり優先順位を考えたり、とかそんな仕事をしてました。

このときは師匠がスクラムマスターをやってくれていたのですが、師匠の助けもあってうまく回っていたと思っていて、 うまくいっているスクラムチームを経験できたのもすごく良かったです。

POをやった感想としては、ビジネスをどうこうする能力は自分には皆無だなーと。 POとして必要と思われる素質で、おそらくぼくにあったのはプロダクトへの愛と情熱で、後はからっきしという感じでした。

まあうまく出来ないことも、何が大変なのかもやってみないとわからないところもありますし、経験という意味ではプラスだったかなと思います。 POは今でも全くうまくできる気がしないですね...。多分もうすすんでやることはないと思います。

動画広告配信プロダクト / TL, SM

子供が生まれるタイミングで異動がありまして、配信系のプロダクトに配属になりました。 AdNetworkといってメディアにタグを張ってもらって広告を返したりとか、DSPといってオークションで広告枠を買い付けたりとか、まあなんやかんやで広告を配信するプロダクトです。

広告配信するのってめっちゃ楽しいんですよー。何が楽しいのかと言われると長い話になるんですが。 まあぼくは配信サーバーのログ眺めてるだけでご飯何倍でもイケる類の人なので... ウフフ...ワシのサーバーが広告配信しとるじゃろ...ウフフフ...

結果的にこのチームに一番長く在籍することになりました。

2回の育児休業を挟んで2回ともここに復帰させてもらったんですが、 今までの仕事人生で一番といっていいくらい居心地のいいチームでした。

MLのプロダクトへの導入、配信アルゴリズムの設計/実装、DSPの実装などなど、技術的にも様々チャレンジさせてもらいましたし、 フルタイムモブプログラミング、スクラム+カンバンなど開発プロセスの面でも、組織の中でも先鋭的なチャレンジが出来ていたと思っています。

このころ、こういったテクニカルなところの意思決定やサポート、開発プロセスやDeveloperExperienceの改善...といった領域でチームの役に立てているという実感が持ててきました。 本とか後述のゼミとかで得た知識と実践が噛み合ってきた感触があって、こういうところに自分のエンジニアとしての強みがあるのかな、と思い始めました。

このチームの話をアジャイルコミュニティや関連のカンファレンスでなんどか発表させていただいて、コミュニティにもつながりができたりと、充実していました。


こんなかんじで、サイバーエージェントではアドテクで主要な領域はSSP以外は一通り仕事で関わらせてもらいました。 ドメイン知識も深まりましたし、何よりインターネット広告の仕事が大好きになりました。

いま、インターネットの多様性を支えているのは紛れもなく広告です。 ざんねんながら嫌われることも少なからずあるインターネット広告ですが、 ぼくはこの仕事に誇りを持っているし、子供にも胸を張って話します。とうちゃんはインターネットを支える仕事をしているぞと。

これからも...まあ仕事がある限り、少なくともしばらくはこの仕事を続けていきたいと思っています。

ゼミ

サイバーエージェントでの仕事を思い出す上でもう一つ重要な要素がありまして、 「ゼミ」と呼ばれる制度です。 この辺を読んでいただければゼミ制度について御理解いただけると思います。

www.cyberagent.co.jp

  • 業務時間の一部を使って良い
  • 予算がつく
  • 一定のコミットと成果が求められる

というのが基本ルールですが、参加者の自主性を非常に重んじるありがたい制度でした。 これがすごく成果も出てるんですよね。

僕は2種類/6つのゼミに参加しました。

機械学習

「音楽を機械学習で創る」というゼミに機械学習なんもわからん状態で入らせてもらってから、

  • GANでショパンピアノ曲を学習させて作曲してみたり、
  • 音楽の分類&レコメンドシステムをつくってみたり、
  • 強化学習で株取引するAI(笑)を書いたり、

とまあ楽しみながら機械学習について学べた大変良い機会でした。

同じことに興味がある人達と一緒にやる、詳しい人の指導を受けながらやるのは上達のいい方法だなと思います。

あとこれらのゼミを通じて「論文を読んで実装する」機会が何度もあったのですが、これはそれまでにない経験で結構考え方が変わりました。 以前は論文読むのって必要なんですっけ?みたいな感覚でしたが、 仕事でも論文読むようになりましたし、そんな特別なことじゃないんだなー、くらいに思うようになって、フロンティアに近づけたかんじがします。

アジャイル

後半2年ほどは、アジャイル関連のゼミに在籍していました。 もうサイバーをやめてしまった人も多いけど、このゼミや関連するイベントを通じて出会った人たちとは今でも親交が続いていて、それだけでも大変に価値がありました。

コミュニティでの人々との出会いや、CSM/CSDといった研修での師匠との出会い、 またAgileConfへの参加を通じて海外にも友だちができたり、 もう語り尽くせないほどいろいろなものを得て、エンジニアとしての幅も大きく広がったと思います。


...そんなわけでゼミで得た知識や経験は仕事にも生かされていて、2年も師の元で勉強を続けると仕事でも使えるようになるんだなぁという感覚です。 エンジニアのキャリアップという意味でも、会社への還元という意味でもほんとうに素晴らしい制度だったと思いますし、 こういうところにサイバーエージェントの強さがあるんだろうなと思います。

今後も是非続けていってほしいです。

なんでやめるの

前述の居心地のいいチームのプロダクトがCloseすることになって、チームも解散することになってしまった... というのが直接的な原因です。 社内でポジションを探しつつ、社外にも目を向けてみようと思って転職活動をはじめたら運良く良いオファーをいただいてしまった...という感じですね。

本当にすごく居心地のいいチームだったので、このままコンフォートゾーンにとどまり続けていいのか...という気持ちも正直なところ少しあったかなと、今となっては思います。

まぁこういう転機は起こるべくして起こるとも言いますし、そういうタイミングということだったのかなーという気もします。

コロナ禍での転職活動や準備については、機会があればまた書きます。ええ、書きたい気持ちはいつでもあるんですよ。

なんでスマートニュースなの

一言でいうと「ピンときたから」です。ここで働いたら楽しいだろうなー、と言うのが想像できたので。

一応、今回の転職活動では2つの軸をおいていて、

  • ハンズオンでエンジニアリングができる、コードが書けるポジション
  • グローバルな環境

この2つの条件に完璧にマッチしたのがスマートニュースでした。

転職活動をはじめて、エージェントから紹介されるまで全く知らなかったのですが、 スマートニュースは世界中から超つよつよエンジニアが集まる国内でも最高峰のテックカンパニーですし、 USでもサービスを展開し、中国/USにもオフィスがあって、日本オフィスでも多くの外国人エンジニアが働くガチグローバル企業です。

インタビューのプロセスはかなり長いのですが、プロセスを通じて全く不快な思いをしなかったこと、 インタビューで出会った人たちみんなと「この人達と働きたいなー」と思えたのも良かったです。

あともちろん広告の仕事がある、も。もはや運命感じちゃいますねー。

ありがたいことにほかにも複数企業からオファーをいただけて、給与とか条件面だけ見たらスマニューより良いところもあったのですが、

「迷ったら楽しそうな方を選ぶ」

というのが最近のコンセプトでして、会社のステージ的にも挑戦が多そうなスマニューにJOINさせてもらうことにしました。

スマートニュースでなにするの

転職活動を始めたときに決めたように、エンジニアリングをゴリゴリやっています。 チームつくって設計してコード書いてデプロイして...

今は完全リモートで、きほんすべてオンラインで仕事を進めているのですが、 徐々に友だちも増えてきて、楽しくやっています。

みんなほんとに優しくて仕事が楽しそうで、良い雰囲気の会社です。しかもみんなすごい仕事ができるという。。 エンジニアもほんとにドン引きするほど優秀な人ばっかりですね、これがグローバルレベルか... っていうかんじです。

あと、世の中で英語喋れんのお前だけ、という気持ちになれるので英語の練習に精が出ます。実際仕事で必要なので身も入りますしね。

全社で他のチームがやっていることを共有する機会がけっこうあるのですが、 話を聞いてるだけでも面白そうな仕事がゴロゴロあるし、すごく距離感が近くてワクワクします!

そもそもみんなで1つの同じアプリケーションを開発してるわけで、これは僕は今までにない経験なんですが、めっちゃエキサイティングですね! みんなが同じ船に乗ってるのを感じられます。

広告ももちろんそうですが、サービスとしても新しいものをどんどん出していて、いろんなことがすごいスピードで動いています。 意思決定も動きも早いですね!ついでに実装もくっっっそ早いです。キャッチアップするのも大変。。

と、いうわけでそんなチャレンジングでエキサイティングな環境なスマニュー、 We are hiring です。 バックエンドエンジニアのポジションはこんなかんじのJDです。

wrkbl.ink

スピード感があって、技術的にもチャレンジングで、エンジニアにとっては最高の環境だといえます!

ご興味ある方、お気軽にTwitter @martin_lover_se などでお声がけくださいー。カジュアルにおはなししましょうー!

あと 2/26 にこんなイベントをやります!

smartnews.connpass.com

スマートニュースにJoinして、3ヶ月で感じたバックエンドエンジニアとして働くたのしさとかやりがいを赤裸々にお伝えできればと思っています! ぜひお誘い合わせの上おこしください〜

~「ギャザリング」とは心の所作である~ RSGT2021に参加しました!

f:id:martin_lover_se:20210113104519p:plain

RSGT2021に参加しました! 結論からいうと、やっぱりRSGTは最高でした。

今年はハイブリッドという新しい形での開催でしたが、 オンラインとオフラインが見事に融合した、まさにハイブリッドカンファレンスと呼ぶにふさわしい場でした!

「ギャザリング」とは心の所作である

考えてみれば 2020, 会場が大崎ブライトコアから御茶ノ水ソラシティに移ったときも、RSGTは変わらずRSGTでした。 そしてフルオンライン参加となった今回も、やはりたしかに「RSGTに参加した」という確固たる感覚があります。 このことから導かれる結論は一つ。

そう、ギャザリングとは心の所作だったのです。

ぼくたちは会場にギャザっていたのではなく、RSGTという概念にギャザっていたのです。

スクラムの名のもとに集まり、あるものはエネルギーを交換し、あるものは暗黙知を伝達し、またあるものは形式知暗黙知に変換し。 これが僕が、おそらくみんなが愛するRSGTだと、これこそがギャザリングなのだと、今年は一層強く感じることができました。

この「場」は決して偶発的に発生したわけではなく、

  • ステイブルチームたる運営の皆様の周到な準備
  • 去年一年間コミュニティに培われたオンラインカンファレンスの叡智、インクリメント
  • 参加者のコミットメント

などなど、これらの集大成としてなされた必然だったのかなと。

スクラムじゃん」とは及部(@TAKAKING22) さん。まさにそのとおりだと思います!

Discordの住人たれ

今年は前回の記事

martin-lover-se.hatenablog.com

で宣言したとおり、朝Discordに「ゴーストをアップして」Discordに住み着きました。

f:id:martin_lover_se:20210113004731p:plain f:id:martin_lover_se:20210113004631p:plain f:id:martin_lover_se:20210113004812p:plain

そして、

「オンサイトでやっていた行動をオンラインで再現する」

徹頭徹尾これを貫きました。 廊下チャンネルに「ウロ...ウロ...」とかしょっちゅう書き込んでいたので、初対面の方からはおそらくヤバい奴だと思われたことでしょう。

オンラインにはオンラインならではの楽しみ方があるというのはもっともな話なのですが、今回は新しいオンラインカンファレンスの楽しみ方を模索する、という僕の実験でもありました。 因果かどうかは定かではありませんが、結果的には冒頭述べた通り最高の3日間を過ごすことができました!

当日の動きはだいたいこんな感じです。

セッションが始まるとき...

  • まずそのセッションの部屋にいき(Discordの該当の部屋のテキストチャンネルに入る)
  • 席を確保し(zoomを起動し)
  • 着席を知らせる(Discordの該当チャンネルに「着席ィ!」などと書き込む - 知り合いや登壇者にアピール)
  • 以降セッションを見ているときは他のチャンネルは見ない(だってリアルでは人間は同時に複数の部屋に存在することはできないですからね、量子力学じゃあるまいし

セッションが終わったら...

  • まず廊下に出て(Discordの廊下チャンネルに入り、「ウロ..ウロ...」とか「キョロキョロ」とか書き込む)
  • だれも捕まらなければ丸テーブルに佇む(丸テーブルボイスチャンネルに一人で入る)
  • だいたい誰かが話しかけてくれるので雑談する
  • 雑談を堪能したら次のセッションへ(以後loop)

こんなムーブをしていました。

そういえば テラスルームにコーヒーとおやつを取りに行く、という所作を抜かしてしまいました。まだまだ解像度が足りないですね。

これは予め「廊下」や各部屋の名前のチャンネルが準備されていたことで成せたムーブでした。 コミュニティの知見に感謝です!

廊下の解像度を上げる

廊下って廊下だけじゃないんですよ(?)

ちょっとソラシティの廊下を心に描いてみると、 スポンサーブースがあって、チョット立ち止まって話ができるスペースがあって、奥に行くとソファーがあったりするわけじゃないですか。

その機能を少しずつ切り取って、オンラインに移植する試みをやっていました。 まあ「丸テーブル」とか「ソファ」とかのボイスチャンネルを作って、そこでだべってただけなんですが。

ぼく的にはこれは大変成功で、多くの人とここで交流できたし、「ちょっとソファーでやすもっか」みたいな行動も観測することができました。
(チャンネル数増やしてしまって申し訳ありませんでした。なけなしの気を使って、いつでも消せるようにテキストチャンネルはつくらないようにしてたんですよ...。)
(後述しますが全体的にコミュニケーションが非常にハイコンテキストになってしまって、初回参加の方には申し訳なかったな、と思っています。)

あと大変画期的だった出来事として、 KANE(@higuyume)さん、びば(@viva_tweet_x)さんが廊下を配信してくれて、ここで多くの人と話すことができました。

note.com

なにより、「心に廊下をインストールできた」こと、これが大きかったですね。 去年の記憶を頼りに廊下をイメージしていたのですが、映像がついてきて、しかもリアルタイムにオンサイト参加者とコミュニケーションが取れることで解像度が一気に高まりました。
もちろん配信の画質/音質もすばらしく、心の廊下の解像度向上に一役買っていたのはいうまでもありません。大変感謝しております、ありがとうございました!

また、忘れてはいけない、オンサイトからオンラインのぼくに何かにつけてメンションをくれたいくお仲間、「いきいきいくお」こと小田中(@dora_e_m)さんの存在も大きかったです。 彼のおかげでオンサイトとのつながりを常に感じることができました。
彼がファシリテートしたOSTは、ハイブリットOSTという新たな形態の一つの到達点ともいうべき場でしたね。圧巻でした。 ありがとう、いくお!

バーチャルぼっちを恐れない

とにかく雑談コミュニケーションを欲していた僕は、「丸テーブルで/少人数で/半プライベートな雑談をする」というあのオンサイト行動を再現しようと躍起になっていました。

当初の作戦は「廊下でウロウロし -> 知っている人を見つけ -> メンションしてボイチャに連れ込む」というものでしたが、 セッションが終わった後、Discordの廊下の廊下に出てくる人は割と限られていて、「知り合いを見つける」が成立しませんでした。そりゃそうか...。オンサイトの廊下は偉大ですね。

結局、休憩時間になったら廊下チャンネルにウロウロを書き込んで存在をアピールすると同時に、丸テーブルに一人佇むというムーブを完成させたのですが、 これは大変よく機能して、話したかった多くの人たちが話しかけてきてくれました。

じっさいボッチで佇んでいた時間は5分もなかったと思います。「こいつは誰かと話したいんだな」というアピールとして通じたのでしょう。 バーチャルぼっちでいることを恐れないだけで、多くの良質なコミュニケーション体験が得られました。

バーチャルサイゼに集合な

打ち上げはサイゼリヤをバーチャル空間に開店して行いました。入店してきてくれた方にはもれなく「いらっしゃいませ〜当店はセルフサービスとなっております」的な雑なアナウンスを行い、もれなく心にサイゼリヤをインストールさせていただきました。 これもおそらく、初対面の方からは(もしかしたら知り合いからも)狂人の類と思われたことでしょう。

サイゼリヤ」の命名については前回のブログにかいたのですが、「ボイスチャットルーム1」みたいな味気ない名前より、特定の、みんながわかるお店の名前で「サイゼで夜中までだべってさー」みたいな共通体験がえられるといいな、くらいの感覚です。

最終日に雑に「サイゼリヤ」チャンネルを作って、とりあえず知り合いを集めてみたところ、勝手知ったる距離感でオンライン同士でもテンポ良く話せて大変満足でした。個人的には、会話のテンポはその会話の満足度に大きく影響する大事なファクターです。 僕としたことがビールを買いそこねていて、それだけが心残りですね。

また、3~4人で話していれば誰かが入ってきてくれて、いつもより知り合いが増えたし、色んな人と話せたなーという感覚があります。 だいたい3人くらいボイスチャンネルに集まっていると、その後はどんどん人が増えてくる現象があるみたいですね。何度か観測しました。おもしろいですね。

オンサイトだと、同じお店にいないと会話できないですし、移動するのもなかなか難しいので、これはオンラインに軍配があがる良い例だったなと思います。

そういえば、今年は「下の中華に集まる」という現象が発生しなかったのが意外でしたね。 みんなが集まって今日のことを話すことが本質なのであって、場所はどこでもよい、ということでしょう。

僕はというと、そんなに中華に思い入れがあるわけじゃないですけど、「毎日終わったら中華に集まって宴会をしている」というその様式美を観測するのがたいへん好きだったので、正直なところ少しさみしかったです。 「誰かがいれば人が集まる」という現象もあるようですし、来年オンラインがあれば、勇気を出して声をかけてみようかなと思います。

能動的参加者

一つ反省として、全体に渡って超ハイコンテキストなコミュニケーションを多用してしまいました。 特に初参加の方、英語話者の方にとってのコミュニケーションや参入障壁になってしまった可能性は否めず、その点は申し訳なかったなと思っています。

今回のRSGTでは、 おがさわらさん(@bonbon_0605)/さいとうさん(@nolick1219)の「知り合いを増やす」という今最も必要とされているニーズを捉えた画期的なセッションや、 なべさん(@watanabeisan)の「初心者の館」など、積極的に初参加の方を仲間にしようという流れが顕著に観測できました。 ぼくにとって、このような行動が実践できる方々はほんとうに尊敬できます。

一方僕はあんまり器用でないし、人に気を使うのも周りに気を配るのも得意でないです。 僕にできることといえば、僕が目一杯楽しんで、その正のエネルギーを周りに少しでも伝播するくらいかなぁ、とかそんな事を考えていました。

もちろん、だれかの自由を奪う/だれかが不快に感じる行動をしないとか、最低限のルールを守った上で、です。 (自分で認知できる範囲で、ですが...。もし会期中の僕の行動でなにか不快な点を感じられた方は、大変お手数ですがぜひ僕に直接フィードバックを貰えればと思います。)

実際、今回はいままでのRSGTの中でも、もしかしたら登壇した前回よりも「RSGTを一緒に作っている」という感覚が強かったです。 よこみち師匠(@ykmc09) はこれを「能動的参加者」と称してくれました。

この能動的参加者の集合体がRSGTであり、それもこのカンファレンスの魅力の一つなのかな、と思います。


そんなわけで、今年も最高の3日間でした。 いやいや、いまもDiscordでは熱狂冷めやらぬDay #N が続いていますね!

長くなってしまったので、拝聴したセッションの感想はまた後日書きたいと思います。

ぼくのオンラインRSGT2021を最高にするための3つのこと

この記事はRSGT2021に参加する方に向けて書いています。

さっこんの情勢を踏まえ、今年のRSGTにオンサイトで参加することを諦めました。 RSGTは僕にとってすでに一年ぶんの元気をもらう大切な場所になっていて、苦渋の決断です。

オンラインで参加すると腹をくくったので、この制約のもとで最大限RSGTを楽しむにはどうすればいいか?を考えてみました。

もし賛同してくれる方がいらっしゃったら、ぜひDiscordでぼくにおこえがけください。IDは suyama#7142 です!

大前提ですが、当然、オンサイトで参加される方、またはカンファレンス自体、関連するいかなる個人・団体を非難したり貶める意図はまったくありません。

ですが、この記事は「僕がRSGTを楽しむために、いまから僕にできること」を念頭に、主に自分のために書きました。 もしこれを見て不快に感じる方がいらっしゃったら、申し訳ありません。 ぜひ僕に直接フィードバックをください。

TL; DR

結論から言うと、電脳化してDiscordに記憶とゴーストをアップします。

  1. オンラインこそセッションはLive視聴
    • Zoomはステージ、Discordはテーブルと思え
    • VideoONで登壇前/中の "目が合う" 的なコミュニケーション
    • 登壇後のまとめや感想などを何某かの手段で伝える
  2. バーチャル徘徊 & 気軽にメンション
    • バーチャル廊下をバーチャル徘徊して出会った知り合いにメンション飛ばす
    • だって廊下で会ったら挨拶するでしょ?
    • 知り合いをつかまえてバーチャルソファーで立ち話する
  3. バーチャルサイゼで打ち上げする
    • 打ち上げを企画して話したい人を誘う
    • 「終わった後あの店で集まってバカ話した」みたいなメタファーが必要
    • バーチャル中華の開店も所望

もしどういう動機でこれをやるのか、に興味を持っていただける方は以下読み進めていただけると嬉いです。

なんでやるの

先日2020年の振り返りを書いた際、「オンラインカンファレンスからオフラインのそれほどの価値を取り出せなかった」みたいなことを書きました。 偽りざる気持ちでしたが、今日RSGTをオンラインにする覚悟を決めたとき、

「あれ、ぼくオンライン最大限楽しむために自分からできること探してやったんだっけ?」

とふと気づき、やれることはやろうかな、と思ったので...。 思い立ったが吉日でばーーっと書き出してみました。いつもの雑なやつですがメモがこちらです。

f:id:martin_lover_se:20210105010832p:plain

何がイヤだったの

さて、ぼくは結局過去のオンラインカンファレンスで何が気に入らなかったのでしょうか。 自分の中でのカンファレンスへの期待値とオンラインでの体験が擦り合ってなかったのかな?と仮説立てて、これをとっかかりにすることにしました。 「物足りなさ」の体験から、「自分が本当に欲しかったもの」に気づいたようなフシもあるのですが。

1. カンファレンスに期待すること

半分以上「RSGTに期待すること」、かもしれません。

Anyway,

1.1. セッションからエネルギーを貰う

会場にいて話を聞いてると、登壇者の緊張や熱意、おそらくあったであろう産みの苦しみ、 または「今ぼくたちはええ話を聞いている」という満足感などなど、そういった空気感を登壇者と、参加者と、会場全体で共有できているように感じることがあります。

そういうセッションは僕にとって満足度が高いです。 話の内容だけでなく、この体験自体を求めていて、これがぼくのエネルギー源にもなっているんだと気づきました。

1.2. 生存確認/同窓会

RSGTへの参加は多分今年で4回目...あれ5回目? まあそれくらいで、だんだん界隈に友達も増えてきました。

いや、今はいつでもどこでも気軽に連絡できる世の中なんですけど、 あの場に行けばあの人達に会える、そんで大好きなアジャイルの話とか、あのセッションはどうだったとか、昔話とか近況報告とか、スター・ウォーズは教養だからなんとかの順番で見ろ、みたいなくだらない話とかとか、気の置けない仲間とそんな話をしに行く場だ、みたいな期待感が勝手にあります。

1.3. 偶然の出会い

隣りに座った人が同じ会社で、その後コミュニティ仲間になって今年RSGTに登壇するだとか、 セッションワクワクしながら席座ってふと隣を見たらIkuoだったとか、 Agile2019で出会ったペルーの友達と再会するだとか、 友だちに友だちを紹介してもらってだんだん友だちが増えていくとか、

なんかそういう不思議で素敵なことが起こる場じゃないですかRSGTって。 そういうやつがほしいんです。

2. これまでの経験と課題

繰り返しますが、これまで参加したオンラインカンファレンスの価値を毀損する意図は全くありません。 ぼくが感じたこと、ぼくが行動できてなかったことを自分の整理のために書いています。

2.1 セッション中の「会場とつながっている」という感覚の欠如

オンライン通話の技術的な問題で、前述の空気感が感じられないのが寂しいです。

オンラインで聞いたセッションも、内容はどれもオンサイトでみたものと遜色ない、素晴らしいものだったと思います。 にもかかわらず満足度がオンサイトのときほど高くないのは、会場の笑いや沈黙、衣服の擦れる音、登壇者の微細な動きや身振り、微妙な声の震えなどなど、おそらく「空気」を構成しているであろう要素がごっっっそり欠落しちゃうので、なんとなく物足りなさがあるんじゃないかなと。

また、「あとで録画を見れるから」と思ってつい仕事をしながら視聴してしまったり、あるいはザッピングのように複数のセッションを同時視聴するみたいな真似をしてしまったり、 セッションへの集中ぐあい、体重のかけ方もオンサイトのときより散漫になってしまっていたのも一因だと思います。

2.2 コミュニケーションが物足りない

ちょっと立ち話で近況報告、してたら話し込んじゃって...みたいなことが起こらなくて寂しいです。 これまでも「廊下」や「トイレ」など画期的なメタファーが発明されてきましたが、ぼくは十分に活用できていませんでした。

もちろんボイスチャット部屋もあるのですが、10人くらい集まってしまうとオンラインでのコミュニケーションは困難(e.g. 同時発話が実質ほぼ不可能なため、話題が一つに絞られてしまう)で、慣れている人たちの話を聞いていたら終わり、というケースが結構ありました。

人数が多いと発言しづらいし、開かれてるんだけど若干パーソナルスペース感があって人数を絞れる、ほらあの大崎ブライトコアのメインホールの横のソファーのところみたいなのとか、ホワイエの立ちテーブルみたいなやつがほしいのです。知り合いに「偶然」廊下で会ったので、ちょっと静かなとこで2~3人で立ち話する、みたいな体験がほしいのです。

あ、特定の方々の会話を聞きたいというニーズはもちろんあって、そういうシチュエーションを否定しているわけではないです。 ぼくが喋り足りないというかんじでしょうか。

2.3 飲み会がなんだかざんねん

これは僕の家庭の理由、かつ完全なる調整ミスなのですが、懇親会は家事のワークロードが最も高い時間帯(17:00 - 19:00)とかぶることが多いです。 風呂&家事&子どもたちの食事を済ませてから参加...と思っていたらあれよあれよという間に時間が過ぎて帰ってきたら解散済&残り火、みたいなことがありがっかりしました。

よしんば参加できても、前述の「人数多くても話題は1つ」縛りでお目当ての人としゃべるのはさらにハードルが高いです。 飲み屋なら同じテーブルに座ってれば隣の会話に少し聞き耳を立てながら隣の人と話す、とか、あそこ大声で盛り上がってる、みたいな複数トラックの会話とか、ジョッキだけ持ってあの人の隣行く、みたいなアタックが成立するわけですが、まず「近くに座ってる」というメタファーがDiscordにまだなく(スペチャとか近いものはありますが)、コミュニケーションを阻害する一因である気がしています。

なにをやるの

だいぶ寂しかったことが整理できたので、それらに対してできること/できそうなことを考えてみました。

1. セッションのLIVE視聴を大切にする

欲しい物を得るためには、オンラインのときこそLIVE視聴で、「今起こっていることを全力で感じて共有する」ことが必要なんじゃないかなと。 だってネットの向こうにから伝わる/伝えられる情報はすくないんですから。 過剰にこちらから発信するのと、集中して少しでも情報を拾うのと同時に欠損している情報を想像と経験で補完する処理が必要なはずです。

Zoomはステージ、Discordはテーブルだと思って、もちろん部屋は1つに絞って参加します。そもそもリアルでは複数の部屋に同時に入ったりできないですからね。

セッション中は

  • Video ON & 所作に を込めて送る
  • テキストチャットを盛り上げる
  • 集中するためメモをとる
    • あわよくば登壇者にフィードバックする

くらいをまずやってみて、会期中に調整しようと思います。

2. バーチャル徘徊 & 気軽にメンション

要は「廊下でばったり会って」「ちょっと立ち話した」このシチュエーションがほしいわけです。

???: 「え?話したいんならメッセなりDMなりしてZoomすればいいじゃん」違うんです。シャイなんです。 会場に行ったらきっとご無沙汰してるあの人にもあの人にもきっと会える、そうだあの人にも挨拶したいな、なんて思いながら廊下をうろちょろする、そういうもんでしょうカンファレンス!!

というわけで、休憩時間はDiscordの廊下をバーチャル徘徊しようと思います。「ウロウロ... キョロキョロ...」とかなんとかテキストチャットに流しとけばきっとだいじょうぶ。 そして廊下で知り合いを見つけたら(これは定義が難しいですがなんかええ塩梅でやります)すかさず声をかけ(メンションし)、そのへんの立ちテーブルとかソファ(というバーチャルボイスチャネル)に連れ込んで立ち話するわけです。イメトレは完璧。

あとは立ちテーブルとかソファみたいな、「廊下より少し狭いエリアで2~3人が話している」みたいなメタファを持ったボイスチャンネルを作って機能するか実験したいですが、そもそも勝手に作って良いのかわからないですし乱立しすぎても困る気もするし、要確認。

そしてどうか廊下で「キョロキョロ...」しているギターのアイコン suyama#7142 を見つけたら、優しく見守るか、前を横切ってみるか、声をかけてあげてください。

3. バーチャルサイゼで打ち上げ

RSGTといえば、終了後の中華ですよね。(今年はリアル開催はさすがに無いでしょうが...)

ぼくはちょっとひねくれ&シャイなので、中華以外の店によって景気付けしてから乗り込む、みたいな行動がとりたかったり、 「どこか違う店かもしれないけどみんなこのへんで飲んでるだろうから適当に声かけられる」みたいな状況が心地よいわけです。

まずスケジュール調整、家庭の方をバッチリ調整しておくことと、会いたい人とは約束しておくこと。 そして(店はなんでもいいんですけど)バーチャルサイゼに複数テーブルがある、みたいなバーチャル環境を作りたいです。 「中華で話してさぁ...」「ビアバーでさぁ...」みたいな共通の思い出にできるメタファーがほしいのです。 はてこれもDiscordに作って良いものか...これは会期中に調整したいですね。

というわけでここまで読んでくれた方!

とにかく金曜、OSTが終わったら集まろう!! ぼくとの約束だ!!


こんなかんじです。 サラっと書くつもりが全体重乗っけてしまいました。

オンラインはオフラインの代替じゃないから、オンライン専用の方法で楽しみなよとか、文句ばっかり言ってんじゃねーよとか、様々ご意見あると思います。

思いつくまま感情に任せてばーーっとかいたので、うまくない方法もあるでしょうし、すでに解決策がある課題もあるかもしれません。 できれば、よりうまいやり方をRSGTの期間中いっしょに模索していただけるとうれしいです。

オンサイトとのハイブリッド開催なので、オンサイトにいる人を捕捉するのもむずかしそうだなーとおもっています。

とにかく、あしたから3日間、ぼくのゴーストは Discord にいます。

RSGTで皆様にお会いできることを心から楽しみにしています!!

2020年の振り返りと2021年の抱負

あけましておめでとうございます。

2020年終わっちゃいましたが、昨年のふりかえりと、ことしの抱負を。 そういえば最近文章書いてないなと思いたち、書き初めのつもりでしたためました。

去年のはこれですね。

martin-lover-se.hatenablog.com

いつものことですが書き始めるとダラダラ長くなってしまった...。

TL; DR

2020年は

  • 辛い一年だった
  • カンファレンス参加3回、ブログ3記事、登壇2本
    • 去年と比べて活動量が目に見えて落ちた
    • 空き時間はだいたいコード書いてた
  • 転職した
    • 経緯とかやったことはまたの機会に
  • CSPになった

2021年は

  • 心穏やかに過ごす
    • 持続可能なペース
  • 読書習慣
  • 英語を仕事ができるレベルに
  • 引き続きエンジニアリングにフォーカス

タイムライン

f:id:martin_lover_se:20210102224712j:plain

ふりかえってみて、改めて、活動量も少なく、気持ちも沈みがちだった一年でした。 やっと現状を認識できたので、これから少しずつ戻していけると良いなと思います。

1月

RSGT2020への登壇から始まり、最高のスタートを切ったと感じていました。 登壇では見積りとスクラムについて発表しました。 はてブもそこそこ反響いただいて、このスライドがきっかけで話しかけてくれる人がいたり、 産みの苦しみはありましたが良い経験でした。

もうずっと昔のような感じがします...。 当時のブログからも、強い正のエネルギーを感じます。

martin-lover-se.hatenablog.com

Cope氏の "It is NOT good, It is NOT bad." は今でも事あるごとに思い出します。僕にとって本当に今年のテーマの一つでした。

2月 ~ 3月

市谷さんの著書、名著「カイゼン・ジャーニー」の続編「チーム・ジャーニー」に少しだけレビュワーとして参加させていただきました。 前作のファンは必読です! え、まだ読んでない!?鬼滅読んでる場合じゃないです今すぐ買いましょう!!

COVID-19 の影響が生活に出始めました。 特にこのころは小さい子供への影響が不明確で、とにかく怖かったのを覚えています。仕事はすぐにフルリモートに切り替えました。 以降ずっとフルリモートで、3回くらいしか会社に行ってないと思います。

精神的にも一番辛かった頃で、何も手に付きませんでした。 以降ずっとこんな状態を引きずっているように思います。

4月 ~ 5月

プロポーザルが通って登壇が決まっていたDevOpsDaysTokyoは中止に、スクラムフェス札幌は延期に。 緊急事態宣言で保育園も臨時閉園、気分的にもかなり落ちんでいました。

6月

スクラムフェス大阪で、かわぐち(@kawaguchi)さんにお声がけいただけて、登壇しました。

www.scrumosaka.org

中止になってしまったDODTのネタを... と思ったのですが、プロポーザルを書いた当時と大きく状況が変わってしまっていて、オンサイトでモブプロできないしさてどうしようどうしよう、 結局1ヶ月以上書いては捨てて書いては捨てての超難産プレゼンでした。

きょんさんに相談させてもらったりして、割と面白い話にまとめられたかなと思っています。 あと個人的に、タイトルスライドが会心の出来で気に入っています。

ぼくたちのモブのプラクティスをまとめた資料をgithubで公開しています。

github.com

全プラクティスに解説をつけるまでやろうと思っていたのですが、途中で力尽きてしまいました。。

オンライン登壇はなんというか難しかったです。観客の空気が感じられなくて空回り感がすごかった。実際後で録画を見るとまあテンパってから回ってましたねw。 ぼくの音質も悪かったので、装備はもう少し整えておけばよかったです。

スクフェス大阪はオンラインカンファレンスのベースラインを押し上げるような素晴らしいカンファレンスでした。 登壇者・プレゼンの質ももちろん素晴らしかったですし、全国のアジャイルコミュニティが一堂に会し、距離を超えてつながりを感じられる素晴らしい体験でした。

しかしながら振り返ってみて、オフラインのカンファレンスと同等以上の価値が取り出せたかというと、僕にとっては残念ながらそうではありませんでした。

これは「僕にとって」というだけの話で、何らカンファレンスの価値を毀損する意図はありません。素晴らしいカンファレンスだったと心底思います。 良いとか悪いとかでもなく。僕がカンファレンスに何を求めているのか、何に価値を感じているのかということを考える良いきっかけでもありました。

7 ~ 8月

あるきっかけで転職活動をはじめて、面談等であっという間に過ぎ去りました。

転職の経緯や、やったことはまた別途書こうと思っていますが、オンラインだけで全ての面接が完結し、直接会うこともなく、オフィスに行くことなく転職活動終了。そんな時代かーという感想です。

結果的に良いオファーをもらうことができ、転職することにしました。

前職での給与と頂いたオファーの乖離もそこそこ大きかったし、起こるべくして起こったイベントだったのかなーと今となっては感じます。

この間、CSD経由でアプライし、Certified Scrum Professional を取得しました。

www.scrumalliance.org

資格自体に価値があるわけではないのですが、これまでの活動の一つの到達点として素直に嬉しかったです。

そういえばA-CSMやCSPO、CAL研修にも参加したいなと思っているのですが、オンラインの研修はあまり自分には合わないような気がしていて、まあゆっくりまとうかなと考えています。

9 ~ 10月

前職での最後の仕事。 新しいチームに配属されて、プロダクトの立ち上げをすこしやりました。 若手エンジニア2人と3人チームでスクラムをやってみましたが、かつてないほどスムーズに事が進んでびっくり。 これがアジャイルネイティブか、と。

そして5年半お世話になったサイバーエージェントを退職。

10月は半分くらい有給消化でお休みいただいて、ゆっくりしてました。

Management 3.0 Japan Conf に参加したのも9月でしたね。

management30.jp

Jurgen Appelo氏の基調講演を楽しみにしていたのですが、結構彼の新著「Startup Scaleup Screwup」の話が多かった印象でした(M30の話と思って参加してた参加者の人はなんでスタートアップの話してるのかな、とおもったんじゃないな) Lisette Sutherland氏の「Work Together Anywhere」の話はフルリモートで仕事する上で大変参考になりました。

11 ~ 12月

新しい会社に入って、とにかく仕事してました。

延期になったスクフェス札幌!開催できてよかった!

www.scrumfestsapporo.org

プロポーザルを採択していただいていたにもかかわらず、前職での経験の話をするつもりだったので会社が変わったこともあり登壇は辞退させていただきました。 大変申し訳ないことになってしまったという後悔の思いと、第二の故郷札幌での登壇や新しい友達づくりを本当に楽しみにしていたので、とても残念でした...。

フェス自体は参加させていただいて、素晴らしかったです。

基調講演のエバッキーさんのお話は楽しみにしていたのですが、僕にはあまりしっくり来ませんでした。

クロージングキーノートの島田さんのお話は最高でした。たくさん勇気をもらったし、「こういう話が聞きたかったんだよ!」って思いながら聞きました。

2020 総括

インプットとアウトプット

今年は本を読む量が激減しました。通勤時間がなくなった影響で、本を読む習慣が吹き飛んでしまい...。

子供が手がかかるようになってきたこともあり、自由になる時間自体が減っているのですが、それでもなけなしの自由な時間は今年はだいたいコードを書くこに当てました。

趣味で始めたAtCoderと、就活準備のためのLeetCodeで問題を解くのを日課として続けていました。

仕事でも、会社が変わり、しばらくモブプロを離れていて一人でコードを書く時間が多くなったのですが、じゃあコード書くのが上達したかというと、うーんどうでしょう。。

反射で出る手癖は早くなったけど、技能が向上しているかといわれると感覚的にはそうでもないなあという感じです。 まあ技能の向上を計るのも難しいんですが...。

人に説明するとか、議論すると行ったコミュニケーションの量・質が減ってしまったことも一因であるだろうし、 インプットの量が足りてないのもあると思います。少しバランスを見直す必要がありそう。少なくとも読書習慣は戻そうかなと思います。

そういえば、モブプロでマシンを共用しているときは「できるだけデフォルトで戦える」をモットーに、デフォルト設定とかキーバインドを頑張って覚えたりしていたのですが、 オンラインになって基本自分のマシンを使うようになったので「自分専用にカリッカリにチューニングしたマシンで戦う」に戻りました。 これも振り子のようなものなんだと思います。

10月のいとまにdotfileを整理して、移植可能な環境を作ました。 fishのテーマを自分専用にカスタマイズしてつかていましたが、さいきんstarshipを使うようになりました。

github.com

キーボードもずっとAppleのMagicKeyboardを使っていましたが、HHKBデビューしました。

これはいいものだ。すっかりこれなしでは生きられない体に。。

コミュニケーションと価値観

2020年は否応なしにオンラインのコミュニケーションが増えましたが、 オンサイトでのコミュニケーションを代替するほどには技術が進歩していないのは明らかです。 Video ON で通話できていたとしても、欠落している情報が多すぎます。

ぼくはもともと「空気を読む」のがとても苦手だと思っていたのですが、 苦手なので必死にノンバーバルな情報を集めて処理していたんだなと、オンラインコミュニケーションがメインになってから感じるようになりました。 色んな人にきいてみましたが、この情報の欠落に困っているという人はそれほど多くなく、やはり僕はオンラインコミュニケーションはあまりうまくないようです。

もちろん悪いことばかりではなく、距離が遠かったり、疎遠になっている人とオンライン飲み会できたりと、オンラインになってよかったこともそれなりにありました。

が、オフラインで築いた関係性と同等の関係はCOVID以降発生しなかったかな...。

Agile2019修学旅行仲間とか、RSGT2020の帰り、サイゼで調子に乗りすぎて一緒に怒られた仲間みたいな...。

正直、これまで築いた信頼関係をくいつぶしながら過ごしているという感覚が強いです。

もちろん新しい会社で新しい関係を徐々に築いていて、友達は増えてはいるのですが、信頼関係を築くにはまだまだ時間がかかりそうです。 なるべくよい環境で通話しようと機材を揃えたりして、どうにかこうにか過ごしています。

「状況が変わった、価値観もアップデートしよう」みたいな主張は今年何度か出会ったように思うのですが、もう結構お腹いっぱいで、 たしかに強い制約が敷かれて小手先の情報伝達方法は変わったけど、 自分の根底の価値観はそんなに変わってないかなーと思うようになりました。 だからつらい思いをしているのかも知れないですが。

まあ僕もいい年なので、何が大切かとか、何をいつ受け入れるかくらいは、自分で考えて自分で決めようと思います。

2021年は

どんな年になるでしょう。

心穏やかに

とりあえず、心穏やかにすごしたいなと思います。 ぼくはどうもストレスの抜き方がうまくないようで、閾値を超えると突然ダメになります。しかも溜まっている事に気付けない。。

疲れを感じていなくても定期的に休むこと、持続可能でない無理をしないこと、を常に心がけるようにします。

あと、消し飛んだ読書習慣を戻すのも。

英語

通勤時間、駅までシャドーイングをするのが日課だったのですが、これも通勤の消滅とともに習慣が消し飛んでしまいました。。 新しい会社では仕事で英語が必要になったこともあり、かつ英語学習の補助が出るので、オンライン英会話を再開しました。

今はCamblyというサービスを使ってます。講師がみんなネイティブなのと、予約のとりやすさ/時間のフレキシブルさが気に入っています。

www.cambly.com

今は30min * 週3回ですが、2021年はもう少し量を増やそうと思います。

「英語で仕事ができるレベル」を目標に、目下優先度順で

  1. 英語の思考スピードを議論に支障がないレベルまで上げる
  2. 発音の改善
  3. ボキャブラリーの増強

こんな感じでしょうか。

エンジニアリング

今回転職活動をする際、「とりあえず40歳まではエンジニアリングに集中しよう」と漠然と決めました。 特に深い理由はなく、今はやっぱりエンジニアリング、特にコードを書くのが好きなので、節目の年までとりあえず好きなことをとことんやって、 またそこで自分と向き合って趣向が変わってたら違うキャリア見つければいっか、くらいの適当なかんじです。

2020年でこの本

に出てくるくらいのデータ構造とアルゴリズムは抑えられたので、 OS周りの低レイヤーをやるか、言語自体の実行系をやるかどちらかかなぁとぼんやりイメージしています。

バックエンドシステムのアーキテクチャもやりたいなという思いもあるのですが、仕事である程度やるし、それより前に↑やっときたいな、と。

あと、毎年1つ使える言語を増やそう運動。今年はRustですかねー。それかClojureか。どちらもチュートリアルよりちょっと先くらいでやめてしまっているので。 うまく学習する領域と重ねられるとよいのですが。

だいたい興味の赴くまま、好奇心にまかせて寄り道しながら進めるので2021年終わってみないとわからないですが、まぁそれもいいかなと思うようになりました。


そんなかんじです。 久しぶりに文章を書いて、少しアタマもスッキリしたような気がします。

大変な世の中ですが、無理せず、健康に、ぼちぼちやっていきましょうー。

「デブサミ再演!クリエーションライン安田氏が語るどん底からのジョイインクジャーニー7年記」をみんなで見た #ハッカーライフラボ

TL; DR

  • もしまだ↓を見ていない方は、とりあえず今すぐ見ましょう。今すぐ!
  • 「オンラインにアーカイブされたセッションをみんなで観る」という体験が新しい扉を開きました
    • カンファレンスのフィードバックをどうするか?問題に一筋の光が差した(気がする

日本にJoy,Incを創る! ぼくらのジョイインクジャーニー 3年間の軌跡

内容については多く触れません、僕の力量の問題でここで伝えられることは多くないです。 僕は久しぶりに勇気をもらえた素晴らしいセッションでした。 とにかくまだ見てないという方は、ここで読むのをやめて今すぐ冒頭の Youtube へ。

さて、Joy, Inc という素晴らしい本がありますね。

ジョイ・インク 役職も部署もない全員主役のマネジメント

ジョイ・インク 役職も部署もない全員主役のマネジメント

この本とは、ちょうど「仕事」と「人生」の垣根がなくなってきて、本当に仕事が楽しい、あるいは仕事って楽しんでいいんだと思え始めた頃に出会いました。 タイトルの通り「喜び」を追求することを経営の柱とする、メンローという会社の話です。 個人的にこの思想はすごく共感できて、僕の価値観や仕事での活動にも背中を押してもらったように感じています。 ぼくもメンロー行きたい。。

...とにかく、この Joy, Inc ー メンローのような会社を、本気で日本で作ろうとし、それを実現している経営者の方のストーリーです。 クリエーションラインさんは様々なカンファレンスでスポンサーをされていますしもちろん知っていましたが、こんなストーリーがあったとは...!

そもそもこのセッション聴きたいなと思っていたのですが、RSGTでは裏番組で見れなく、デブサミは行けず。。 そのセッションがなんとオンラインで見られるというではありませんか...! ...それでもオンタイムでは見られませんでした。理由は後述。。

それが今回、社内のコミュニティみんなで見る機会を得られました。 コミュニティの長であり、僕の師匠である吉田氏がこれをみんなで見ようと言い出してくれて実現しました。さすがとしか言いようがありません。

昨今の情勢から、この会自体もリモートで参加し、オンラインでZoomでつないで一つのPCからYoutubeを流すというスタイルで開催となりました。

f:id:martin_lover_se:20200313001951p:plain

会がオンラインだったことによる影響は大きくなかったと思います。多少会話がしづらいのが残念でした。

とにかく、完全オンライン/アーカイブされることが前提のセッションをみんなで観る、という体験は初めてでしたが予想以上に良く、 というか感動レベルだったので、そのPros/Consを少しまとめておこうと思いブログを認めました。

予想以上に前置きが長くなりました。。

Pros/よかったこと

いつでもみられる

完全に個人的な制約からくる理由ですが、まずこの時点でもう最高です。

東京ではITの勉強会が多く開催されていますが、その多くは 19:00 ~ 19:30 に開始されます。 エンジニアの終業後で参加しやすい時間帯...ということだと思うのですが、僕には小さな子供が2人おり、その時間帯は完全に家事のピークタイム。 ご飯を作って子供をお風呂に入れてご飯を食べたらあっというまに21:00です。

昨今の社会情勢でオンライン勉強会も増えいているように思いますが、オン/オフに関わらずこの時間帯でのオンタイム参加は厳しい、というのが現状です。

というわけで、オンラインでいつでも見られる、というのは個人的にこれだけで本当にありがたく価値があります。

みんなとみられる

仲間とみられる、といっても良いです。 今回の場合は前述の通り同じ会社で、それぞれに「チームを良くしたい」という志を持って集まった人たち ー つまりコンテキストをある程度共有できている人たちと一緒に見ることができました。 こういう会を気軽に開催できるのが良いですね。

かつ、ワイワイあーでもないこーでもない話しながら見られる。これが個人的に最高の体験でした。

オフラインのカンファレンスのセッションでは、セッションの真っ只中で感じたことを話しながら観るのは実質的に不可能でしょう、まわりの方にも迷惑ですし。 Slackでチャットしてたりはしますが、やはり会話にまさる情報量はありません。

それが今回やってみて、もちろんそれぞれに感じることは違うけど、会話によってそれらをつなげることができそうだぞ、これなら想いも少し共有できそうだぞ、と。

個人的によくカンファレンスに参加するのですが、会社でお金を出してもらった場合はフィードバック会を開いて参加しなかった人に共有します。 誰かが喋ったスライドをかいつまんで「こんなセッションがありました」「この人がこんな事を言ってました」みたいなフィードバックをしがちなのですが、まあ1ミリも伝わらないですしやるほうとしても辛いな、と思っていました。 そもそもカンファレンスから持ち帰る最高の財産は「情熱」や「エネルギー」だと考えているのですが、こちらがアツくなればなるほど温度差が広がり、やはり熱量は1ジュールも伝わりません。

今回のように、1つのセッションを少人数で見ながらああでもないこうでもないと会話をするスタイルでならもしかしたら...、少しは「熱量」を伝えられるかも? 次にカンファレンスフィードバックをする機会があってセッションの録画が公開されていたら、ぜひこのスタイルを試してみたいと思います。

Cons/難しいなとかんじたこと

断っておきますが、上記の通りベースラインは「最高」スタートです。 オンライン上でのセッションとオフラインでのそれを比べて、特有の難しさがあるなと感じたのでついでに記しておきます。

スピーカーの熱量が伝わりづらい

理由は色々あると思いますが、

お客さんが見えないので登壇者自身もテンションあげつらい(のかな?)とか? 画像や音の劣化、情報の欠落による「空気感」の感じ取りづらさ、とかもありそうです。細かい感情の震えとか。 話者と目線が合わない、インタラクションがない、etcetc...

これはどうしてもリアルで観る、に軍配が上がるかなと思いました。 それでも僕には無事ぶっ刺さっていますが。

スピーカーの緊張

関係者の方は撮影の場にはいらしたと思うのですが、カメラの向こうに向かってしゃべるというのはやっぱり特殊な状況に思えます。 特に生放送で、全くリアクションのフィードバックが得られないのに聴いてる人は実際にいるという状況は、オフラインでリスナーの方を前にした登壇とはまた違う緊張感がありそうだな、と感じました。やったことがないので想像ですが... 安田さんもしきりに「緊張してますね」とおっしゃっていたのが印象的です。

ビールが入ってからはだいぶ緊張もほぐれたように感じられました、これもオンラインならではでいいなと思いました!

おわりに

再三ですが本当に最高の企画でした。 #ハッカーライフラボ の皆様、 いわきり さん本当にありがとうございます。みなさんもぜひ、仲間と一緒にワイガヤしながら鑑賞する会を企画されてはいかがでしょうか!

今後も配信を企画されるとのことでしたので、Youtubeチャンネル ハッカーライフラボ さんに要注目、マストフォローです!

2019年の振り返りと2020年の抱負

f:id:martin_lover_se:20200114004438j:plain

スーパー今更ですが、やっと落ち着いたので。 去年できたことのダンプと、今年の抱負を。

写真は去年一番ハマった食べ物、ピェンロー鍋です。

TL; DR

  • 2019年ふりかえり:テーマは ’Agile
    • いろいろ登壇させてもらいました
    • いろんなカンファレンスに参加しました
      • ほとんどがAgileに関するもの!
    • プライベートでも変化の多い一年でした
  • 2020年チャレンジしたいこと

2019年振り返り

いろいろ登壇&出演させてもらいました

チームでいろいろな取り組みがうまくいき始めて、仕事がどんどん楽しくなりました。 とくにモブプロをデフォルトの働き方として採用したのは大きかったです。 チームを長く続けることで出来ることもあるんだなぁ、と感じた一年でした。

それと同時に、社外カンファレンスでその取り組みを発表させていただきました。

  • Agile Japan 2019
  • Agile Japan サテライト渋谷(再演)
  • 正しいものを正しくつくるカンファレンス
  • RSGT2020(2020年だけど)

登壇することがきっかけで自分のやっていることを言語化するきっかけになりましたし、 なによりコミュニティの方々に名前を覚えてもらえて、コミュニティに参加するのが楽しくなりました。 人生初の海外カンファレンス発表&英語プレゼンも、刺激と自信になりました。

憧れのビデオ&ポッドキャストにも出演させてもらいました。

  • Mob Mentality Show

これはお声がけいただいた時は本当に心臓止まるかと思いました。 Thank you Chris and Austin! そしてお誘いいただいた川口さんありがとうございました!!

「観測範囲で最もはしゃいでた2人(のうち1人)」として、Agile2019の ~土産話~ 自慢話をしてきました。 横道さん三浦さんありがとうございました!

Management3.0 関連でも、Co-Facilitatorとしてワークショップに参加したりしてました。 校正に携わった公式ドキュメント日本語版も、V1.0が無事リリース!

最近ちょっと時間が取れていないですが、せっかく認定ファシリテータの資格をとっているのでまたワークショップファシリテーターもやりたいですね。 今年は社内でももっと多くの人にこの考え方に触れてもらえると良いなと思います。

いろんなカンファレンスに参加しました

  • RSGT 2019
  • DevOps Days Tokyo
  • Agile Leadership Summit
  • Agile Japan
  • Agile 2019
  • XP祭り
  • DevLove 正しいものを正しくつくるカンファレンス

大きいものだけでもこれだけ。社外カンファレンス楽しい!Agile2019しか振り返りブログ書いてなかったですね...

martin-lover-se.hatenablog.com

勉強会にも参加したいんですが、子供が小さいと夜はなかなか...

自分が発表させていただいたカンファレンスはもちろんですが、個人的にはOSTが楽しかった Agile Leadership Summit がとても印象に残っています。ぜひ来年も参加したい。

来年も海外カンファレンスに参加できるといいな。

社内コミュニティの成長

ほそぼそとやっていた社内のアジャイルコミュニティに一気に人が増えて大所帯に。 師匠の人徳のなせる技でした。 人が増えると視点が増えて議論にも活気が出るし、チャレンジできることの幅が広がり楽しく過ごせました。

「正しいものを正しく作る」の著者である市谷さんをお招きして、ABDの結果を共有できたり。 スクラムワークショップを社内で実施してみたり。 Agile Japanサテライトを社内で開催してみたり。

今年もこういう活動を通じて、社内に仲間を増やしていこうと思います。

CSDになりました

こちらのブログに書きましたが、Certified Scrum Developer になりました。

martin-lover-se.hatenablog.com

実践的で最高に学びがある5日間でした。 David は今でも良い師匠です。 あ、「レガシーコードからの脱却」読みましょう、全人類必読です。

会社に高額な費用を負担してもらったので、これからも還元していきます。

次男の誕生、2度めの育児休業

プライベートでも大きな変化がありました。 一番はなんと言っても次男の誕生です。

2度めの育児休業は1.5ヶ月と短かったですが、充実していました。 新生児の時期の育休は子供のためにあらず。ママの回復をサポートするためにあります。 とはいえ赤ちゃんの次男と多くの時間を過ごせたことはまた人生の財産になりました。

またひょんなことからマンションを買って引っ越すというイベントも発生して、物理的にも大きく環境が変わった一年でした。

2020年チャレンジしたいこと

Agile を継続して学ぶ

もはや自分にとってAgileはソフトウェアを作ることそのもの。 継続的に学び、また機会があればアウトプットしていきたいです。 また、アジャイルコミュニティにも引き続き参加して友だちを増やしたい!

英語を何とかする

「英語は趣味」といってダラダラ勉強を続けてきてはや4年。 それでも一定上達はしていると感じています。

去年は通勤時のPodcastシャドーイングと、オンライン英会話、オフラインでのマンツーマンがメインでした。

海外カンファレンスなど英語で会話する機会にも恵まれ、 英語で会話をすることに抵抗や恐怖心はほとんどなくなりました。

しかしまだまだ、自分が目標とする

「英語で議論する」 「英語でプレゼンする」 「英語で仕事する」

に必要なレベルには程遠く感じています。 ここらでもう一段階レベル上げたいなと。 具体的な方法はこれからですが。シャドーイングの負荷上げるとか。

英語能力の証明にTOEFLでも受けようかと思っています。

コードを書く、コンピュータサイエンスを学ぶ

昨年は仕事以外でコードを書く時間が大きく減ってしまいました。 前述の通りいろいろな場所で発表させていただいたのですが、僕は発表1本つくるのにだいたい1ヶ月くらいはずーっとそのことばかりを考えて過ごしてしまいます。 そもそも並列でちがうことをやるのがあまり得意でないので...

もちろんそのおかげで気づいたことや学んだことも多くあったので、良いとか悪いとかではなく。

コードを書くことをこれからも生業としていきたいですし、今年はとりあえずコードを書く時間をもう少し確保します。 あと専攻がCSだったわけでもなく、体系的に学んだわけでもない... というのがずっと心に引っかかっていて、ここらで一念発起してちゃんと勉強しようかと。

こちらもまだ具体的に何しようかというのは考え中ですが、 データ構造やアルゴリズムの練習に競プロでもはじめようかとぼんやり考えています。

まとめ

RSGT2020で「今年のテーマ」レベルに印象に残った言葉が2つあります。

  • 「It is NOT Good, It is NOT Bad.」
  • 「迷ったら楽しそうな方を選ぶ」
    • 高橋さんは「迷ったらつらい方を選ぶ」とおっしゃっていて、その後「迷ったらXXXを選ぶ」を自分に合わせるメソッドを川口さんに教えてもらって生まれた気づき

人生のテーマレベルかも知れません。今年はこんなかんじでやっていこうと思います。

というわけで、とりとめないですが去年の振り返りと今年の抱負でした。 2019年は自分史上最高が色々できた良い年だったと思います。今年はさらにその上を..!

出会ったすべての皆様、昨年はありがとうございました! 今年もよろしくお願いいたします!