Bayangin ini: lo download Claude Code, Aider, atau Cursor. Lo kasih task pertama — “bikinin REST API buat todo app”. 10 menit kemudian, kodenya jadi, jalan di localhost, dan lo bisa langsung push ke production. Lo merasa 10x lebih produktif.
Fast forward 3 bulan. Lo udah nggak bisa nulis regex dari kepala. Lo nggak tau lagi bedanya async/await sama Promise.then(). Lo ngerasa lebih lambat mikir tanpa AI, dan kode-kode lama lo yang lo tulis sendiri jadi misterius.
Selamat datang di dunia anti-pattern penggunaan AI coding agent — jebakan yang bikin lo keliatan produktif, tapi sebenernya lagi menumpulkan skill dan menumpuk technical debt. 🪤
Apa Itu Anti-Pattern?
Anti-pattern adalah pola yang keliatan kayak best practice, tapi sebenernya bikin lo lebih buruk dalam jangka panjang. Ibarat minum obat penghilang rasa sakit tanpa menyembuhkan penyakit — gejala hilang, tapi masalah makin parah.
Di dunia AI coding agent, anti-pattern ini lebih berbahaya karena:
- 🤖 Output-nya keliatan profesional — format rapi, variable naming bagus, semua jalan
- ⏱️ Feedback loop lambat — efek negatifnya baru keliatan berminggu-minggu atau berbulan kemudian
- 🧠 Skill atrophy nggak terasa — lo nggak sadar kemampuan lo turun sampai tiba-tiba lo butuh debug production dan bingung
Yuk, kita bedah 5 anti-pattern paling umum (plus 2 bonus) — supaya lo bisa avoid jebakan ini.
Anti-Pattern #1: Pakai AI untuk Hal yang Butuh Pemahaman Mendalam
Ini mungkin anti-pattern yang paling sering terjadi. Lo ngasih task ke AI yang sebenernya membutuhkan lo untuk paham konteks, trade-off, dan implikasi jangka panjang.
Contoh Nyata
Lo lagi design sistem payment processing buat e-commerce. Daripada mikirin dulu:
- Idempotency: gimana handle retry dari payment gateway?
- Concurrency: gimana handle race condition di saldo user?
- Failure mode: gimana kalau payment sukses di gateway tapi gagal di database?
- Regulasi: PCI-DSS compliance, audit trail, dsb.
Lo langsung bilang ke AI: “Bikinin payment service pake Stripe webhook”. AI ngikutin, kasih kode, jalan. Tapi:
- ❌ Lo nggak tau kenapa ada webhook signature verification
- ❌ Lo nggak sadar ada edge case yang nggak ke-handle
- ❌ Lo nggak tau trade-off antara sync vs async processing
- ❌ Lo nggak bisa debugging kalau ada masalah di production
Kenapa Berbahaya?
Lo ngerasa “udah selesai”, tapi sebenernya lo cuma nunda learning. Sistem yang kritis butuh deep understanding, bukan cuma code yang jalan. Lo bakal stuck pas:
- Sistem error dan lo nggak tau root cause-nya
- Butuh extend fitur dan lo nggak tau dimana harus ubah
- Tim baru nanya kenapa pakai approach A bukan B — dan lo nggak bisa jawab
Cara Fix
Sebelum delegasi ke AI, tanya ke diri sendiri:
- “Apakah task ini butuh trade-off analysis?” — kalau iya, lo yang harusnya mikir, bukan AI
- “Apakah ada implikasi bisnis yang nggak keliatan di kode?” — kalau iya, diskusi sama stakeholder dulu
- “Apakah gue akan mampu debug ini 6 bulan lagi?” — kalau nggak, jangan delegasi
AI boleh bantu implementasi setelah lo paham design-nya, tapi bukan bantuin lo decide design-nya.
Anti-Pattern #2: Menerima Kode AI Tanpa Review
“Kalau AI udah bikin dan test-nya lewat, berarti bener dong?” — SALAH BANGET.
Kenapa Code Review Tetap Penting
AI coding agent itu powerful tapi bukan infallible. Dia bisa:
- 🤖 Halusinasi API — ngarang method yang nggak ada di library
- 📅 Pakai pattern outdated — syntax lama yang udah deprecated
- 🔓 Ngabaikan security — SQL injection, XSS, hardcoded secret
- 🐌 Algoritma suboptimal — O(n²) padahal bisa O(n)
- 🧩 Over-engineering — tambah abstraksi yang sebenernya nggak perlu
- 📚 Nggak sesuai konvensi project — gaya coding beda dari yang udah established
Contoh: Code yang Keliatan Bagus Tapi Bermasalah
AI kasih lo kode ini buat query database:
// Code yang di-generate AI
def get_user_data(user_id):
query = f"SELECT * FROM users WHERE id = {user_id}"
return db.execute(query).fetchall() Jalan? Jalan. Tapi ada SQL injection vulnerability yang kalau dieksploitasi, attacker bisa delete seluruh database lo. 😱
Yang bener:
def get_user_data(user_id):
query = "SELECT * FROM users WHERE id = %s"
return db.execute(query, (user_id,)).fetchall() Bedanya cuma 1 kata, tapi konsekuensinya beda jauh. Code review yang ketat akan catch ini dalam 5 detik.
Cara Fix
Setiap kode yang AI generate harus melewati code review process yang sama seperti kode dari manusia:
- ✅ Linting & static analysis — ESLint, Pylint, SonarQube, Snyk
- ✅ Security scan — OWASP, Snyk, dependabot
- ✅ Manual review — baca kodenya, pahami logikanya, tanya “kenapa?” kalau ada yang aneh
- ✅ Testing yang proper — bukan cuma happy path, tapi edge cases & failure modes
- ✅ Pull request review — kalau di tim, minta orang lain review sebelum merge
Prinsipnya: treat AI code seperti kode dari junior developer yang baru lo hire — kerja, tapi perlu diawasi.
Anti-Pattern #3: Terlalu Bergantung pada Satu Tools
“Aku cuma pakai Claude Code / Cursor / Aider, dan aku baik-baik aja.” — Untuk sekarang, mungkin. Tapi ini jebakan.
Kenapa One-Tool Dependency Berbahaya?
- 🔒 Vendor lock-in — kalau Claude Code besok di-shutdown atau di-price up 300%, lo stuck
- 🧠 Skill atrophy — lo cuma belajar workflow satu tools, nggak paham fundamental
- 💸 Price gouging risk — provider AI naik harga = lo harus ikut
- 🔄 Migrasi mahal — kalau harus pindah tools, lo nggak tau workflow lain
- ⚠️ Single point of failure — kalau tools-nya error, lo nggak punya fallback
Cara Fix: Bangun AI Toolkit yang Beragam
Jadi “polyglot” dalam hal tools AI:
| Situasi | Tools yang cocok |
|---|---|
| Feature baru, butuh planning | Claude Code / Cursor Agent |
| Refactor cepet | Aider |
| Inline edit di VS Code | Cursor / Continue.dev / Copilot |
| Multi-agent workflow | Hermes Agent |
| Belajar fundamental | Manual coding (yes, no AI) |
| Privacy-sensitif project | Local model via Ollama / Aider + local LLM |
Selain itu, belajar workflow yang nggak bergantung tools tertentu:
- ✅ Paham prompt engineering dasar (bukan cuma shortcut tools)
- ✅ Bisa baca code tanpa bantuan AI (yes, ini skill)
- ✅ Tau cara pakai CLI, Git, dan tools development dasar dengan manual
- ✅ Bisa setup AI agent di environment baru dari nol
Anti-Pattern #4: “Kodenya Jalan, Pasti Bener”
Salah satu fallacy paling berbahaya di dunia programming: “kalau jalan, berarti bener”. Ini double salah kalau kodenya dari AI.
Kenapa Test Itu Tidak Cukup
AI biasanya generate test yang:
- ✅ Test happy path — input valid, output sesuai
- ❌ Tidak test edge cases (input kosong, null, karakter aneh, dll)
- ❌ Tidak test failure modes (network error, timeout, database down)
- ❌ Tidak test boundary conditions (max value, min value, off-by-one)
- ❌ Tidak test concurrency issues (race condition, deadlock)
Hasilnya: test 100% pass, code-nya 100% jalan, tapi di production error 50% waktu karena edge case yang nggak ke-cover.
Contoh Real: Bug yang Lolos Test
AI bikinin fungsi buat hitung diskon:
def apply_discount(price, discount_percent):
return price * (1 - discount_percent / 100)
# Test dari AI
assert apply_discount(100, 10) == 90 # Pass ✓
assert apply_discount(200, 25) == 150 # Pass ✓ Test pass semua. Tapi coba di production:
apply_discount(100, -10) # → 110 (discount negatif = harga naik??)
apply_discount(100, 150) # → -50 (harga negatif!)
apply_discount(100, None) # → TypeError, server crash Validation hilang. Test AI nggak cover edge case ini karena dia asumsi input selalu valid.
Cara Fix
Setiap kode dari AI harus di-test dengan:
- ✅ Property-based testing — generate input random dan cek property yang harus selalu benar
- ✅ Fuzzing — input random/string aneh untuk cari edge case yang nggak ke-cover
- ✅ Adversarial testing — mikir “gimana cara saya ngehack kode ini?”
- ✅ Load testing — gimana perform-nya di high traffic?
- ✅ Security testing — pakai tools kayak OWASP ZAP, Burp Suite
Dan yang paling penting: jangan cuma percaya test yang AI generate. Tulis test sendiri untuk validate behavior yang lo expect.
Anti-Pattern #5: Pakai AI untuk Tugas yang Butuh Kreativitas & Intuisi Manusia
AI jago di pattern matching, tapi lemah di hal-hal yang butuh intuisi, taste, dan human judgment. Beberapa area di mana lo harus menahan diri dari delegasi ke AI:
1. API Design & Naming
Nama yang bagus itu intuisi, bukan pattern matching. Lo nggak mau punya API kayak gini:
// AI yang generate
getDataById(id)
getDataWithRelatedItems(id, options)
getAllDataWithComplexFiltering(filter1, filter2, filter3, ...) Compare sama API yang designed dengan taste:
// Designed by manusia
user.find(id)
user.withPosts(id, options)
user.search(criteria) Bedanya: yang pertama deskriptif, yang kedua intuitif. Lo bisa langsung tau yang kedua ngapain tanpa baca docs.
2. UX & Microcopy
Empty state message, error message, tooltip, onboarding copy — semua butuh empati dan pemahaman tentang user. AI bisa nulis “Tidak ada data” yang generic, tapi “Yuk mulai tambahin data pertama lo! 🚀” lebih manusiawi.
3. Architectural Decisions
Monolith vs microservices? SQL vs NoSQL? Event-driven vs request-response? Ini keputusan yang bergantung pada konteks bisnis, tim, dan future roadmap. AI bisa kasih pro-kontra generic, tapi lo yang harus decide.
4. Naming Variables & Functions
AI sering kasih nama generic: data1, temp, handle_thing. Atau sebaliknya, terlalu verbose: getListOfAllActiveUsersFromDatabase. Yang bagus itu self-documenting tapi ringkas: activeUsers, processPayment.
Cara Fix
Untuk area-area ini, pake AI sebagai brainstorm partner, bukan generator:
- 🔹 “Kasih 5 nama alternative untuk function ini, dengan trade-off masing-masing” — bukan “kasih nama terbaik”
- 🔹 “Review API design ini, kasih feedback apa yang bisa diperbaiki” — bukan “bikin API design”
- 🔹 “Bantu aku brainstorm arsitektur untuk use case ini” — bukan “implementasikan arsitektur ini”
Intinya: AI kasih lo perspektif & opsi, lo yang punya taste & judgment.
Bonus Anti-Pattern #6: Nggak Ngerti Apa yang Lo “Pakai”
Fenomena ini ada namanya: “AI cargo culting” — pake sesuatu tanpa ngerti cara kerjanya, karena semua orang juga pake.
Contoh
Lo copy-paste prompt dari Twitter: “Bikinin web app pake Next.js, Tailwind, Prisma, tRPC, dan LLM embedding”. Lo jalanin, jalan. Tapi:
- ❌ Lo nggak tau kenapa Prisma lebih cocok dari Drizzle untuk case ini
- ❌ Lo nggak tau tRPC ngapain dan kenapa nggak REST biasa
- ❌ Lo nggak tau LLM embedding itu apa dan gimana cara kerjanya
Hasilnya: over-engineered project yang kalau ada masalah, lo nggak bisa troubleshoot. Dan 6 bulan lagi, lo bakal bingung kenapa project lo begini.
Cara Fix
Rule sederhana: jika lo nggak bisa menjelaskan kenapa setiap teknologi dipakai, lo nggak seharusnya memakainya.
Sebelum install library/framework, tanyakan:
- Apa problem yang diselesain?
- Apa alternative-nya dan kenapa ini lebih baik?
- Apa trade-off-nya?
Kalau lo nggak bisa jawab, ya jangan dipakai. Sederhana, tapi powerful.
Bonus Anti-Pattern #7: Nggak Ngerti Limitasi AI
AI coding agent itu powerful, tapi nggak sempurna. Beberapa limitasi yang sering dilupain:
Context Window
AI punya batas memory. Project gede bisa “lupa” apa yang udah dia bikin. Makanya planning & dokumentasi tetep penting.
Knowledge Cutoff
AI nggak tau library yang rilis bulan kemarin. Dia bisa kasih saran yang outdated tanpa sadar. Verifikasi selalu dengan dokumentasi resmi.
Halusinasi
AI bisa ngarang fakta, API, atau behavior library. Selalu test dan verify.
Bias
AI bias ke pattern yang umum di training data. Untuk niche use case, dia bisa kasih saran yang nggak optimal.
Cara Fix
Sadar limitasi, dan bangun habit untuk kompensasi:
- ✅ Selalu cek tanggal rilis / changelog library yang disebutin AI
- ✅ Verifikasi API signature di dokumentasi resmi
- ✅ Test edge cases manual
- ✅ Punya second opinion (search engine, senior dev, atau AI tools lain)
Cara Pakai AI Coding Agent yang Sehat
Sekarang kita udah tau anti-pattern-nya. Ini prinsip-prinsip yang bisa lo adopsi supaya tetep produktif tanpa jadi budak AI:
1. “AI Augments, Doesn’t Replace”
Pakai AI untuk accelerate kerja lo, bukan untuk menggantikan berpikir. Lo tetep yang mikir, decide, dan bertanggung jawab.
2. “Learn First, Use AI Second”
Untuk teknologi baru, belajar manual dulu minimal 1-2 minggu. Baru pakai AI untuk accelerate project lo. Dengan begini, lo punya fundamental dan AI cuma bikin lo lebih cepet, bukan lebih bodoh.
3. “Always Review, Always Test”
Treat AI output sebagai first draft. Selalu review, selalu test, selalu verify.
4. “Diversify Your Toolkit”
Pakai 2-3 tools, paham workflow-nya, dan tau kapan harus pakai yang mana. Plus, pahami fundamental yang nggak bergantung tools.
5. “Take Breaks from AI”
Setiap beberapa minggu, cobain coding tanpa AI untuk project kecil. Latih skill fundamental, jaga “code muscle” lo tetep kuat.
6. “Document Your AI Usage”
Track di mana lo pake AI, kenapa, dan gimana hasilnya. Audit berkala. Ini juga bantu tim lo align soal AI usage policy.
Tanda-Tanda Lo Kena Anti-Pattern
Quiz kecil buat self-check. Lebih dari 3 “ya” berarti lo perlu introspeksi:
- ❓ Lo nggak bisa explain code yang lo “tulis” sendiri 1 bulan lalu?
- ❓ Lo lebih sering minta AI generate code baru daripada refactor yang ada?
- ❓ Lo nggak bisa debugging tanpa AI?
- ❓ Lo lupa syntax bahasa yang lo pake sehari-hari?
- ❓ Lo sering push kode yang nggak sepenuhnya lo pahami?
- ❓ Lo nggak tau package/dependency apa aja yang project lo pake?
- ❓ Lo ngerasa guilty kalo harus coding tanpa AI?
Kalau lo jawab “ya” untuk banyak pertanyaan di atas, it’s time to recalibrate. Turunin ketergantungan AI, belajar lagi fundamental, dan pake AI dengan lebih bijak.
Penutup
AI coding agent adalah tools yang luar biasa powerful. Tapi kayak tools apapun, dia bisa dipakai dengan benar atau salah. Bukan tools-nya yang berbahaya, tapi cara kita pakainya.
Master anti-pattern awareness, dan lo bakal jadi developer yang lebih produktif TANPA kehilangan kemampuan fundamental. Itu goal-nya: bukan jadi “AI-dependent”, tapi jadi “AI-augmented”.
Selamat ngoding dengan lebih bijak! 🧠✨
Artikel ini ditulis dengan bantuan AI agent sebagai bagian dari eksperimen workflow agentic coding itu sendiri. Total waktu penulisan + editing + review: sekitar 30 menit. Tiap klaim diverifikasi manual oleh penulis.