🔖

AI時代の新チームへのスムーズなジョイン術

に公開

はじめに

新しいチームにジョインしたとき、システムの「全体像」が見えず、手探りで作業を進めることに戸惑った経験はありませんか?特に、複雑な既存システムの保守運用では、コードを一行ずつ読み解いたり、ドキュメントを探し回ったりするのに多くの時間が必要でした。
しかし、ジョインについてもAIは力強く支援してくれます。
6月にカンリー店舗集客にジョインした私が、Laravel未経験の状態からAIツールを駆使してわずか1ヶ月で実務にキャッチアップした方法をご紹介します。

従来のチームジョイン手法の課題

AI以前は新チーム参加時のキャッチアップは以下のような流れで実施していました:

  • ドキュメント探し: 散在する設計書や手順書を探し回る
  • 先輩への質問: 忙しい先輩エンジニアの時間をいただいて基本的な質問を繰り返す
  • コード読み込み: 文脈の分からないコードを一行ずつ追いかける
  • 試行錯誤: 影響範囲が分からないまま恐る恐る作業を進める

大抵はE2Eテストを作りながら上のようなことを実施しつつ、システムの大きさにもよりますが1~3ヶ月かけてジョインするのが普通だったと思います。

AIを活用したチームジョイン

プロジェクト全体の俯瞰理解

まず最初に、プロジェクト全体の構造を把握することから始めました。ここではCursorを活用して、プロジェクトの「地図」を作成しました。

質問例:

このプロジェクトの簡単なディレクトリ構成を教えてください。

AIからの回答例(抜粋):

このプロジェクトはLaravelフレームワークを使用したPHPプロジェクトのようです。主なディレクトリ構成は以下の通りです:

主要なディレクトリ:
- app/ - アプリケーションのメインコードが格納されています
- config/ - 設定ファイルが格納されています
- database/ - データベース関連のファイル(マイグレーション、シーダーなど)
- resources/ - ビュー、アセット、言語ファイルなど
- routes/ - ルーティング定義ファイル
...

Docker関連:
- docker/ - Docker関連の設定ファイル
- laradock/ - Laradockの設定ファイル
- 複数のdocker-compose.ymlファイル(異なる環境用)

続いて、デプロイフローについても質問しました:

デプロイの取り扱いはどうなっていますか。
プロジェクトのデプロイ構成について、以下のように整理させていただきます:

1. デプロイ環境
- 本番環境(Production)
- ステージング環境(Staging)
- 開発環境(Development)

2. デプロイ方式
- GitHub Actionsを使用したCI/CDパイプライン

3. デプロイフロー
本番環境(Production):
- `release`ブランチへのプッシュで自動デプロイ
- ECS Fargateを使用
- 複数のWebサーバー(3台)とバッチサーバー(2台)にデプロイ
- デプロイ完了時にSlack通知

ステージング環境(Staging):
- `main`ブランチへのプッシュで自動デプロイ
- ECS Fargateを使用
- デプロイ完了時にSlack通知

...(省略)...

8. モニタリング
- Datadogを使用したアプリケーションとインフラのモニタリング
- ログ集約と分析
- パフォーマンスモニタリング

結果的に上記の内容については一部ハルシネーションはありましたが、ジョイン当時はREADMEを読む余力がなかった状態で、これらの概要がすぐ生成されるのは大変ありがたいものでした。

Laravel特有の機能に対するキャッチアップ

プロジェクト全体を俯瞰できたところで、次はLaravel Jobを作る必要が出てきたため、Laravelについての理解を深めていきました。Laravel利用経験がなく、ArtisanコマンドやJob、Queue、バッチ処理などの概念に馴染みがなかったため、AIにひたすら質問を投げることでこれを解消しました。

実際の質問例:

Laravelプロジェクトです。下記を実行した際何が起きるか教えてください。

php artisan import:images-csv
Laravelプロジェクトで`php artisan import:images-csv`コマンドを実行する前に、このコマンドが何をするのかを確認しましょう。まず、プロジェクトの構造を調べて、このコマンドの定義を見つけます。

Ran tool

Laravelプロジェクトであることが確認できました。次に、`import:images-csv`コマンドの定義を探すために、Artisanコマンドが定義されている場所を確認します。

Search files...

Kernel.phpに書かれたコマンドの詳細を確認するために、`ImportImagesCsv`クラスの完全な内容を読み取ります。

...(省略)...

## `php artisan import:images-csv`コマンドの実行内容

このコマンドを実行すると、以下の処理が行われます:

### 1. **CSVファイルの検索**
- 現在の日付(YYYYMMDD形式)で`images_YYYYMMDD.csv`というファイル名を生成
- 設定されたストレージディスク(`config('images_disk')`)から該当ファイルを検索
- 環境変数`IMAGES_FILESYSTEM_DRIVER`で指定されたディスク(デフォルトは`local`)を使用

...(省略)...

AIは思考過程も残してくれるため、Laravelでコマンドを実行する際の定義の方法や設定等が見て取れます。本来であれば公式ドキュメントをがっつり読んだ方が良いのだとは思いますが、今回は実装を急がねばならず時間がない中でも、他の似たようなミドルウェアから類推できる内容と合わせて手早く情報をかき集めました。

実際の調査業務への応用

上記のようにある程度プロジェクトを理解していたおかげで、ジョイン後1ヶ月ほど経った朝方、バッチサーバーが詰まる不具合があった際に、手早くトラブルを収めることができました。上記のようにLaravelのスケジュールの仕組みや、実際の本番サーバーでの設定状況等もある程度把握していたので、手早く詰まっていた時間帯のJobの再実行まで辿り着けました。

Laravelバッチサーバーがxx:xx-yy:yyの間でダウンしました。
下記のジョブのうち、停止時間中に実行予定で、かつ実行時間によって挙動が変わるため再実行が必要なものを特定してコマンドを作成してください。

# インサイトバッチ
CAN_COLLECT_INSIGHTS=true
TIME_TO_COLLECT_INSIGHTS='0 9 * * *'

# SNS Reviews  
CAN_COLLECT_SNS_REVIEWS=true
TIME_TO_COLLECT_SNS_REVIEWS='0 8 * * *'

# リマインダー
CAN_NOTIFY_REMINDER=true
TIME_TO_NOTIFY_REMINDER='0 8 * * *'

...(省略)...
停止したバッチジョブを再実行するコマンド:

* インサイトバッチ: php artisan collect:insights {レポジトリ名}:schedule.php:33-37
* SNS Reviews: php artisan collect:sns_reviews {レポジトリ名}:schedule.php:61-65  
* 投稿承認待ちリマインダー: php artisan notify:reminder {レポジトリ名}:schedule.php:235-239

...(省略)...

当然これらのバッチで良いかレビューが必要ですが、上記のようにジョインしていった結果、Laravelの知識がある程度身についていたため、AIの出力した結果のレビューを実施することができ、お客さま影響は最小にした状態で問題の収束を素早くできました。

おわりに

今回、結果的にあまりジョインに時間をかけられなかったこともあり、AIを駆使してチームの実務に入っていきました。当然時間があるのであればLaravelやPHPの本を通読してから入った方が良いとは考えていますが、一通りの作業実施ができるようになるところまで伴走してくれるため大変強力だと感じています。
AI時代ではキャッチアップが効率的に進むという感触を得ており、新しいチームジョイン時にもAIはマストな時代になったと感じております。

カンリーテックブログ

Discussion