Pelajari cara menulis batasan dan non-goals dalam spesifikasi aplikasi agar pekerjaan ulang cepat berkurang. Gunakan format sederhana untuk menegaskan stack, anggaran, tenggat waktu, dan hal yang bisa berubah.

Pekerjaan ulang terjadi ketika Anda membangun sesuatu yang berfungsi, tetapi itu bukan hal yang tepat untuk proyek. Tim harus mengulang layar, menulis ulang logika, memigrasi data, atau membangun ulang fitur karena keputusan penting muncul terlambat.
Ini sering muncul dengan cara yang familiar: sebuah alur dibangun ulang karena peran pengguna yang salah diasumsikan; layar didesain ulang karena dukungan mobile diharapkan tetapi tidak pernah dinyatakan; model data berubah karena “kami butuh riwayat audit” muncul setelah versi pertama; sebuah integrasi diganti karena klien tidak dapat memakai layanan pihak ketiga; atau aplikasi harus pindah hosting karena aturan kepatuhan atau wilayah.
Batasan yang hilang menciptakan keputusan mengejutkan nanti. Ketika spesifikasi mengatakan “bangun CRM,” itu meninggalkan puluhan pertanyaan terbuka: siapa yang menggunakannya, platform apa yang penting, aturan keamanan apa yang berlaku, apa yang harus tetap di luar ruang lingkup, anggaran dan tenggat yang sebenarnya berapa. Jika jawabannya datang setelah kode ada, proyek membayar dua kali: sekali untuk membangun, dan lagi untuk membatalkan.
Contoh sederhana: seorang pendiri meminta “janji temu + pengingat.” Minggu pertama dikirim pengingat lewat email. Minggu kedua mereka menyebut perlu SMS, tapi SMS tidak diperbolehkan di negara mereka atau melampaui anggaran. Sekarang sistem pengingat didesain ulang, layar berubah, dan pengujian dimulai ulang. Pekerjaan ulang itu bukan karena kode buruk. Itu karena batasan yang muncul terlambat.
Tujuannya adalah mengurangi bolak-balik sebelum kode ditulis atau dihasilkan. Baik Anda menulis kode sendiri atau menggunakan pembuat berbasis chat, keluaran hanya mengikuti aturan yang Anda berikan. Jika aturan muncul terlambat, pekerjaan bergeser dan Anda mengulangnya.
Ini bukan soal menulis dokumen panjang. Spesifikasi ringan bisa tetap tegas di hal-hal yang penting. Di tahap awal, sebaiknya menjawab:
Saat batasan dan non-goals ditulis lebih dulu, mereka berfungsi seperti pembatas. Anda akan mendapatkan lebih sedikit kejutan, lebih sedikit pembangunan ulang, dan keputusan yang lebih jelas sejak hari pertama.
Batasan adalah keputusan tetap yang harus dipatuhi proyek Anda. Abaikan mereka dan Anda bekerja dua kali, karena membangun ke arah yang tidak bisa dikirim.
Non-goals adalah pilihan eksplisit untuk tidak membangun sesuatu. Lewatkan mereka dan spesifikasi tumbuh diam-diam saat orang menambahkan “ekstra kecil”. Itulah cara Anda akhirnya mengulang layar, alur, dan model data.
Aturan cepat: batasan membatasi bagaimana Anda membangun; non-goals membatasi apa yang Anda bangun.
Batasan adalah keharusan yang tidak berubah tanpa keputusan nyata (dan trade-off).
Contoh:
Saat sebuah batasan nyata, tuliskan sebagai kalimat yang tidak bisa diperdebatkan. Jika seseorang berkata “mungkin,” itu belum menjadi batasan.
Non-goal adalah pernyataan eksplisit “kita tidak melakukan ini,” meskipun terdengar berguna. Ini melindungi rilis pertama.
Contoh:
Non-goals bukan negatif. Mereka mencegah detour yang mahal. Misalnya, “tidak ada custom roles di v1” bisa menghemat minggu-minggu penanganan edge case izin yang memaksa redesign database dan UI.
Sebelum menulis halaman detail, tulis satu kalimat yang menegaskan proyek. Itu menjaga semua orang tetap selaras saat trade-off muncul.
Satu kalimat yang baik menjawab: untuk siapa ini, dan pekerjaan utama apa yang harus dilakukan?
Contoh satu kalimat:
Kemudian tambahkan definisi keberhasilan kecil: 3 sampai 5 hasil yang harus dicapai pengguna nyata saat proyek selesai. Tulis sebagai hasil pengguna, bukan fitur.
Untuk contoh booking tutor:
Jika Anda belum punya metrik, jelaskan keberhasilan dengan kata-kata. “Cepat” terlalu samar, tetapi “terasa cepat di ponsel” masih berguna. “Mudah” samar, tetapi “tidak perlu panggilan setup” lebih jelas. Anda bisa menambahkan angka nanti.
Jaga bagian ini singkat. Ini menjadi konteks untuk semua yang mengikuti: apa yang harus benar, apa yang tidak boleh terjadi, dan apa yang boleh berubah.
Pekerjaan ulang sering dimulai ketika jadwal dan proses pengambilan keputusan hanya tersimpan di kepala seseorang. Letakkan batasan proyek di spesifikasi sebelum Anda menggambarkan layar dan fitur.
Tulis sebagai pernyataan sederhana dan bisa dites:
Contoh sederhana:
“Rilis pertama harus dikirim paling lambat 30 Mei. Termasuk login, daftar pelanggan dasar, dan satu laporan bulanan. Tidak ada integrasi di v1. Anggaran dibatasi $8.000 termasuk hosting untuk bulan pertama. Review dilakukan dalam 24 jam di hari kerja. Product owner adalah Sam yang menyetujui perubahan ruang lingkup.”
Kecepatan feedback layak mendapat baris sendiri karena mengontrol seberapa aman Anda bisa bergerak. Jika pemangku kepentingan hanya bisa meninjau sekali seminggu, spesifikasi harus memilih rilis yang lebih kecil dan lebih sedikit edge case.
Pilih ritme review yang sesuai realitas: feedback hari yang sama, 24–48 jam di hari kerja, pertemuan mingguan saja, atau (jarang) “tidak perlu feedback.”
Jika Anda tidak menulis batasan teknis sejak awal, orang akan mengisi celah dengan asumsi. Itulah cara tim akhirnya mengulang layar, migrasi, atau integrasi setelah pekerjaan dimulai.
Mulailah dengan menyatakan apa yang dikunci dan apa yang hanya preferensi. “Prefer React” berbeda dengan “harus React karena kita bergantung pada perpustakaan komponen internal.” Satu kalimat per keputusan sudah cukup.
Jelaskan secara eksplisit di seluruh aplikasi: web, backend, database, dan mobile. Jika suatu bagian fleksibel, katakan begitu dan tambahkan batasan (mis. “mobile adalah web-only di v1”).
Cara sederhana menulisnya:
Lalu daftar integrasi yang tidak bisa dihindari. Sebutkan sistemnya (pembayaran, email, analytics, CRM) dan catat batasan keras. Contoh: “Harus menggunakan Stripe untuk billing,” “Harus mengirim email lewat penyedia kami yang ada,” “Analytics tidak boleh melacak data pribadi.” Jika otentikasi dikunci (SSO, Google login, passwordless), nyatakan.
Pilihan hosting mengubah arsitektur. Tuliskan di mana aplikasi harus berjalan dan kenapa: “Harus berjalan di Jerman,” “Data harus tetap di EU,” atau “Bisa berjalan global.”
Jika Anda punya kebutuhan kepatuhan, buat konkret: periode retensi, aturan penghapusan, dan kebutuhan audit.
Contoh: “Simpan catatan selama 7 tahun, hapus dalam 30 hari setelah permintaan terverifikasi, simpan log audit siapa yang melihat catatan, dan deploy hanya di negara tempat pasien tinggal.” Baris-baris ini mencegah kejutan tepat ketika Anda siap mengirim.
Non-goals adalah pembatas spesifikasi. Mereka mengatakan apa yang tidak Anda bangun, tidak dukung, atau tidak mencoba sempurnakan di rilis pertama. Ini salah satu cara tercepat mengurangi kejutan, karena banyak permintaan “kecil” muncul kemudian dan diam-diam mengubah seluruh rencana.
Non-goal yang baik cukup spesifik sehingga rekan tim bisa mengenali scope creep dalam satu kalimat. Harus juga punya batas waktu. “Tidak di v1” lebih jelas daripada “kita tidak akan melakukan ini.”
Mulailah dengan fitur yang sering diasumsikan termasuk. Untuk aplikasi booking sederhana, itu mungkin seperti:
Fitur-fitur ini bukan hal buruk. Mereka mahal. Menuliskannya membuat rilis pertama tetap fokus.
Juga sebutkan item “detail” yang menyebabkan banyak pekerjaan lanjutan: peran, izin, dan alur edge-case. “Tidak ada custom roles. Hanya dua peran: Owner dan Member.” Satu baris itu bisa menghemat minggu kerja.
Tim sering lupa non-goals yang bukan fitur. Mereka muncul nanti sebagai pekerjaan ulang yang menyakitkan.
Tentukan apa yang tidak akan Anda optimalkan. Misalnya: “Tidak akan dituning untuk 1 juta pengguna. Kita mengasumsikan hingga 500 pengguna aktif mingguan di v1.”
Juga catat apa yang tidak akan didukung, supaya pengujian tetap realistis: “Tidak mendukung Internet Explorer,” “Tidak ada tata letak khusus tablet,” atau “Login hanya via email dan password (tidak SSO, tidak magic links).”
Spesifikasi terasa lebih aman ketika memungkinkan keputusan kecil berkembang. Jika Anda hanya menulis yang tetap, setiap ide baru berubah menjadi perdebatan. Daftar “bisa berubah” singkat memberi ruang untuk memperbaiki produk tanpa memulai ulang seluruh rencana.
Jaga realistis. Bahas apa yang Anda harapkan dipelajari setelah melihat versi kerja, bukan fitur besar baru. Item fleksibel umum meliputi teks UI, penyesuaian alur kecil, kolom laporan, penamaan (peran, status, kategori), dan pilihan tata letak dasar.
Selanjutnya, putuskan bagaimana perubahan diterima. Tanpa aturan persetujuan sederhana, “penyempurnaan cepat” berubah menjadi scope creep diam-diam.
Alur kerja sederhana yang cocok untuk kebanyakan tim kecil:
Aturan kuncinya: perubahan fleksibel tidak boleh memecah batasan tetap. Jika stack Anda React + Go + PostgreSQL, permintaan “bisa berubah” tidak boleh menjadi “mari ganti backend.” Jika tenggat waktu tetap, “bisa berubah” tidak boleh berarti menambahkan modul baru yang membutuhkan dua minggu lagi.
Tambahkan satu catatan trade-off yang disetujui semua orang. Contoh: “Jika kita menambahkan peran pengguna baru dengan izin khusus, kita menunda pelaporan lanjutan ke fase 2.”
Spesifikasi yang baik dimulai dengan membatasi opsi, bukan memperluasnya. Format ini memaksa Anda menulis aturan sebelum siapa pun mulai membangun.
Gunakan ini sebagai header di dokumen Anda:
SPEC v0.1 (date)
Owner:
Reviewers:
1) One-liner
- Build: [what it is]
- For: [who]
- So they can: [main benefit]
2) Success definition (3 outcomes)
- Outcome 1: [measurable result]
- Outcome 2: [measurable result]
- Outcome 3: [measurable result]
3) Fixed constraints (cannot change without re-approval)
- Deadline: [date]
- Budget: [$ or hours]
- People: [who is available]
- Tech stack: [fixed choices]
- Hosting/region: [where it must run]
4) Non-goals (must NOT happen)
- [explicit “no”]
- [explicit “not in v1”]
- [explicit “we won’t support”]
5) Open questions
- Q: [question]
Owner: [name]
Due: [date]
6) Lock rule
- After review: changes require: [what approval looks like]
Sebagian besar kejutan bukan kebetulan. Mereka terjadi karena spesifikasi memberi ruang untuk interpretasi berbeda.
Satu perangkap umum adalah mencampur tujuan dan solusi. Tim langsung lompat ke layar dan alur sebelum menulis apa yang tetap (tenggat, anggaran, tech stack) dan apa yang di luar ruang lingkup. Hasilnya rencana UI yang bagus tetapi tidak sesuai batasan.
Perangkap lain adalah non-goals yang samar. “Tidak ada fitur ekstra” terdengar tegas, tetapi tidak melindungi ketika seseorang meminta “hanya satu laporan lagi” atau “panel admin cepat”. Non-goals yang baik spesifik dan bisa dites.
Batasan anggaran tersembunyi atau tenggat “lunak” juga bom ruang lingkup. Jika anggaran nyata $5k tetapi spesifikasi terlihat seperti produk $50k, tim akan membangun yang salah. Tuliskan angka-angka yang membuat tidak nyaman itu di halaman.
Integrasi dan kepemilikan data juga menyebabkan kejutan diam-diam. Jika Anda berkata “hubungkan ke Stripe” tetapi tidak mendefinisikan event mana, field mana, dan siapa yang memiliku data, Anda akan mengulang keputusan yang sama berkali-kali.
Perangkap terakhir adalah mengubah batasan di tengah pembangunan tanpa menyebut trade-off. Beralih dari “hanya web” ke “web + mobile,” atau dari “gunakan Postgres” ke “pakai apa pun yang termurah,” mengubah rencana. Anda boleh mengubahnya, tetapi Anda harus memperbarui ruang lingkup, timeline, atau ekspektasi kualitas.
Tambahkan catatan singkat di spesifikasi yang menjawab lima poin:
Sebelum siapa pun mulai membangun, Anda harus bisa menjawab pertanyaan “apa yang tetap?” tanpa mencari melalui dokumen panjang.
Pemeriksaan cepat:
Jika salah satu hilang, build pertama masih akan terjadi, tetapi build kedua yang akan menjadi yang sebenarnya.
Langkah berikut yang menjaga momentum tanpa mengunci Anda pada keputusan buruk:
Jika Anda menggunakan Koder.ai (koder.ai), “Planning Mode” ditambah bagian batasan dan non-goals yang jelas membantu platform menghasilkan draf pertama yang sesuai dengan stack, wilayah hosting, dan ruang lingkup Anda. Dan jika prioritas bergeser, snapshot dan rollback memungkinkan Anda menguji perubahan tanpa kehilangan baseline stabil.
Ketika aturan-aturan ini ditulis sejak awal, diskusi fitur jadi lebih mudah karena semua orang tahu apa yang harus tetap tetap dan apa yang boleh berubah.
Pekerjaan ulang adalah ketika Anda membangun sesuatu yang berfungsi, tetapi tidak bisa diluncurkan karena keputusan penting muncul terlambat dan mengubah aturan. Biasanya ini terjadi ketika spesifikasi tidak menyebutkan batasan utama sejak awal, sehingga tim mengambil asumsi yang kemudian terbukti keliru.
Mulailah dengan hal-hal yang tidak boleh berubah tanpa trade-off nyata, seperti tenggat waktu, batas anggaran, wilayah hosting, stack yang diwajibkan, dan aturan kepatuhan. Tambahkan juga bagian non-goals singkat supaya orang tidak diam-diam memperluas ruang lingkup dengan "ekstra kecil".
Batasan membatasi bagaimana Anda membangun, misalnya “harus berjalan di EU” atau “harus menggunakan React dan PostgreSQL.” Non-goals membatasi apa yang Anda bangun, misalnya “tidak ada aplikasi mobile di v1” atau “tidak ada custom roles saat peluncuran.”
Tuliskan sebagai kalimat yang bisa diuji, bukan sekadar preferensi. Jika seseorang bisa menjawab “mungkin” dan tidak ada yang bisa menegakkannya, itu belum menjadi batasan yang nyata dan sebaiknya diperlakukan sebagai pertanyaan terbuka dulu.
Pilih 3 sampai 5 hasil pengguna yang menjelaskan seperti apa sukses untuk rilis pertama, dengan bahasa sederhana. Hasil membuat tim fokus pada apa yang harus dicapai pengguna, sehingga lebih mudah menolak fitur yang tidak mendukung rilis pertama.
Yang sering tersembunyi adalah dukungan mobile, peran dan izin, sejarah audit, residensi data, dan integrasi yang tidak bisa dipakai klien. Jika Anda mengangkat hal-hal itu sejak awal, Anda menghindari mendesain ulang layar, mengubah model data, atau mengganti penyedia di akhir proyek.
Jelaskan dengan spesifik dan ada batas waktunya, misalnya “tidak di v1” atau “kami tidak akan mendukung tablet.” Non-goal yang samar seperti “tidak ada fitur ekstra” tidak cukup karena tidak memblokir permintaan spesifik yang mungkin muncul.
Tuliskan siapa yang menyetujui perubahan, seberapa cepat review berlangsung, dan ritme evaluasinya. Feedback yang lambat adalah batasan nyata karena memengaruhi seberapa aman Anda bisa beriterasi dan berapa banyak ketidakpastian yang dapat ditangani.
Cantumkan sebagai pertanyaan terbuka dengan satu pemilik dan tanggal jatuh tempo, dan jangan mulai membangun area yang terpengaruh sampai jawabannya dikunci. Jika terpaksa mulai, tuliskan asumsi yang digunakan agar perubahan nanti bisa ditinjau tanpa kebingungan.
Gunakan perencanaan untuk mengunci batasan dan non-goals sebelum menghasilkan apa pun, sehingga draf pertama sesuai stack, wilayah, dan ruang lingkup Anda. Jika prioritas berubah, fitur seperti snapshot dan rollback membantu menguji perubahan tanpa kehilangan baseline stabil, dan ekspor source code berguna jika Anda perlu memindahkan pekerjaan ke tempat lain.