Kenapa Vibe Coding Bisa Berbahaya Kalau Kamu Tidak Paham Kodenya
Semua orang sedang membicarakan vibe coding. "Aku build startup dalam seminggu pakai AI!" "Aku tidak perlu belajar coding lagi, AI yang ngerjain!" Tapi ada sisi gelap yang jarang dibahas: kode yang kamu tidak pahami adalah kode yang tidak bisa kamu pertanggungjawabkan.
Artikel ini bukan anti-AI. Aku sendiri menggunakan AI setiap hari dalam pekerjaan. Tapi ada perbedaan besar antara menggunakan AI sebagai alat yang kamu kendalikan versus membiarkan AI mengendalikan kamu.
1. Masalah Nyata yang Terjadi di Lapangan
Kasus 1: Security Hole yang Tidak Terdeteksi
Seorang developer meminta AI membuat endpoint untuk mengambil data user. AI menghasilkan kode yang berfungsi sempurna — semua test pass. Tapi ada satu masalah kecil yang terlewat:
// Kode yang dihasilkan AI — terlihat normal
app.get('/api/users/:id/profile', authenticate, async (req, res) => {
const user = await db.users.findById(req.params.id);
return res.json(user);
});
// Masalahnya: tidak ada pengecekan apakah user yang login
// boleh mengakses profil user dengan id tersebut!
// User A bisa mengakses profil User B hanya dengan mengganti angka di URL.
// Ini adalah IDOR (Insecure Direct Object Reference) — masuk OWASP Top 10.
// Yang benar:
app.get('/api/users/:id/profile', authenticate, async (req, res) => {
// Pastikan user hanya bisa akses profilnya sendiri (atau admin)
if (req.user.id !== req.params.id && req.user.role !== 'admin') {
return res.status(403).json({ error: 'Forbidden' });
}
const user = await db.users.findById(req.params.id);
return res.json(user);
});
Kalau developer tidak paham konsep authorization dan IDOR, bug ini bisa lolos ke production dan mengekspos data semua user.
Kasus 2: Race Condition yang Muncul di Production
// AI generate kode untuk deduct saldo — terlihat benar
async function deductBalance(userId, amount) {
const user = await User.findById(userId);
if (user.balance {
const user = await User.query(trx)
.forUpdate() // Row-level lock
.findById(userId);
if (user.balance {
this.process(data);
});
}
process(data) {
// ... processing
}
}
// Setiap kali DataProcessor dibuat, listener baru ditambahkan.
// Kalau DataProcessor dibuat berkali-kali (misal per request),
// listener menumpuk → memory leak → server crash setelah beberapa jam.
// Yang benar:
class DataProcessor {
constructor(eventEmitter) {
this.eventEmitter = eventEmitter;
this.handler = (data) => this.process(data);
eventEmitter.on('data', this.handler);
}
destroy() {
// Selalu cleanup listener saat object tidak dipakai
this.eventEmitter.off('data', this.handler);
}
process(data) {
// ... processing
}
}
2. Mengapa AI Menghasilkan Kode Bermasalah?
AI bukan bodoh — AI sangat pintar dalam menghasilkan kode yang terlihat benar. Masalahnya ada di beberapa hal:
- AI tidak tahu konteks bisnis kamu — AI tidak tahu bahwa di aplikasimu, user bisa punya multiple role, atau bahwa transaksi finansial butuh audit trail
- AI mengoptimalkan untuk "kode yang berjalan" — bukan "kode yang aman dan scalable"
- AI tidak tahu production environment kamu — berapa concurrent user, pola traffic, infrastruktur yang dipakai
- Training data AI mengandung kode buruk — internet penuh dengan tutorial yang mengabaikan security dan edge case
3. Tanda-tanda Kamu Terlalu Bergantung pada AI
Evaluasi dirimu sendiri:
- Kamu tidak bisa menjelaskan cara kerja kode yang kamu submit ke PR
- Ketika ada bug, kamu langsung tanya AI tanpa mencoba debug sendiri dulu
- Kamu tidak tahu kenapa kode AI bekerja, hanya tahu bahwa ia bekerja
- Kamu tidak bisa review kode AI — semua terlihat "masuk akal" bagimu
- Kamu tidak bisa menulis kode tanpa AI, bahkan untuk hal sederhana
Kalau 3 atau lebih poin di atas berlaku untukmu, ini saatnya untuk memperlambat dan membangun pemahaman yang lebih dalam.
4. Cara Vibe Coding yang Bertanggung Jawab
Aturan 1: Pahami Sebelum Commit
// Sebelum commit kode yang dihasilkan AI, tanyakan ke dirimu:
// 1. Apa yang dilakukan setiap baris kode ini?
// 2. Apa yang terjadi kalau input-nya null/undefined/kosong?
// 3. Apa yang terjadi kalau database down?
// 4. Apakah ada data user yang bisa bocor?
// 5. Apakah ada resource yang tidak di-cleanup?
// Kalau tidak bisa jawab → minta AI jelaskan, jangan langsung commit
Aturan 2: Gunakan AI untuk Belajar, Bukan Hanya Menghasilkan
// Setelah AI generate kode, tanyakan:
"Jelaskan kode ini line by line. Kenapa kamu pilih pendekatan ini?
Apa alternatif lain dan apa trade-off-nya?
Apa yang bisa salah dengan implementasi ini?"
// Ini mengubah AI dari "mesin kode" menjadi "guru"
Aturan 3: Selalu Review dengan Checklist Keamanan
Sebelum merge kode yang dihasilkan AI, cek:
□ Apakah semua input divalidasi?
□ Apakah ada authorization check (bukan hanya authentication)?
□ Apakah error message tidak mengekspos informasi sensitif?
□ Apakah ada potensi SQL injection / XSS / CSRF?
□ Apakah semua resource (connection, file, listener) di-cleanup?
□ Apakah ada potensi race condition untuk operasi concurrent?
□ Apakah ada sensitive data yang di-log?
Aturan 4: Test Edge Case Secara Manual
// AI sering lupa edge case. Selalu test:
- Input kosong / null / undefined
- Input dengan karakter spesial (<script>, ' OR 1=1, dll)
- Angka negatif dan nol untuk kalkulasi finansial
- File dengan ukuran 0 byte dan ukuran maksimal
- Request concurrent (buka 2 tab, submit bersamaan)
- Apa yang terjadi saat database/API eksternal down
5. Keseimbangan yang Tepat
Bukan berarti kamu harus menulis semua kode sendiri. Keseimbangan yang tepat:
Biarkan AI yang Kerjakan
Kamu Harus Pahami dan Review
Boilerplate dan scaffolding
Logic autentikasi dan otorisasi
CRUD operations standar
Operasi finansial dan transaksi
Formatting dan styling
Kode yang menyentuh data sensitif
Unit test untuk happy path
Error handling dan edge case
Dokumentasi dan komentar
Arsitektur dan keputusan desain
Kesimpulan
Vibe coding adalah alat yang luar biasa powerful — tapi seperti semua alat powerful, ia bisa berbahaya di tangan yang salah. Developer yang paling efektif menggunakan AI bukan yang paling malas berpikir, melainkan yang paling tahu kapan harus percaya AI dan kapan harus skeptis.
Bangun fondasi pemahaman yang kuat. Gunakan AI untuk mempercepat, bukan untuk menggantikan pemahaman. Karena ketika production down jam 3 pagi dan kamu harus debug, AI tidak akan bisa membantu kalau kamu sendiri tidak mengerti sistem yang kamu bangun.
Artikel ini pertama kali diterbitkan di SavefileArchive.
Top comments (0)