🌇

2022年に扱った技術の振り返り

2022/12/31に公開

2022年も今日で終わりですね。
1年の締めくくりとして、この1年で扱った技術を簡単にまとめてみます。

はじめに

簡単に自己紹介をしておくと、某通信事業者でシステム開発をしています。スクラムで少人数(開発次第では一人)で開発をしていることが多く、フルスタックに手広く手掛けています。今年は、主にIaC・CI/CD基盤システムの開発と、ネットワークのIaCを実現するためのフレームワークの開発をしていました。それぞれの概要については、以下の講演資料で説明しています。

どちらもKubernetesを基盤とするプロダクトで、開発をしながら常にKubernetesを使っていたので、Kubernetes力は大分上がった気がしています(といいつつ、SRE的なお仕事はあまりやっておらず開発が中心です)。

ということで、分野が広く雑多なまとめになりそうですが、今年扱った技術や良かった本などをまとめてみます。

扱った技術

言語

Go・TypeScript・Pythonの3つでした。2021年度と変わらないラインナップですが、今年はGoの比重が大きく増え、バックエンドはGo、フロントエンドはTypeScript、データ加工のスクリプトを書くときだけPython、の構成が定着しつつあります。「Kubernetesカスタムオペレータで開発することが多かった」「CUEのGo APIを使う必要がある」あたりがGoの比重が増えた主な要因ですが、FastAPIを使っていてランタイム型検査のパフォーマンス問題で痛い目を見たため、Gradual Typingよりも静的型付け言語を選択したいという思いが強くなったことも大きいです。
なお、もう型のない開発には戻れないので、言語を問わず型安全なコードを書くようにしています。

フロントエンド

ここ2年ほどはReactを使わずVue使いだったのですが、今年から参加したCloudNative DaysのdreamkastでReactを使っていたため、久しぶりにReactを使いました。2019年にReact Hooksを実戦投入したときにマネージャコンポーネントが肥大化して保守性が悪くなる問題に直面し、Vue/Nuxtに鞍替えしていたのですが、あらためてReactいいなあとなっています。

今年扱ったフレームワークはこちらです。

  • React/Next.js/RTK Query
  • Vue2/Nuxt.js/openapi-generator-cli

フロントエンド関連で今年一番のヒットはRTK Queryでした。バックエンドでOpenAPIを生成してopenapi-generator-cliでクライアントコードを生成していたのですが、OpenAPIが大きくなるにつれて生成コードも肥大化して困っていました。生成コード自体も可読性が低く、使い勝手が良くないです。RTK Queryに乗り換えることで、様々なことが改善しました。

  • 生成コードが劇的に小さくなった
  • 生成されたコードの可読性が高い
  • Reduxのsliceを使ったキャッシュがノーコードで実現できる
  • キャッシュ更新のタイミングを柔軟に制御できるし、mutationをトリガにしたrefetchを自動構成することもできる

まるでApolloやFirestore APIを使っているかのような使用感が、REST APIからほぼノーコードで得られたので、衝撃でした。バックエンドがREST APIしか提供しておらずopenapi-generator-cliを使っている方は結構いると思うので、その場合はぜひRTK Queryを触ってみてほしいです。 年内は時間が取れずRTK Queryの記事を書けなかったので、また改めて書く予定です。

バックエンドAPI

PythonではFastAPI、Goではgrpc-goでAPIを実装していました。
FastAPIでは、firestoreやKubernetes api-serverへのリクエストをラップしてREST APIとして提供する機能を担わせていました。Pydanticとdatamodel-codegenのおかげで開発体験は良かったですが、Kubernetesリソースを扱う用途でFastAPIを使うとパフォーマンスがネックでした。
一方Goで書いているプロジェクトの方は、複数のマイクロサービスがサーバ間通信を多用する構成だったため、gRPCで効率的に開発できました。Goだと、net/httpにしてもgRPCにしてもhttpのサーブ機能も持っており、使いやすく抽象化しつつも過度に隠蔽していないためトランスポートなどを柔軟に変更できるのが良いです。Connect も使ってみたかったのですが時間が取れなかったので、来年の課題です。

本当はRESTよりGraphQLを使いたいのですが今年は機会に恵まれなかったので、来年こそはGraphQLを選定した開発をやりたいです。外部向けにはGraphQLよりもRESTの方が利用者が多いという理由でRESTを選定しがちなのですが、GraphQL SOFAなるものをLayerXさんのブログ記事で見かけたので、このあたりも試してみたいです。

Kubernetesカスタムオペレータ

今年はKubernetesカスタムオペレータを書く機会が多かったので、kubebuilderにすごくお世話になりました。ginkgo/gomegaでのBDDテストの実装も、オペレータのテストが書きやすかったです。一方で、kubebuilderのBDDテストはユニットテストではなく、状態収束を待つ必要があってテスト時間がどうしても長くなってしまうので、来年はこのあたりも積極的に改善していきたいです。
開発では、定番ですがkindやTelepresenceが活躍してくれました。カスタムオペレータはapi-serverとetcdさえあればどこでも開発・動作検証ができるので、このあたりの軽量性も良きです。

データベース

クラウドのマネージドNoSQLが費用面でも保守面でもメリットが大きすぎて、firestoreやdynamoDBばかり使っています。2022年はRDBを使うことがほぼありませんでした。ここ数年でNoSQLのモデリング力はかなり上がりましたが、トランザクションが必要なケースで極端に面倒になるので、うまく使い分けていきたいところです。
一方で、割り切って分散トランザクションマネージャに集約すると、モノリス・マイクロサービスのアーキテクチャ選定に依存しなくなるので、パフォーマンスが重要でないならありなのではと考えています。開発を高速化するための有効な一手になる気がしているので、来年はこのあたりも試したいです。

IaC

基本はTerraformを常用していて、業務で使うためPulumiとCUEもたくさん触りました。
今年は縁あってAWS CDKも使ってみました。PulumiとAWS CDKはコンセプトが近いので比較されることが多いですが、TypeScript SDKを使っての比較では、AWS CDKに軍配があがるように感じました。
CUEは、2022年はDaggerやOpenSSFのFRSCAなど、IaCだけではなくCI/CDにもCUEを活用する事例が出てきました。今後の展開が楽しみです。

CI/CD

Tektonを使ってCIOpsするプロダクトを開発している関係で、昨年同様に開発でもCDでもTektonを頻繁に触っていました。ただ今年は他のプロジェクトにも参画したため、ArgoCDやFluxCDも扱いました。
ArgoCDは、やはりCD特化でよくできていて素晴らしいですね。ApplicationSetなどで利便性が増してますし、PullRequest Generatorを使うことで自前でNetlifyやCloudflareのようなPR previewがバックエンド込で構築できてしまうのがすごいです。
FluxCDは、全体を使ったことはないのですが、ネットワークのIaCフレームワークを開発するときのGitOpsを行うコントローラとして、FluxCDのサブセットであるsource-controllerを使わせてもらいました。簡単に独自のGitOpsを組み上げることができたので、GitOpsする何かを自作したい人は試してみると良さそうです。

クラウド

本業がGCPメインなので、昨年までと変わらず主にGCP・本業以外でAWSという形になっています。どちらもメインで使っているのはGKEかEKSなので、クラウドごとにインテグレーションの仕方の差はあれどもKubernetes YAMLでどちらも扱えるというのは便利ですね。
逆に、Kubernetes関連以外のクラウドプロダクトの最新動向のキャッチアップがおろそかになっているので、来年はちゃんとしたいです。

今年読んで良かった技術本

今年はそこそこ本が読めました。ただ、積ん読が多すぎて今のペースだと消化できないので、来年はもっとペースを上げて読み進めたいです。

良かった技術本は以下です。自分の知識の穴を埋めてくれた本が多いです。

  • Googleのソフトウェアエンジニアリング
    • CI/CDの基盤を開発しているエンジニアとして、自身の開発プロセス目線でもユーザのペルソナ目線でもすごく学びがありました。Googleほどのプロダクト規模でないと問題にならない or 意味がないものもありますが、「ビルド・リリースプロセスとはかくあるべき」というものが学べます。
  • ソフトウェアアーキテクチャ・ハードパーツ
    • 前作 ソフトウェアアーキテクチャの基礎 も良かったですが、コンポーネント・データの分解だけでなく統合すべきケースもトレードオフとともにまとまっており、分散アーキテクチャの各パターンとそのメリデメも簡潔にまとまっているので、アーキテクチャを検討するときのバイブルとして重宝しそうです。
  • 実用Go言語
    • 今年はGoを書くことが多かったので、とても参考になりました。
  • Real World HTTP 第2版
    • HTTPの理解が断片的だったので、過去の歴史含めて包括的に学べて頭の整理ができました。上の「実用Go言語」と同じ渋川よしきさんの著作で、ファンになりました。
  • プロフェッショナルSSL/TLS
    • Real World HTTPと同時期に読んでいたのですが、HTTPとTLSの関係性について相互補完的に読めてよかったです。
  • Docker/Kubernetes開発・運用のためのセキュリティ実践ガイド
    • 少し情報が古いところもありますが、コンテナランタイムセキュリティやKubernetesクラスターのセキュリティを知る上で一番の和書だと思います。プロダクトのハーデニングのために読ませてもらいましたが、CKSを取るときにも参考書として使えました。

おわりに

昨年に比べて仕事が落ち着き、また子供が大きくなってきたことで、少し余裕が生まれて新しい取り組みを始められた年でした。
個人的には成長を感じている1年なのですが、技術で振り返ってみると、新しい技術・概念を学んだというよりも ある程度手の内化している武器をさらにレベルアップさせた1年だった、という感じでした。
来年は、引き続き穴を深く掘り進めつつ、幅も広げられるように意識して取り組もうと思います。

それでは、良いお年を!

Discussion