Cara Menggunakan AI untuk Membantu Coding: Strategi, Prompt, dan Best Practices Developer

pindipin
05 October 2026
13 min read
Cara Menggunakan AI untuk Membantu Coding: Strategi, Prompt, dan Best Practices Developer

Artificial Intelligence (AI) dalam software development bukan lagi sekadar eksperimen atau fitur hiburan. Tool seperti GitHub Copilot, Cursor IDE, Claude, ChatGPT, hingga agentic tools seperti OpenCode dan Aider sudah menjadi bagian dari alur kerja harian banyak developer.

Namun, efektivitas AI sangat bergantung pada cara kamu berinteraksi dengan tool tersebut. Tanpa strategi yang jelas, penggunaan AI justru bisa menimbulkan dua masalah. Yang pertama adalah kode spaghetti yang rentan bug karena terlalu banyak melakukan blind copy-pasting. Yang kedua adalah frustrasi ketika AI menghasilkan method halusinatif yang sebenarnya tidak pernah ada di framework.

Artikel ini membahas workflow praktis AI-assisted coding khusus untuk developer—dengan penekanan pada ekosistem PHP dan Laravel—mulai dari pemilihan tool, teknik prompt engineering, skenario refactoring, testing, debugging, hingga langkah mitigasi risiko keamanan.


1. Memahami Ekosistem Tool AI untuk Coding

Tidak semua tool AI dirancang untuk tugas yang sama. Memahami batasan dan spesialisasi dari masing-masing kategori tool akan mencegah kamu salah memilih alat saat bekerja. Kamu bisa membaca lebih lanjut gambaran mendasar tentang alat-alat ini di /apa-itu-ai-coding-assistant.

Kategori ToolContohKasus Penggunaan UtamaCara Kerja
Inline AutocompleteGitHub Copilot, Supermaven, TabnineMelengkapi baris kode, boilerplate, dan fungsi pendek secara real-time.Bekerja pasif di latar belakang IDE berdasarkan buffer teks di sekitarnya.
Context-Aware Chat IDECursor IDE, Windsurf, Copilot ChatRefactoring, feature implementation, tanya-jawab codebase, dan analisis arsitektur.Mengindeks seluruh repositori (RAG) dan menggunakan pencarian simbol/file.
Autonomous AI AgentsOpenCode, Cline (Claude Dev), AiderTask-driven refactoring multi-file, menjalankan CLI command (test/lint), dan bug fixing.Berjalan dalam siklus loop eksekusi (baca file, ubah kode, jalankan test, perbaiki error). Pelajari arsitekturnya di /apa-itu-ai-agent-cara-kerja.

Untuk hasil optimal dalam proyek skala menengah hingga besar, kombinasi antara Inline Autocomplete untuk kecepatan ketik dan Context-Aware IDE / Agentic Tools untuk tugas kompleks adalah pendekatan paling efisien.


2. Framework Prompt Engineering Khusus Coding

Banyak developer mendapatkan jawaban AI yang generik atau kurang akurat karena memberikan prompt yang terlalu singkat, seperti "buatkan fungsi payment Laravel".

Untuk mendapatkan output kode yang langsung siap pakai dan sesuai standar repositori, kamu dapat menggunakan struktur prompt 5 elemen: Role, Context, Task, Constraint, dan Chain-of-Thought (CoT).

Contoh Prompt Komprehensif

[ROLE]
Bertindaklah sebagai Senior Laravel & PHP Architect yang sangat konsisten menerapkan clean code, SOLID principles, dan PHP 8.3 strict typing.

[CONTEXT]
Kami sedang mengerjakan sistem e-commerce berbasis Laravel 11. 
Model `Order` memiliki relasi `belongsTo` dengan `User` dan `hasMany` dengan `OrderItem`.
Kami menggunakan DTO (Data Transfer Object) untuk mempassing data dari controller ke service layer.

[TASK]
Buatlah refactoring untuk proses checkout pesanan yang saat ini menumpuk di `OrderController@store`. Pindahkan logika bisnis ke sebuah Invokable Action Class bernama `CreateOrderAction`.

[CONSTRAINT]
1. Gunakan PHP 8.3 features: constructor property promotion, readonly class, match expression, dan strict types.
2. Bungkus transaksi database dalam `DB::transaction()`.
3. Lempar custom exception `PaymentFailedException` jika verifikasi pembayaran gagal.
4. Jangan menyertakan penjelasan basa-basi. Berikan kode lengkap PHP beserta file DTO-nya.

[CHAIN-OF-THOUGHT]
Sebelum menulis kode final:
1. Uraikan alur validasi dan eksekusi transaksi yang akan terjadi.
2. Tentukan class DTO yang dibutuhkan.
3. Tulis implementasi Action Class.

Dengan memberikan batasan (constraints) dan alur berpikir (chain-of-thought) seperti di atas, model AI tidak akan mengarang pattern sendiri yang tidak sesuai dengan arsitektur proyek kamu.


3. Practical Workflow: Penerapan AI dalam Skenario Harian

Mari bedah penerapan AI pada 4 tugas utama pengembang perangkat lunak: refactoring, unit testing, debugging, dan pembuatan dokumen teknis.

3.1 Refactoring Kode Legacy (PHP 8.2+ & Laravel 11)

Salah satu kegunaan terbaik AI adalah merapikan kode lama (fat controller) menjadi komponen yang terisolasi dan mudah diuji.

Kode Asli (Monolithic Controller)

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Order;
use App\Models\Product;
use Illuminate\Support\Facades\DB;

class OrderController extends Controller
{
    public function store(Request $request)
    {
        if (!$request->has('user_id') || !$request->has('items')) {
            return response()->json(['error' => 'Invalid payload'], 400);
        }

        DB::beginTransaction();
        try {
            $total = 0;
            foreach ($request->items as $item) {
                $product = Product::find($item['product_id']);
                if ($product->stock < $item['quantity']) {
                    DB::rollBack();
                    return response()->json(['error' => 'Out of stock'], 422);
                }
                $product->decrement('stock', $item['quantity']);
                $total += $product->price * $item['quantity'];
            }

            $status = 'pending';
            if ($request->payment_method === 'credit_card') {
                $status = 'paid';
            } elseif ($request->payment_method === 'bank_transfer') {
                $status = 'awaiting_payment';
            }

            $order = Order::create([
                'user_id' => $request->user_id,
                'total_amount' => $total,
                'status' => $status,
            ]);

            DB::commit();
            return response()->json($order, 201);
        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }
}

Prompt Refactoring ke AI

"Refactor method store di atas menggunakan Laravel 11 best practices. Pisahkan ke Form Request StoreOrderRequest, Enum OrderStatus, dan Invokable Action Class CreateOrderAction. Gunakan PHP 8.2+ readonly class dan match expression."

Hasil Refactoring yang Dihasilkan AI

Enum Status Pesanan
<?php

declare(strict_types=1);

namespace App\Enums;

enum OrderStatus: string
{
    case Paid = 'paid';
    case AwaitingPayment = 'awaiting_payment';
    case Pending = 'pending';

    public static function fromPaymentMethod(string $method): self
    {
        return match ($method) {
            'credit_card' => self::Paid,
            'bank_transfer' => self::AwaitingPayment,
            default => self::Pending,
        };
    }
}
Invokable Action Class
<?php

declare(strict_types=1);

namespace App\Actions;

use App\Enums\OrderStatus;
use App\Exceptions\OutOfStockException;
use App\Models\Order;
use App\Models\Product;
use Illuminate\Support\Facades\DB;

final readonly class CreateOrderAction
{
    /**
     * @param array<int, array{product_id: int, quantity: int}> $items
     */
    public function execute(int $userId, array $items, string $paymentMethod): Order
    {
        return DB::transaction(function () use ($userId, $items, $paymentMethod) {
            $total = 0;

            foreach ($items as $item) {
                $product = Product::findOrFail($item['product_id']);

                if ($product->stock < $item['quantity']) {
                    throw new OutOfStockException("Stok produk {$product->name} tidak mencukupi.");
                }

                $product->decrement('stock', $item['quantity']);
                $total += $product->price * $item['quantity'];
            }

            return Order::create([
                'user_id' => $userId,
                'total_amount' => $total,
                'status' => OrderStatus::fromPaymentMethod($paymentMethod)->value,
            ]);
        });
    }
}
Controller Hasil Refactoring
<?php

declare(strict_types=1);

namespace App\Http\Controllers;

use App\Actions\CreateOrderAction;
use App\Http\Requests\StoreOrderRequest;
use Illuminate\Http\JsonResponse;

final class OrderController extends Controller
{
    public function __invoke(StoreOrderRequest $request, CreateOrderAction $action): JsonResponse
    {
        $order = $action->execute(
            userId: $request->validated('user_id'),
            items: $request->validated('items'),
            paymentMethod: $request->validated('payment_method')
        );

        return response()->json($order, 201);
    }
}

Hasil refactoring ini jauh lebih bersih, mengikuti Single Responsibility Principle (SRP), dan mudah dibuatkan unit test-nya secara terpisah.


3.2 Pembuatan Automated Unit Test (Pest PHP)

Menulis unit test manual sering kali memakan waktu pada bagian penyiapan mocking dan boilerplate setup. AI dapat membuat test suite yang mencakup skenario sukses (happy path) maupun skenario kegagalan (edge cases).

Prompt Pest PHP Test

"Buatkan test suite menggunakan Pest PHP versi 3 untuk CreateOrderAction di atas. Sertakan skenario: 1) Berhasil membuat order dengan status yang sesuai, 2) Gagal dan melempar OutOfStockException jika stok kurang. Gunakan RefreshDatabase trait dan Eloquent factories."

Hasil Test Code Pest PHP

<?php

use App\Actions\CreateOrderAction;
use App\Enums\OrderStatus;
use App\Exceptions\OutOfStockException;
use App\Models\Product;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('creates an order successfully with correct payment status', function () {
    $user = User::factory()->create();
    $product = Product::factory()->create([
        'stock' => 10,
        'price' => 50000,
    ]);

    $action = app(CreateOrderAction::class);

    $order = $action->execute(
        userId: $user->id,
        items: [
            ['product_id' => $product->id, 'quantity' => 2],
        ],
        paymentMethod: 'credit_card'
    );

    expect($order)->toBeInstanceOf(\App\Models\Order::class)
        ->and($order->total_amount)->toBe(100000)
        ->and($order->status)->toBe(OrderStatus::Paid->value);

    $this->assertDatabaseHas('products', [
        'id' => $product->id,
        'stock' => 8,
    ]);
});

it('throws out of stock exception when product stock is insufficient', function () {
    $user = User::factory()->create();
    $product = Product::factory()->create([
        'stock' => 1,
    ]);

    $action = app(CreateOrderAction::class);

    $action->execute(
        userId: $user->id,
        items: [
            ['product_id' => $product->id, 'quantity' => 5],
        ],
        paymentMethod: 'bank_transfer'
    );
})->throws(OutOfStockException::class);

3.3 Debugging Error Stack Trace

Ketika terjadi error di lingkungan lokal atau staging, alih-alih membaca ratusan baris log secara manual, pasok stack trace dan potongan kode terkait ke AI.

Prompt Debugging

Aplikasi Laravel melempar exception saat menjalankan background queue worker:

Illuminate\Contracts\Container\BindingResolutionException: Target [App\Contracts\PaymentGatewayInterface] is not instantiable while building [App\Services\CheckoutService].

Snippet AppServiceProvider.php:
public function register(): void
{
    // ...
}

Analisis akar masalah (root cause) dan berikan perbaikan kodenya.

Tanggapan & Diagnosa AI

AI akan mengidentifikasi bahwa PaymentGatewayInterface belum terikat (unbound interface) pada IoC Container Laravel, lalu memberikan perbaikan langsung:

// App\Providers\AppServiceProvider.php

public function register(): void
{
    $this->app->bind(
        \App\Contracts\PaymentGatewayInterface::class,
        \App\Services\StripePaymentGateway::class
    );
}

3.4 Memahami & Dokumentasi Legacy Code

Jika kamu baru bergabung ke sebuah proyek dengan kode warisan tanpa dokumentasi, kamu bisa meminta AI menjelaskan alur sistem dan membuatkan visualisasinya dengan Mermaid syntax.

Prompt Diagram Mermaid

"Jelaskan data flow dari OrderController dan CreateOrderAction di atas, lalu buatkan diagram urutan (sequence diagram) dalam format Mermaid."

Output Diagram Mermaid

Database (MySQL)CreateOrderActionStoreOrderRequestOrderControllerDatabase (MySQL)CreateOrderActionStoreOrderRequestOrderController#mermaid-muukancn-w5h8l5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-muukancn-w5h8l5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-muukancn-w5h8l5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-muukancn-w5h8l5 .error-icon{fill:#552222;}#mermaid-muukancn-w5h8l5 .error-text{fill:#552222;stroke:#552222;}#mermaid-muukancn-w5h8l5 .edge-thickness-normal{stroke-width:1px;}#mermaid-muukancn-w5h8l5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-muukancn-w5h8l5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-muukancn-w5h8l5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-muukancn-w5h8l5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-muukancn-w5h8l5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-muukancn-w5h8l5 .marker{fill:#333333;stroke:#333333;}#mermaid-muukancn-w5h8l5 .marker.cross{stroke:#333333;}#mermaid-muukancn-w5h8l5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-muukancn-w5h8l5 p{margin:0;}#mermaid-muukancn-w5h8l5 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-muukancn-w5h8l5 text.actor>tspan{fill:black;stroke:none;}#mermaid-muukancn-w5h8l5 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-muukancn-w5h8l5 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-muukancn-w5h8l5 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-muukancn-w5h8l5 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-muukancn-w5h8l5 #arrowhead path{fill:#333;stroke:#333;}#mermaid-muukancn-w5h8l5 .sequenceNumber{fill:white;}#mermaid-muukancn-w5h8l5 #sequencenumber{fill:#333;}#mermaid-muukancn-w5h8l5 #crosshead path{fill:#333;stroke:#333;}#mermaid-muukancn-w5h8l5 .messageText{fill:#333;stroke:none;}#mermaid-muukancn-w5h8l5 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-muukancn-w5h8l5 .labelText,#mermaid-muukancn-w5h8l5 .labelText>tspan{fill:black;stroke:none;}#mermaid-muukancn-w5h8l5 .loopText,#mermaid-muukancn-w5h8l5 .loopText>tspan{fill:black;stroke:none;}#mermaid-muukancn-w5h8l5 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-muukancn-w5h8l5 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-muukancn-w5h8l5 .noteText,#mermaid-muukancn-w5h8l5 .noteText>tspan{fill:black;stroke:none;}#mermaid-muukancn-w5h8l5 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-muukancn-w5h8l5 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-muukancn-w5h8l5 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-muukancn-w5h8l5 .actorPopupMenu{position:absolute;}#mermaid-muukancn-w5h8l5 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-muukancn-w5h8l5 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-muukancn-w5h8l5 .actor-man circle,#mermaid-muukancn-w5h8l5 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-muukancn-w5h8l5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}alt[Stock Available][Stock Insufficient]ClientPOST /orders (Payload JSON)1Validate Input2Validated Data3execute(userId, items, paymentMethod)4Begin Transaction5Check Product Stock6Decrement Stock & Insert Order7Commit Transaction8Return Order Model9HTTP 201 Created (JSON Response)10Rollback Transaction11Throw OutOfStockException12HTTP 422 Unprocessable Entity13Client

Diagram ini dapat langsung dipasang pada file README.md repositori untuk membantu anggota tim lainnya.


4. Persisten Project Rules (.cursorrules / AGENTS.md)

Agar tidak perlu mengulang instruksi yang sama di setiap percakapan prompt, manfaatkan file instruksi proyek persisten seperti .cursorrules atau AGENTS.md di root directory repositori.

Contoh File AGENTS.md untuk Proyek Laravel Modern

# Repository Guidelines for AI Assistants

## Tech Stack & Environment
- PHP 8.3 / Laravel 11
- Database: PostgreSQL
- Testing Framework: Pest PHP v3
- Code Quality: Laravel Pint & PHPStan (Level 8)

## Architecture & Coding Standards
1. Strict Types: Always include `declare(strict_types=1);` at the top of PHP files.
2. Architecture: Use Invokable Action Classes for business logic. Keep Controllers thin.
3. Type Hinting: Always use explicit return types and property types. Avoid `mixed` where possible.
4. Testing: Never use PHPUnit class syntax; write all tests using Pest syntax (`it(...)` or `test(...)`).
5. Security: Never hardcode secret credentials or API tokens. Use `config(...)` or `.env`.

## Response Format
- Return clean PHP code without conversational filler.
- Ensure all imports (`use` statements) are fully present and correctly namespaced.

Saat file ini ada di repositori, IDE seperti Cursor atau agentic tools seperti OpenCode akan membaca aturan tersebut secara otomatis sebelum memproses prompt kamu.


5. Mitigasi Risiko, Bahaya, dan Pitfalls

Meskipun AI sangat membantu, menggunakannya secara buta tanpa pengawasan membawa risiko fatal bagi stabilitas dan keamanan aplikasi.


5.1 Hallucinated Methods (Halusinasi Code)

  • Bahaya: AI terkadang merekomendasikan method yang terlihat meyakinkan namun sebenarnya tidak pernah ada di PHP atau Laravel (misalnya: User::whereActive()->getOrThrow()).
  • Mitigasi: Selalu jalankan static analysis tool seperti PHPStan atau Psalm di level ketat (Level 5–8). PHPStan akan langsung mendeteksi panggilan method atau class yang tidak terdefinisi sebelum kode masuk ke production.

5.2 Kebocoran Kunci Rahasia & Data Privasi

  • Bahaya: Mengirim snippet kode yang memuat API key Stripe, kredensial AWS, atau data pelanggan nyata ke provider cloud LLM.
  • Mitigasi:
    • Tambahkan .env, config/secrets.php, atau file kredensial ke dalam file .cursorignore atau .copilotignore.
    • Pastikan tim kamu menggunakan fitur Zero Data Retention (ZDR) jika berlangganan AI enterprise plan.

5.3 Celah Keamanan (Security Vulnerabilities)

  • Bahaya: Kode hasil AI mungkin mengandung celah klasik seperti SQL Injection (akibat penggunaan DB::raw dengan rekonsiliasi string unescaped), Mass Assignment vulnerability, atau XSS.
  • Mitigasi: Periksa secara manual setiap query database buatan AI. Pastikan seluruh input pengguna melewati kelas FormRequest validasi sebelum digunakan.

5.4 Blind Copy-Pasting & Pendangkalan Pemahaman

  • Bahaya: Developer meng-accept saran AI dengan menekan Tab tanpa membaca atau memahami logika di baliknya. Hal ini menciptakan technical debt yang sulit dimaintain di kemudian hari.
  • Mitigasi: Terapkan aturan pribadi: "Jangan commit kode yang tidak kamu pahami 100%." Jika ada bagian sintaks atau logika yang asing, tanyakan kembali ke AI: "Jelaskan mengapa Anda memilih pendekatan algoritma ini dibanding loop biasa?"

6. The Verification Loop: Workflow Ideal Developer Modern

Untuk menggabungkan efisiensi AI dan keamanan aplikasi, terapkan alur verifikasi berlapis (The Verification Loop) pada setiap perubahan kode:

  1. Prompt / Request AI: Minta AI menghasilkan atau mengubah kode berdasarkan konteks yang spesifik.
  2. Human Code Review: Dekati kode tersebut dengan sikap kritis. Baca alur logika, struktur tipe data, dan alur eksepsinya.
  3. Automated Formatting: Jalankan linter otomatis (vendor/bin/pint) untuk menyesuaikan gaya penulisan dengan standar proyek.
  4. Static Analysis Check: Jalankan analyzer (vendor/bin/phpstan analyse) untuk memastikan tidak ada method halusinasi atau type mismatch.
  5. Run Automated Test: Jalankan tes suite (vendor/bin/pest) untuk memastikan fitur baru tidak merusak fitur lama (regression check).
  6. Git Commit: Setelah seluruh tahap di atas lolos, simpan perubahan ke dalam version control. Untuk alur tim yang terstruktur, ikuti /workflow-git-laravel.

7. Penutup

AI adalah pengali efisiensi (leverage multiplier) yang sangat hebat bagi developer. Tool ini dapat memangkas waktu kerja monoton seperti penulisan boilerplate, pembuatan unit test, dan pemformatan data.

Namun, posisi kamu sebagai Architect, Security Gatekeeper, dan Code Reviewer tidak pernah tergantikan. Kualitas aplikasi akhir tetap sepenuhnya menjadi tanggung jawab developer yang menekan tombol commit.

Dengan menerapkan framework prompt yang terstruktur, memanfaatkan file instruksi persisten (AGENTS.md), serta menjalankan siklus verifikasi ketat (Verification Loop), kamu dapat meningkatkan produktivitas koding hingga berkali-kali lipat tanpa mengorbankan kualitas dan keamanan perangkat lunak.

Referensi Terpercaya

Bagikan Artikel:
Diskusi & Komentar

Fitur komentar belum diaktifkan oleh administrator.

Artikel Terkait

Selesai membaca? Kembali ke beranda untuk melihat artikel menarik lainnya.

Kembali ke Beranda