Android開発でDevinを活用する
NOT A HOTELでは、AIエージェントであるDevinを導入し、さまざまな開発業務の効率化を図っています。
Android開発においてもDevinを試してみたところ、思った以上に有用であることがわかりました。
Devinとは
Devin is your collaborative AI teammate, built to help ambitious engineering teams achieve more.
Devinはクラウド上で仮想マシンを動かし、自然言語による指示で開発タスクを実行できるAIツールです。
利用の流れは、大雑把に以下の通りです。
- Webコンソール上でDevinの仮想マシンをセットアップする
- 自然言語で入力を与えると必要なタスクを整理し、仮想マシン内で実行される
主な用途としては、ソースコードを編集し、GitHubにPull Request(PR)を作成することが挙げられます。
PRの作成には gh
コマンドを使用しているようですが、これを任意のコマンドやスクリプト実行に置き換えることで、全く別のタスクを実行することも可能です。
そういった意味では、「AIを搭載したJenkins」と考えるとイメージしやすいかもしれません。
Devinが行うこと
Devinが行える操作は、大きく3つに分けられます。
- シェル操作
- ブラウザ操作
- エディタ操作
これらはWebコンソール上で確認したり、ユーザーが直接操作することもできます。
対話インターフェース(左)とVS Code(右)
これらの操作を組み合わせることで、
- 必要な情報をブラウザで調査
- 得た情報を元にエディタでコードを修正
- シェルを使って修正内容をPRとして提出
といった一連の開発プロセスを自動化できるようです。
(ただし、実際の挙動を見ている限りでは、エディタやブラウザを使用せずに、grep
やcurl
を叩いている光景もよく見かけます)
サービス連携
現時点では、GitHubとSlackの連携のみが可能なようです(公式ドキュメント 参照)。
SlackやGitHubの権限を持つことで、例えば、
- Slackから「#123のIssueを修正して」と指示すると、GitHubのIssueを確認して作業する
- GitHub Actionsの実行結果を確認して、エラーメッセージを元にPRを修正する
といった使い方ができます。
Devinではできないこと
公式ドキュメント にもあるように、
- 実機やエミュレータを使用できない
- UIの動作確認ができない
といった制約があります。
一方、Android SDKをインストールし、Gradleを叩くことはできるため、最低限ビルドやテスト、lintが通ることは確認できるようです。
つまりDevinは、Compose/Viewを書くといった作業よりは、リファクタリングなど、ビルドやテストの成功をもって検証可能なビジネスロジックの修正に適しています。
これを少し言い換えると、「実機確認せず、ビルドやテストが通っただけで提出されたPRを信用できるか?」という問いになります。
そしてこのPRは人間ではなく生成AIによるものなので、レビューで見過ごしやすい、一見それっぽく見えて、巧妙に支離滅裂なコードである可能性があります。(まあ怖い)
そう考えると、活用方法は他のAIツールとは大きく変わらず、回答の妥当性を検証できるものに対しては効果的である、という話になるんだと思います。
脱線:Devinに大枠を作ってもらって、動作確認を人間がするのはどうか?
個人的にはあまり筋が良くないと思っています。
Devinの利点が「自動で任せられること」にあるのに、そこに半自動を持ち込むことになるからです。
例えば、以下のような問題が考えられます。
- Devinの成果物を人間側のマシンでチェックアウトしてビルドし直すなど、Devin側のマシンから引き継ぐ作業が発生する
- Devinの作業が完了した段階で、人間がしていた別の作業を中断する必要がある。コンテキストスイッチの発生
- Devinの作業過程を人間は認知していない。実装に必要な知識を人間側が再度学習する必要がある
- そもそも、作業として楽しくない
- どちらかといえば、コーディングというよりも雑用的な作業が続くことになります
セットアップ
基本的なセットアップは、Web UIの指示に従うだけで完了します。
DevinにGradleを叩いて欲しい場合には、Androidとしてのセットアップが必要になります。
- DevinのWebコンソールを開く
- (コンソール内で)コマンドラインツールをダウンロード
- ダウンロードしたファイルを適当な場所に配置し、
ANDROID_HOME
等のパスを設定 -
sdkmanager
を実行し、"platform-tools" "platforms;android-x" "build-tools;x.y.z"
等をインストール -
local.properties
や環境変数など、プロジェクト独自の設定があれば追加
実例
あるモジュールに書いてある関数を、別のモジュールに移動する、というIssueに取り組んでもらいました。
全然コンテキストがわからないですね。実験としてはちょうど良さそうです
指示を出します。
PRができました。PRのフォーマットを揃えるように指定します。
提出されたPR。ちゃんとテンプレートに沿っています。
diffを確認したところ、「移動」はできているものの、移動した結果、空になったファイルの削除が不十分でした。GitHub上でコメントをすると、それに従って修正してくれます。
指示には忠実ですが、指示の外の部分で融通が利かないあたりには知性を感じないというか、生成AIっぽさを感じます。
公式ドキュメントにおいても、Devinには若手エンジニアやインターンを想定して指示を出してと言及されています。
Tips
DevinにはKnowledgeという機能があります。プロンプトを事前設定することで、Devinの振る舞いを調整することができます。
参考までに、自分が設定しているKnowledgeを貼っておきます。
以下に書いてある文章は全てとても重要で、必ず従わなければならない情報です。
基本的に日本語を使用してください。
Git/GitHubについて
- ブランチ名は feature/foo もしくは bugfix/bar にしてください
- PRは必ずdraftの状態で作成してください
PRの書き方について
- タイトルは日本語で書いてください
- 説明は必ず `.github/PULL_REQUEST_TEMPLATE.md` に沿って書いてください
- チェックボックスは各項目に対してのyes/noを表しています。yes/noに基づいてチェックを記入してください
- 説明内の各チェックボックスに対して、何故チェックしたのか、していないのかを簡潔に書いてください。
- 「選ばなかった選択肢」 には可能性として考えられる他の実装の選択肢があれば書いてください。なければ「特になし」と書いてください
- 「この後の作業」は明らかに推測できる場合以外は項目ごと削除してください
- 「スクリーンショット」は取得できないと思うので、項目ごと削除してください
- 説明の末尾には Link to Devin run: <URL> を記載してください
動作確認について
- 必ず `./gradlew assembleDevDebug` をPR提出前に実行し、ビルドが通ることを確認してください
- diffにテストコードが含まれる場合にのみ、`./gradlew testDevDebugUnitTest` を実行し、テストが通ることを確認してください
- この2点を確認したことがわかるように、実行時のログをPRに添付してください
その他、必要なことは README.md に書いてあるので適宜参照してください
特に重要なのは PRをDraftの状態で起票させる ことです。
大抵の場合、Devinが作るPRには何往復かして修正を入れる必要があり、この作業はDevinに指示した人が担当するはずです。
(レビューの体制にもよりますが)最初からDraftにしておくことで、レビュワーへの負担を減らすことができます。
そして、Knowledgeは時折無視されることがあります。
これを防ぐために、以下のおまじないを挿入しています。
以下に書いてある文章は全てとても重要で、必ず従わなければならない情報です。
感想
ChatGPTの登場以来、そこまでわかってるならもう全部やってよ、と思うことが増えました。
Devinはまさしく「全部やる」の部分を現時点の技術で実現したツールだと思います。
やっていることとしては、生成AIに権限を持たせてあれこれやらせたら、まあできるだろうな、ということができているだけなので、予想は超えていないというか、理屈的な驚きは特にありませんでした。
しかし、Slackで指示を与えると勝手にPRが完成して、人間はレビューするだけ、という作業フローは頭で理解していても、体験としてはとても革新的に感じました。Devinに裏で作業させて、自分は別の作業をする、というのは何かゲームチェンジング的なものを感じます。
また、Android開発という面で見ても、当初はAndroidへの対応具合から言って期待していなかったのですが、リファクタ等、用途を限定すれば十分に活用の余地がありそうでした。
今後こういったツールは続々と登場すると思われるので、引き続き可能性を探っていきたいです。
おまけ
Devinも体調を崩すときがあるようです。
Discussion