Slide 1

Slide 1 text

3ヶ月で20万行を消すためにやったこと PHP Conference Fukuoka 2019 @naopr

Slide 2

Slide 2 text

@naopr ● Backend Engineer of CSTool Team ○ CSTool = CS用管理ツール ● Love ☗

Slide 3

Slide 3 text

メルカリと福岡 仙台 ・お問い合わせ返信 ・商品・コメント等の監 視 福岡 ・コールセンター ・開発拠点 東京 ・本社 ・アプリ開発

Slide 4

Slide 4 text

メルカリとPHP ● メルカリのAPIはPHPで書かれている! ● モノリス→マイクロサービスへ移行中 ○ PHPからGoへ ○ 既存のAPIのふるまいを変えずに各サービスにブレークダウン中 ○ MTC2018 - Mercari API: from Monolithic to Microservices

Slide 5

Slide 5 text

3ヶ月で20万行を消す ためにやったこと

Slide 6

Slide 6 text

アジェンダ ● 不要コードを削除するメリット ● メルカリで実際に行ったコード削除 ○ どのようにコードを削除したのか ○ 結果 ● まとめ

Slide 7

Slide 7 text

不要コードを削除するメリット ● コードの複雑度の低下 ○ 行数の削減 ○ 循環的複雑度の低下 ○ トランザクションの複雑度の低下 ● システムの高速化 ○ レスポンスタイム ○ CIの実行時間

Slide 8

Slide 8 text

メルカリで実際に行った コード削除

Slide 9

Slide 9 text

コード削除の手法 機能単位 API単位

Slide 10

Slide 10 text

コード削除の手法 機能単位 API単位 今回はこちらのお話

Slide 11

Slide 11 text

API単位でコードを削除するステップ 不要なAPIをリストアップする プロジェクトチームを作る コードを削除する 1 2 3

Slide 12

Slide 12 text

不要なAPIをリストアップする (1/3) 1. 直近アクセスのないAPIを抽出する a. BigQueryに保存しているアクセスログとPHPのAPI定義を突き合わせる b. 1ヶ月アクセスのないものを抽出する 2. 使われているものと使われていないものに分類する a. ひたすらコードを読む b. `git blame` で開発者を見つけて聞く c. そのAPIに関する開発チケットを読む

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

不要なAPIをリストアップする (2/3)

Slide 15

Slide 15 text

不要なAPIをリストアップする (3/3) ● 抽出されたAPI(526個) ○ 別リージョンでのみ使われていたAPI i. メルカリでは元々全リージョン同一リポジトリだった ○ どこからも呼び出されていないAPI ○ 呼び出し元が既に使われていないAPI ● 抽出されたが削除NGになったAPI(156個) ○ 直近アクセスがないだけで使用されているAPI 526 - 156 = 370 個が削除対象

Slide 16

Slide 16 text

メルカリで不要API削除のために行ったステップ 不要なAPI群をリストアップする プロジェクトチームを作る コードを削除する 1 2 3

Slide 17

Slide 17 text

プロジェクトチームを作る (1/3) ● 一緒にコード削除をやってくれる仲間を探す ○ バックエンドエンジニア x 7 ○ フロントエンドエンジニア x 1 ○ QAエンジニア x 1 ● 削除手順を決める ○ APIリストをどう管理するか ○ どのようにQAを行うか

Slide 18

Slide 18 text

プロジェクトチームを作る (2/3) ● 仲間探しについて ○ 370個のAPIを1人で消すのは物理的にも精神的にも無理 ○ 気が向いたときにやってくれるくらいのゆるい同士を募る ○ チーム・部署横断でチームを作るのでキックオフをする ○ タフなプロジェクトになるのでの力も借りる

Slide 19

Slide 19 text

プロジェクトチームを作る (3/3) ● API管理シート アサイン欄が空のものを選んで ステータス欄とアサイン欄を更新 メモ欄で難易度と雰囲気を感じとる 好きな時に好きなAPIを消せる

Slide 20

Slide 20 text

メルカリで不要API削除のために行ったステップ 不要なAPI群をリストアップする プロジェクトチームを作る コードを削除する 1 2 3

Slide 21

Slide 21 text

コードを削除する (1/2) ● 再度直近のアクセスログをチェックする ○ リストを作ってから消すまでにタイムラグがあるため ● Controllerを起点に再帰的に消す ○ `git grep` をひたすら叩く ○ IDEのシンボルサーチも役に立つ ○ Controller, Service, Exception, Entity, DB table, DB schema, test, etc… ○ 中途半端に残すと後の混乱の種になるので徹底的に消す ■ ただしリファクタはスコープが大きくなりすぎるのでほどほどに

Slide 22

Slide 22 text

コードを削除する (2/2) ● 「デグレリスクが怖いです…」 ○ 単体テストと結合テストがある程度書かれている前提 ○ メルカリはテストが充実しているので思い切って削除できた ■ 新機能実装時に必ずテストを書く文化 ■ QAチームによる自動e2eテストもある ○ クリティカルな機能をさわった場合にはQAエンジニアにマニュアルのテストも お願いした ○ 複雑度が高すぎるAPIは消さない判断もアリ

Slide 23

Slide 23 text

結果

Slide 24

Slide 24 text

結果サマリー ● 349個のAPIを削除 ○ 3ヶ月で20万行 ● Reverted 9 PRs ○ DBテーブルを削除したら別のサービスで使っていた ○ 使われていたAPIを誤って消してしまい大量のエラーが発生 ○ 突っ込んだ話はAsk the Speakerや懇親会でぜひ

Slide 25

Slide 25 text

まとめ

Slide 26

Slide 26 text

コード削除は難しい(だがやる価値がある) ● 地道にコードを読み、わからなければ詳しいエンジニアに聞くべし ● 一人でやるのは無理。チームを作るべし ● アクセスログのチェックはしつこいくらいにやるべし ● DBテーブルを消す時は他サービスへの影響をチェックすべし ● ストレスのたまる作業なので適宜ガス抜きをすべし ぜひ、みなさんのチームでも少しずつコード削除を始めてみてください

Slide 27

Slide 27 text

Let’s delete codes!