2022年1月〜3月の振り返り


2022 年 1 月〜3 月に 個人 OKR を設定して頑張るということをしたのでその振り返りです。設定した OKR は下記でした。

Objective: Rust で Web サービスを作る

KeyResult

  • Rust に関連した本を読む
  • Rust で認証機能を持った API サーバーを TDD で作成する
  • WebAssembly を利用したフロントエンド機能を作る
  • Rust で CLI ツールを作る

内容はさておき、OKR は達成率 60〜70%くらいを念頭に設定するのが良いと聞きました。年の初めだったのもありやる気満々な感じで設定し、結果は下記のような達成率となりました。

Objective: 32%

  • Rust に関連した本を読む: 50%
  • Rust で認証機能を持った API サーバーを TDD で作成する: 50%
  • WebAssembly を利用したフロントエンド機能を作る: 0%
  • Rust で CLI ツールを作る: 20%

頑張りきれずに 32%でした。企業 OKR だったら予測の甘さを怒られそうな数値でフィニッシュでした。

OKR に設定した内容のモチベーションと目的

  1. フロント、バックエンド両方が依存するビジネスロジックのパッケージを Rust で作り、両方でストレスなく使えるものができないかというのを試みたかった
  2. JavaScript だとメモリエラーが起きそうな処理があったとき、メモリ管理上手いと噂の Rust で実装したらどうなるんだろうという実験がしたかった

例えば、フロントエンドとバックエンドでチームが別れているとき、両方のチームでデータの扱いが違ったり、それぞれで同じような処理を書いたり、どっちかに負担が集中してしまうのは効率的でないなと思うことが過去ありました。

必要なドメインを作るビジネスロジックは両方のチームで書き、あるべき姿でドメインが作成された後、フロントや API などそれぞれのレイヤーに必要な形の整形は各チームが行ってできたら良いのではと思ったからです。。クリーンアーキテクチャでいう ユースケース レイヤーまでは一緒に、ゲートウェイからはそれぞれで作るイメージです。

WebAssembly 全然知らないけど、なんかこんなことできませんかね!というイメージで OKR に入れました。

結果的に作ったもの

API

https://github.com/Hidekazoo/crudzoo-mypage-api

Rust 初見だったのと、きちんと型を書く言語に不慣れ、要は基礎的な実力が低くて非常に難しかったというのが率直な感想です。動かすのも大変でした。ZeroToProduction という素晴らしい本があり、そちらを参考にしすぎるくらいに真似することで、期間中になんとかデプロイして動かせるところまではいけたのは自分を褒めたい部分。

Zero To Production In Rust

Rust で Web サービス作りたいけど方法が全然わからないという人には特にお勧めの本です。

ちょうど skaffold を学んでいたタイミングでもあったので、デプロイ先 kubernetes ではないですが環境構築に skaffold が少しだけ顔を出しています。認証機能については Auth0 にほぼ全部任せっきりできるのでは?と考えいたものの、Auth0 の SDK が Rust にはない誤算がありました。トークンを受け取って検証する処理を自分で書くことにしたものの、最終的に自分でもこれはどうなんだと思うくらいのコードしか書けなかったのは悔しかった部分、ここが今の限界です。

言語自体を学ぶことに専念する期間と、作ることに専念する期間は分けた方が良かったのかもしれないというところが API 側の反省点です。あるいは、稼働のうち x%は基礎を学ぶ時間にするといったことを決めておけば良かったなと思いました。

フロントエンド

※コード公開できるところまでできたら公開

フロントエンドは WebAssembly を使ってみたいので、UI は使い慣れた React で適当に作ろう!という想定でしたが、油断して Remix に手を出してしまった結果、Remix 面白すぎて手が離れないことになって OKR の進捗を下げる主要因になりました。

Remix は特にフォームの扱いが衝撃でした。React の強靭な UI の構築力はそのままに、サーバーサイドで HTML 作成し form タグの action でサーバーサイドに POST していたシンプルなフォームができてしまう不思議。React なのにフォームの state に悩まなそうな世界観、これはやばい。

今のところ、浅いところまでしか触っていないのでフォームの不具合を 1 つでも踏んでしまったら意見変わってるかもですが、そういう手探りなところも刺激があって、結果 OKR 忘れて楽しんでしまったわけですね。

インフラ

作ったものは自分しか触らなくてもとりあえず公開したい派なので、デプロイ先を探しました。今回は下記にデプロイしています。

  • フロント: CloudFlare Pages + 付属しているパイプライン
  • API: Google Cloud Run + CloudBuild
  • DB: Oracle Cloud の VM

DB は RDBMS が使いたいけど極力お金使いたくないという理由で、Oracle Cloud の VM マシンに自分で Postgres 立てることにしました。管理は手間ですが無料枠で可能です。CloudSQL といったサービスを利用するとクオリティが高いものの、月 1500 円くらいは覚悟となるのでかけられる予算次第でしょう。仮に自分以外のデータも保存するならそういうサービスを選ぶと思います。

Rust の API は Docker コンテナで動かしたかったので Cloud Run を選びました。Rust はローカル開発時は全然気づかなかったのですが Rust のコードをビルドしたりするのにかなり CPU パワーが必要です。例えば GCP の AlwaysFree 枠の VM マシンだと Rust のコードビルドするのも一苦労で、CloudBuild は高性能なパイプラインじゃないと初回ビルド時 Hello World のレベルでも依存ライブラリによっては 20 分覚悟です。

AlwaysFree の枠内で Rust がサクッと動く VM マシンは Oracle Cloud くらいしかないのでは?と思います。 その点で Oracle Cloud の VM に Jenkins 構築とかするの楽しそうではあったものの、また方向性がずれそうだったので諦めました。 CloudBuild で 30 分くらいを許容しました。

フロントは Remix と相性が良いという噂だったので CloudFlare Pages です。Remix が早いのか、CloudFlare のパイプラインがすごいのか不明ですがフロントのビルドと公開は爆速です。

その他取り組んだものなど

他、OKR に大きく関係なかったけど学びに時間をかけたもの。大体仕事関係。

Kubernetes 関連

仕事で Kubernetes(k8s)を本格的に触るようになったのでキャッチアップのために時間を使いました。過去に学んだことはあったので初めてではないものの、複数のマイクロサービスが立つ環境で、たくさんの意味のわからない設定ファイル、覚えられない kubectl コマンド、なんか立ち上げに失敗している Pod、言うことを聞いてくれない helm、お前なんなんだよ skaffold と、全然わからなくて困ったことが多かった分、学びは多くありました。

結果的に自分のプライベートなコードにも skaffold ファイル入れるくらいには好きになっていて、今後も継続して学びつつどこかのタイミングで自分管理の k8s を作りたい(予算を組むか、Oracle Cloud で頑張ってみるか)です。

コミュニケーション

空気読めない言動をせず、相手を傷つけるようなストレート過ぎる言葉を使わず、いつも謙虚で相手を尊重し、問題があればメンバーを適切にフォローして解決に導くことができる。そんなおっさんになりたいのですが、今のままだとなれそうにないので本を読んだり、相談したりしたものの、なかなかうまくいかずに悩みました。

自分が考える理想のおっさんと、自分に適性があるおっさんの在り方が違うのかもと思ったり、周囲が求めるおっさん像もまた違うのかもと思ったりで、コミュニケーションって本当に難しいと感じました。

また、リモート会議ばかりなのもあり聞き取りやすい発声や、発表についても課題感を感じて練習しました。同じ空間だと伝わる感情も、カメラ越しだとあんまりだなと思ったためです。改善しようとしているもののとても難しく、現状手応えを感じていません。

次の三ヶ月

1〜3 月で分かった課題を解消しつつ、次の 3 ヶ月も OKR 立てて頑張る予定です。やってみて良かった点としては、決めた以上はやらないと恥ずかしいという感情になるので少しは強制力が働くというところです。色々と興味が移りやすい方なので、今までは何か学んでいてもあるべきところに集中できないと思うところはあったのですが、OKR にすることで本来自分がなりたいところをどれくらい頑張れたのかがわかるようになりました。

一方で、

  • Rust に関連した本を読む

上記のようなゴールが曖昧で本人の良心が問われるような設定が多すぎたという反省はあります。例えば期間中に x ページ読むとか、xx を全て読むとか、読んで x 個のコードを公開するみたいな風にした方が結果はどうあれ達成率は分かりやすかったはずです。

次の 3 ヶ月も頑張るぞ!