#roppongijs でNuxt.js + TypeScriptの話をしてきた
仕事で使っている Nuxt.js + TypeScriptの話をしてきた。本当はもっと話したいことあったんだけど、5分なのでTypeScriptに絞って話しをした。 第一回目の発表ということもあって結構レベルの高い発表が多かったんだけど、懇親会では何人かから質問もあったしまあまあ良かったのではと思っている。
SpringからAPIクライアントを自動生成する仕組みのところが皆さん気になっていたようで、結構Swagger定義を手で書くのしんどいっすって話が多かった。自分の例ではSpringのControllerの実装からSwaggerの定義は自動で作っているので、Swaggerは手で書いていない。手で書くのは正直結構しんどいよねーと思います。懇親会で話してたら結構 grpc-web
とか grpc-gateway
の話に興味を持つ人が多かったので、その辺も機会があればLTしようかな。
あと、フロント専任のエンジニアみたいな人が多いのかなと思いきや、割と大きい会社の人でも結構サーバーと兼任みたいな人の方が多くて意外だった。会社の規模が一定以上になると、サーバー / フロントを分けるのが普通なのかなと思ってたけどそうでもないんですね。自分としてはどっちもやっていきたいので、そういう会社が多いと嬉しいな。
メルカリさんの会場は広いし綺麗だし、ミートアップ用の冷蔵庫あったりですごかった。また4月にあるようなので是非参加したい。
本番運用まで行かなかったgRPCの知見をまとめておく
会社のブログに書こうと思ったんだけど、ちょっとマイナスイメージを持つ人もいそうな気がしたので、個人ブログに書くことにした。
この3ヶ月くらい、システムのリニューアル(アプリ間で分散したロジックを集約するバックエンドサーバと、用途に応じたフロントエンドサーバを立てるみたいなマイクロサービス構成)をやっていて、そこでサーバ間のやりとりにgRPCを使っていた。すごーく雑な絵を書くとこんな感じです。
しかし、最近になってプロジェクトのスコープについて見直しが入りました。マイクロサービス化ではなく単純にレガシーJavaで独自FWなアプリをリプレースするだけになり、必要なのはSPAとSpringBootのAPIサーバだけに(要するにRails側のロジックをなんとかするのがスコープ外になった)。
で、SPAに提供するAPIのためにgRPC(+ grpc-gateway)を使うのはちょっとオーバースペックだよねーという話になり、gRPCをやめて普通にRESTのAPIを作ることになりました。*1
プロジェクトが終わったら色々知見を公開したいなとおもったんだけど、その機会がなくなってしまい、ちょっと勿体無いのでブログにしておきます。 あくまでプロジェクト都合でgRPCを使うのをやめただけなので、何か問題があってとかではないです。その辺を期待してこの記事を開いた人はスミマセン。
このポストで話すこと
Spring BootでgRPCサーバーを作る
Javaコードを生成する
gradleのプラグインを使いましょう
なぜかドキュメントに書いてない気がするんだけど、 ./gradlew generateProto
で .proto
からコードが生成できます。
コンパイル時に必ずこれが走るようにしておくとよいでしょう。最初は雑に生成したコードもGitの管理に含めてしまってましたが、割と差分が馬鹿にならない量になっていくので、.gitignore
しておくことをオススメします。
クライアントコードを生成する
ruby / gateway用のGoコード、さらにcom.google.protobuf
で公開されているような Timestamp
などを使おうと思うと、これらをビルドする依存関係をインストールするだけでも
かなり大変になってきます。
protoeasy
というツールを使うと、このあたりの生成が以下のように大分楽になります(公式のDockerImageも提供してくれています)。
protoeasy --go --grpc --go-import-path github.com/user/your-go-project --cpp --ruby . # exclude protocol buffers files in foo/*
ただ2018年3月13日現在では公式のDockerイメージではSwagger定義を生成することができないので、独自のDocker Imageを作って対応しましょう。 --grpc-gatewa-swagger
オプションはよ。
このツールを使って、コアとなるAPIサーバがmasterにマージされたら各クライアントライブラリと後述するgrpc-gatewayサーバのリポジトリを更新しにいくということをしていました。
私は大本となるgRPCのサーバで.proto
ファイルも管理してしまっていましたが、このように色んなものをCIでビルドしようなどと思うと結構辛くなってきそうなので、クライアントが増えてきたら.proto
だけ配布して、そっちでビルドしてくれ!って世界観もありかなと思います。
.proto
ファイルの依存関係を解決してくれるようなツールは標準では私が知る限りないのですが、CyberAgentの方が protodep
というツールを作成されているようです。
Spring BootでgRPCを動かす
Spring BootでgRPCを動かすまでは本当に簡単です。 springboot-starter
というライブラリが公開されており、ほぼそれで完結します。
こちらは過去Qiitaにも書いたので、よかったら見てみてください。
.protoファイルの整理について
シンプルなサーバであれば、 .proto
ファイル一つで事足りるかもしれませんが、アプリケーションが大きくなってくると、
一つの .proto
ファイルでは見通しが悪くなってきます。
じゃあどう整理したらいいのかというところですが、私はgoogleが公開しているGCP用の .proto
ファイルの構成を参考にしました。(ちなみに結構ファイルによって書き方がマチマチ…w)
例えば bigtableの .proto
ファイルは以下の様に3つに分割されています。
googleapis/google/bigtable/v1 at master · googleapis/googleapis · GitHub
bigtable_data.proto -- Request / Responseで使うmessage定義 bigtable_service.proto -- Service定義 bigtable_service_messages.proto -- ServiceのRequest / Responseの定義
自分は最終的に以下のように整理しました。
src/main/proto/todo L todo_service.proto L request L get_todo_request.proto L post_todo_request.proto L response L post_todo_response.proto L get_todo_response.proto
認証をどのように行うか
このブログで紹介されているように、Interceptorを使ってSpring SecurityのSecurity Contextに認証情報を詰め込むという方法を取っていました。
で、最初は割とうまく行ってたんだけど、普通に動かしてる分にはよくても、Spring Securityまわりでテストが落ちることが頻発したりとちょっと挙動が不安定に。
Spring Security allows us to specify an alternative SecurityContext store by implementing a custom SecurityContextHolderStrategy. Additionally, the gRPC Java runtime provides the Context class, which can be used to carry state across API boundaries and between threads.
と、あるように grpc-java の Context
を使って無理やり実装してみたらテストの不安定さは解消されたものの、Securiy Contect
の機構に頼らず、素直にgrpc-java のContext
を使ったほうが良さそうだなぁという感触です。
エラーハンドリングについて
エラーハンドリングについてはこちらに書きました。
例えばバリデーションのような詳細な情報を返したい場合にはMetadataに詰めて返すようにしていました。
grpc-javaのサンプルにもあるように、以下のようにすると良いでしょう。
Metadata trailers = new Metadata();
trailers.put(DEBUG_INFO_TRAILER_KEY, DEBUG_INFO);
responseObserver.onError(Status.INTERNAL.withDescription(DEBUG_DESC)
.asRuntimeException(trailers));
gRPCをアプリケーションのどのレイヤーにおくか
クライアント、サーバで型を共有できるのが、gRPCの良いところではありますが、gRPCで生成されたクラスを所謂ドメインレイヤーまで引きずるような設計にはしないほうが無難です。
この場合gRPCのモデルからドメイン層、アプリケーション層にもってくるときのマッピングがかなり面倒になります。が、gRPCに強く依存する形でアプリケーションを作ってしまうと、今回のようにgRPCを差し替えないといけないことになったときに大変な事になります。
今回意識してgRPCにアプリケーションロジックが依存しないように作っていたので、gRPCからRESTへの書き換えも1週間程度で終わりました。
参考までに、プロジェクトの構成はざっくり以下のようにしていました。
domain/ application/ presentation/ └ grpc/ ├── interceptor/ └── service/ infrastructure/
grpc-gateway について
grpc-gatewayを使用して、SPA向けのRESTのエンドポイントを作成していました。grpc-gatewayのためのコード生成時にSwagger定義を同時に生成することができるので、Swagger Codegenを使ってフロントエンド用のTypeScriptクライアントも同時に生成して配布していました。
grpc-web
という選択肢もあったのですが、社内にAPIアグリゲータがいるとか、パスを見てnginxでリクエストを振り分ける必要があるとか色々あり、ブラウザから叩かれるエンドポイントとしてはgrpc-gatewayを選択しました。
grpc-gatewayはエンドポイントとしてのコードを自動で生成してくれるだけなので、実際のGoのサーバーはある程度自分で書く必要があります。逆にいうと足りないものがあれば拡張してくことが可能です。
エラー情報をクライアントにJSONでいい感じに返す
grpc-gateway
ではデフォルトでエラーの内容が以下のようになります。
{ "error": "invalid token", "code": 16 }
上記で書いたように、 Metadata
に詰めた内容も grpc-gateway
でクライアントにJSONとして返したい場合には、エラーの場合の挙動をカスタマイズする必要があります。
実はこの方法は、grpc-gatewayのwikiにリンクが貼られている以下のブログに書いてあります。
runtime.HTTPError
にエラーハンドラーが定義されているので、これを差し替えます。
色々端折っていますが、自分は以下のようなエラーハンドラを定義しました。
// CustomHTTPError おもにgRPCのMetadataをerrorBodyのような構造に変換し、クライアントに返すためのカスタムハンドラー func customHTTPError(ctx context.Context, _ *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, _ *http.Request, err error) { const fallback = `{"error": "failed to marshal error message"}` w.Header().Set("Content-type", marshaler.ContentType()) w.WriteHeader(runtime.HTTPStatusFromCode(grpc.Code(err))) eb := errorBody{ Err: grpc.ErrorDesc(err), } md, _ := runtime.ServerMetadataFromContext(ctx) for k, v := range md.TrailerMD { eb.ErrorDetails = append(eb.ErrorDetails, errorDetail{ Field: strings.TrimSuffix(k, "-bin"), // バイナリで帰ってくる文字列は-binのprefixがつくので、クライアントが扱いやすいよう消す Message: string(v[0]), // サーバー側では文字列としてしか入れていないが、何故かArrayで入ってくるので最初のものだけ取得する }) } jErr := json.NewEncoder(w).Encode(eb) if jErr != nil { w.Write([]byte(fallback)) } }
ファイルアップロード / ダウンロードする
以下のIssueにもあるように multipart form request
は grpc-gateway
では使えません。
一番簡単な方法は、Base64エンコーディングして受け渡しをしてしまうことです。
ただしProtocol Buffersの説明にもあるように、Protocol BuffersではMB以上のサイズを受け渡しするのは向いていません。
https://developers.google.com/protocol-buffers/docs/techniques
手元でやったところ大体3MB以上のファイルになると、この方法ではうまく行きませんでした。この場合には、grpc-gatewayに独自のエンドポイントを設けて 一度gatewayでファイルを受けて、Client Streamingで送るとかを検討する必要があるかもしれません。※自分はそれほど大きなファイルを送らずに済んだので、試してませんが…
JSONのMarshallをカスタマイズする
grpc-gateway
はデフォルトでは、Protocol Buffersでデフォルト値になっているものをレスポンスから省いてしまいます。
これはproto3では、デフォルト値なのか値がセットされていないのかを区別できないのでこのような挙動になっているようです。
この挙動は以下のIssueのコメントにもあるように WithMarshalerOption
で変える事ができます。
gwmux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
- OrigName
- デフォルトではJSONはキャメルケースになりますが、これをtrueにすると、
.proto
に定義されたフィールド名で出力されるようになります
- デフォルトではJSONはキャメルケースになりますが、これをtrueにすると、
- EmitDefaults
- proto3でデフォルト値になっているものもJSONで出力することができます。
まとめ
いまいちまとまりのないポストになってしまいましたが、プロジェクトで触った、gRPC / grpc-gateway について書きました。
個人的にはgRPCはかなり開発体験が良かったので、次に機会があればまた検討したいなと思います。
カイゼン・ジャーニーを読んだ
カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで
- 作者: 市谷聡啓,新井剛
- 出版社/メーカー: 翔泳社
- 発売日: 2018/02/15
- メディア: Kindle版
- この商品を含むブログを見る
カイゼン・ジャーニーを読んだ。展開が熱くて2日くらいで一気に読んで、この熱量を伝えたくて会社の人に布教してしまった。
江島という主人公のストリーに沿ってスクラム・アジャイルについて学べる
この本のいいところはタイトルにあるように「たった1人からはじめて」というところだと思う。現場に対して不満や変えたいことがあったとしても、それをいきなり理想形の形に持っていくのはとてもむずかしい。いきなり理想形にもっていくのは現場の社員1人では無理だと思う。それでも1人からはじめて、仲間をどのように作っていくか、そこから書かれている点がとても良いなと思った。
立ち向かう問題がなかなかリアル
自分はスクラムの経験が沢山あるわけではないけれど、それでもあーこういうことあったなぁーという問題が本書のなかでも沢山起こっていて、とてもリアルだった。個人的にはデザイナーとの協業のところは、過去に似たような経験があったのでとても学びが大きかった。当時は自分の馬力で何とかした(なってなかった説もある)けど、こういうやり方で進めればよかったなーと思うことが沢山ある。
インセプションデッキを定期的に見直す、とか「向き直り」をする、とかこれまでやったことのないアプローチもあったので真似していきたい。
いちいちセリフが熱い
「みんな、隣の芝生は青く見えている。行ってみると、実は芝生は前にいた場所から続いていて、大して変わらないことに気づくんだ」
「それで、あなたは何をしている人なんですか?」
「僕が取り組むより、部のみんなに展開したほうが良いかもしれない。…といって、また自分からは始めないのが、これまでの僕だ。」
WEB系にいる今でも震えたので、SIerにいたときなら涙がでちゃったかもしれない。
専門家はいない。私たちしかいないんだ。
これは先日あったRuby 25周年イベントのときに何かのスライドで、またエラスティックリーダーシップという本でも出てきたフレーズだ。カイゼンジャーニーに出てくるフレーズではないんだけど、サブタイトルにもなっている「越境」するチームというのは、こういうマインドを持ったチームなんじゃないかと読んでいて思った。
まとめ
現場を変えたいと思っている人にとっては、手法が参考になるのは勿論のこと、やっていこうという熱量を貰える本だと思う。オススメです!
ティール組織を読んだ
Twitterでよく見かけたので、ティール組織を読んだ。
- 作者: フレデリック・ラルー,嘉村賢州,鈴木立哉
- 出版社/メーカー: 英治出版
- 発売日: 2018/01/24
- メディア: 単行本
- この商品を含むブログ (1件) を見る
ティール組織と呼ばれる、従来の組織形態の常識からは考えられないルールで運営され成果を出している組織形態についての話だった。ホラクラシーというと馴染みがあるかもしれない。(ホラクラシーはティール組織の形態の1つみたいな紹介のされ方がされている。)
ティール組織は以下の3つの特徴があるらしい
- セルフマネジメント (自主経営)
- ホールネス (全体性)
- 存在目的
コレだけ見ると、セルフマネジメント以外はなんとなくトンデモ理論に見えるけど、読み進めていくと確かにと思うことが多かった。 1章目は若干スピリチュアルな話(にこの時点では感じること)が入ってるんだけど、2章目からは実際にティール組織で運営が行わている企業の話が続いていくので1章目は我慢して読んでいってほしい。
以下読んでいて自分が思ったこと。
性善説な組織
セルフマネジメントな組織では、従業員は基本的に善良であるという前提にたって組織運営がされている。本書で紹介されている会社では、元々備品の貸出にマネージャーの承認が必要だったり、事細かにタイムカードを付けなければいけなかったものを一切取りやめるだけでなく、目標設定や決済まで各チームに任されて運営がされていた。従業員が基本的に善良であるという前提にたつと冗長なルールや面倒な手続きのほとんどをなくすことができるようだ(だからこのような組織ではオフィス機能にあたる人の数が極端に少ない)。
個人的にも性善説にたっていない組織では、無駄なルールやとりあえずマネージャーに承認をもらうみたいなフローが多くなるという気はしていたので、これは納得だった。
こうなると気になるのは「何か不正が起こったらどうするのか?」ということだけど、本の事例だと以下のパターンだった。
- 罪を犯した人は解雇になり社内にも統制を求めるような声があがったが、社長が中心になりセルフマネジメントで性善説にたった文化を守った
- これまでこのような組織運営に寛容だった取締役陣が、統制を求め始めてセルフマネジメントの文化が失われてしまった
こういう文化を守っていくには、経営層にそれなりの覚悟がいりそうだなと思った。
なぜ最近のオフィスはアットホームな雰囲気のものが多いのか
これはホールネス(全体性)にかかってくる部分。そもそもホールネスってなんだよって感じだけど、本書を読んでいくと職場でも「自分らしくいられるか」ということだということが分かる。職場で「自分らしくいられる」ということの意味は、多分「自分を必要以上に大きく見せ」たり、「必要以上に卑下して見せ」る必要が無く、普段に家や友人と過ごすような気持ちで職場で過ごせるかということなんだと思う。 最近できたオフィスってカフェスペースがあったり、小上がりがあったりするのが多いのって、社員が自然体でいられるようにという狙いもあったりするのかなーと思った。
ティール組織になるとどのようなことが起こるのか
オランダのビュートゾルフというヘルスケアの非営利組織の話が特に面白い。もともとオランダの地域看護師を束ねる組織では、1看護師あたりの生産性を上げるために細かく全ての医療行為に標準時間を設定して内容を指示し、それをモニタリングするために各家庭の玄関ドアにバーコードを付けて医療行為にかかった時間を調べ、遠隔地から監視・モニタリングするということをしていた。(これだけ聞くと結構利にかなっていると思ってしまう。)
一方ビュートゾルフではこういった管理をせず、10〜12人のチームでケアサービスや、患者の受け入れ、スケジュール管理、さらには採用まで受け持つ形態を取っている。しかし結果として、ビュートゾルフの方が他の組織よりも1顧客あたりに費やした介護時間は40%近く少ない(要は効率よく医療行為ができている)というデータが出ているらしい。2006年に10人だった組織が2013年には7000人になっているという成長スピードも凄まじい。
いまの組織をティール組織にするにはどうしたらいいのか
これは結構身も蓋も無いことが書いてあって、正直だいぶ厳しい。
- CEOがティール組織のアイディアについて個人的に素晴らしいと思ってくれているか
- 取締役会もティール組織について理解し、支持しているか
CEOが乗り気でない場合には、自分の権力や時間を注ぐことはそれほど意味がないとまで言われてしまっている。厳しい。
まとめ
最近生産性を上げるにはもっと性善説に立たないといけないと思っていたので、どうやってセルフマネジメントな組織が実現されているのかは納得する部分が多かった。 既存の組織を末端の社員からティール組織に変革していくのは無理ゲーと書かれているわけだけど、組織がどのように変わっていくかの話など勉強になる内容が多かったし、変革までいかなくても改善していける部分もありそう。というかあってくれ頼む。
メルカリやSmartHRはかなりこのあたりうまくやってる印象あるけど、どうなんやろうか。 blog.shojimiyata.com
実践ドメイン駆動設計を読んだ
実践ドメイン駆動設計を読んだ
会社でレガシーシステムのリニューアルをやっていて、それのコアとなるAPIサーバをDDDで作りたいと思い購入した。
エバンス本は既に一度読んでいたのだけれど、いざ実務になるとこれはどこに置いた方がいいんだ?とか、どう実装するべきなんだ?みたいなのは本当によく迷う。
この本で、そのあたりクリアになるんじゃないかなという期待を持っていた。
以下、感想
自分がやっていたのは軽量DDDだった
本書ではDDDの思想を理解せずに、そのアーキテクチャの実装だけを真似ることを軽量DDDと呼んでいて、あまりオススメしないと言っている。
実際、自分もやって見て思ったんだけど、ドメインとは何だろう?という問いにちゃんと答えられないとレイヤー分けが結構難しくなってくる気がする。
ビジネスロジックはドメインなんでしょ?みたいな意識だけだと、複数人の開発で意識合わせていくの辛くなるんじゃないかなと漠然と思ってたので納得。
DDDとは特定の技術的なアーキテクチャのことではない
これはよく公開されているスライド見ててもよく誤用されてるし実際自分も DDDでやってますみたいなこと言っちゃうんだけど、レイヤードアーキテクチャ= DDDではないという話。
特定の技術に依存するものではない、でもヘキサゴナルアーキテクチャがオススメとは本書に書かれていた
エンティティとは?バリューオブジェクトとは?アプリケーションサービスとは?ドメインサービスとは?
このあたりは、概念としては分かっているつもりでも、いざ実装するとこれでいいんだっけ…ってなりがち。本書ではこれらについて具体的なコード例もつけて解説してくれているので、かなり参考になる。また理想的にはこうだけど、パフォーマンス要件とかで難しい場合もあるよねーといった現実的な話もしてくれるのが良かった。
でもこれもやはり、技術的なテクニックというだけの話ではなく、ドメインから導いていくということが大切だなとおもった。(特にアプリケーションサービス、ドメインサービスは単純にビジネスロジック置き場みたいな気持ちだとごちゃごちゃになっていきそう)
全てをバリューオブジェクトにする必要はない
例えばBooleanの値であったり自己完結した数値だったりする場合など、その値自体で意味のある全体を成している場合にはバリューオブジェクトにする必要が無いということは書いてあった。
なんとなくDDDガチ勢の人って全てをバリューオブジェクトでラップする印象があったのでちょっと意外だった。(よく考えたらそりゃそうだという話ではあるけど)
一方でIDみたいなものはどんどんバリューオブジェクト化した方が良さそうなので、自分もやって行こうと思う。
まとめ
おもっていたよりも読みやすい本だった。表紙で損してる気がするw
これを呼んでエバンス本の方をまた読み返し、またこの本を読むみたいなことをすると、理解が深まりそう。
作者が公開しているリポジトリも参考になるのでおススメです。
Netflixでデビルマンを見た
深夜に調べ物をしていてそのお供に見た。ながら見だったんだけど、割とトラウマになった。。。どれくらいかというと、ぼーっとしてるとその辛いシーンが思い出されて陰鬱な気分になるレベル。 ただ本当に傑作だと思った。
以下激しくネタバレ含みます。
続きを読む2017年の振り返り
2017年は上半期で振り返ってた suzan2go.hatenablog.com
2017年の下半期振り返り
11月に転してた。
7月
7月の最初には関わっていた決済回りの機能追加プロジェクトが無事リリース。かなりリファクタリングもしたし、決して単純な機能ではなかったが大きなバグも起こさずにいけたのは安心したし自信になった。
7月の後半からマネージャーから打診を受けてリーダー的な役割をやることになった。この時点で退職を考えていたというか既に内定が出ていたのでリーダー的な役割を引き受けるか迷ったけど、正直に話したところそれでもやってみてほしいということだったので頑張ることに。
8月
リーダー的な立場になり数値を追っていくことや、ビズデブ的な人たちとの関わりなどこれまで以上にやることになったが、1つ視座が上がった感じで割と楽しめた。
KARTEというツールを導入して、キャンペーンとかサイト内プロモーションをエンジニア無しに大体できるようになったのが自分のやった仕事としては大きいと思う。導入までは結構頑張ってその後の運用は優秀な新卒氏に任せたんだけど、ガンガン使い込んでいてとても頼もしかった。半分冗談でKARTE大臣!と呼んで任せていたら本当にめちゃくちゃ詳しくなっていって、名をつけて任せるって大事だなーと実感した。 karte.io
今も活用されているようで嬉しい。 qiita.com
9月
転職後に触ることになりそうなKotlin + Spring Bootの勉強をプライベートで始めていた。
9月後半からは社内でScalaも始まってたので、Kotlinで勉強していたことやSpringでのレイヤーわけは地味に役に立った。
10月
サービスの運用負荷を下げるためのサポートの人向け機能開発とか、自分が過去に開発に関わったサービスのリアーキテクチャとか、自分が rails new
したサービスの面倒を見ていた。サービスのリアーキテクチャは、完全に自分が(期間的に)やりきれない案件だったので、自分の理想を押し付ける形にならないように、実際に手を動かす人と認識を合わせることを意識した。その後どうなったかは聞けていないんだけど、頑張って欲しい…すみません…
このタイミングで祖母が亡くなったりしてめちゃくちゃドタバタしたものの、サポートの人にお願いされていた管理系の機能は全てリリースできたのでよかった。
そして10月の後半は2年半在籍したスタートアップ?の最終出社日だった。2度目の転職。何で転職したかというと主に理由は二つ。
- 条件面
- 技術的に今と違うことがやりたくなった
会社の公式エンジニアブログに何故か退職エントリーを書きました…
11月
今思うとツールだけの問題ではないんだけど、前職で当たり前に使っていたツールが使えないので転職してすぐは結構テンションが下がっていた。
単純に慣れなんだとは思うけど、当たり前に使っていたツールやサービスが使えなくなると思ったよりテンション下がるんだな
— すーさん二号 (@suusan2go) 2017年11月3日
あと入社してしばらくお腹こわしていたんだけど、今思うとこれ明らかにストレスだな…
無限に胃でガスが生成されてる感じで凄く辛い
— すーさん二号 (@suusan2go) 2017年11月9日
破裂しそう
この辺のお気持ちは以下で表明している。 suzan2go.hatenablog.com
仕事内容的な話でいうとgRPC + Spring Boot + Rails(これはこれから) + Nuxt.js なプロジェクトをほぼほぼ1人で回している。当初はgRPCやるつもりなかったんだけど、ちょっと触ってみると思ったよりも良いものだった。
DDDを実践するためにこういう本を買って読んでいるんだけど、自分がやっているのはレイヤードアーキテクチャ(or オニオンアーキテクチャ or クリーンアーキテクチャ)なだけで所謂 軽量DDD の域を出ていないなぁと思う。大分ドメインの知識がついてきたので、今年はドメインエキスパートと話して諸々すり合わせをしていきたい。
- 作者: ヴァーン・ヴァーノン
- 出版社/メーカー: 翔泳社
- 発売日: 2015/03/19
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
12月
Slackが使いたすぎて、Slackを入れたいという話をして資料を作って、偉い人に持っていったら何やかんやあって導入が決まった。過去の経緯とか聞いてると、色んな人の下準備が色々あったので、自分の提案で通ったって感じっぽい。
他のチャットツールをディスるわけではないけど、現時点でやっぱり開発用のチャットとしてはSlackが最強だなーと。GitHub(会社ではGitLabだけど…)の通知を垂れ流すだけでも情報共有という意味ではかなり価値があるし、セキュリティや言語、FW関連の情報をRSSで流せるのもいい。
あと振り返り・プランニングの習慣を他チームに広めたりしていた。振り返りでとりあえずKPTやってみたんだけど、めちゃくちゃいろんな意見が出て他チームながらとても有意義だった。Problemとしてとても重い課題(組織構造的な話)がでたんだけど、それでも「XXと話す場を作って相談してみる」という具体的なTryが出て実行されたのはとても良かった。
まとめ
11月の転職が大きな出来事でした。前職は不満が1つもないといったら嘘になるけど、エンジニアとして働く環境という意味ではとても良い会社だったなーと改めて気付かされました。そして、自分が当たり前に享受していた諸々は決して当たり前ではなかったなーというのを実感して、感謝の気持ちでいっぱいです。
現職はポジティブに捉えると改善しがいがあることが沢山あるし、色んなことを任せてもらっているので、メインのプロジェクトと平行して頑張っていきたい。とはいえ段々と手が足りなくなってきた感はあるので手伝いたい人ご連絡ください。
改善しがいがあることが多い(しかも自分の経験が役に立ちそう)というのはとても嬉しいことなんだけど、一方でそれをやるために転職したわけではない…という思いは正直ある。知り合いから「組織を変えるには、それなりの立場、権限、報酬がセットじゃないと消耗するだけで得るものがない」とも言われているので、かかる労力や期間がどれくらいかというのはぶっちゃけ結構シビアに考えている。
2017年下半期の抱負の進捗
機械学習
進捗ダメです
アプリ
Spring Boot + Kotlin + gRPCの勉強に消えていきました・・・
2018年の抱負
力尽きたのでまた週末に…