【Jules】Geminiが2週間かかると言った機能実装を土日で終わらせた
Julesとは?
GoogleがI/O 2025で発表したAIコーディングエージェントのことです。githubのリポジトリを登録してプロンプトを入力すれば自律的にコーディングしてくれるのが特徴で、DevinやCopilot Agentが先行して公開されていました。
今回のGoogleからの発表により、MicrosoftはCopilot Agent、GoogleはJules、OpenAIはCodexなど、主要なテクノロジー企業からツールが出揃ったことになりますね。
個人的には料金の面で使いやすいなと思っています。1日60タスクまで無料で、実験するには十分な量の無料枠があるのが嬉しい!
使ってみた
今回任せた実装タスク
今個人開発で進めている実装タスクを任せました。
もともとまとめていた実装タスクのMarkdown
## レビュー機能 実装タスク一覧
### 1. バックエンド (Ruby on Rails)
#### 1.1. DB・モデル更新
- [ ] `reviews`テーブルに`image_url` (string, nullable) と `scene_tag_id` (integer, nullable, FK to `tags`テーブル) を追加するマイグレーションファイルを作成する。
- [ ] 作成したマイグレーションを実行する (`rails db:migrate`)。
- [ ] `app/models/review.rb` に`belongs_to :scene_tag, class_name: 'Tag', optional: true` の関連付けを追加する。
- [ ] `app/models/review.rb` に必要なバリデーション(例: `rating`や`comment`の存在チェック)を追加する。
#### 1.2. レビュー投稿API実装 (`POST /api/restaurants/:restaurant_id/reviews`)
- [ ] `config/routes.rb`に、restaurantsにネストした形でreviewsへのルーティングを追加する (`resources :reviews, only: [:create]`)。
- [ ] `Api::ReviewsController`と`create`アクションの骨子を作成する。
- [ ] JWT認証を必須にする (`before_action :authenticate_user!`)。
- [ ] 画像アップロード処理を実装する(受け取ったファイルをサーバーに保存し、アクセス可能なURLを生成する)。
- [ ] Strong Parametersで`comment`, `rating`, `image`, `scene_tag_id`を許可する設定を記述する。
- [ ] `create`アクション内で、認証済みユーザー (`current_user`) に紐付けてレビューをDBに保存するロジックを実装する。
- [ ] 保存成功時に、作成されたレビューオブジェクトのJSONとHTTPステータス`201 Created`を返す。
- [ ] バリデーションエラー時に、エラーメッセージのJSONとHTTPステータス`422 Unprocessable Entity`を返す。
- [ ] (推奨) RSpecで`create`アクションのテストを作成する(正常系、異常系)。
#### 1.3. 店舗詳細API改修 (`GET /api/restaurants/:id`)
- [ ] `Api::RestaurantsController`の`show`アクションを修正する。
- [ ] N+1問題を避けるため、`.includes(reviews: [:user, :scene_tag])`などを使い、レビューとその関連情報(投稿ユーザー、シーンタグ)をまとめて取得するようにする。
- [ ] レスポンスJSONに`reviews`というキーで、レビュー情報の配列を含めるように変更する。
- [ ] `reviews`配列内の各レビューオブジェクトには、ユーザー名、コメント、評価、画像URL、シーンタグ名などの必要な情報を含めるように整形する。
- [ ] (推奨) RSpecで、レスポンスにレビュー情報が正しく含まれていることを検証するテストを追加する。
---
### 2. フロントエンド (Next.js)
#### 2.1. レビュー投稿フォーム実装
- [ ] `GET /api/tags?category=scene` を呼び出し、シーンタグの選択肢を取得するAPI連携処理を実装する。
- [ ] レビュー投稿フォームのUIコンポーネントを作成する。
- [ ] コメント入力用の`<textarea>`
- [ ] 星評価選択用のUI(例: クリック可能な星アイコン)
- [ ] 画像1枚アップロード用の`<input type="file">`
- [ ] (努力目標) 選択された画像のプレビュー機能
- [ ] シーンタグ選択用の`<select>`(APIから取得したデータを表示)
- [ ] 送信ボタン
- [ ] フォームの入力値(コメント、評価、画像ファイル、選択されたシーンタグID)を管理するReact state(またはZustandストア)を実装する。
- [ ] フォーム送信時に`FormData`を使用して、レビュー投稿APIにPOSTリクエストを送る処理を実装する。
- [ ] APIの成功・失敗に応じたユーザーへのフィードバック(Toast通知やメッセージ表示など)を実装する。
#### 2.2. レビュー一覧表示実装
- [ ] 1つのレビュー情報を表示するための`ReviewCard`コンポーネントを作成する。
- [ ] 投稿者名・アイコン
- [ ] 星評価の表示
- [ ] コメント本文
- [ ] 投稿された画像(`<img>`タグ)
- [ ] 選択されたシーンタグ名
- [ ] 店舗詳細ページで、APIから取得した`reviews`配列をmap処理で`ReviewCard`コンポーネントに渡し、一覧表示するロジックを実装する。
- [ ] レビューが0件の場合の表示(例: 「まだレビューはありません」)を実装する。
- [ ] レビュー投稿成功後に、レビュー一覧が自動的に更新されるようにする(APIを再取得するか、ローカルのstateを更新する)。
---
### 3. 統合・レイアウト調整
- [ ] 店舗詳細ページに、サイドバー(店舗詳細情報)とメインコンテンツ(レビュー機能)の2カラムレイアウトを実装する。
- [ ] 店舗詳細ページで、レビュー投稿から一覧表示までの一連の流れが正しく動作することをE2E(エンドツーエンド)でテストする。
- [ ] レスポンシブ対応の基本的な確認と、必要に応じたスタイルの調整を行う。
- [ ] 全体的なバグ修正とUIの微調整。
このMarkdownもAIにレビュー&出力させているので、ほんとに最近はAIサマサマです。
従来の実装スタイルではどれくらいかかるのか?
Julesを試した目的は「自律型コーディングさせるとどれくらい効率的に開発できそうなのか?」を知ることだったので、従来の「Copilot等の補助AIツール使いながら自分で実装する」スタイルでこの機能実装するにはどのくらいの期間がかかりそうかをざっくり考えてみました。
結論としては 「自分だったら2週間くらいかかりそう、もっと熟練した方であれば1週間くらい」 です。根拠は自分の勘とGemini。
はい、承知いたしました。
レビュー機能の実装を、AIをフル活用する2年目のエンジニア1名が担当すると仮定した場合の工数と期間を再見積もりします。
見積もりの前提(変更点)
チーム体制: 2年目のエンジニア1名。
生産性の変化:
プラス要因: 2ヶ月目の方への指導やサポート、チーム内のコミュニケーションコストがゼロになり、100%自身の開発作業に集中できます。
考慮事項: 5年目のエンジニアと比較すると、未知の技術的な問題に直面した際の調査やデバッグ、複雑な設計判断に時間がかかる可能性があります。
AIとのシナジー効果: AIを効果的に活用し、コーディング速度を上げることができますが、5年目のベテランエンジニアと比較すると、AIの提案を評価・修正する時間や、より高度な指示を出すスキルに差が出る可能性があります。
工数見積もり(2年目エンジニア1名+AIの場合)
タスク内容は変わりませんが、担当者の経験値を考慮して各工数を見積もり直します。
1. バックエンド (BE) 実装: 約 2.5〜4.5 人日
DB・モデル更新 (0.25人日): 変更なし。
レビュー投稿API実装 (1.25〜2.25人日): 画像アップロード処理などで、少し調査や試行錯誤の時間が必要になる可能性があります。
店舗詳細API改修 (0.5〜1人日): N+1問題への対処など、パフォーマンスを意識した実装に少し時間がかかるかもしれません。
テスト (RSpecなど) (0.5〜1人日): AIの支援を受けつつ、必要なテストケースを実装します。
2. フロントエンド (FE) 実装: 約 2.5〜4.5 人日
レビュー投稿フォーム実装 (1.5〜2.5人日): 状態管理やFormDataを使った非同期通信など、フロントエンドの複雑な部分で調査やデバッグに時間がかかる可能性があります。
レビュー一覧表示実装 (1〜1.5人日): コンポーネント設計とAPIからのデータ表示を実装します。
レイアウト統合 (0.25〜0.5人日): 既存レイアウトへの組み込み。
3. 結合・調整・バッファ: 約 1〜2 人日
E2Eテスト: 一人で全体を開発するため、大きな連携ミスは少ないかもしれませんが、思い込みによる見落としがないか確認が必要です。
バグ修正: 問題発生時の原因特定と修正に時間がかかる可能性があります。
UI微調整: 全体の使い勝手を見ながら行う軽微な修正。
総合的な期間の見積もり
上記の工数を合計すると、全体で 約6〜11人日 の作業量が見込まれます。
エンジニア1名がフルタイムで専念する場合、**工数(人日)がそのまま所要期間(営業日)**となります。
したがって、このレビュー機能の追加タスクを2年目のエンジニア1名がAIを活用して担当した場合、およそ6営業日から11営業日(約1週間半〜2週間強) が完了までの目安となりそうです。
まずはプロンプトを英語化
ただ、これをそのままプロンプトとして入力するのではなく、実際は英語で入力しました。AIはおそらく日本語よりも英語のほうがコスト&速度の面で効率的に処理できるので、「プロンプトも英語で入力すればいいっしょ!」の精神です。
英語化したプロンプト
Objective: Implement the complete review feature for our restaurant discovery application.
Phase 1: Project Analysis & Contextual Understanding
First, please thoroughly analyze the entire existing project codebase. It's crucial that you understand:
The technology stack: Ruby on Rails (API mode) for the backend, Next.js with TypeScript for the frontend, and PostgreSQL for the database.
Authentication: The system uses JWT for authentication. All write operations must be protected.
Existing code patterns & style: Analyze the current project structure, coding conventions, and existing implementation patterns. All new code must be consistent with these established conventions to maintain code quality and coherence.
After you have a complete understanding of the project, proceed with the implementation tasks below.
Phase 2: Feature Implementation
The goal is to add a complete review system. This involves creating a new API endpoint for submitting reviews, updating an existing API to serve reviews, and building the frontend UI to display and submit reviews.
UI/UX Requirements
The review functionality will be integrated into the restaurant detail page. The layout should be as follows:
A sidebar on the left (approximately 1/3 of the screen width) will persistently display the restaurant's details.
The main content area on the right (approximately 2/3 of the screen width) will be dedicated to the review system. This area must contain both the review submission form and the list of existing reviews.
Backend Tasks (Ruby on Rails API)
Update Review Model and Database Schema:
Goal: Add columns to the reviews table to store an image and a scene tag for each review.
Tasks:
Create a new migration to add image_url (string, nullable) and scene_tag_id (integer, nullable, foreign key to the tags table) to the reviews table.
Update the app/models/review.rb model to include the new belongs_to :scene_tag, class_name: 'Tag', optional: true association.
Implement Review Submission API:
Goal: Create a secure endpoint for authenticated users to post a new review for a specific restaurant.
Tasks:
Define a new endpoint: POST /api/restaurants/:restaurant_id/reviews.
This endpoint must require JWT authentication. The new review should be associated with the authenticated user (current_user).
The controller action should accept: comment (text), rating (integer), a single image (file upload), and a scene_tag_id (integer).
Implement the image upload logic. Save the uploaded file (e.g., to a local directory or a cloud storage service) and store the resulting URL in the image_url column.
On successful creation, respond with the new review object and a 201 Created status code.
Implement proper error handling for validation failures (e.g., respond with a 422 Unprocessable Entity status).
Update Restaurant Detail API to Include Reviews:
Goal: Enhance the existing restaurant detail API to embed all associated reviews.
Tasks:
Modify the show action in the RestaurantsController for the GET /api/restaurants/:id endpoint.
The JSON response for a single restaurant must now include a nested array named reviews.
Use includes (e.g., .includes(reviews: [:user, :scene_tag])) to prevent N+1 query problems.
Each object in the reviews array must contain the review's id, comment, rating, image_url, the associated user's information (at least id and name), and the associated scene_tag's information (id and name).
Frontend Tasks (Next.js & TypeScript)
Implement Review Submission Form Component:
Goal: Create a form on the restaurant detail page that allows users to write and submit a new review.
Tasks:
Create a new React component for the review form.
The form must include inputs for a multi-line comment (textarea), a star-based rating (e.g., 1-5 clickable stars), a single image file upload (<input type="file">), and a select dropdown for a single "scene" tag.
The options for the "scene" tag dropdown must be dynamically fetched from the existing GET /api/tags?category=scene endpoint.
On form submission, create a FormData object to handle the file upload and send a POST request to the new review submission API.
Implement user feedback (e.g., toast notifications or messages) for both successful and failed submissions.
Implement Review List Display Component:
Goal: Display all reviews for the current restaurant on the detail page.
Tasks:
Create a "ReviewCard" component to display a single review.
The ReviewCard must display: the author's name, the star rating, the comment text, the uploaded image (if one exists), and the name of the selected scene tag.
On the restaurant detail page, fetch the restaurant data (which now includes the reviews array) and use the ReviewCard component to render the list of all reviews.
Handle the case where there are no reviews yet.
Please ensure all new code is clean, well-commented where necessary, and adheres to the project's existing conventions and best practices.
プロンプト入れて実行計画を考えさせる
プロンプトを入れると、実装計画を立ててくれます。
トグルを開いてみると、細かくなってていい感じ。
計画作ったからよかったらApproveしてねと言われたのでもちろんGoです。
動かして待つ
計画をApproveすると、実装を始めてくれます。
大量にエラーを出しているので中身見てみると、どうやらJulesの環境でゴニョゴニョしようとしているのでrailsが見つからないよと怒られているみたいです。
コーヒータイムかなと思って放置していたら、50分くらい経って完成したようです。
ちゃんとブランチも切ってくれて、バックエンドのテストも追加したよとのこと。ただ、フロントテストを追加しようとして失敗しているみたいですね。
とりあえずフロントテストまで完成させるように指示しましたが、結局だめだったそうで「完成だよ!」と言ってきました。wipでブランチを出しているあたり、細かいところまで配慮がいってますね。
実際に開いてみた
ブランチに移動して該当機能にアクセスしましたが、フロントでコンパイルエラーが出ていました。
ゴニョゴニョして直して、開いてみたらいい感じに出来上がっています。ボタンのサイズ感ミスってはいるけど許容範囲な気がします。
レビューつけてコメント書いて登録したら、無事レビューが追加されました。
途中でインポートエラーがあったりバージョンのエラーがあったりしたんですが、一応完成までこぎつけることができました🥳
Jules使ってわかったメリットとデメリット
メリット
以下の3点が言えるかなと思います。
- 無料
- Githubと連携するだけでコード実装任せられる
- ベテラン開発者がいるかのような安心感
- 非同期実行
無料
一番デカいです。DevinやClaude Codeは20ドル払わないと使えない中で、無料で試せるのは敷居がとても低いです。ベータ版なのでまずは知名度上げたり情報集めしたいということなんでしょうね。
今回の実装タスクで何回かチャット会話していますが、それでも1タスクとして計算されているみたいです。Dailyで60タスクまで無料なので、今回の実装ももう少し切り分けて並列実装させればよりアウトプットの品質が上がったかもしれないですね。
Githubと連携するだけでコード実装任せられる
githubと認証するだけでリポジトリクローン&コード理解してくれるので、開発を始めるまでの敷居がとても低いです。プロンプト入れたら開発者はコーヒー淹れて待つだけになりつつあります。
空いた時間でリラックスできればいいですが、その時間も別のAIに仕事任せたくなるので一長一短ですね笑
ベテラン開発者が隣にいるかのような安心感
私はまだエンジニア始めて2年目なので、コード品質に自信がありません。数年前であれば、先輩にずっとついてもらわなければ何もできなくなっていたでしょう。しかしAI隆盛期にいる私は、AIが出力する 「ある程度品質の担保されたコード」 を読みまくることができます。
const handleSubmit = async (event: FormEvent) => {
event.preventDefault();
setSubmitError(null);
// クライアントサイドバリデーション
if (rating === 0) {
setSubmitError('Please select a rating.');
return;
}
setIsSubmitting(true);
// FormDataによるファイルアップロード対応
const formData = new FormData();
formData.append('review[comment]', comment);
formData.append('review[rating]', String(rating));
if (image) {
formData.append('review[image]', image);
}
if (sceneTagId && sceneTagId !== 'none') {
formData.append('review[scene_tag_id]', sceneTagId);
}
const response = await authApi.submitReview(restaurantId, formData);
if (response.data) {
// 成功時のクリーンアップ
setComment('');
setRating(0);
setImage(null);
setSceneTagId('none');
// ファイル入力のリセット
const fileInput = document.getElementById('review-image-input') as HTMLInputElement;
if (fileInput) fileInput.value = '';
onReviewSubmitted(); // 親コンポーネントへのコールバック
} else {
setSubmitError(response.error || 'Failed to submit review.');
}
setIsSubmitting(false);
};
こういうコードを読むと、「あ、バリデーションはサーバーに任せきりにしないでクライアントでもやるべきだな」とか、「アップロード成功時にこうやって値をクリアにしていかないといけないよな」と学べるわけです。先輩エンジニアがいなくても、AIがそれなりの品質のコードを出力してくれるので、それを読むだけで勉強できます。最高の時代に生まれたなと思います。
非同期実行
これも地味に嬉しいポイントです。Claude CodeやCursorだと、AIがコード書いている間は画面を占有されてしまいますが、Julesは完全に非同期で動いてくれます。
つまり、「この機能実装しといて!」とJulesに投げて、自分は別のタスクに取り組めるということです。今回も50分くらいかかりましたが、その間に自分は「これ記事にしたら面白そうだな」と思って草案を考えていたりなどしました。将来的には自分の分身を作って、自分の思考を毎回インプットしなくてもその場で意思決定してくれる感じで非同期実装させたいですよね。
デメリット
もちろんいいことばかりではなかったので、使ってみて感じたデメリットもシェアします。
エラーが多い
今回の実装でも何度かエラーが出ていました。遭遇したエラーとしてはこんな感じ↓
- インポートエラー(yarn addしたのに型定義が存在しないと言われる)
- バージョンの不整合(Next.jsのバージョンとインポートしたライブラリの相性)
- 環境依存のエラー(Julesの実行環境とローカルの違い)
環境依存については回避できたような気もします。「Docker環境立ち上げれば大丈夫だよ!」みたいなドキュメントを作っておいて、それを読ませればいいので。
コンテキストの理解が完璧ではない
一応プロンプトでは既存のコードスタイルに合わせてと指示しましたが、微妙に違う書き方をしている部分がありました。
# reviews_controller.rb
before_action :require_authentication!, only: [:create]
def jwt_authentication_required?
action_name.to_sym == :create
end
こんな感じで、認証が必要かどうか判断するためのプライベートメソッドを作っているにも関わらず、before_actionで別途 require_authentication
を呼んでしまっています。AIは念の為の追加チェックだと判断していそうです。些細な違いですが、こういう部分は人間がレビューして修正する必要がありますね。
パッと思いつく解決策でいえば、関数等の上には引数、returnするもの、関数の説明等を書いたコメントを書くように義務付けておくことでしょうか。小さいプロジェクトのうちから徹底するようにしておけばハードルもそんなに高くないと思いつつ、「とりあえず動けばいいか」で済ませてしまうのもエンジニアの性。
UIの細かい調整は苦手
Julesに限ったことではないかもしれませんが、やはりUIの細かい部分は人間が調整したほうが良さそうです。機能的には動くが、見た目がいまいちというパターンが多い印象でした。「いい感じのモダンなデザインにして」ではなく、「いい感じのモダンなデザインにするために、~~~してください」のように命令するといいかも。
英語実装と日本語実装が混在した
日本語でコメント追記しているところと英語でコメント追記しているところが混ざっていました。プロンプトを英語で入力したからでしょうが、やっぱり読みづらいです。とりあえずマージしてしまいましたが、プロフェッショナルな場で使うにはコードコメントを確認して日本語に統一する作業が必要かもしれません。地味に時間かかりそう、、
まとめ
Jules使ってみた感想は、
「めちゃくちゃ便利なので早く正式リリースしてほしい」
という感じです。そうです、まだJulesはベータ版なのです。
とはいえ無料で使えるのはありがたい!Devinも最初は500ドルという高さから20ドルまで敷居を下げてきましたが、20ドルだと1ヶ月間使い倒すのは難しそうです。かといって趣味レベルで20ドル払うかと言われたら微妙ですし、、
今回は2週間かかりそうな実装を50分で(エラー修正含めても2時間くらいで)終わらせることができたので、時間効率としては10倍 になったといえるかもしれません。
ただ、やはり最初の設計のところをきちんと人間がやるのと、コードレビューを真剣にやるところだけは人間様の力が重要になってきそうです。
皆さんもぜひJules試してみてください!無料枠があるうちに色々実験してみるのがおすすめです🚀
追記:ちゃんとコード学習しない設定もできるようです
Discussion