- Bahkan jika LLM terus menulis kode sebagai pengganti kita, jika
if yang duplikatif dan implementasi sementara digabungkan apa adanya, kode yang dihasilkan berikutnya bisa mengikuti kebiasaan itu seolah-olah itu adalah aturan proyek
- Jika logika pemeriksaan hak akses diulang di route handler, background job, API endpoint, webhook, dan lainnya, pengujian mungkin tetap lolos tetapi beban pemeliharaan tetap ada
- Karena model membuat kode berikutnya dengan melihat file yang terbuka, pola yang sudah ada, dan perubahan terbaru, 4
if hasil salin-tempel menjadi sinyal yang memanggil salinan kelima
- Meskipun nanti diminta melakukan refactor, sulit menjamin LLM akan merapikan semua salinan yang ada dengan benar, dan pola buruk menjadi lebih mirip gaya codebase daripada kesalahan sekali saja
- Jika
if duplikatif, fungsi “god”, dan merge “rapikan nanti” terus menumpuk, akan sulit membalikkannya hanya dengan prompt dan pada akhirnya manusia harus memperbaikinya sendiri
Yang dirujuk LLM adalah codebase saat ini
- LLM tidak menulis kode dalam “ruang hampa”, melainkan membaca codebase pengguna
- file yang sedang dibuka
- pola yang sudah ada
- perubahan terbaru
- Jalan pintas yang sudah digabungkan ke codebase menjadi sinyal pembelajaran bahwa “di sini caranya seperti ini”
- Kondisi kontrol akses yang sama bisa berulang di banyak lokasi
if (user.isActive && user.hasPermission('read') &&
!user.isSuspended && account.status === 'open') {
// do a thing
}
if ini bisa diekstrak menjadi helper bersama, tetapi bisa saja tetap digabungkan begitu saja karena kode buatan LLM berfungsi dan tesnya lolos
- Saat diminta endpoint kelima dengan aturan yang sama, model lebih mungkin mengikuti salinan yang sudah ada di repositori daripada merancang dari awal
Ilusi menyerahkan pemeliharaan kepada LLM
- Pikiran seperti “nanti saat diubah LLM juga yang mengerjakannya” membuat duplikasi dan code smell dibiarkan begitu saja
- Beberapa
if duplikatif mungkin tidak fatal, tetapi code smell seperti ini akan terus menumpuk
if duplikatif
- fungsi “god”
- merge yang diputuskan untuk “dirapikan nanti”
- Ketika pola buruk bertambah, hasil prompt berikutnya juga ikut terpengaruh, dan sulit percaya bahwa nanti LLM akan memperbaiki semua instance tanpa ada yang terlewat
- Sekalipun merasa pemeliharaan sudah di-outsource ke LLM, pada praktiknya situasinya justru bisa membuat kebiasaan yang makin buruk terus diulang
- Kode harus ditulis seolah-olah akan dipelihara oleh manusia, dan pola kode yang diserap lalu dikembalikan oleh LLM harus dijaga tetap dalam kondisi baik
1 komentar
Komentar Hacker News
Ada baiknya membuat perintah /review sebagai file Markdown kosong di
.claude/commands/review.md, lalu menaruh checklist yang harus diperiksa agen di sanaSaat perlu code review, ketik
/review, lalu agen akan melihat checklist itu, merencanakan hal-hal yang layak diperbaiki, dan kemudian bertanyaFile saya dimulai dengan “masuk ke mode perencanaan. lihat perbedaan antara branch ini dan main. hal-hal yang perlu dipertimbangkan: ...”, dan karena saya terus menambahkan item yang ditemukan saat code review agar agen bisa memperbaikinya, sekarang jumlahnya sekitar 200
Agen tidak terlalu terganggu meski menerima dinding feedback umum dan memeriksa item satu per satu, dan ketika saya menambahkan “pastikan hal-hal baru yang dibuat tidak menduplikasi kode yang sudah ada”, saya terkejut karena ia benar-benar mulai merencanakan pekerjaan perapian
Ini masih baru menggores permukaannya saja, dan kita perlu memberi alat untuk alat agar tool bisa menjadi tool yang lebih baik
Bahkan sekarang pun saya memakai instruksi yang cukup sederhana, tetapi Claude sering melanggar instruksi awal seperti “jangan commit ke git tanpa izin” dan “jangan sign commit message”
Jika ditanya, ia menjawab “benar, ada instruksi itu tetapi saya mengabaikannya”, dan jika dikoreksi dengan sopan dalam sesi, ia memahaminya, tetapi setelah itu kadang malah jadi tidak bisa commit sama sekali
Jika disuruh meninjau checklist 200 item, kemungkinan besar ada cukup banyak yang diam-diam terlewat
Kalau ini engineer manusia, ketika sudah ada 200 test yang memakai assertion library tertentu, mereka tidak akan menulis test baru dengan library yang sama sekali berbeda, tetapi Claude sudah beberapa kali melakukan hal seperti itu
Karena itu saya terus menambahkan item seperti “sebelum menulis, periksa dulu konvensi test”
Sebaliknya, hal-hal dasar seperti apa itu fungsi, atau bahwa test harus menangani diff perubahan, mestinya tidak perlu dijelaskan; tetapi tidak ada daftar yang jelas tentang mana yang perlu disebutkan dan mana yang aman untuk diabaikan, jadi rasanya seperti membangun metode yang lumayan berguna lewat trial and error
Dalam kasus saya, sering kali saya bolak-balik dengan agen sambil merapikan “sampai terlihat oke menurut mata dan selera saya”, tetapi saya belum membuat daftar seperti itu
Tergantung proyeknya, kadang masalah kecil atau magic number masih dibiarkan, dan di proyek lain justru diwajibkan konstanta dengan nama bermakna seperti
SECONDS_IN_A_DAY = 24 * 60 * 60, jadi ini sangat bergantung kontekshttps://github.com/alibaba/open-code-review
https://layandreas.github.io/personal-blog/posts/beyond-vide...
Misalnya, suruh ia memilih N peran yang paling cocok untuk perubahan tersebut dari daftar peran panjang seperti Senior Engineer, Security Engineer, WCAG specialist
Claude menjalankan review-review itu secara paralel lalu menggabungkan feedback-nya
Karena saya melakukan development berbasis spesifikasi, issue yang ditemukan saya tambahkan ke spesifikasi agar jejak issue dan keputusan tetap tersimpan
Agak aneh betapa banyak engineer yang menambahkan prompt lain di atasnya
Menurut pengalaman saya, makin begitu hasilnya malah makin buruk: tetap ada abstraksi, tetapi abstraksinya keliru, dan komentarnya berlebihan sampai membuat pemanggilan LLM berikutnya ikut bingung
Pada codebase yang bagus, ini masih lumayan bisa jalan, tetapi perlahan membuat kode makin buruk, dan jika terus dipakai lalu suatu saat tidak berfungsi, pada akhirnya harus membayar harga karena selama ini tidak benar-benar membangunnya sendiri saat memperbaikinya
Kalau agent dimasukkan ke codebase baru, biasanya masih ada model mental tentang kode tersebut dan kodenya juga cukup ringkas, tetapi setelah pengulangan menumpuk, keduanya hilang dan performa LLM juga menurun
Jadi saya memakai LLM untuk eksplorasi dan review, lalu menulis kodenya sendiri
Coding sendiri juga bukan bagian yang sangat memakan waktu, malah justru yang paling menyenangkan, jadi sulit dipahami kenapa orang ingin menghindarinya; kadang kalau adu balap debugging dengan AI memakai prompt
/bug, AI juga tidak selalu lebih cepatDalam beberapa tahun terakhir, pekerjaan software berubah dari salah satu tempat pelarian rekayasa praktis bagi para otak penasaran yang suka ngoprek dan pecandu teka-teki, menjadi jalur karier bagi orang-orang pintar yang mengejar uang, seperti di keuangan, hukum, atau kedokteran
Banyak orang yang sekarang menyandang gelar “software engineer” sejak awal memang tidak pernah menikmati pekerjaan itu; mereka hanya cukup pintar dan bertanggung jawab untuk mencapai target yang cukup masuk akal dari pemberi kerja
Orang-orang seperti itu paling ingin AI agent menyingkirkan kebutuhan akan desain yang ketat dan kerja teka-teki, lalu memungkinkan kecerdasan bawaan mereka dipakai dengan cara yang lebih malas
Karena mereka tidak pernah menginternalisasi coding dan prinsip-prinsip rekayasa, ketika dikelilingi rekan dengan pola pikir serupa, sulit menebak hasil seperti apa yang akan lahir dari cara ini ke depan
Jika coding itu sendiri sejak awal terasa sangat membuat frustrasi dan penuh gesekan, akan mudah merasa bahwa AI lebih cepat
Kode tidak cukup hanya dibaca; ia harus dialami dengan susah payah agar benar-benar terinternalisasi
Agent sering kali membungkus kode lama secara defensif alih-alih bertanya apakah jalur yang sudah ada itu masih perlu dipertahankan, sehingga muncul efek kode defensif dalam jumlah besar yang menumpuk berlapis-lapis seperti boneka Rusia
https://softwaredoug.com/blog/2026/07/09/write-code
Opus 4.8 adalah titik baliknya, dan terutama untuk masalah rumit, sekarang saya sudah tidak sering bisa mengalahkan Opus 4.8
Kalau semua orang memakai Opus 4.8 atau yang lebih tinggi untuk semua tugas dan pertanyaan, suasana keseluruhannya akan sangat berbeda, dan saya rasa tidak akan banyak skeptis AI yang tersisa
Saya masih tetap menulis kode dengan tangan, dan sebagian, meski tidak semuanya, dihasilkan oleh Opus
Mungkin ini pikiran yang nyeleneh, tetapi ya tinggal tulis saja kodenya sendiri
Di era AI ini mungkin terdengar seperti konsep yang sulit dipercaya, tetapi kalau kodenya memang harus dibaca dan dipelihara manusia, lebih baik menulisnya langsung demi orang-orang itu
Saat membaca kode yang terlalu bertele-tele dan hasil salin-tempel, Anda pasti kesal, dan orang lain juga akan begitu
Kalau menulis sendiri, Anda akan memperbaikinya sendiri dan menuliskannya dengan cara yang masuk akal untuk dipelihara orang lain
Atau Anda bisa mencoba menenangkan agent dan loop dengan membuat jaring file Markdown yang rumit agar mereka memahami bentuk kode yang akan diharapkan oleh maintainer di masa depan
Saya tidak tahu jalan mana yang dalam jangka panjang lebih mudah, dan saya penasaran apakah ada orang yang pernah mewarisi lalu mencoba memahami codebase yang digerakkan agent berbasis loop
Saya tidak begitu yakin seberapa tepat kalimat, “Saat berikutnya Anda meminta endpoint dengan aturan akses yang sama ke LLM, model tidak mulai berpikir dari nol, melainkan memulai dari empat salinan yang sudah ada di repositori”
Dalam praktiknya, tampaknya ada bias bawaan untuk mengulang struktur dasar dan lebih jarang melakukan reuse atau abstraksi
Jika pola yang ada memang seperti itu, model tampak seolah mengikutinya, tetapi sebenarnya kemungkinan besar ia akan tetap melakukannya ke arah mana pun
Bahkan setelah saya lebih dulu menyiapkan abstraksi yang ketat dan contoh penggunaannya, lalu secara eksplisit memerintahkan agar hanya memakai API abstraksi tertentu dan menyalin cara saya menulisnya, pada LLM terbaru pun sering kali keduanya tidak dilakukan; model malah mengimplementasikan ulang struktur dasar dari bawah dan sebagian atau sepenuhnya mengabaikan abstraksi
Saya tidak tahu pasti kenapa, tetapi saya menduga mungkin karena terlalu banyak kode seperti ini di data latih, sehingga bobot model lebih “tahu” cara menghasilkan keluaran dengan pola tersebut
Meski begitu, saya tetap menganggap LLM layak dipakai sebagai mesin implementasi yang cepat
Tantangannya adalah membuat model memunculkan keputusan implementasi semacam ini lebih dulu sebelum ia berlari ke arah yang salah
Setelah perubahan besar, saya mendapat hasil bagus dengan prompt berikut
“Sekarang lakukan pemeriksaan akhir kode. Apakah semuanya sudah rapi dan komponen mengikuti prinsip separation of concerns? Apakah kondisinya dapat dipahami dan dipelihara? Apakah ada asumsi yang mungkin sudah tidak lagi benar? Apakah ada kode sisa dari edit atau eksperimen sebelumnya yang masuk ke codebase? Apakah dokumentasi masih mencerminkan keadaan kode saat ini?”
Lalu model umumnya bisa menyimpulkan yang disebut di atas dan lebih dari itu
Hanya saja, satu hal yang tetap harus terus saya tunjukkan langsung adalah menghapus semua komentar untuk “pelacakan progres”, dan hanya menyisakan komentar yang cocok untuk pemeliharaan jangka panjang
Claude meninggalkan komentar seperti “Klik tombol sekarang memicu penyimpanan dan tidak lagi memakai onBlur”, padahal kode sebenarnya tidak pernah memakai onBlur, dan itu hanya jejak dari sesuatu yang sebelumnya ingin dilakukan Claude lalu saya belokkan dalam task/branch yang sama
Model memang akan menafsirkannya sesuka hati, tetapi tetap saja sering lebih baik daripada tidak melakukan apa-apa
Anda mengajarkan semuanya ke AI lalu bertanya apakah ia sudah mempelajarinya dengan benar, dan hasilnya ternyata cukup baik
Saya mengikuti langkah-langkah yang mirip dengan tulisan ini
https://www.lucasfcosta.com/blog/backpressure-is-all-you-nee...
Ada pepatah lama
“beri komentar pada kode seolah-olah pemelihara berikutnya adalah pembunuh gila yang tahu di mana kamu tinggal”
Baru-baru ini aku menemui hal seperti itu lagi dan lagi saat review PR, lalu menulis komentar dengan kesal, dan aku sendiri pun terkejut
Aku tidak tahu kalau aku bisa bereaksi seperti itu
Maksudnya, komentar itu ada karena kodenya sendiri tidak cukup jelas, dan memang ada kasus seperti itu, tetapi secara umum menurutku komentar yang lebih banyak lebih baik daripada lebih sedikit
Terutama jika komentar itu menjelaskan bagaimana kode terhubung dengan kebutuhan bisnis atau fungsional yang nyata, dan bukan sekadar mengulang apa yang dilakukan kode
Beberapa tahun lalu aku sering menulis komentar lebih dulu
Menjelaskan tujuan keseluruhan, membaginya menjadi rutinitas dan urutan pekerjaan, lalu setelah terasa pas, mengisi blok-blok kode di antara komentar
Rasanya seperti semacam pemrograman literer, tetapi aku sudah melakukannya bahkan sebelum tahu istilah itu, dan sebenarnya itu lebih mirip memberi prompt kepada diri sendiri menuju tujuan
Kekurangannya, komentar pada akhirnya mudah berubah menjadi sekadar penjelasan dalam bahasa Inggris tentang apa yang dilakukan kode, sehingga belum tentu banyak membantu pemelihara di masa depan
Kode seharusnya bisa menjelaskan dirinya sendiri, dan komentar dipakai di tempat yang memang ada naganya
Dalam konteks serupa, prompt yang kusukai adalah “tolong tinjau test yang kamu tulis. Apakah test ini benar-benar menguji hal yang dimaksud? Jika kodenya rusak, apakah test-nya juga gagal?”
Sungguh mengejutkan betapa seringnya LLM menulis test kosong yang tidak memverifikasi apa pun
Rasanya aneh kalau hal seperti ini masih harus dibahas serius
Kalau sudah begitu banyak “eksperimen” dengan LLM, bukankah ini seharusnya sudah diterima sebagai hal yang jelas?
Aku penasaran kapan kita bisa kembali membicarakan coding manual tanpa memperlakukannya seperti sesuatu yang tabu
LLM memang berguna dalam banyak hal, tetapi ketika melihat orang-orang mendelegasikan pengetikan seluruh source code kepada agen, rasanya
mirip seperti diberi tahu bahwa web itu bagus jadi kita seharusnya bahagia
Aku terus menjalankan codebase lewat berbagai model untuk mencari bau kode buruk seperti kode duplikat
Cukup efektif, dan sepertinya kalau tidak terus dirawat seiring waktu, itu akan menjadi gumpalan berantakan yang makin menumpuk
Itu juga bisa dimasukkan ke pipeline build, dan sama sekali tidak memakai token
Atau justru proses review dan reset konteks yang lebih penting?
Aku sudah melihat banyak duplikasi seperti ini, dan hal-hal yang lebih buruk, bahkan pada kode yang dipelihara orang selama 20 tahun
Sejujurnya, dalam kebanyakan kasus kode yang ditulis dan dipelihara manusia justru lebih buruk daripada yang dibuat LLM sekarang
Kadang karena kurang pengalaman, kadang karena kelalaian yang disengaja, tetapi biasanya karena jadwal yang ketat dan tekanan untuk segera menyelesaikannya
Orang tahu cara melakukannya dengan lebih baik, tetapi tidak punya waktu dan anggaran untuk benar-benar melakukannya
LLM juga mempelajari itu