Slide 1

Slide 1 text

1 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting 事業を止めない技術改善の取り組み July 20th, 2022 Eureka Back-End Team Hiromichi Ema © 2021 eureka, Inc. All Rights Reserved.

Slide 2

Slide 2 text

2 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● Ema Hiromichi a.k.a. emahiro ● Back-end Engineer at Eureka. ※ 最近はなんでも屋をしてます。 ● 好きな言語は Go。今回テーマとしている改善作業では1メンバーとして愚直に改善作 業をこなしていました。 ● 個人で ブログ も書いてます。 自己紹介 © 2021 eureka, Inc. All Rights Reserved.

Slide 3

Slide 3 text

3 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 技術改善とタイトルをつけてますが主に Pairs の API における Go のコードベースを 直近2年で丸っと変更した話をします。 ● Go を採用している環境以外ではまた異なるアプローチになると思います。 前提 © 2021 eureka, Inc. All Rights Reserved.

Slide 4

Slide 4 text

4 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 技術改善をするに至った背景 ● エウレカ Back-end チームのアプローチ方法 ● 実際の改善活動事例紹介(一部) ● 振り返り ● まとめ Today’s Agenda © 2021 eureka, Inc. All Rights Reserved.

Slide 5

Slide 5 text

5 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting 1. Pairs は 2016 年、当時大きなユーザーベースを抱えていたにもかからず、 API の コードベースを PHP から Go にフルスクラッチで作り直すという離れ業を成し遂げて いた。 2. Go のコードとしては業界でも息が長く、現在まで 5 年以上運用されている。 3. ただ、当時は今ほど Go のエコシステムも整っていなかったこともあり、当時良いと思 われていた実装が現在負債化して開発生産性を低下させる 1 つの要因になってい た。 技術改善をするに至った背景 © 2021 eureka, Inc. All Rights Reserved.

Slide 6

Slide 6 text

6 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 事業推進に影響を少なく進める必要があること => 特に Pairs はそのほぼ全てのビジネスロジックを API が握っているので Back-end エンジニアのリソースを負債返済に使うことは事業を止めるということと同義。 ● 20% ルールは 120% ルールになりがち。どこかに無理が生じてしまう。 ● 技術負債返済のモチベーションは個々人で異なることもしばしばで、中々全体として 思うように進まなかったりする。 技術改善作業実行のツラミ & 難しさ © 2021 eureka, Inc. All Rights Reserved.

Slide 7

Slide 7 text

7 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 基本方針 ○ 事業は止めない = プロダクトのロードマップとは別ラインにする。 ● 進め方 ○ 専門チームを組成 ○ 事業の合間で行えるレベルで返済タスクを細分化し、そのタスクを消化すること を Back-end Team 全体で合意する。 ○ ガードレール (テストやLinter) を整備し、機械検知を積極利用する。 Eureka Back-end Team のアプローチ © 2021 eureka, Inc. All Rights Reserved.

Slide 8

Slide 8 text

8 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● Routing ライブラリの入れ替え ● E2E (*1) テストの導入 ● メンテされなくなった独自 OSS からの離脱 ○ 純正の AWS Go SDK への移行 ○ ORM の入れ替え ● エラーハンドリング *1. Controller レベルのテストなので厳密な E2E ではないです。 改善作業事例の紹介 (一部) © 2021 eureka, Inc. All Rights Reserved.

Slide 9

Slide 9 text

9 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting 魔改造 Gin => go-chi/chi ● 後述する httptest package を使ったController レベルのテストを整備するために、Go の 標準 http インターフェースに準拠した実装に揃えておきたかった。 ● go-chi/chi は最低限の routing と middleware を揃っており、別サービスでも利用されてて メンバーに知見があった + 技術スタックを揃えたかったので採用しました。 Routing ライブラリの入れ替え © 2021 eureka, Inc. All Rights Reserved.

Slide 10

Slide 10 text

10 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ドメインロジックの単体テスト => Controller レベルの E2E テストへ移行 ● httptest package を利用した自前の E2E テストを実装。 ○ http.Transport の書き換えを利用して外部 API もエミュレート。 ○ 新規 Endpoint を追加した場合にこの E2E テストがないと警告してくる Linter を実装 し CI で回していた Reviewdog 🐶 に追加。 => CI と連携することで E2E テストの追加を仕組み化する。 ● go test コマンドのみで API の振る舞いの検証可能 => 生産性への貢献 E2E テストの導入 © 2021 eureka, Inc. All Rights Reserved.

Slide 11

Slide 11 text

11 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● AWS Go SDK のラッパーライブラリ => 謹製の AWS Go SDK V2 へ移行 ○ 当時としては Pairs の開発に影響を与えないために必要なものだった ■ 2015年当時は AWS Go SDK 発展途上ですぐに壊れる (下位互換がない) ■ Go における依存のバージョン管理の標準的な手法がなかった。 ■ 普段使いに特化したラッパーの方が都合が良かった。 ○ 現在は AWS Go SDK も安定 + 独自ラッパー側が AWS サービスの新しい仕様に追従して おらず、実装時に使いたい機能が利用できないなど、開発に不都合な点が多くなってきた。 ex. DynamoDB の Transaction、GSI の SortKey フィルタなど。 メンテされなくなった独自 OSS からの離脱 1 © 2021 eureka, Inc. All Rights Reserved.

Slide 12

Slide 12 text

12 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● xorm のシャーディングライブラリ (Wizard) => xorm/xorm へ移行 ○ 導入当時は Pairs の長期的な負荷分散を見越したものだった(が、開発後に Aurora が出ちゃった...) ○ xorm/xorm で実装されていた新機能を使いたかった + パフォーマンス向上が見込め た。 ○ 移行前後で出力される SQL の差分をチェックするツールを実装し、SQL を確認しな がら移行を進める。詳細は以下の弊社ブログに記載しています。 ■ ORMをアップグレードするために行った大改修 メンテされなくなった独自 OSS からの離脱 2 © 2021 eureka, Inc. All Rights Reserved.

Slide 13

Slide 13 text

13 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 握りつぶされていたエラーを全てハンドリングする。 ○ _ := hoge()、もしくは if err := nil { return nil } と実装される箇所を全て if err := nil { return err } に変更し、エラーを返していないメソッドのシグネチャも合わせて全て変更 した。 ○ エラーを握り潰してると警告する Linter を実装し CI に組み込み、通常の実装でサボ れないようにする。 ● 同時にエラーログの出力についても、適切な SLO 運用のためにユースケースごとに severity の調整を行った。 エラーハンドリング © 2021 eureka, Inc. All Rights Reserved.

Slide 14

Slide 14 text

14 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting © 2021 eureka, Inc. All Rights Reserved. 振り返り

Slide 15

Slide 15 text

15 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 時間の経過が負債を産むことがある。 ○ 今回のように Go 全体のエコシステムやベストプラクティスの変化が負債になることが ある。 ● 独自 OSS はメンテナンスの仕組みとそこへのコミットメントの合意が不可欠。メンテナンス への合意がない場合は OSS としての実装と公開は避ける方が無難。 ● 改善中に作ったツールが現在進行中の開発生産性にも貢献しているので、改善作業が事 業推進にいい影響をもたらした。 振り返り 1 © 2021 eureka, Inc. All Rights Reserved.

Slide 16

Slide 16 text

16 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 事業を止めずに技術改善を進めるのは難しい。 ○ 改善作業を進め続けることができたのは、専門チームの組成できたことによるところが大き い。 ○ チーム、組織への説明責任を果たして合意を取って進めないといけない。 ○ Production 環境への影響を最小限にする努力があってこそ続けられる。 ■ ガードレールとなるテストの整備。 ○ 推進・協力してくれたメンバーにはマジ感謝。 ■ issue の管理や有志による Linter の実装(*)など。 ※ Go は静的解析を使って改善すべきレガシーな実装は Linter で検知できるように し、CI にも組み込んで機械に警告してもらうようにしました。 振り返り 2 © 2021 eureka, Inc. All Rights Reserved.

Slide 17

Slide 17 text

17 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting エラーは握りつぶさない方が良い 後になって本当に困ることが多い... 振り返り 3 © 2021 eureka, Inc. All Rights Reserved.

Slide 18

Slide 18 text

18 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting © 2021 eureka, Inc. All Rights Reserved. まとめ

Slide 19

Slide 19 text

19 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting ● 負債を溜めないことは不可能。しかし負債化しづらい仕組みを作ることは可能。 ○ 巨人の肩に乗る。 ○ エコシステムに乗る。 ● コードも運用されていくもの。運用を軽視すると後々それが事業成長のボトルネックにな る。 できる範囲で「今」運用を見据えたコードを書くこと、書く仕組みを作ることで将来発生する かもしれないボトルネックを小さくできる。 まとめ © 2021 eureka, Inc. All Rights Reserved.

Slide 20

Slide 20 text

20 © 2021 eureka, Inc. All Rights Reserved. CONFIDENTIAL INFORMATION: Not for Public Distribution - Do Not Copy All Hands Meeting © 2021 eureka, Inc. All Rights Reserved.