こんにちは。エンジニアのりゅーそうです。
microCMSのエンジニアチームでは、毎週1時間ほど社内勉強会をしています。
有志のメンバーが話題を持ち寄って発表したり、適当にテーマを設けて雑談したり、、、とゆるく数年間運営されています。
今回はそんなmicroCMSの勉強会ではどんなことが話されているのか?2月(全4回)で話した内容を紹介したいと思います。
第1週
Pulumiについて調べてみた
石井さんによるPulumiについての発表です。以前OpenTofuについてもまとめてくださっていましたが、今回比較対象として調べた内容の共有でした!
PulumiはAWS CDKのようにTypeScriptなど好きな言語で書けるというメリットがありつつ、Terraformからの移行も pulumi convert --from terraform --language typescript コマンドが用意されていたりと、移行のしやすさにもメリットがあるとのことでした。
メンバーの意見では、意外とインフラをHCLで書くことに違和感がないという意見や逆にTypeScriptだと学習コストがかかりそうという面白い意見もありました。
GraphQL
村松さんによるGraphQLについての発表です。SNSでGraphQLが話題になっており、改めてGraphQLのメリットやおすすめの使い方を紹介してくださいました。
RESTの課題として、Over-fetching(取りすぎ)・Under-fetching(取り足りない)・UI変更がAPI変更に波及しやすい、という3点を挙げ、これらの課題をGraphQLで解決するための設計について解説していました。
フィールド単位でリゾルバーを書いて、GraphQLサーバーをバックエンドそのものではなく、BFFレイヤーとして捉え捉える。
またクライアント側では
- Fragment Colocation:コンポーネントが必要とするデータをFragmentとして宣言して、コンポーネントのそばに置く
- Fragment Masking:コンポーネントが宣言したFragment以外のフィールドを、型として読めなくする仕組み
の設計パターンで「UI = f(data, state)」というReact的な設計に基づき、依存が壊れにくくなる仕組みについて解説していただきました。
microCMS内でのGraphQL活用やコンポーネント設計について見つめ直す良いきっかけになる発表でした。
文字列 NFC/NFD問題
宇都宮さんによる文字列のNFC/NFD問題についての解説でした。1年前にも解説した内容でしたが、メンバーが増えてきたので改めて共有しますとのこと。
Unicodeの正規化形式の違いにより、見た目が同じでもバイト列が異なることがあるという問題です。
const rawInput = 'ピ'; // "ピ" が分離して U+30D2 (ヒ) + U+309A (半濁点)
const expected = 'ピ'; // U+30D4
// false
rawInput === expected
// true - NFC形式正規化(分離しているものを合成)
rawInput.normalize('NFC') === expected
// false - NFC形式正規化 → NFD形式正規化(分解される)
rawInput.normalize('NFC').normalize('NFD') === expected
のようなコードをあげ、NFC・NFDによって濁点などで正規化の形式が異なり、文字列比較ができなくなる例を解説しました。
対応としては String.prototype.normalize() で文字列のUnicode形式を指定し、比較を行う。外部データなどとの通信時には正規化したデータを使うなどの対策を挙げていました。
文字列周りは罠が多いので、この類の話は何度話しても良さそうですね....!
第2週
検索システムとOpenSearch移行の勉強会
大西さん主催でOpenSearchについての勉強会を行いました。今回は趣向を変えて時間を長めに取ってスライドも準備いただきmicroCMS内で利用しているOpenSearchの解説をそもそも検索システムとはどうあるべきなのか?も含めて解説いただきました。
まずは、OpenSearchのシャード・レプリカ・クラスターなどの設計について。microCMSでは元々シャード設計が悪く効率よくパフォーマンスを出せていないという課題がありました。データノードをどのように配置するのか共有がありました。
検索の基本的な仕組みについての解説もありました。検索インデックスやテキスト解析の仕組み、microCMSの現行の検索精度についての課題や、仕様変更に伴いどのような解析・トークナイザーでの検索を行うのかなど背景を含めて解説いただきました。
今回別枠で時間を取って、microCMSの根幹となる検索システムの解説勉強会を行いました。チーム全体で検索システムについての理解が深まりとてもためになったと思います。
第3週
モブプロ
今週は特に勉強会のアジェンダがなかったので、今週も趣向を変えて自分が現在開発している機能のモブプロを行いました。自分が画面共有をしながら実際に機能開発を進めました。
Cursorを利用し、どのようにプロンプトを投げて機能開発を進めていくのか。デバッグ結果などをAgentsにどのように伝えているのかをシェアしつつ進めました。
エージェントの進行を眺めるという不思議な時間も流れていたりしました。その合間でメンバーがどのようにAIを使っているのか?や質問などいろいろな知見が共有されたので、開催してとても良かったと思いました....!
第4週
スナップショットテストについて
三由さんより、スナップショットテストについての話です!
コードベースを大きく移植する際に、旧コードとのレスポンス一致の安全性を高めるために実施したので、実行手順や知見を共有いただきました。
DynamoDBのcloneデータを用意し、移植前のコードと後のコードで出力結果を比較し、差分がないようにスナップショットで検証したそうです。その際のデータの問題などデバッグの手順などの知見をシェアしていただきとても勉強になりました!
久しぶりに個人開発でアプリをリリースした話
大西さんより、個人開発でアプリをリリースした際の知見の共有がありました!
セキュリティ周りの制約に引っかからないClipboardのmacOSアプリを開発したそうです!
利用規約やローカライズをAIで対応した話や、最近のApp Storeの状況などをシェアしてくださいました。過去の実際の売上なども共有しメンバーの個人開発へのモチベーションも高まる発表だったと思います!
今月は通常の勉強会に加えて、OpenSearchについての業務よりの知見の単体の勉強会やモブプロなど色々な取り組みもありました。
フルリモートでもお互いの知見や開発スタイルの共有をどんどん活発にしていきたいと改めて思った2月でした。来月以降もゆるく続けていきたいと思います。




