Blog

  • Aplikasi Bengkel: Servis, Stok Sparepart, Riwayat Kendaraan

    Aplikasi Bengkel: Servis, Stok Sparepart, Riwayat Kendaraan

    Aplikasi bengkel yang layak dipakai sebenarnya cuma perlu beres di tiga hal. Pertama, work order servis. Setiap kendaraan yang masuk tercatat sebagai satu pekerjaan, mulai dari keluhan awal, siapa mekanik yang mengerjakan, sampai statusnya selesai dan dibayar di kasir. Kedua, stok sparepart. Setiap part yang dipakai di work order otomatis memotong stok, jadi angka di sistem selalu sama dengan barang yang ada di rak. Ketiga, riwayat kendaraan. Semua servis tersimpan per nomor polisi. Pelanggan datang lagi, Anda tinggal ketik nopolnya, seluruh riwayatnya langsung muncul.

    Kalau tiga fungsi itu jalan, sisanya mengikuti. Laporan omzet tinggal ditarik dari work order yang sudah lunas. Reminder servis berkala tinggal dihitung dari tanggal servis terakhir. Di artikel ini kita bahas satu per satu, termasuk bagian yang jarang dibahas penyedia aplikasi: kapan bengkel Anda sebenarnya belum butuh sistem sama sekali.

    Masalah yang muncul kalau semua masih dicatat manual

    Kebanyakan bengkel mulai dari buku tulis dan nota rangkap. Untuk lima kendaraan sehari, itu cukup. Masalah baru terasa waktu bengkel mulai ramai dan orang yang terlibat lebih dari dua tiga orang. Polanya hampir selalu sama.

    • Nota hilang atau lupa ditulis. Pekerjaan sudah selesai, kendaraan sudah diambil, tapi tidak ada catatan berapa yang dibayar dan pakai part apa.
    • Sparepart berkurang tanpa jejak. Kampas rem di rak tinggal dua, padahal seingat Anda masih lima. Terpakai di kendaraan mana, tidak ada yang tahu.
    • Pelanggan tanya, terakhir ganti oli kapan ya. Anda cuma bisa menjawab kira kira. Padahal jawaban yang pasti itu kesempatan jualan.
    • Mekanik sudah selesai, kasir tidak tahu. Pelanggan menunggu, kasir masih tanya ke belakang, itung itungannya berapa. Antrian jadi lambat bukan karena servisnya, tapi karena administrasinya.

    Semua masalah itu punya akar yang sama. Informasi cuma ada di kepala orang, bukan di sistem yang bisa dilihat semua orang. Selama masih begitu, bengkel bergantung penuh ke ingatan pemilik. Sekali pemilik tidak di tempat, semuanya berantakan.

    Alur work order digital, dari kendaraan masuk sampai pembayaran

    Work order itu jantungnya aplikasi bengkel. Satu kendaraan masuk, satu work order dibuat. Semua yang terjadi setelah itu menempel di sana. Alurnya kira kira begini.

    • Kendaraan masuk. Petugas depan mencatat nopol, nama pelanggan, keluhan, dan kilometer. Kalau nopolnya sudah pernah servis, datanya otomatis muncul, tidak perlu tulis ulang.
    • Work order dibuat dan ditugaskan ke mekanik. Mekanik bisa lihat daftar antriannya sendiri, keluhannya apa, prioritasnya yang mana.
    • Selama pengerjaan, mekanik atau petugas mencatat jasa apa saja yang dikerjakan dan part apa saja yang dipakai. Part yang dipilih langsung mengurangi stok.
    • Status work order berubah jadi selesai. Kasir langsung lihat di layarnya, rinciannya sudah lengkap. Jasa berapa, part berapa, totalnya berapa. Tidak perlu tanya tanya ke belakang.
    • Pembayaran dicatat, nota dicetak atau dikirim lewat WhatsApp. Work order tertutup dan masuk jadi riwayat kendaraan itu.

    Perhatikan satu hal. Tidak ada langkah tambahan yang aneh untuk mekanik atau kasir. Alurnya sama dengan yang selama ini mereka kerjakan, cuma medianya pindah dari nota kertas ke layar. Ini penting, karena sistem yang menambah kerjaan biasanya cuma bertahan dua minggu sebelum semua orang balik ke buku tulis.

    Riwayat per nopol itu senjata retensi, bukan sekadar arsip

    Banyak pemilik bengkel menganggap riwayat servis cuma arsip. Padahal ini bagian yang paling berpengaruh ke omzet jangka panjang. Bisnis bengkel itu bisnis pelanggan yang balik lagi. Kendaraan yang sama akan butuh servis lagi dalam dua tiga bulan. Pertanyaannya cuma satu, dia balik ke bengkel Anda atau ke bengkel sebelah.

    Riwayat per nopol membuat pelanggan susah pindah. Waktu dia datang, Anda bisa bilang, servis terakhir bulan Maret, ganti oli sama kampas rem depan, waktu itu kampas belakang tinggal tipis. Kalimat sederhana seperti itu terasa seperti dilayani dokter langganan yang hafal riwayat pasiennya. Bengkel sebelah harus mulai dari nol.

    Dari riwayat yang sama, reminder servis berkala bisa jalan otomatis. Sistem tahu kapan ganti oli terakhir, tinggal dihitung mundur, lalu kirim pesan WhatsApp. Halo Pak Budi, Avanza B 1234 XYZ terakhir ganti oli 1 April, biasanya interval 3 bulan, mau sekalian dijadwalkan minggu ini. Satu pesan seperti itu, dikirim ke pelanggan yang tepat di waktu yang tepat, sering lebih efektif daripada pasang spanduk promo di depan bengkel.

    Prinsip kerjanya sebenarnya sama dengan CRM di bisnis lain, yaitu data pelanggan yang rapi dipakai untuk membuat mereka kembali. Kalau mau paham konsep dasarnya lebih jauh, kami pernah menulis soal apa itu CRM dan kenapa bisnis kecil juga butuh. Di bengkel, CRM-nya menempel langsung ke nopol.

    Stok sparepart yang nyambung langsung ke work order

    Modal bengkel paling banyak nyangkut di sparepart. Oli, kampas, filter, busi, aki. Kalau stoknya tidak tercatat, ada dua kebocoran yang jalan diam diam. Pertama, part terpakai tapi tidak tertagih ke pelanggan. Kedua, part hilang dan baru ketahuan berbulan bulan kemudian, itu pun kalau ketahuan.

    Kuncinya bukan sekadar punya catatan stok. Kuncinya stok itu nyambung ke work order. Barang masuk dicatat dari pembelian ke supplier. Barang keluar tidak diinput manual, tapi otomatis terpotong waktu part dipilih di work order. Dengan begitu setiap pengurangan stok selalu punya alasan yang bisa dilacak, kepakai di kendaraan mana, tanggal berapa, dikerjakan siapa.

    Efek sampingnya banyak. Anda bisa pasang batas stok minimum, jadi oli favorit tidak pernah kosong pas bengkel ramai. Stok opname yang biasanya makan seharian jadi tinggal mencocokkan selisih. Dan Anda mulai bisa lihat margin per part, bukan cuma omzet kotor.

    Laporan yang pemilik bengkel benar benar pakai

    Aplikasi apa pun biasanya jualan fitur laporan yang banyak. Dari pengalaman kami membangun sistem kasir dan inventory untuk berbagai usaha, yang benar benar dibuka pemilik itu cuma segelintir.

    • Omzet harian dan bulanan. Angka paling dasar, tapi harus akurat dan bisa dilihat dari HP tanpa datang ke bengkel.
    • Perbandingan pendapatan jasa dan sparepart. Dua sumber uang ini marginnya beda jauh. Kalau omzet naik tapi isinya jualan part semua, untungnya belum tentu ikut naik.
    • Produktivitas mekanik. Siapa menyelesaikan berapa work order, nilai pekerjaannya berapa. Berguna buat insentif yang adil, bukan berdasarkan perasaan.
    • Part paling laku dan stok mati. Yang laku jangan sampai kosong, yang tidak gerak jangan dibeli lagi.

    Laporan di luar itu boleh ada, tapi jangan jadi alasan memilih aplikasi. Empat hal di atas sudah cukup untuk mengambil hampir semua keputusan harian.

    Kapan belum butuh, dan pilih aplikasi jadi atau custom

    Kapan bengkel kecil belum butuh aplikasi

    Jujur saja, tidak semua bengkel butuh ini sekarang. Kalau kendaraan yang masuk masih di bawah lima sehari, mekaniknya Anda sendiri plus satu orang, dan semua transaksi masih terpantau langsung, buku tulis dan spreadsheet masih sangat bisa jalan. Uangnya lebih baik dipakai beli peralatan atau stok.

    Tanda Anda mulai butuh sistem biasanya begini. Anda sudah tidak hafal semua kendaraan yang masuk minggu ini. Ada selisih stok yang tidak bisa dijelaskan. Atau Anda mulai jarang di bengkel dan tidak tahu persis omzet hari ini berapa. Kalau dua dari tiga itu kena, catatan manual sudah jadi penghambat, bukan penghemat.

    Aplikasi jadi atau bikin custom

    Untuk kebanyakan bengkel, aplikasi bengkel yang sudah jadi adalah pilihan pertama yang masuk akal. Biayanya langganan bulanan, bisa dipakai hari itu juga, dan alur standarnya sudah teruji. Coba dulu yang jadi, rasakan sebulan dua bulan.

    Custom baru layak dipikirkan kalau alur bengkel Anda memang tidak standar. Misalnya bengkel spesialis dengan tahapan pengerjaan sendiri, bengkel yang melayani kontrak perawatan armada perusahaan dengan sistem tagihan bulanan, atau yang mau nyambung ke sistem akuntansi dan cabang lain. Di titik itu aplikasi jadi mulai terasa sempit, terlalu banyak fitur yang tidak kepakai dan fitur yang dibutuhkan justru tidak ada. Gambaran soal kapan sistem custom masuk akal dan prosesnya seperti apa bisa dibaca di halaman pembuatan sistem aplikasi custom kami.

    Pertanyaan yang sering diajukan

    Bengkel motor kecil cocok tidak pakai aplikasi seperti ini?

    Cocok kalau volumenya sudah ada, kira kira di atas sepuluh motor sehari atau sudah punya dua mekanik ke atas. Di bawah itu, mulai dari yang paling ringan dulu, misalnya spreadsheet untuk stok part dan catatan servis per nopol. Yang penting kebiasaan mencatatnya terbentuk dulu, pindah ke aplikasi belakangan jadi gampang karena datanya sudah ada.

    Bisa kirim reminder servis otomatis ke pelanggan?

    Bisa, dan ini justru fitur yang paling cepat terasa hasilnya. Sistem menghitung dari tanggal servis terakhir per nopol, lalu mengirim pesan WhatsApp menjelang jadwal berikutnya. Yang perlu dijaga cuma dua hal, nomor pelanggan dicatat benar sejak awal dan isi pesannya dibuat personal, menyebut nama dan kendaraannya, bukan pesan promo massal yang terasa seperti spam.

    Bagaimana input stok awal sparepart yang jumlahnya ratusan item?

    Tidak perlu langsung semua. Cara yang paling masuk akal, hitung fisik dulu untuk part yang paling sering keluar, biasanya 30 sampai 50 item sudah mewakili sebagian besar transaksi. Input lewat template excel yang disediakan aplikasi, lalu sisanya menyusul sambil jalan. Part yang belum terdata otomatis ketahuan waktu pertama kali dipakai di work order, saat itu juga tinggal ditambahkan.

    Kalau Anda pemilik bengkel yang mulai kewalahan dengan catatan manual dan ingin ngobrol dulu soal sistem yang pas, entah itu aplikasi jadi atau custom, silakan hubungi kami. Konsultasi awal gratis, dan kalau ternyata kebutuhan Anda cukup dijawab aplikasi jadi yang sudah ada di pasaran, kami akan bilang begitu.

  • Website SMK Itu Beda: Jurusan, PKL, dan BKK Harus Kelihatan

    Website SMK Itu Beda: Jurusan, PKL, dan BKK Harus Kelihatan

    Website SMK itu beda dari website SD, SMP, atau SMA. Bedanya ada di tiga hal: halaman jurusan yang digarap serius, informasi PKL yang jelas untuk siswa dan orang tua, serta bursa kerja khusus (BKK) yang terlihat aktif. Tiga hal ini yang sebenarnya dicari calon siswa dan orang tuanya sebelum memutuskan mendaftar. Kalau ketiganya tidak kelihatan di website, SMK sedang menyembunyikan senjata promosinya sendiri.

    Fitur dasar seperti profil sekolah, berita, dan info PPDB tentu tetap perlu. Itu berlaku untuk semua jenjang dan sudah kami bahas lengkap di artikel fitur website sekolah yang wajib ada. Artikel ini tidak akan mengulanginya. Kita fokus ke kebutuhan yang hanya dimiliki SMK.

    Orang memilih SMK karena ujungnya kerja

    Sebelum bicara fitur, pahami dulu psikologi calon pendaftarnya. Orang tua yang menyekolahkan anak ke SMA umumnya berpikir soal kuliah. Orang tua yang memilih SMK berpikir lebih pendek dan lebih konkret: setelah tiga tahun, anak saya bisa kerja di mana.

    Pertanyaan itu yang harus dijawab website SMK di halaman pertama. Bukan sejarah sekolah. Bukan sambutan kepala sekolah tiga paragraf. Tapi bukti bahwa lulusan sekolah ini punya keterampilan nyata dan jalur ke dunia kerja. Website SMA boleh berhenti di prestasi akademik. Website SMK harus menunjukkan mesin penyalur kerjanya.

    Ini juga alasan kenapa menyalin template website sekolah umum lalu mengganti logo hampir selalu gagal untuk SMK. Strukturnya memang tidak dirancang untuk menjawab pertanyaan orang tua calon siswa SMK.

    Halaman jurusan yang serius, bukan sekadar daftar nama

    Kebanyakan website SMK menampilkan kompetensi keahlian sebagai daftar: TKJ, TKR, Akuntansi, selesai. Padahal halaman jurusan adalah halaman paling menentukan di seluruh situs. Calon siswa tidak memilih sekolah dulu baru jurusan. Mereka memilih jurusan dulu, baru mencari sekolah yang jurusannya meyakinkan.

    Setiap kompetensi keahlian layak punya halaman sendiri yang memuat:

    • Apa yang dipelajari, ditulis dengan bahasa orang awam, bukan salinan kurikulum
    • Fasilitas praktiknya: bengkel, lab, dapur, studio, lengkap dengan foto asli, bukan stok foto
    • Karya siswa dari jurusan itu, misalnya aplikasi buatan anak RPL atau produk anak Tata Boga
    • Prospek kerja lulusan: profesi apa saja yang bisa diambil dan industri mana yang biasa menyerap
    • Guru produktif dan latar belakang industrinya, kalau ada

    Halaman jurusan yang lengkap seperti ini punya bonus lain. Orang mencari di Google dengan kata seperti “SMK jurusan TKJ di kota X”. Halaman jurusan yang serius jauh lebih mungkin muncul di pencarian semacam itu daripada halaman beranda yang isinya campur aduk.

    Informasi PKL yang menenangkan orang tua

    PKL atau prakerin adalah fase yang paling banyak menimbulkan pertanyaan dari orang tua. Anak akan ditempatkan di mana, berapa lama, siapa yang mengawasi, dokumen apa yang harus disiapkan. Kalau jawaban ini tidak ada di website, pertanyaannya pindah ke telepon sekolah dan grup WhatsApp wali murid. Waka humas yang kena getahnya.

    Sediakan satu bagian khusus PKL yang memuat:

    • Daftar industri mitra tempat siswa biasa ditempatkan, disusun per jurusan
    • Alur dan jadwal PKL dalam satu tahun ajaran, dari pembekalan sampai penarikan
    • Dokumen yang bisa diunduh: surat pengantar, jurnal kegiatan, format laporan, tata tertib
    • Kontak guru pembimbing atau pokja PKL untuk pertanyaan lanjutan

    Untuk calon pendaftar, daftar industri mitra ini sekaligus berfungsi sebagai bukti. Nama perusahaan yang jelas di halaman PKL jauh lebih meyakinkan daripada kalimat “bekerja sama dengan berbagai industri” tanpa satu pun nama.

    Ada efek samping yang menyenangkan dari halaman PKL yang rapi. Perusahaan calon mitra baru sering mengecek website sekolah sebelum menandatangani kerja sama. Halaman PKL yang tertata memberi kesan sekolah serius mengelola program magangnya, dan itu memudahkan pokja PKL membuka pintu mitra berikutnya.

    BKK, nilai jual paling kuat yang paling sering disembunyikan

    Hampir semua SMK punya bursa kerja khusus. Anehnya, BKK justru jadi bagian yang paling jarang tampil di website. Padahal inilah pembeda paling tajam antara SMK dan SMA di mata orang tua: sekolah ini bukan hanya mengajar, tapi ikut menyalurkan lulusannya bekerja.

    Halaman BKK yang berfungsi setidaknya memuat tiga hal. Pertama, lowongan kerja dari industri mitra yang diperbarui rutin. Ini membuat alumni terus kembali ke website dan menunjukkan ke calon pendaftar bahwa relasi industrinya hidup. Kedua, data keterserapan alumni: berapa persen lulusan tahun lalu yang sudah bekerja, melanjutkan kuliah, atau berwirausaha. Angka jujur, meskipun belum sempurna, lebih dipercaya daripada klaim bombastis. Ketiga, cerita alumni yang sudah bekerja, lengkap dengan nama perusahaan dan posisinya.

    Bayangkan orang tua membandingkan dua SMK. Satu websitenya hanya berisi berita upacara. Satu lagi menampilkan lowongan aktif dari pabrik dan hotel mitra plus data alumni yang terserap kerja. Keputusannya hampir tidak perlu dipikir lama.

    Secara teknis, halaman BKK tidak rumit. Yang berat justru komitmen memperbaruinya. Karena itu sistemnya harus memudahkan petugas BKK memasang lowongan sendiri tanpa menunggu operator website. Kalau setiap update harus lewat satu orang teknis, halaman ini biasanya mati dalam tiga bulan.

    Karya siswa, sertifikasi, dan kemitraan industri sebagai bukti mutu

    Klaim “lulusan kami siap kerja” ada di semua brosur SMK. Yang membedakan adalah buktinya. Ada tiga jenis bukti yang layak diberi tempat serius di website.

    Pertama, galeri karya siswa. Bukan galeri foto kegiatan yang isinya barisan siswa upacara, tapi hasil kerja: proyek las anak Teknik Pengelasan, desain anak DKV, aplikasi anak RPL, produk kewirausahaan yang benar-benar dijual. Karya berbicara lebih keras daripada deskripsi kurikulum mana pun.

    Kedua, sertifikasi kompetensi. Kalau sekolah sudah menjadi TUK atau bekerja sama dengan LSP, tampilkan skema sertifikasi apa saja yang bisa diikuti siswa. Sertifikat BNSP adalah bekal konkret saat melamar kerja, dan banyak orang tua belum tahu sekolah incarannya menyediakan itu.

    Ketiga, kemitraan industri yang lebih dalam dari sekadar tempat PKL. Teaching factory dan kelas industri adalah program mahal yang sering diperjuangkan sekolah bertahun-tahun, lalu hanya muncul sebagai satu kalimat di laporan tahunan. Kalau ada kelas binaan perusahaan tertentu, ceritakan di website: apa yang berbeda dari kelas reguler, apa keuntungan siswanya, ke mana lulusannya biasa disalurkan.

    Studi kasus: SMK Sekar Bumi Nusantara

    Salah satu contoh yang kami kerjakan adalah SMK Sekar Bumi Nusantara. Kebutuhan sekolah ini sejak awal memang lebih dari sekadar profil online. Sebelumnya banyak proses berjalan terpisah, sehingga update informasi dan manajemen data kurang efisien.

    Solusinya kami bangun sebagai satu ekosistem: website sekolah yang informatif dan mudah dikelola sendiri oleh admin, modul manajemen data untuk kebutuhan operasional dasar, dan LMS untuk distribusi materi serta pembelajaran digital. Seluruhnya dioptimasi untuk akses mobile dan SEO, karena mayoritas orang tua membuka website sekolah dari ponsel. Situsnya kini live di smksekarbuminusantara.sch.id.

    Pelajaran pentingnya satu: website SMK bekerja paling baik saat dia bukan pajangan, melainkan bagian dari operasional sekolah. Ketika admin mudah memperbarui konten, informasi jurusan, kegiatan, dan pengumuman ikut hidup. Website yang datanya segar selalu lebih meyakinkan daripada website bagus yang terakhir diperbarui dua tahun lalu.

    Mulai dari mana kalau website SMK Anda masih generik

    Tidak perlu langsung merombak semuanya. Urutan yang masuk akal kira-kira begini.

    • Bangun dulu halaman per jurusan yang lengkap. Ini fondasi yang paling memengaruhi keputusan pendaftar
    • Susul dengan halaman PKL berisi mitra industri dan dokumen unduhan, karena efeknya langsung terasa mengurangi beban humas
    • Hidupkan halaman BKK, minimal data keterserapan alumni dan beberapa lowongan aktif
    • Terakhir, rapikan galeri karya, informasi sertifikasi, dan cerita kemitraan industri

    Kalau tim internal tidak sempat mengerjakan sendiri, wajar. Kebanyakan sekolah memang tidak punya tenaga khusus untuk itu. Kami di Arrazy menyediakan jasa pembuatan website sekolah yang strukturnya bisa disesuaikan dengan kebutuhan SMK seperti di atas, termasuk halaman jurusan, PKL, dan BKK yang dikelola sendiri oleh admin sekolah. Kalau mau berdiskusi dulu soal kondisi website SMK Anda sekarang, silakan hubungi kami. Ngobrol dulu tidak ada biayanya.

    Pertanyaan yang sering diajukan

    Apakah BKK wajib punya halaman sendiri di website?

    Sangat disarankan. BKK adalah pembeda utama SMK di mata orang tua, dan lowongan yang diperbarui rutin membuat alumni terus kembali ke website. Minimal sediakan satu halaman berisi lowongan aktif, data keterserapan lulusan, dan kontak petugas BKK.

    Sekolah kami baru dan data alumninya belum banyak. Apa yang ditampilkan?

    Tampilkan apa yang sudah ada secara jujur: daftar industri mitra PKL, karya siswa angkatan berjalan, dan program sertifikasi yang disiapkan. Bukti proses lebih baik daripada klaim hasil yang belum bisa dibuktikan. Data keterserapan bisa menyusul begitu angkatan pertama lulus.

    Berapa lama membangun website SMK dengan halaman jurusan, PKL, dan BKK?

    Tergantung kesiapan konten dari sekolah, terutama foto fasilitas, data mitra, dan profil jurusan. Sisi teknisnya biasanya lebih cepat daripada pengumpulan kontennya. Cara paling praktis, mulai dari struktur dan halaman jurusan dulu, lalu lengkapi bagian lain bertahap sambil website sudah tayang.

  • Belajar Golang dari Nol #8: Package dan Go Module

    Belajar Golang dari Nol #8: Package dan Go Module

    Di Belajar Golang dari Nol #7 kita sudah membereskan pointer. Materi paling menakutkan di seri ini sudah lewat. Sekarang saatnya bicara soal kerapian. Selama tujuh bagian, semua latihan kita tulis di satu file bernama main.go. Untuk belajar, itu wajar. Untuk proyek sungguhan, itu resep pusing. Di bagian ini kita belajar memecah kode ke banyak file dan banyak folder. Kuncinya dua hal: package dan Go module.

    Masalahnya: main.go yang mulai gemuk

    Coba lihat file latihan Anda dari bagian 4 sampai 7. Isinya kira-kira begini. Ada struct Produk. Ada beberapa method. Ada function pembantu untuk format harga. Ada function main. Semua tumpuk di satu file.

    // main.go, semua campur di sini
    package main
    
    import "fmt"
    
    type Produk struct { ... }
    
    func (p *Produk) TambahStok(jumlah int) { ... }
    func (p *Produk) KurangiStok(jumlah int) error { ... }
    
    func formatRupiah(angka int) string { ... }
    func cetakLaporan(daftar []Produk) { ... }
    
    func main() { ... }
    

    Untuk 100 baris, ini masih aman. Tapi bayangkan aplikasi kasir sederhana. Ada produk, pelanggan, transaksi, dan laporan. Kalau semua ditulis di main.go, file itu bisa tembus ribuan baris. Anda akan scroll ke sana kemari cuma untuk cari satu function. Nama function juga mulai bentrok. Simpan() untuk produk atau untuk pelanggan? Terpaksa dinamai SimpanProduk dan SimpanPelanggan, lalu file makin ramai.

    Bahasa lain menyelesaikan ini dengan class dan namespace. Go menyelesaikannya dengan package. Satu package berisi kode yang topiknya sama. Kode soal produk masuk package produk. Alur utama program tetap di package main.

    Go module: KTP proyek Anda

    Sebelum bikin package, kita lunasi dulu satu utang dari bagian 1. Waktu itu saya minta Anda menjalankan go mod init tanpa penjelasan panjang. Sekarang waktunya dijelaskan tuntas.

    Module adalah unit proyek di Go. Satu module berisi satu proyek utuh: semua file, semua folder, semua package di dalamnya. Module juga mencatat proyek Anda bergantung ke library apa saja. Anggap saja module itu KTP proyek. Dia menyimpan nama proyek dan daftar kenalannya.

    Membuatnya cukup satu perintah di folder proyek.

    go mod init github.com/budi/tokokita
    

    Perintah ini menghasilkan file go.mod. Isinya pendek.

    module github.com/budi/tokokita
    
    go 1.22
    

    Baris pertama adalah nama module. Baris kedua adalah versi Go minimum yang dipakai proyek ini. Sudah, itu saja untuk sekarang.

    Soal penamaan, ada kebiasaan yang hampir semua programmer Go ikuti: nama module memakai path repository tempat kode itu nanti disimpan. Kalau username GitHub Anda budi dan proyeknya bernama tokokita, nama module-nya github.com/budi/tokokita. Kenapa begitu? Karena kalau suatu hari orang lain mau memakai kode Anda, Go bisa langsung tahu harus download dari mana. Nama module sekaligus jadi alamatnya. Untuk latihan lokal, Anda bebas menamai apa saja, misalnya tokokita saja. Tapi biasakan format path repo sejak awal supaya tidak perlu ganti nanti.

    Membuat package sendiri

    Sekarang kita pecah proyeknya. Aturannya sederhana: satu folder berisi satu package. Semua file di folder yang sama harus memakai nama package yang sama. Kita buat folder produk di dalam proyek, lalu isi dengan file produk.go.

    tokokita/
    ├── go.mod
    ├── main.go
    └── produk/
        └── produk.go
    

    Baris pertama di produk/produk.go bukan lagi package main, tapi package produk. Nama package sebaiknya sama dengan nama foldernya. Go tidak memaksa, tapi kalau berbeda, orang yang baca kode Anda akan bingung.

    Satu hal penting: hanya package main yang punya function main() dan bisa dijalankan langsung. Package lain sifatnya seperti kotak perkakas. Isinya dipakai oleh package lain, tidak jalan sendiri.

    Huruf besar dan huruf kecil: aturan akses Go

    Di banyak bahasa, ada kata kunci public dan private untuk mengatur apa yang boleh diakses dari luar. Go tidak punya kata kunci itu. Aturannya lebih sederhana dan agak unik: dilihat dari huruf pertama namanya.

    • Nama diawali huruf besar, misalnya Produk atau TambahStok: exported. Bisa diakses dari package lain.
    • Nama diawali huruf kecil, misalnya hitungDiskon: unexported. Hanya bisa dipakai di dalam package itu sendiri. Privat.

    Aturan ini berlaku untuk semuanya: function, struct, method, field struct, sampai variabel level package. Field struct yang huruf kecil pun tidak bisa dibaca dari luar package-nya.

    Masih ingat di bagian 1 saya bilang penulisan fmt.Println dengan P besar itu bukan selera, tapi keharusan? Ini jawabannya. Println ada di package fmt milik tim Go. Supaya bisa kita panggil dari luar, dia harus exported. Makanya hurufnya besar. Kalau tim Go menamainya println, kita tidak akan bisa memakainya sama sekali.

    Meng-import package sendiri

    Lalu bagaimana main.go memakai package produk? Lewat import, sama seperti kita meng-import fmt selama ini. Bedanya, path-nya adalah nama module ditambah nama folder.

    import "github.com/budi/tokokita/produk"
    

    Go membaca path itu begini: cari module github.com/budi/tokokita. Itu proyek kita sendiri, sesuai go.mod. Lalu masuk ke folder produk. Setelah di-import, semua isi yang exported bisa dipanggil dengan awalan nama package-nya: produk.Baru(...), mirip fmt.Println(...).

    Praktik: memecah sistem stok jadi dua file

    Teori cukup. Sekarang kita rapikan latihan sistem stok dari bagian 4. Semua yang berhubungan dengan produk pindah ke package produk: struct, constructor, dan method-nya. File main.go hanya berisi alur program. Ini isi lengkap produk/produk.go.

    package produk
    
    import "fmt"
    
    // Produk menyimpan data satu barang di gudang.
    type Produk struct {
    	Nama  string
    	Stok  int
    	Harga int
    }
    
    // Baru membuat Produk baru dan mengembalikan pointer-nya.
    func Baru(nama string, stok int, harga int) *Produk {
    	return &Produk{Nama: nama, Stok: stok, Harga: harga}
    }
    
    // TambahStok menambah jumlah stok.
    func (p *Produk) TambahStok(jumlah int) {
    	p.Stok += jumlah
    }
    
    // KurangiStok mengurangi stok, gagal kalau stok tidak cukup.
    func (p *Produk) KurangiStok(jumlah int) error {
    	if jumlah > p.Stok {
    		return fmt.Errorf("stok %s tinggal %d, tidak cukup untuk keluar %d",
    			p.Nama, p.Stok, jumlah)
    	}
    	p.Stok -= jumlah
    	return nil
    }
    
    // Info mengembalikan ringkasan produk dalam satu baris.
    func (p *Produk) Info() string {
    	return fmt.Sprintf("%s | stok %d | Rp%d", p.Nama, p.Stok, p.Harga)
    }
    

    Perhatikan function Baru. Ini pola yang disebut constructor. Dari luar, pemanggilannya jadi produk.Baru(...), enak dibaca seperti kalimat: buat produk baru. Method-nya memakai pointer receiver *Produk supaya perubahan stok benar-benar tersimpan. Itu materi bagian 7 yang langsung terpakai di sini.

    Sekarang main.go. Pendek dan bersih.

    package main
    
    import (
    	"fmt"
    
    	"github.com/budi/tokokita/produk"
    )
    
    func main() {
    	kopi := produk.Baru("Kopi Arabika", 10, 25000)
    	kopi.TambahStok(5)
    
    	err := kopi.KurangiStok(20)
    	if err != nil {
    		fmt.Println("Gagal:", err)
    	}
    
    	err = kopi.KurangiStok(8)
    	if err != nil {
    		fmt.Println("Gagal:", err)
    	}
    
    	fmt.Println(kopi.Info())
    }
    

    Jalankan dengan go run . dari folder proyek. Titik di akhir artinya jalankan package di folder ini. Outputnya:

    Gagal: stok Kopi Arabika tinggal 15, tidak cukup untuk keluar 20
    Kopi Arabika | stok 7 | Rp25000
    

    Logikanya sama persis dengan versi satu file. Yang berubah cuma letaknya. Tapi rasakan bedanya. Kalau besok Anda mau menambah fitur diskon, Anda tahu persis harus buka produk/produk.go. Kalau mau mengubah alur program, buka main.go. Kode soal pelanggan nanti tinggal dibuatkan folder pelanggan sendiri.

    Memakai package buatan orang lain

    Kekuatan module tidak berhenti di kode sendiri. Dengan go get, Anda bisa memakai ribuan package buatan komunitas. Kita coba satu yang populer dan stabil: github.com/google/uuid, pembuat ID unik. Jalankan dari folder proyek.

    go get github.com/google/uuid
    

    Go akan download package itu, lalu mencatatnya di go.mod. File-nya sekarang punya baris baru.

    module github.com/budi/tokokita
    
    go 1.22
    
    require github.com/google/uuid v1.6.0
    

    Artinya proyek ini butuh package uuid versi 1.6.0. Selain itu muncul file baru bernama go.sum. Isinya kode hash dari package yang di-download. Fungsinya seperti segel: kalau nanti Anda atau teman satu tim download ulang package itu dan isinya berbeda dari yang tercatat, Go langsung menolak. Dua file ini yang menjamin proyek Anda jalan sama persis di komputer siapa pun. Keduanya wajib ikut di-commit ke Git.

    Memakainya sama seperti package lain. Tambahkan di import, panggil function-nya.

    import "github.com/google/uuid"
    
    // di dalam function:
    id := uuid.NewString()
    fmt.Println("ID transaksi:", id)
    

    Setiap dipanggil, uuid.NewString() menghasilkan string acak seperti 3f1c9d2a-8b7e-4f0a-9c2d-1e5b6a7f8d90. Cocok untuk ID transaksi atau nomor pesanan yang tidak boleh kembar.

    Kebiasaan penamaan package yang baik

    Terakhir, soal nama. Komunitas Go punya selera yang cukup seragam di sini.

    • Pendek dan satu kata: produk, laporan, kasir.
    • Semua huruf kecil. Tanpa underscore, tanpa camelCase. Bukan dataProduk atau data_produk.
    • Nama menggambarkan isi. Orang harus bisa menebak isi package dari namanya saja.
    • Hindari pengulangan nama. Function produk.Baru lebih enak daripada produk.ProdukBaru. Nama package sudah memberi konteks, tidak perlu diulang.

    Anti-pattern yang paling sering muncul di pemula: package util atau helper. Isinya gado-gado. Format tanggal, hitung pajak, validasi email, semua dilempar ke sana. Enam bulan kemudian package itu jadi tempat sampah yang tidak ada yang berani menyentuh. Kalau ada function yang bingung mau ditaruh di mana, itu tanda Anda belum menemukan nama topik yang tepat, bukan tanda butuh package util. Format tanggal bisa masuk package tanggal. Hitung pajak masuk pajak. Spesifik selalu menang.

    Rangkuman dan bagian berikutnya

    Hari ini kode Anda naik kelas. Dari satu file main.go menjadi proyek yang tertata. Yang perlu diingat:

    • Module adalah KTP proyek. Dibuat dengan go mod init, dicatat di go.mod, dinamai dengan path repo seperti github.com/username/tokokita.
    • Satu folder satu package. Kode dikelompokkan per topik, bukan ditumpuk di satu file.
    • Huruf besar berarti exported, huruf kecil berarti privat. Itu alasan Println ber-P besar.
    • Import package sendiri memakai nama module ditambah nama folder.
    • go get menarik package pihak ketiga, tercatat di go.mod dan disegel di go.sum.
    • Nama package pendek, huruf kecil, spesifik. Jauhi package util campur aduk.

    Coba latihan kecil sebelum lanjut: pecah latihan Anda sendiri dari bagian 5 atau 6 menjadi minimal satu package terpisah, lalu pastikan go run . tetap jalan. Di bagian 9 kita masuk ke salah satu fitur paling khas Go: interface. Judulnya “Interface: Kontrak yang Bikin Kode Fleksibel”. Struktur proyek seperti ini juga yang kami pakai sehari-hari saat membangun sistem aplikasi untuk bisnis dengan Go di Arrazy.

  • Belajar Kubernetes #1: Kubernetes Adalah + Install Minikube

    Belajar Kubernetes #1: Kubernetes Adalah + Install Minikube

    Kubernetes adalah platform open source untuk mengelola aplikasi berbasis container secara otomatis. Tugasnya mencakup menjalankan container di banyak server sekaligus, menghidupkan ulang container yang mati, membagi beban trafik, dan menaikkan jumlah container saat trafik ramai. Singkatnya, kalau Docker menjalankan satu container, Kubernetes mengatur ratusan container di banyak mesin supaya kamu tidak perlu mengurusnya satu per satu.

    Artikel ini bagian pertama dari seri Belajar Kubernetes dari Nol, total 26 bagian sampai kamu bisa deploy aplikasi web plus database di VPS sendiri. Di bagian ini kita bahas konsep dasarnya, lalu langsung praktik: install kubectl dan Minikube, jalankan cluster pertama, dan deploy nginx sebagai bukti environment kamu hidup. Prasyaratnya cuma satu: paham Docker dasar. Kalau belum, selesaikan dulu seri Belajar Docker dari Nol minimal sampai paham image, container, dan port mapping.

    Kubernetes Adalah Solusi untuk Masalah Banyak Container

    Bayangkan kamu punya aplikasi toko online yang sudah di-container-kan dengan Docker. Di laptop, satu perintah docker run sudah cukup. Masalah muncul waktu aplikasi itu masuk production dan trafiknya naik. Satu server tidak kuat, jadi kamu sewa tiga server. Sekarang pertanyaannya:

    • Container mana jalan di server mana?
    • Kalau satu container crash jam 3 pagi, siapa yang menghidupkan ulang?
    • Kalau satu server mati total, siapa yang memindahkan container ke server lain?
    • Kalau ada update versi aplikasi, bagaimana caranya ganti 20 container tanpa downtime?
    • Trafik naik saat flash sale, siapa yang menambah container lalu menguranginya lagi setelah sepi?

    Semua itu bisa dikerjakan manual dengan SSH ke tiap server dan menjalankan perintah Docker satu per satu. Untuk dua tiga container masih masuk akal. Untuk puluhan container di beberapa server, itu resep begadang. Kubernetes lahir untuk mengambil alih pekerjaan ini. Istilah kerennya container orchestration, orkestrasi container.

    Analogi paling gampang: Kubernetes itu seperti mandor proyek bangunan. Kamu sebagai pemilik proyek cukup bilang “saya mau 5 tukang ngecat tembok”. Mandor yang mengatur tukang mana ditempatkan di sisi mana, mencarikan pengganti kalau ada tukang yang sakit, dan menambah tukang kalau target dipercepat. Kamu tidak perlu mengawasi tukang satu per satu. Di Kubernetes, kamu menulis keinginan itu dalam file konfigurasi, misalnya “jalankan 5 replika aplikasi saya”, lalu Kubernetes yang menjaga kondisi itu terus terpenuhi. Konsep ini disebut desired state, dan ini yang membedakan Kubernetes dari sekadar menjalankan container manual.

    Tim kami di Arrazy memakai pola yang sama saat mengelola backend Go dan Laravel milik klien. Saat aplikasi masih kecil, Docker Compose di satu VPS cukup. Begitu kebutuhan uptime dan skala naik, orkestrasi seperti Kubernetes atau k3s jadi jauh lebih masuk akal daripada mengelola container manual lintas server.

    Alat yang Dibutuhkan: kubectl dan Minikube

    Untuk belajar, kamu tidak perlu sewa tiga server. Ada dua alat yang kita pakai sepanjang seri ini:

    • kubectl: command line untuk berkomunikasi dengan cluster Kubernetes. Semua perintah ke cluster lewat sini.
    • Minikube: alat untuk menjalankan cluster Kubernetes mini di laptop, cukup satu mesin. Cocok untuk belajar dan development.

    Spesifikasi minimum untuk Minikube: 2 CPU, 2 GB RAM bebas, 20 GB disk, dan Docker sudah terinstall (versi 20.10 ke atas, cek dengan docker version). Kita pakai Docker sebagai driver Minikube karena paling ringan dan tidak butuh VirtualBox.

    Install kubectl dan Minikube di Linux

    Contoh untuk Ubuntu 22.04 atau 24.04, arsitektur x86_64. Install kubectl versi stabil terbaru:

    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    kubectl version --client

    Output yang diharapkan kurang lebih seperti ini (versi minor bisa berbeda):

    Client Version: v1.31.0
    Kustomize Version: v5.4.2

    Lanjut install Minikube:

    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
    minikube version

    Output: minikube version: v1.34.0 atau lebih baru.

    Install kubectl dan Minikube di macOS

    Paling cepat lewat Homebrew:

    brew install kubectl minikube
    kubectl version --client
    minikube version

    Berlaku untuk Mac Intel maupun Apple Silicon. Pastikan Docker Desktop sudah jalan sebelum lanjut ke langkah berikutnya.

    Install kubectl dan Minikube di Windows

    Pakai winget dari PowerShell (jalankan sebagai Administrator):

    winget install -e --id Kubernetes.kubectl
    winget install -e --id Kubernetes.minikube

    Tutup dan buka lagi PowerShell supaya PATH terbaca, lalu verifikasi dengan kubectl version --client dan minikube version. Untuk Windows, saya sarankan Docker Desktop dengan backend WSL 2. Kalau kamu sudah terbiasa kerja di WSL 2 Ubuntu, boleh juga ikuti langkah Linux di atas langsung dari dalam WSL.

    Menjalankan Cluster Kubernetes Pertama

    Sekarang bagian serunya. Jalankan cluster dengan Kubernetes versi 1.31 supaya seragam sepanjang seri:

    minikube start --driver=docker --kubernetes-version=v1.31.0

    Proses pertama butuh beberapa menit karena Minikube mengunduh image Kubernetes sekitar 1 GB. Kalau sukses, baris terakhirnya seperti ini:

    Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

    Cek kondisi cluster dengan tiga perintah ini:

    minikube status

    Output yang diharapkan:

    minikube
    type: Control Plane
    host: Running
    kubelet: Running
    apiserver: Running
    kubeconfig: Configured

    Lalu cek node, yaitu mesin yang jadi anggota cluster. Di Minikube cuma ada satu:

    kubectl get nodes
    NAME       STATUS   ROLES           AGE   VERSION
    minikube   Ready    control-plane   1m    v1.31.0

    Terakhir, cek alamat komponen inti cluster:

    kubectl cluster-info
    Kubernetes control plane is running at https://192.168.49.2:8443
    CoreDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

    Kalau ketiga perintah itu keluar tanpa error, selamat, kamu resmi punya cluster Kubernetes di laptop. Istilah seperti control plane dan node akan kita bedah di bagian 3 tentang arsitektur. Untuk sekarang cukup pahami: node adalah mesin pekerja, control plane adalah otaknya.

    Deploy Percobaan: Membuktikan Cluster Hidup

    Kita belum akan belajar deployment secara serius, itu jatah bagian 7. Tapi tidak afdol rasanya punya cluster tanpa menjalankan apa pun. Deploy nginx dengan satu perintah:

    kubectl create deployment nginx --image=nginx:1.27

    Output: deployment.apps/nginx created. Lalu lihat hasilnya:

    kubectl get pods
    NAME                     READY   STATUS    RESTARTS   AGE
    nginx-676b6c5bbc-8k2vw   1/1     Running   0          30s

    Kalau STATUS masih ContainerCreating, tunggu beberapa detik lalu jalankan lagi. Begitu Running, artinya Kubernetes berhasil menarik image nginx dan menjalankannya sebagai pod. Apa itu pod? Sabar, itu materi bagian 5. Sekarang hapus dulu percobaan ini supaya cluster bersih:

    kubectl delete deployment nginx

    Kalau mau istirahat, matikan cluster dengan minikube stop. Data dan konfigurasi tetap tersimpan, tinggal minikube start lagi kapan pun.

    Error Umum Saat Install Minikube dan Solusinya

    Virtualisasi belum aktif di BIOS

    Gejala: Minikube atau Docker Desktop gagal start dengan pesan seperti This computer doesn't have VT-X/AMD-v enabled. Penyebabnya fitur virtualisasi (Intel VT-x atau AMD-V) belum dinyalakan di BIOS/UEFI. Solusi: restart komputer, masuk BIOS (biasanya tombol F2, F10, atau Del), cari opsi bernama Intel Virtualization Technology, VT-x, AMD-V, atau SVM Mode, lalu set ke Enabled. Di Linux kamu bisa cek dulu dengan egrep -c '(vmx|svm)' /proc/cpuinfo. Kalau hasilnya lebih dari 0, virtualisasi didukung CPU kamu.

    Bingung driver docker vs virtualbox

    Minikube bisa jalan di atas beberapa driver. Dua yang paling sering dipakai pemula: docker dan virtualbox. Rekomendasi saya tegas: pakai --driver=docker. Lebih ringan, start lebih cepat, dan tidak perlu install aplikasi tambahan kalau Docker sudah ada. VirtualBox baru relevan kalau kamu memang tidak bisa memasang Docker. Kalau Minikube kamu telanjur terbuat dengan driver lain dan mau ganti, hapus dulu clusternya dengan minikube delete, lalu start ulang dengan flag driver yang benar. Ganti driver tidak bisa dilakukan pada cluster yang sudah jadi.

    minikube start gagal karena RAM kurang

    Gejala: muncul pesan seperti Requested memory allocation is less than the recommended minimum atau proses start macet lalu gagal. Minikube default meminta 2 GB ke atas, dan kalau laptop kamu sisa RAM-nya tipis karena browser membuka 30 tab, start bisa gagal. Solusi: tutup aplikasi berat, lalu jalankan dengan alokasi eksplisit, misalnya minikube start --driver=docker --memory=2048 --cpus=2 --kubernetes-version=v1.31.0. Kalau total RAM laptop 4 GB, pengalaman belajarnya akan berat. Pertimbangkan pakai VPS murah untuk lab, nanti di bagian 24 kita bahas install k3s di VPS yang jauh lebih hemat resource.

    Docker daemon tidak jalan atau permission denied

    Gejala: Cannot connect to the Docker daemon atau permission denied while trying to connect to the Docker daemon socket. Yang pertama artinya service Docker belum hidup, jalankan sudo systemctl start docker di Linux atau buka Docker Desktop di Windows/macOS. Yang kedua artinya user kamu belum masuk grup docker, perbaiki dengan sudo usermod -aG docker $USER lalu logout dan login lagi. Satu catatan penting: jangan menjalankan minikube start sebagai root, driver docker memang menolak dijalankan dengan sudo.

    Peta Lengkap Seri Belajar Kubernetes dari Nol

    Supaya kamu tahu arah perjalanan, ini peta 26 bagian yang akan kita lalui. Semuanya praktik di Minikube dulu, lalu pindah ke VPS sungguhan menjelang akhir.

    Bagian Topik Yang kamu kuasai
    1 sampai 4 Pengenalan, beda Docker vs Kubernetes, arsitektur cluster, perintah dasar kubectl Fondasi konsep dan alat kerja
    5 sampai 8 Pod, YAML manifest, Deployment dan ReplicaSet, rolling update dan rollback Menjalankan dan meng-update aplikasi tanpa downtime
    9 sampai 10 Service (ClusterIP, NodePort) dan Ingress Membuka akses aplikasi dari luar cluster
    11 sampai 14 ConfigMap, Secret, liveness dan readiness probe, resource request dan limit Konfigurasi dan kesehatan aplikasi ala production
    15 sampai 17 Volume, Persistent Volume dan PVC, StatefulSet Menyimpan data dan menjalankan database
    18 sampai 22 Namespace, RBAC, HPA autoscaling, Helm, logging dan monitoring Mengelola cluster secara rapi dan aman
    23 sampai 26 Deploy web plus database lengkap, install k3s di VPS, HTTPS dengan cert-manager, proyek akhir Aplikasi nyata jalan di VPS dengan domain dan HTTPS

    Di akhir seri, kamu akan punya aplikasi web lengkap dengan database yang berjalan di cluster milikmu sendiri di VPS, bisa diakses lewat domain dengan HTTPS. Itu portofolio yang layak ditunjukkan saat melamar kerja sebagai backend atau DevOps engineer.

    Rangkuman dan Lanjut ke Bagian 2

    Hari ini kamu sudah paham bahwa Kubernetes adalah orkestrator container, si mandor yang menjaga aplikasi tetap jalan sesuai keinginanmu di banyak mesin. Kamu juga sudah install kubectl dan Minikube, menjalankan cluster Kubernetes 1.31 pertama, membuktikannya hidup lewat kubectl get nodes, dan sempat deploy nginx sebagai pemanasan.

    Pertanyaan yang paling sering muncul setelah ini: kalau sudah bisa Docker, kenapa repot belajar Kubernetes, dan kapan Docker Compose saja sudah cukup? Itu tema bagian berikutnya, “Belajar Kubernetes #2: Perbedaan Docker dan Kubernetes”, yang terbit menyusul di halaman hub Belajar Kubernetes dari Nol. Sambil menunggu, biarkan Minikube terpasang dan coba ulangi perintah hari ini sampai lancar di luar kepala.

    Referensi

  • Website Sudah Jadi tapi Belum Muncul di Google? Urutan Ngeceknya

    Website Sudah Jadi tapi Belum Muncul di Google? Urutan Ngeceknya

    Website baru selesai dibuat, dibuka di browser normal, tapi begitu dicari di Google hasilnya kosong. Rasanya seperti buka toko tapi tidak ada yang tahu tokonya ada. Sebelum panik, pahami dulu satu hal. Hampir semua kasus website tidak muncul di Google jatuh ke salah satu dari dua kemungkinan. Pertama, website Anda belum terindex, artinya Google memang belum tahu website itu ada. Kedua, website sudah terindex tapi kalah bersaing, jadi posisinya jauh di bawah dan praktis tidak terlihat.

    Cara membedakannya cuma butuh 30 detik. Buka Google, lalu ketik site:namadomain.com dengan domain Anda sendiri, tanpa spasi setelah titik dua. Kalau muncul daftar halaman website Anda, berarti sudah terindex dan masalahnya ada di persaingan. Kalau hasilnya kosong, berarti Google belum mengindex website Anda sama sekali. Dua kondisi ini penanganannya beda jauh. Artikel ini membahas urutan ngeceknya satu per satu, dari penyebab yang paling sering kejadian.

    Cek dulu: Anda mencari pakai apa?

    Ini pertanyaan pertama yang sering dilewati. Waktu bilang “website saya tidak muncul di Google”, Anda mencarinya pakai apa? Nama bisnis sendiri, atau kata kunci umum?

    Kalau Anda mengetik nama bisnis sendiri, misalnya “Toko Berkah Mandiri Purwokerto”, dan website tetap tidak muncul, itu memang ada masalah yang perlu dicek. Nama bisnis biasanya tidak punya banyak pesaing, jadi begitu terindex, website Anda seharusnya langsung tampil untuk pencarian nama sendiri.

    Tapi kalau yang Anda ketik adalah kata kunci umum seperti “jual baju anak” atau “catering murah”, lalu website tidak muncul di halaman satu, itu bukan error. Itu normal untuk website baru. Kata kunci umum diperebutkan ratusan sampai ribuan website yang sudah lebih dulu ada, sudah punya banyak konten, dan sudah dipercaya Google bertahun-tahun. Website berumur seminggu belum bisa menang di arena itu, dan tidak ada pengaturan ajaib yang bisa mengubahnya dalam semalam. Butuh waktu dan usaha yang konsisten.

    Jadi pisahkan dulu dua hal ini. Sisa artikel ini membahas kasus pertama, yaitu website yang bahkan tidak muncul saat dicari pakai nama sendiri.

    Cek status index pakai site:namadomain.com

    Perintah site: meminta Google menampilkan semua halaman dari satu domain yang sudah ada di database mereka. Contohnya, ketik site:tokoberkah.com di kolom pencarian Google.

    • Hasilnya ada. Website Anda sudah terindex. Google sudah tahu website Anda. Kalau masih tidak muncul di pencarian biasa, masalahnya bukan index, tapi persaingan. Lompat ke bagian tentang kalah bersaing di bawah.
    • Hasilnya kosong. Google belum menyimpan satu pun halaman website Anda. Penyebabnya bisa sesederhana umur website yang masih hitungan hari, atau ada pengaturan teknis yang menghalangi. Kita bahas keduanya.

    Satu catatan. Kadang hanya sebagian halaman yang muncul. Misalnya halaman depan terindex tapi halaman produk belum. Itu wajar di masa awal, Google mengindex bertahap, tidak sekaligus.

    Websitenya umur berapa?

    Kalau website baru tayang seminggu, jawabannya sederhana. Memang belum waktunya. Google tidak langsung tahu setiap website baru yang muncul di internet. Perayapnya perlu menemukan website Anda dulu, membacanya, lalu memutuskan menyimpannya ke index. Proses ini bisa makan waktu beberapa hari sampai beberapa minggu, apalagi kalau belum ada satu pun website lain yang menautkan ke website Anda.

    Jadi kalau website baru launching minggu lalu dan hasil site: masih kosong, ini bukan tanda ada yang rusak. Anda bisa mempercepat prosesnya lewat Google Search Console, yang dibahas di bawah. Tapi kalau sudah lewat sebulan dan hasil site: tetap kosong, barulah patut curiga ada penghalang teknis.

    Tiga penyebab teknis yang bisa ditanyakan ke developer

    Tiga hal ini penyebab teknis paling umum. Anda tidak perlu paham kodenya, cukup tanyakan langsung ke developer atau vendor website Anda dengan kalimat di bawah.

    1. Tag noindex kelupaan dicabut

    Ini juara satu. Saat website masih tahap pengerjaan, developer biasanya memasang tag noindex supaya versi setengah jadi tidak keburu muncul di Google. Masalahnya, tag ini sering lupa dicabut saat website resmi tayang. Akibatnya website terlihat normal di browser, tapi Google diminta untuk tidak menyimpannya. Tanyakan ke developer, “Apakah tag noindex sudah dilepas setelah launching?”

    2. Robots.txt memblokir Google

    File robots.txt adalah semacam papan aturan untuk mesin pencari. Kalau isinya keliru, Google bisa terblokir dari seluruh website. Sama seperti noindex, pengaturan ini sering dipakai saat pengembangan lalu lupa dikembalikan. Tanyakan, “Apakah robots.txt masih memblokir mesin pencari?”

    3. Sitemap belum disubmit

    Sitemap adalah daftar semua halaman website Anda dalam format yang dipahami Google. Tanpa sitemap, Google tetap bisa menemukan website Anda, hanya lebih lambat. Dengan sitemap yang disubmit ke Google Search Console, Anda memberi tahu Google secara langsung, “Ini daftar halaman saya, silakan dirayapi.” Tanyakan ke developer apakah sitemap sudah dibuat dan disubmit.

    Selagi mengecek tiga hal ini ke developer, sekalian saja minta dia memeriksa poin-poin di checklist keamanan website yang bisa dicek sendiri. Website baru launching biasanya belum sempat diaudit dua sisi ini sekaligus.

    Pasang Google Search Console, ini wajib

    Google Search Console adalah alat gratis dari Google untuk pemilik website. Fungsinya seperti dashboard komunikasi antara Anda dan Google. Dari sini Anda bisa lihat halaman mana yang sudah terindex, kata kunci apa yang mendatangkan pengunjung, dan apakah ada masalah yang membuat halaman ditolak. Kalau ada tag noindex atau blokir robots.txt seperti di atas, Search Console yang akan memberitahunya, lengkap dengan alasannya.

    Cara daftarnya tidak sulit dan tidak butuh keahlian teknis khusus.

    • Buka search.google.com/search-console lalu login pakai akun Google.
    • Tambahkan properti dengan memasukkan alamat domain Anda.
    • Verifikasi kepemilikan. Cara paling umum lewat pengaturan DNS domain, atau minta developer memasang kode verifikasi di website. Prosesnya beberapa menit saja.
    • Setelah terverifikasi, buka menu Sitemaps, lalu masukkan alamat sitemap Anda, biasanya namadomain.com/sitemap.xml, dan klik submit.

    Setelah itu Anda tinggal menunggu sambil sesekali mengecek laporan indexing. Kalau ada halaman penting yang belum terindex, ada fitur inspeksi URL untuk meminta Google merayapinya lebih cepat. Sekali lagi, ini alat wajib. Tanpa Search Console, Anda menebak-nebak dalam gelap.

    Sudah terindex tapi tetap kalah bersaing?

    Sekarang skenario kedua. Hasil site: menunjukkan website Anda sudah terindex, muncul juga saat dicari pakai nama bisnis, tapi untuk kata kunci umum posisinya entah di halaman berapa. Di sini perlu jujur soal ekspektasi.

    Muncul di posisi atas untuk kata kunci yang ramai itu hasil kerja panjang, bukan hasil sekali setting. Google menilai banyak hal. Seberapa lengkap dan berguna konten Anda dibanding pesaing. Seberapa banyak website lain yang mempercayai dan menautkan website Anda. Seberapa lama website Anda konsisten hadir di topik itu. Pesaing yang sekarang ada di halaman satu sudah menabung semua itu bertahun-tahun.

    Kabar baiknya, ini bisa dikejar dengan strategi yang benar. Mulai dari kata kunci yang lebih spesifik, misalnya menambahkan nama kota atau niche tertentu, yang persaingannya jauh lebih masuk akal untuk website baru. Rajin menerbitkan konten yang benar-benar menjawab pertanyaan calon pelanggan. Dan pastikan fondasi teknisnya beres sejak awal. Website yang dibangun dengan struktur yang ramah mesin pencari dari hari pertama punya start yang jauh lebih enak dibanding website yang harus dibongkar ulang belakangan.

    Yang penting dipahami, tidak ada jalan pintas yang jujur di sini. Siapa pun yang menjanjikan posisi satu dalam seminggu untuk kata kunci ramai sedang menjual sesuatu yang tidak bisa dia kendalikan.

    Hal yang justru tidak perlu Anda lakukan

    Saat panik, orang gampang tergoda solusi instan. Tiga hal ini terlihat seperti usaha, padahal buang waktu atau malah merusak.

    • Mendaftarkan website ke puluhan situs direktori abal-abal. Direktori yang isinya cuma tumpukan link tidak membantu index dan tidak menaikkan posisi. Google sudah lama mengabaikan pola seperti ini.
    • Beli backlink murah. Paket ribuan backlink seharga nasi padang itu hampir pasti berasal dari jaringan spam. Skenario terbaiknya tidak berpengaruh, skenario terburuknya website Anda kena penalti dan makin sulit muncul.
    • Menjejalkan kata kunci di mana-mana. Mengulang “jasa catering murah jakarta” dua puluh kali di satu halaman tidak menipu Google, hanya membuat calon pelanggan yang benar-benar mampir jadi ilfeel.

    Kalau ragu suatu taktik aman atau tidak, tanya sederhana saja. Apakah ini membuat website saya lebih berguna untuk manusia? Kalau jawabannya tidak, lewati.

    Kapan wajar minta bantuan?

    Sebagian besar langkah di artikel ini bisa Anda kerjakan sendiri atau selesaikan lewat satu dua pertanyaan ke developer. Kalau website belum terindex, urutannya jelas. Cek site:, cek umur website, tanyakan noindex, robots.txt, dan sitemap, lalu pasang Search Console.

    Minta bantuan jadi masuk akal saat masalahnya sudah bergeser ke persaingan. Misalnya website sudah terindex berbulan-bulan tapi trafiknya tidak bergerak, atau Anda tidak yakin kata kunci mana yang layak diperjuangkan lebih dulu. Di titik itu yang dibutuhkan bukan perbaikan sekali jalan, tapi strategi dan pengerjaan rutin. Kalau sampai di fase itu dan butuh partner yang mengerjakannya dengan cara yang jujur, tim Arrazy menyediakan layanan SEO yang bisa Anda ajak diskusi dulu tanpa komitmen.

    Intinya, website yang belum muncul di Google jarang sekali berarti websitenya gagal. Biasanya cuma soal waktu, satu dua pengaturan yang kelupaan, atau ekspektasi yang perlu disetel ulang. Cek urut dari atas, dan Anda akan ketemu jawabannya.

  • Cara Menentukan Harga Jasa Tanpa Ikut Perang Harga

    Cara Menentukan Harga Jasa Tanpa Ikut Perang Harga

    Banyak pemilik usaha jasa menentukan tarif dengan cara yang sama: lihat harga kompetitor, lalu pasang sedikit di bawahnya. Kelihatannya aman, padahal ini jalan pintas menuju capek. Cara yang lebih sehat sebenarnya sederhana. Hitung dulu biaya nyata untuk mengerjakan satu pesanan, tentukan mau berdiri di posisi mana dibanding pasar, lalu jual perbedaan Anda, bukan kemurahan Anda.

    Artikel ini membahas ketiganya satu per satu. Ada contoh angka supaya gampang dipraktikkan, entah Anda buka jasa desain, servis elektronik, les privat, fotografi, atau cleaning service. Di bagian akhir ada juga cara menaikkan harga tanpa membuat pelanggan lama kabur.

    Kenapa Ikut Harga Pasaran Lalu Diskon Itu Jebakan

    Logikanya terdengar masuk akal. Kompetitor pasang Rp500 ribu, saya pasang Rp450 ribu, pelanggan pasti pilih saya. Masalahnya, kompetitor juga bisa berpikir sama. Dia turunkan lagi ke Rp400 ribu. Anda ikut turun. Begitu terus sampai tidak ada yang untung.

    Ada tiga akibat yang biasanya baru terasa setelah beberapa bulan:

    • Margin tipis. Sekali ada pengeluaran tak terduga, misalnya alat rusak atau klien minta revisi berkali kali, satu pesanan bisa langsung rugi.
    • Pelanggan yang datang sensitif harga. Orang yang memilih Anda karena paling murah akan pindah begitu ada yang lebih murah. Tidak ada loyalitas yang bisa dibangun dari selisih Rp50 ribu.
    • Capek sendiri. Karena margin per pesanan kecil, Anda harus ambil banyak pesanan untuk hidup. Jadwal penuh, kualitas turun, review jelek, dan harga makin susah dinaikkan.

    Perang harga itu permainan yang hanya bisa dimenangkan pemain bermodal paling besar. Usaha jasa kecil hampir tidak pernah berada di posisi itu.

    Hitung Dulu Biaya Nyata Anda, Bukan Cuma Bahan

    Sebelum bicara tarif, Anda harus tahu angka minimum supaya tidak rugi. Di usaha jasa, biaya yang kelihatan biasanya cuma bahan atau alat habis pakai. Padahal komponen terbesar justru yang tidak kelihatan:

    • Waktu pengerjaan nyata. Bukan waktu ideal. Kalau satu sesi foto butuh 2 jam di lokasi tapi 5 jam untuk seleksi dan editing, hitung 7 jam.
    • Waktu komunikasi dengan klien. Balas chat, meeting, kirim penawaran, follow up. Untuk banyak jasa, ini bisa 1 sampai 2 jam per klien. Gratis kalau tidak dihitung, tapi tetap memakan hari Anda.
    • Transport. Bensin, parkir, tol, ongkos kirim. Kecil per trip, besar per bulan.
    • Alat dan penyusutannya. Kamera, laptop, mesin cuci sofa, semuanya ada umurnya. Sisihkan sebagian dari tiap pesanan untuk penggantinya kelak.
    • Revisi. Hampir semua jasa kreatif dan servis punya pekerjaan ulang. Kalau rata rata satu proyek kena satu putaran revisi, waktunya harus masuk hitungan sejak awal.

    Contoh sederhana untuk jasa desain logo. Pengerjaan 6 jam, komunikasi dan revisi 3 jam, total 9 jam. Kalau target penghasilan Anda setara Rp50 ribu per jam, biaya dasarnya sudah Rp450 ribu. Belum termasuk listrik, internet, dan langganan software. Kalau selama ini Anda pasang tarif Rp300 ribu karena ikut harga grup Facebook, sekarang jelas kenapa rasanya kerja terus tapi uangnya tidak kelihatan.

    Tiga Pendekatan Menentukan Harga Jasa

    Setelah tahu biaya dasar, baru pilih cara menentukan tarif. Ada tiga pendekatan yang umum dipakai. Ketiganya bisa dikombinasikan.

    1. Cost plus: biaya ditambah margin

    Ini yang paling gampang. Ambil biaya dasar tadi, tambahkan margin. Misalnya biaya dasar jasa cleaning satu rumah Rp250 ribu, tambah margin 40 persen, tarif jadi Rp350 ribu. Kelebihannya, Anda dijamin tidak rugi. Kekurangannya, pendekatan ini tidak melihat pasar sama sekali. Bisa jadi tarif Anda terlalu murah untuk kualitas yang Anda berikan, atau terlalu mahal untuk area Anda. Jadikan cost plus sebagai lantai, batas bawah yang tidak boleh ditembus, bukan sebagai harga final.

    2. Harga pasar: pilih posisi secara sadar

    Riset tarif 5 sampai 10 kompetitor di area dan segmen yang sama. Katakanlah jasa les privat matematika di kota Anda rata rata Rp100 ribu per pertemuan. Anda punya tiga pilihan posisi. Di bawah rata rata, misalnya Rp80 ribu, cocok kalau Anda baru mulai dan butuh murid pertama untuk testimoni, tapi jangan lama lama di sini. Di rata rata, aman, tapi Anda harus menang lewat hal lain seperti kecepatan respon atau jadwal yang fleksibel. Di atas rata rata, misalnya Rp150 ribu, hanya masuk akal kalau ada alasan yang bisa dilihat calon pelanggan: pengalaman lebih panjang, spesialisasi persiapan ujian tertentu, atau hasil murid yang terdokumentasi.

    Posisi di atas rata rata paling nyaman dijalani, tapi ada syaratnya. Semua yang dilihat calon pelanggan harus mendukung harga itu, dari cara Anda menjawab chat, portofolio, sampai tampilan online. Orang sulit percaya jasa premium yang etalasenya seadanya. Website profesional adalah salah satu pendukungnya, dan kalau butuh, ada jasa pembuatan website yang bisa membantu.

    3. Value based: harga berdasar dampak ke klien

    Di sini harga tidak dihitung dari jam kerja, tapi dari nilai hasil untuk klien. Contoh, Anda fotografer produk. Untuk pedagang kaki lima, foto bagus nilainya kecil. Untuk brand skincare yang beriklan dengan budget puluhan juta per bulan, foto yang menaikkan konversi sedikit saja nilainya sangat besar. Wajar kalau tarif untuk keduanya berbeda jauh, meski jam kerjanya sama.

    Value based masuk akal kalau hasil kerja Anda berdampak langsung ke pemasukan atau penghematan klien, dan dampaknya bisa dijelaskan dengan angka. Untuk jasa yang hasilnya susah diukur, seperti les privat atau cleaning rutin, pendekatan ini sulit dipakai penuh. Ambil semangatnya saja: klien dengan kebutuhan lebih besar dan risiko lebih tinggi layak membayar lebih.

    Paket Bertingkat Supaya Tidak Dibandingkan Mentah

    Satu harga tunggal itu sasaran empuk. Calon pelanggan tinggal menyandingkan angka Anda dengan angka kompetitor, selesai. Paket bertingkat mengubah pertanyaannya dari “mana yang termurah” menjadi “mana yang paling pas untuk saya”.

    Buat tiga tingkat, misalnya basic, standard, dan premium. Contoh untuk jasa cuci sofa: basic hanya vakum dan cuci permukaan Rp150 ribu, standard tambah pembersihan noda dan pewangi Rp250 ribu, premium tambah antitungau dan garansi ulang seminggu Rp400 ribu. Kebanyakan orang akan memilih tingkat tengah. Yang menarik, kehadiran paket premium membuat paket tengah terasa masuk akal, dan selalu ada sebagian klien yang memang mau bayar lebih untuk rasa aman.

    Aturannya satu saja. Beda antar paket harus jelas dan jujur. Jangan sengaja membuat paket basic jelek supaya orang terpaksa naik. Pelanggan bisa merasakannya, dan kepercayaan yang rusak jauh lebih mahal dari selisih paket.

    Cara Menaikkan Harga Tanpa Kehilangan Pelanggan Lama

    Setelah hitung ulang, banyak pemilik jasa sadar tarifnya kemurahan. Menaikkannya bikin deg degan, apalagi untuk pelanggan yang sudah langganan bertahun tahun. Ada tiga cara yang bisa dipakai, sendiri sendiri atau digabung:

    • Beri pemberitahuan jauh hari. Kabari 1 sampai 2 bulan sebelumnya, sebutkan tanggal berlakunya. Orang lebih menerima kenaikan yang diumumkan baik baik daripada yang tahu tahu muncul di tagihan.
    • Grandfathering. Pelanggan lama tetap di tarif lama untuk periode tertentu, misalnya 6 bulan, atau selamanya untuk beberapa pelanggan paling setia. Mereka merasa dihargai, dan Anda tetap bisa memasang tarif baru untuk semua orang lain.
    • Naikkan untuk klien baru dulu. Ini cara paling minim risiko. Semua penawaran baru pakai tarif baru. Kalau calon klien tetap datang, berarti pasar menerima harga itu, dan Anda punya bukti sebelum menyentuh tarif pelanggan lama.

    Satu hal yang sering dilupakan: sebagian kecil pelanggan memang akan pergi, dan itu tidak apa apa. Kalau kenaikan 20 persen membuat 1 dari 10 pelanggan pergi, pemasukan Anda tetap naik, dengan beban kerja yang lebih ringan.

    Kapan Boleh Ikut Perang Harga

    Jawaban jujurnya: hampir tidak pernah. Satu satunya situasi yang bisa dibenarkan adalah strategi masuk pasar. Anda benar benar baru, belum punya portofolio dan testimoni, dan butuh 5 sampai 10 klien pertama secepatnya. Di situ harga murah boleh jadi alat, dengan dua syarat ketat. Pertama, ada batas waktu atau batas jumlah yang jelas, misalnya harga perkenalan untuk 10 klien pertama saja. Kedua, Anda sendiri tahu ini promosi, bukan tarif normal, dan menyebutnya begitu ke klien.

    Tanpa dua syarat itu, harga murah akan menempel jadi identitas Anda. Pelanggan yang masuk lewat harga perkenalan pun perlu tahu sejak awal berapa tarif normalnya, supaya tidak kaget saat promosi berakhir. Kalau ada kompetitor banting harga di luar situasi itu, jalan yang lebih sehat bukan ikut turun, tapi memperjelas perbedaan: garansi, kecepatan, spesialisasi, atau pengalaman yang mereka tidak punya.

    Mulai dari Data Anda Sendiri

    Semua pendekatan di atas butuh satu bahan baku: catatan. Tanpa catatan pesanan dan pelanggan yang rapi, Anda tidak akan tahu layanan mana yang paling menguntungkan, klien tipe apa yang paling sering minta revisi, atau paket mana yang paling laku. Mulailah mencatat setiap pesanan, nilai transaksinya, dan berapa lama pengerjaannya. Dari situ keputusan harga berikutnya tidak lagi berdasar perasaan. Kalau pelanggan mulai banyak dan catatan manual mulai keteteran, Anda bisa baca dulu apa itu CRM dan kenapa bisnis kecil juga butuh. Intinya sama: kenali angka Anda sendiri, karena dari sanalah harga yang sehat berasal.

  • Belajar Golang dari Nol #7: Pointer, Alamat Memori Tanpa Pusing

    Belajar Golang dari Nol #7: Pointer, Alamat Memori Tanpa Pusing

    Di Belajar Golang dari Nol #6 kita sudah belajar mengendalikan alur program dengan for dan percabangan. Sekarang kita masuk ke materi yang paling sering bikin pemula gentar sebelum mencoba: pointer. Padahal konsepnya sederhana. Anda hanya perlu satu analogi yang pas, dan sisanya akan terasa masuk akal.

    Masih ingat di bagian 4 kita menyinggung pointer receiver saat membahas method, lalu saya janji akan membahasnya tuntas? Ini bagian yang menepati janji itu.

    Analogi: Fotokopi Dokumen vs Alamat Rumah

    Bayangkan Anda punya dokumen penting di rumah, misalnya sertifikat tanah. Teman Anda butuh dokumen itu. Ada dua cara Anda memberikannya.

    Cara pertama, Anda fotokopi dokumennya lalu kirim fotokopiannya. Teman Anda boleh mencoret-coret fotokopian itu sesuka hati. Dokumen asli di rumah Anda tetap aman, tidak berubah sedikit pun.

    Cara kedua, Anda kasih alamat rumah Anda. Teman Anda datang ke alamat itu, membuka lemari, dan mengubah dokumen aslinya langsung. Apa pun yang dia tulis di sana, itu terjadi pada dokumen asli.

    Di Go, cara pertama adalah perilaku default: setiap nilai yang dioper ke function akan difotokopi. Cara kedua adalah pointer: Anda tidak mengoper nilainya, tapi mengoper alamat tempat nilai itu disimpan di memori. Pegang analogi ini terus. Semua materi di bawah hanyalah variasi dari dua cara itu.

    Go Selalu Mengoper Salinan

    Mari buktikan dulu perilaku defaultnya. Coba jalankan program ini.

    package main
    
    import "fmt"
    
    func tambahBonus(gaji int) {
    	gaji = gaji + 500000
    	fmt.Println("Di dalam function:", gaji)
    }
    
    func main() {
    	gaji := 5000000
    	tambahBonus(gaji)
    	fmt.Println("Di main:", gaji)
    }

    Outputnya:

    Di dalam function: 5500000
    Di main: 5000000

    Perhatikan baik-baik. Di dalam tambahBonus, nilai gaji memang bertambah jadi 5500000. Tapi begitu kembali ke main, nilainya tetap 5000000. Kenapa? Karena yang diterima function adalah fotokopian. Function mencoret-coret fotokopian itu, lalu fotokopiannya dibuang saat function selesai. Dokumen asli di main tidak pernah tersentuh.

    Ini bukan bug. Ini desain Go yang disengaja, namanya pass by value. Tapi kadang kita memang ingin function lain mengubah data asli. Di situlah pointer masuk.

    Dua Operator Kunci: & dan *

    Untuk bermain dengan alamat memori, Go memberi kita dua operator.

    • & artinya “ambil alamat dari variabel ini”. Seperti bertanya, rumah si Budi di mana ya.
    • * artinya “buka isi dari alamat ini”. Seperti datang ke alamat itu dan melihat apa yang ada di dalamnya.

    Contoh kecilnya begini.

    package main
    
    import "fmt"
    
    func main() {
    	umur := 25
    	alamat := &umur
    
    	fmt.Println("Nilai umur:", umur)
    	fmt.Println("Alamat umur:", alamat)
    	fmt.Println("Isi dari alamat:", *alamat)
    }

    Outputnya kira-kira seperti ini:

    Nilai umur: 25
    Alamat umur: 0xc000012028
    Isi dari alamat: 25

    Angka 0xc000012028 itu alamat memori. Di komputer Anda angkanya hampir pasti beda, dan tiap kali program dijalankan ulang angkanya juga bisa berubah. Itu normal. Sistem operasi bebas menaruh data di slot memori mana pun yang kosong, sama seperti mobil yang tidak selalu parkir di slot yang sama tiap ke mal.

    Variabel alamat di atas bertipe *int, dibaca “pointer ke int”. Artinya dia tidak menyimpan angka 25, dia menyimpan alamat tempat angka 25 berada.

    Function yang Benar-Benar Mengubah Nilai

    Sekarang gabungkan keduanya. Kalau parameter function bertipe pointer, function itu menerima alamat, bukan fotokopian. Dia bisa datang ke alamat itu dan mengubah dokumen aslinya.

    package main
    
    import "fmt"
    
    func ubahNilai(x *int) {
    	*x = 100
    }
    
    func ubahNilaiBiasa(x int) {
    	x = 100
    }
    
    func main() {
    	angka := 5
    
    	ubahNilaiBiasa(angka)
    	fmt.Println("Setelah versi biasa:", angka)
    
    	ubahNilai(&angka)
    	fmt.Println("Setelah versi pointer:", angka)
    }

    Outputnya:

    Setelah versi biasa: 5
    Setelah versi pointer: 100

    Baca ubahNilai pelan-pelan. Parameter x *int artinya x adalah alamat. Baris *x = 100 artinya datang ke alamat itu, lalu tulis 100 di sana. Karena yang diubah adalah isi alamat asli, perubahan itu terlihat dari main. Dan perhatikan cara memanggilnya: ubahNilai(&angka). Kita tidak mengirim angkanya, kita mengirim alamatnya.

    Pointer dan Struct: Rahasia di Balik Pointer Receiver

    Sekarang kita bayar utang dari bagian 4. Waktu itu Anda sudah lihat method dengan receiver (r *Rekening) dan saya bilang pakai saja dulu, nanti dijelaskan. Ini penjelasannya.

    package main
    
    import "fmt"
    
    type Pengguna struct {
    	Nama string
    }
    
    func (p Pengguna) GantiNamaValue(baru string) {
    	p.Nama = baru
    }
    
    func (p *Pengguna) GantiNamaPointer(baru string) {
    	p.Nama = baru
    }
    
    func main() {
    	u := Pengguna{Nama: "Budi"}
    
    	u.GantiNamaValue("Andi")
    	fmt.Println("Setelah value receiver:", u.Nama)
    
    	u.GantiNamaPointer("Andi")
    	fmt.Println("Setelah pointer receiver:", u.Nama)
    }

    Outputnya:

    Setelah value receiver: Budi
    Setelah pointer receiver: Andi

    Sekarang mekanismenya jelas. Value receiver (p Pengguna) menerima fotokopian struct. Method mengganti nama di fotokopian, fotokopiannya dibuang, struct asli tetap Budi. Persis seperti kasus tambahBonus tadi. Pointer receiver (p *Pengguna) menerima alamat struct asli, jadi perubahannya nyata.

    Ada satu kemudahan dari Go yang perlu Anda tahu. Secara teori, untuk mengakses field lewat pointer Anda harus menulis (*p).Nama: buka dulu isi alamatnya, baru ambil fieldnya. Tapi Go tahu itu merepotkan, jadi p.Nama saja sudah cukup. Go otomatis mengerti maksud Anda. Itulah kenapa di dalam GantiNamaPointer kita bisa menulis p.Nama = baru tanpa tanda bintang. Hal yang sama berlaku saat memanggil: u.GantiNamaPointer("Andi") otomatis diterjemahkan Go menjadi (&u).GantiNamaPointer("Andi").

    Hati-Hati dengan Nil Pointer

    Masih ingat konsep zero value dari bagian 2? Setiap tipe punya nilai awal. Zero value untuk pointer adalah nil, artinya pointer itu belum menunjuk ke alamat mana pun. Seperti secarik kertas alamat yang masih kosong.

    Masalah muncul kalau Anda mencoba membuka isi dari alamat kosong.

    package main
    
    import "fmt"
    
    func main() {
    	var p *int
    	fmt.Println(*p)
    }

    Program ini langsung crash dengan pesan:

    panic: runtime error: invalid memory address or nil pointer dereference

    Wajar saja. Anda menyuruh Go datang ke sebuah alamat, tapi kertas alamatnya kosong. Mau ke mana? Ini salah satu error paling umum di dunia Go, jadi biasakan mengecek dulu sebelum membuka isi pointer.

    package main
    
    import "fmt"
    
    func main() {
    	var p *int
    
    	if p != nil {
    		fmt.Println("Isi p:", *p)
    	} else {
    		fmt.Println("p masih nil, belum menunjuk ke mana-mana")
    	}
    }

    Outputnya:

    p masih nil, belum menunjuk ke mana-mana

    Pola if p != nil ini akan sangat sering Anda temui di kode Go sungguhan, terutama saat menerima pointer dari function lain.

    Kapan Pakai Pointer, Kapan Tidak

    Supaya tidak bingung di lapangan, pegang aturan praktis ini.

    Pakai pointer kalau:

    • Anda ingin function atau method mengubah data aslinya, seperti semua contoh di atas.
    • Struct Anda besar dan sering dioper ke banyak function. Mengoper alamat jauh lebih ringan daripada memfotokopi seluruh isi struct berulang kali.
    • Menjaga konsistensi method. Kalau satu method di sebuah struct sudah pakai pointer receiver, sebaiknya semua method di struct itu pakai pointer receiver juga, biar tidak membingungkan pembaca kode.

    Tidak perlu pointer kalau:

    • Tipenya kecil seperti int, bool, atau string, dan Anda tidak berniat mengubahnya. Fotokopi tipe kecil itu murah.
    • Datanya slice atau map. Ingat pelajaran bagian 5: slice dan map secara internal sudah menunjuk ke data yang sama, jadi perubahan isi di dalam function memang terlihat dari luar tanpa pointer.

    Satu hal lagi yang layak disebut singkat: function bawaan new(). Menulis p := new(int) artinya Go membuatkan sebuah int dengan zero value, lalu langsung memberi Anda pointernya. Praktiknya, gaya p := &variabel jauh lebih sering dipakai, jadi cukup kenali saja bahwa new() ada.

    Latihan: Sistem Saldo Rekening

    Sekarang rangkai semuanya jadi satu program utuh. Kita buat sistem saldo sederhana: struct Rekening, method Setor dan Tarik dengan pointer receiver, plus function TransferDana yang menerima dua pointer sekaligus. Method Tarik mengembalikan error kalau saldo kurang, persis pola error yang Anda pelajari di bagian 3.

    package main
    
    import (
    	"errors"
    	"fmt"
    )
    
    type Rekening struct {
    	Pemilik string
    	Saldo   int
    }
    
    func (r *Rekening) Setor(jumlah int) {
    	r.Saldo = r.Saldo + jumlah
    }
    
    func (r *Rekening) Tarik(jumlah int) error {
    	if jumlah > r.Saldo {
    		return errors.New("saldo tidak cukup")
    	}
    	r.Saldo = r.Saldo - jumlah
    	return nil
    }
    
    func TransferDana(dari *Rekening, ke *Rekening, jumlah int) error {
    	err := dari.Tarik(jumlah)
    	if err != nil {
    		return err
    	}
    	ke.Setor(jumlah)
    	return nil
    }
    
    func main() {
    	rekeningBudi := Rekening{Pemilik: "Budi", Saldo: 500000}
    	rekeningSari := Rekening{Pemilik: "Sari", Saldo: 200000}
    
    	rekeningBudi.Setor(100000)
    	fmt.Println("Saldo Budi setelah setor:", rekeningBudi.Saldo)
    
    	err := TransferDana(&rekeningBudi, &rekeningSari, 250000)
    	if err != nil {
    		fmt.Println("Transfer gagal:", err)
    	} else {
    		fmt.Println("Transfer 250000 dari Budi ke Sari berhasil")
    	}
    	fmt.Println("Saldo Budi:", rekeningBudi.Saldo)
    	fmt.Println("Saldo Sari:", rekeningSari.Saldo)
    
    	err = TransferDana(&rekeningBudi, &rekeningSari, 1000000)
    	if err != nil {
    		fmt.Println("Transfer gagal:", err)
    	}
    	fmt.Println("Saldo Budi:", rekeningBudi.Saldo)
    	fmt.Println("Saldo Sari:", rekeningSari.Saldo)
    }

    Outputnya:

    Saldo Budi setelah setor: 600000
    Transfer 250000 dari Budi ke Sari berhasil
    Saldo Budi: 350000
    Saldo Sari: 450000
    Transfer gagal: saldo tidak cukup
    Saldo Budi: 350000
    Saldo Sari: 450000

    Telusuri alurnya. Setor menambah saldo Budi jadi 600000, dan perubahannya nyata karena receivernya pointer. TransferDana menerima alamat dua rekening sekaligus, jadi dia bisa mengurangi saldo Budi dan menambah saldo Sari dalam satu function. Transfer kedua gagal karena Budi hanya punya 350000, dan lihat saldonya: tidak ada satu rupiah pun yang berubah saat transfer gagal. Method Tarik menolak duluan sebelum sempat menyentuh apa pun.

    Coba modifikasi sendiri sebagai latihan. Misalnya, tambahkan validasi agar jumlah setor tidak boleh negatif, atau buat method Info yang mencetak pemilik dan saldo dengan rapi. Kalau kode Anda berperilaku sesuai dugaan, berarti pointer sudah masuk ke kepala.

    Rangkuman dan Lanjut ke Bagian 8

    Hari ini Anda belajar bahwa Go mengoper nilai secara fotokopi, pointer adalah cara mengoper alamat aslinya, & mengambil alamat, * membuka isinya, pointer receiver bekerja karena menerima alamat struct asli, dan nil pointer wajib dicek sebelum dibuka. Materi yang katanya menakutkan ternyata cuma soal fotokopi dan alamat rumah.

    Sejauh ini semua kode kita masih menumpuk di satu file main.go. Untuk program kecil tidak masalah, tapi program sungguhan butuh struktur. Di bagian 8 kita akan membahas Package dan Go Module: Merapikan Kode ke Banyak File. Sampai ketemu di sana.

    Kalau bisnis Anda butuh aplikasi yang dibangun dengan fondasi backend yang rapi seperti ini, tim Arrazy siap bantu lewat layanan pengembangan sistem aplikasi.

  • Belajar Struktur Data dari Nol: Pengenalan dan Persiapan Go

    Belajar Struktur Data dari Nol: Pengenalan dan Persiapan Go

    Struktur data adalah cara menyimpan dan mengatur data di memori supaya cepat diakses dan diubah. Algoritma adalah urutan langkah untuk memproses data itu. Dua hal ini yang membedakan aplikasi yang tetap responsif saat datanya jutaan baris dengan aplikasi yang mulai lemot padahal datanya baru ribuan. Artikel ini bagian pertama dari seri Belajar Struktur Data dari Nol. Di bagian ini kita bereskan fondasinya dulu: paham apa itu struktur data, kenapa serinya pakai Go, lalu siapkan Go 1.24 di komputer sampai program pertama benar-benar jalan.

    Prasyaratnya ringan. Kamu cukup paham sintaks dasar Go: variabel, fungsi, if, dan for. Kalau belum, selesaikan dulu bagian-bagian awal seri Belajar Golang dari Nol, karena dasar bahasanya sengaja tidak diulang di sini. Yang penting kamu bisa membaca kode Go sederhana tanpa bingung.

    Apa Itu Struktur Data dan Algoritma

    Bayangkan dua gudang dengan isi barang yang sama persis. Gudang pertama pakai rak berlabel: lorong A untuk sparepart, lorong B untuk kemasan, tiap rak ada nomornya. Gudang kedua tidak pakai rak sama sekali, semua barang ditumpuk begitu saja di lantai. Saat ada pesanan masuk, petugas gudang pertama langsung jalan ke lorong yang benar dan ambil barangnya dalam hitungan detik. Petugas gudang kedua harus membongkar tumpukan satu per satu, dan makin banyak barangnya makin lama carinya.

    Struktur data adalah sistem raknya, yaitu cara data disusun. Algoritma adalah cara kerja petugasnya, yaitu langkah-langkah mencari, menambah, atau mengeluarkan barang. Keduanya tidak bisa dipisah. Rak serapi apa pun percuma kalau petugasnya tetap memeriksa semua lorong satu per satu. Sebaliknya, petugas secerdas apa pun tidak bisa berbuat banyak kalau barangnya cuma ditumpuk. Itulah kenapa di kampus keduanya diajarkan sebagai satu mata kuliah: pilihan struktur data menentukan algoritma apa saja yang bisa jalan efisien di atasnya.

    Contoh nyatanya ada di HP kamu. Daftar kontak tersimpan terurut berdasarkan nama, jadi pencarian nama bisa langsung melompat ke huruf yang benar. Kalau kontak disimpan acak sesuai urutan input, satu-satunya cara mencari adalah memeriksa semua kontak dari awal. Data sama, struktur beda, kecepatan beda jauh.

    Kenapa Seri Ini Pakai Go 1.24

    Semua contoh kode di 26 bagian seri ini ditulis dengan Go 1.24. Alasannya praktis, bukan sekadar selera:

    • Sintaksnya kecil. Go tidak punya banyak fitur ajaib yang menyembunyikan apa yang terjadi di memori. Saat belajar linked list atau hash table, kamu ingin melihat pointer dan alokasi secara eksplisit, dan Go menampilkannya apa adanya.
    • Tooling bawaan lengkap. Ada go run untuk eksekusi cepat, gofmt untuk format otomatis, dan package testing bawaan. Tidak perlu instal build tool tambahan.
    • Generics sudah matang. Sejak Go 1.18 kita bisa menulis struktur data generik seperti Stack[T], dan di Go 1.24 dukungannya sudah stabil termasuk untuk type alias generik. Ini penting karena kita akan membuat struktur data yang bisa dipakai ulang.
    • Dipakai di industri. Go umum dipakai untuk backend dan tooling infrastruktur. Tim Arrazy sendiri memakai Go di backend sistem aplikasi yang kami bangun untuk klien, jadi materi seri ini diambil dari pola yang memang kami pakai sehari-hari.

    Kamu tidak wajib memakai persis versi 1.24. Versi 1.22 ke atas masih bisa mengikuti hampir semua materi. Tapi supaya output di artikel sama dengan di layar kamu, sebaiknya samakan versinya.

    Install Go 1.24 dan Verifikasi dengan go version

    Cara paling aman adalah unduh langsung dari situs resmi Go, bukan dari package manager sistem. Di Linux (Ubuntu, Debian, dan turunannya) jalankan perintah berikut di terminal:

    wget https://go.dev/dl/go1.24.5.linux-amd64.tar.gz
    sudo rm -rf /usr/local/go
    sudo tar -C /usr/local -xzf go1.24.5.linux-amd64.tar.gz

    Lalu tambahkan Go ke PATH. Buka ~/.bashrc (atau ~/.zshrc kalau pakai zsh), tambahkan baris ini di paling bawah, lalu buka terminal baru:

    export PATH=$PATH:/usr/local/go/bin

    Untuk Windows, unduh installer .msi dari halaman go.dev/dl, klik dua kali, dan ikuti wizard-nya. PATH diatur otomatis. Untuk macOS, unduh installer .pkg dari halaman yang sama.

    Apa pun sistem operasinya, verifikasi dengan perintah ini:

    go version

    Output yang diharapkan (arsitektur bisa berbeda sesuai mesin kamu):

    go version go1.24.5 linux/amd64

    Kalau yang muncul justru error atau versi lama, jangan lanjut dulu. Lihat bagian error umum di bawah, dua masalah paling sering terjadi persis di langkah ini.

    Proyek Pertama: go mod init dan go run

    Semua kode seri ini akan hidup dalam satu proyek bernama struktur-data. Buat foldernya dan inisialisasi Go module:

    mkdir struktur-data
    cd struktur-data
    go mod init struktur-data

    Output yang diharapkan:

    go: creating new go.mod: module struktur-data

    Perintah itu membuat file go.mod, penanda bahwa folder ini adalah sebuah Go module. Tanpa file ini, banyak perintah Go modern akan menolak jalan. Sekarang buat file main.go berisi kode berikut:

    package main
    
    import "fmt"
    
    func main() {
    	angka := []int{7, 3, 9}
    	fmt.Println("Isi slice:", angka)
    	fmt.Println("Jumlah elemen:", len(angka))
    }

    Jalankan:

    go run main.go

    Output yang diharapkan:

    Isi slice: [7 3 9]
    Jumlah elemen: 3

    Kalau output kamu sama, environment sudah siap. Slice yang barusan kamu cetak itu sebenarnya struktur data pertama di seri ini, dan cara kerjanya di dalam memori akan kita bedah di bagian 4 dan 5.

    Setup VS Code dan Struktur Folder untuk Mengikuti Seri

    Editor yang dipakai di seri ini adalah VS Code karena dukungan Go-nya paling mulus. Langkah setupnya:

    1. Buka VS Code, masuk ke tab Extensions, cari Go yang dipublikasikan oleh Go Team at Google (id: golang.go), lalu install.
    2. Buka folder struktur-data lewat File, Open Folder.
    3. Tekan Ctrl+Shift+P, ketik Go: Install/Update Tools, centang semua tool (termasuk gopls dan dlv), lalu OK. Tool ini yang membuat autocomplete dan deteksi error jalan.

    Supaya kode otomatis dirapikan gofmt setiap kali disimpan, buka Settings JSON (Ctrl+Shift+P, lalu Preferences: Open User Settings (JSON)) dan tambahkan:

    {
      "[go]": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "golang.go"
      }
    }

    Terakhir, sepakati struktur folder. Setiap bagian seri dapat satu folder sendiri di dalam module yang sama, jadi kode lama tidak tertimpa kode baru:

    struktur-data/
    ├── go.mod
    ├── bab-01-pengenalan/
    │   └── main.go
    ├── bab-02-kompleksitas/
    │   └── main.go
    └── bab-03-big-o/
        └── main.go

    Pindahkan main.go yang tadi ke bab-01-pengenalan/. Untuk menjalankan kode bab tertentu dari root proyek, cukup sebut foldernya:

    go run ./bab-01-pengenalan

    Error Umum Saat Setup Go dan Cara Mengatasinya

    go: command not found

    Muncul saat mengetik go version padahal Go sudah diekstrak ke /usr/local/go. Penyebabnya hampir selalu PATH: shell tidak tahu harus mencari binary go di mana. Pastikan baris export PATH=$PATH:/usr/local/go/bin benar-benar tersimpan di ~/.bashrc atau ~/.zshrc, lalu buka terminal baru atau jalankan source ~/.bashrc. Cek juga file mana yang dibaca shell kamu dengan echo $SHELL, karena user zsh sering salah menaruh export di .bashrc.

    Versi Go lama padahal baru install

    go version menampilkan misalnya go1.18 padahal kamu baru mengekstrak 1.24. Biasanya karena dulu pernah install Go lewat apt, dan binary lama di /usr/bin/go ditemukan lebih dulu daripada yang baru. Cek dengan which go. Kalau hasilnya /usr/bin/go, hapus versi lama dengan sudo apt remove golang-go, lalu buka terminal baru. Repository apt memang sering tertinggal beberapa versi di belakang rilis resmi, jadi untuk Go selalu unduh dari go.dev/dl.

    go.mod file not found in current directory

    Error lengkapnya biasanya go: cannot find main module atau go.mod file not found. Ini muncul saat menjalankan perintah Go di folder yang belum diinisialisasi sebagai module. Zaman dulu Go mewajibkan semua kode ada di dalam satu folder global bernama GOPATH. Sistem itu sudah ditinggalkan dan diganti Go modules, tapi banyak tutorial lama di internet masih mengajarkan GOPATH sehingga pemula tercampur. Aturannya sekarang sederhana: satu proyek satu folder, jalankan go mod init nama-proyek sekali di root folder itu, selesai. Kamu tidak perlu menyentuh variabel GOPATH sama sekali.

    Autocomplete VS Code tidak jalan

    Kode bisa di-run tapi tidak ada saran kode dan error tidak digarisbawahi. Biasanya gopls belum terinstal atau VS Code dibuka bukan di root proyek. Jalankan lagi Go: Install/Update Tools, pastikan folder yang dibuka adalah folder yang berisi go.mod, lalu restart VS Code.

    Peta Lengkap 26 Bagian Seri Belajar Struktur Data

    Supaya kamu tahu arah perjalanannya, ini peta seri dari awal sampai akhir:

    Bagian Topik Yang kamu kuasai
    1-3 Fondasi: setup, kompleksitas, Big O Mengukur cepat lambatnya algoritma secara objektif
    4-5 Array dan slice Paham perilaku slice Go sampai level memori dan kapasitas
    6-9 Linked list, stack, queue Membangun struktur linear sendiri dengan pointer
    10-11 Hash table dan map Tahu cara kerja map Go dari dalam, termasuk hashing dan collision
    12-15 Rekursi, binary tree, BST, heap Struktur hierarkis dan priority queue
    16-18 Graph, BFS, DFS Memodelkan relasi dan menelusurinya, termasuk deteksi siklus
    19-22 Sorting dan binary search Bubble, insertion, merge, quick sort, plus pencarian cepat di data terurut
    23-24 Greedy dan dynamic programming Strategi memecahkan soal optimasi
    25-26 Latihan interview dan proyek LRU cache Menggabungkan semua materi jadi solusi soal nyata

    Di akhir seri kamu bukan cuma hafal nama-nama struktur data. Kamu sudah pernah mengimplementasikan semuanya sendiri di Go, tahu kapan memakai yang mana, dan siap menghadapi soal coding interview yang menanyakan hal-hal ini.

    Langkah Berikutnya

    Environment sudah siap, program pertama sudah jalan, dan kamu sudah pegang peta serinya. Pertanyaan berikutnya yang wajar muncul: kalau dua program sama-sama benar, bagaimana cara membuktikan yang satu lebih cepat dari yang lain tanpa menebak-nebak. Itu materi bagian kedua, “Kompleksitas Algoritma: Kenapa Struktur Data Menentukan Performa”, yang terbit menyusul dan bisa kamu pantau di halaman hub seri Belajar Struktur Data dari Nol. Sampai artikelnya terbit, pastikan setup kamu beres: go version menampilkan 1.24 dan go run ./bab-01-pengenalan mencetak output tanpa error.

    Referensi

  • Checklist Keamanan Website Bisnis: 10 Hal yang Bisa Dicek Sendiri

    Checklist Keamanan Website Bisnis: 10 Hal yang Bisa Dicek Sendiri

    Keamanan website sering dianggap urusan orang IT. Padahal ada banyak hal yang bisa Anda cek sendiri hari ini, tanpa perlu bisa coding sama sekali. Sepuluh hal itu adalah: gembok HTTPS di browser, kekuatan password admin, siapa saja yang punya akses, update CMS dan plugin, kondisi backup, spam di form kontak, alamat halaman admin, kepemilikan domain dan hosting, password email bisnis, serta hasil pencarian nama bisnis Anda di Google.

    Anggap artikel ini seperti cek kesehatan ringan. Sebagian poin bisa Anda periksa langsung dalam lima menit. Sebagian lagi berupa pertanyaan yang tepat untuk diajukan ke developer atau vendor website Anda. Tidak perlu panik kalau ada yang bermasalah. Yang penting Anda tahu kondisinya, lalu tahu harus minta apa.

    1. Gembok HTTPS aktif dan tidak kedaluwarsa

    Buka website Anda di browser. Lihat bagian kiri kolom alamat. Kalau ada ikon gembok kecil, berarti sertifikat SSL aktif dan koneksi pengunjung terenkripsi. Klik gembok itu, biasanya ada informasi sampai kapan sertifikat berlaku. Coba juga akses website dengan mengetik http:// di depannya. Website yang sehat akan otomatis berpindah ke versi https://.

    Kenapa penting? Browser modern menampilkan peringatan “Not Secure” atau “Tidak Aman” pada website tanpa HTTPS. Calon pelanggan yang melihat peringatan itu biasanya langsung menutup halaman. Google juga menjadikan HTTPS sebagai salah satu sinyal ranking.

    Kalau gembok tidak muncul atau ada peringatan sertifikat, minta vendor memasang SSL dan mengatur perpanjangan otomatis. Sertifikat gratis seperti Let’s Encrypt sudah cukup untuk mayoritas website bisnis, jadi ini seharusnya bukan biaya besar.

    2. Password admin tidak gampang ditebak

    Cek password yang Anda pakai untuk masuk ke dashboard website. Kalau masih berupa nama bisnis plus angka tahun, tanggal lahir, atau kata seperti “admin123”, ganti hari ini juga. Cek juga satu hal yang sering terlewat: apakah password itu dipakai juga di akun lain seperti email atau media sosial.

    Password yang sama di banyak tempat itu risikonya berlipat. Kalau satu layanan bocor, semua akun Anda ikut terbuka. Gunakan password yang panjang dan unik untuk tiap akun. Aplikasi pengelola password bisa membantu supaya Anda tidak perlu menghafal semuanya.

    Tanyakan juga ke vendor apakah login admin bisa dipasangi verifikasi dua langkah. Fitur ini membuat akun tetap aman walaupun password sempat bocor.

    3. Audit siapa saja yang punya akses admin

    Masuk ke dashboard website, cari menu daftar pengguna atau users. Baca satu per satu. Apakah semua nama di situ masih relevan? Sering sekali ditemukan akun bekas karyawan, bekas vendor lama, atau akun uji coba yang tidak pernah dihapus.

    Setiap akun admin adalah satu pintu masuk. Makin banyak pintu, makin besar peluang ada yang lupa dikunci. Akun bekas karyawan yang masih aktif juga berisiko dipakai orang yang sudah tidak punya kepentingan dengan bisnis Anda.

    Hapus akun yang tidak terpakai. Untuk akun yang masih perlu, turunkan levelnya sesuai kebutuhan. Orang yang hanya menulis artikel tidak perlu akses admin penuh. Kalau Anda tidak bisa mengakses menu ini sendiri, minta vendor menunjukkan daftar semua akun beserta levelnya.

    4. Update CMS dan plugin

    Poin ini terutama untuk pengguna WordPress dan CMS sejenis. Masuk ke dashboard dan lihat apakah ada notifikasi update. Angka merah di menu updates yang menunjukkan belasan item tertunda adalah tanda website jarang dirawat.

    Mayoritas kasus website WordPress yang dibobol terjadi lewat plugin versi lama yang celah keamanannya sudah diketahui publik. Penyerang tidak menarget bisnis Anda secara khusus. Mereka memakai program otomatis yang memindai ribuan website sekaligus untuk mencari celah yang sama.

    Tanyakan ke vendor siapa yang bertanggung jawab menjalankan update rutin, seberapa sering, dan apakah ada backup sebelum update dijalankan. Kalau jawabannya tidak jelas, sepakati jadwal perawatan bulanan secara tertulis.

    5. Backup: ada, di mana, dan kapan terakhir dites

    Ini poin yang jarang bisa dicek sendiri, tapi pertanyaannya sederhana. Ajukan tiga pertanyaan ini ke vendor atau developer Anda. Pertama, apakah website di-backup otomatis dan seberapa sering. Kedua, di mana backup disimpan, apakah di server yang sama atau di tempat terpisah. Ketiga, kapan terakhir kali backup dites dengan restore sungguhan.

    Pertanyaan ketiga itu yang paling penting. Backup yang tidak pernah dites restore itu seperti alat pemadam yang tidak pernah dicek isinya. Baru ketahuan kosong justru saat kebakaran. Backup yang disimpan di server yang sama dengan website juga percuma kalau servernya yang bermasalah.

    Jawaban yang sehat kira-kira begini: backup harian otomatis, disimpan di lokasi terpisah, dan pernah diuji restore. Kalau vendor tidak bisa menjawab, minta itu dijadikan bagian dari layanan perawatan.

    6. Form website tidak dibanjiri spam

    Cek kotak masuk email yang menampung kiriman form kontak website Anda. Kalau isinya dipenuhi pesan promosi aneh berbahasa asing, tautan mencurigakan, atau teks acak, berarti form Anda belum punya proteksi.

    Spam form bukan sekadar mengganggu. Pesan dari calon pelanggan sungguhan jadi tenggelam dan bisa terlewat. Form tanpa proteksi juga menandakan website dibangun tanpa memikirkan penyalahgunaan, dan itu sinyal untuk memeriksa bagian lain lebih teliti.

    Minta vendor memasang proteksi seperti reCAPTCHA, Turnstile, atau teknik honeypot yang bekerja diam-diam tanpa mengganggu pengunjung. Pemasangannya cepat dan efeknya langsung terasa.

    7. Halaman admin tidak mudah ditemukan orang

    Coba buka alamat website Anda ditambah /wp-admin atau /admin dari browser biasa. Kalau halaman login langsung muncul begitu saja, siapa pun di internet bisa menemukannya juga, termasuk program otomatis yang kerjanya menebak password ribuan kali.

    Halaman login yang terbuka lebar bukan berarti pasti dibobol. Tapi itu mengundang percobaan terus menerus. Selain risiko tembus, serangan tebak password yang bertubi-tubi juga bisa membuat website melambat.

    Solusinya bisa Anda minta ke vendor: ubah alamat halaman login dari alamat bawaan, batasi jumlah percobaan login yang gagal, atau batasi akses halaman admin hanya dari jaringan tertentu. Cukup satu atau dua lapisan tambahan, efeknya sudah besar.

    8. Domain dan hosting atas nama sendiri

    Tiga pertanyaan untuk diri sendiri. Apakah domain terdaftar atas nama Anda atau perusahaan Anda, bukan atas nama vendor? Apakah Anda pegang akses ke akun registrar domain dan panel hosting? Apakah Anda tahu tanggal kedaluwarsa domain dan hosting?

    Kasus domain hangus itu nyata dan sering terjadi. Domain terdaftar atas nama vendor, kerja sama berakhir, tagihan perpanjangan tidak ada yang mengurus, lalu domain mati. Website hilang, email bisnis ikut mati, dan domain yang sudah hangus bisa dibeli orang lain. Membangunnya kembali jauh lebih mahal daripada mencegahnya.

    Kalau saat ini semuanya masih dipegang vendor, minta serah terima kepemilikan secara baik-baik. Daftar lengkap akses apa saja yang wajib Anda pegang sudah kami tulis di checklist serah terima proyek dari vendor. Setelah itu, pasang pengingat tanggal perpanjangan di kalender dan nyalakan perpanjangan otomatis kalau memungkinkan.

    9. Email bisnis tidak berbagi password dengan website

    Poin ini kelihatan sepele, tapi email adalah kunci induk dari hampir semua akun bisnis Anda. Reset password website, akses registrar domain, notifikasi hosting, semuanya lewat email. Kalau password email sama dengan password admin website, satu kebocoran cukup untuk membuka semuanya.

    Cara ceknya cukup jujur pada diri sendiri. Apakah password email bisnis Anda sama atau mirip dengan password website, media sosial, atau marketplace? Kalau ya, ganti password email lebih dulu karena akun itu yang paling kritis, lalu nyalakan verifikasi dua langkah.

    Kalau email bisnis dikelola vendor, tanyakan siapa saja yang memegang aksesnya dan pastikan Anda punya akses pemulihan sendiri.

    10. Cek nama bisnis Anda di Google

    Buka Google, lalu ketik site:namadomainanda.com dengan domain Anda sendiri. Perintah ini menampilkan semua halaman website Anda yang terindeks Google. Baca hasilnya pelan-pelan. Semua judul halaman seharusnya Anda kenali.

    Kalau muncul halaman berbahasa asing yang tidak pernah Anda buat, judul tentang obat-obatan, judi online, atau produk yang tidak ada hubungannya dengan bisnis Anda, itu gejala klasik website yang sudah disusupi. Penyerang menumpang otoritas domain Anda untuk menyebar halaman spam, sering kali tanpa mengubah tampilan website sama sekali sehingga pemiliknya tidak sadar berbulan-bulan.

    Kalau menemukan halaman seperti ini, jangan hapus sembarangan. Foto atau screenshot dulu hasilnya, lalu bawa ke developer untuk pembersihan menyeluruh. Menghapus halaman spam tanpa menutup celah masuknya hanya membuat halaman itu muncul lagi minggu depan.

    Tiga tanda website sudah kena hack yang sering telat disadari

    Selain sepuluh poin di atas, kenali juga tiga gejala yang sering luput karena tampilan website terlihat normal.

    • Hasil pencarian Google berbeda dengan tampilan asli. Judul dan deskripsi di Google berubah jadi teks aneh, padahal saat dibuka langsung website tampak biasa saja. Penyerang memang sengaja hanya menampilkan konten spam ke mesin pencari.
    • Pengunjung dialihkan ke situs lain. Ada pelanggan yang mengeluh dibuang ke situs judi atau iklan saat membuka website Anda dari HP, padahal dari laptop Anda semuanya normal. Pengalihan seperti ini sering dipasang hanya untuk pengunjung dari perangkat atau sumber tertentu.
    • Peringatan merah dari browser atau Google. Muncul label “Situs ini mungkin diretas” di hasil pencarian, atau layar merah peringatan saat website dibuka. Kalau sudah sampai tahap ini, Google sudah mendeteksi masalahnya lebih dulu daripada Anda.

    Kalau salah satu tanda ini muncul, langkah pertamanya bukan panik lalu menghapus file atau halaman sembarangan. Jejak serangan justru dibutuhkan developer untuk menemukan celah masuknya. Yang perlu Anda lakukan: catat gejalanya lengkap dengan screenshot, ganti password admin dan email, lalu hubungi developer atau vendor untuk pembersihan dan penutupan celah. Kalau website sedang menyimpan data pelanggan, sampaikan juga itu ke developer supaya penanganannya diprioritaskan.

    Mulai dari yang paling mudah hari ini

    Tidak perlu menyelesaikan semuanya dalam sehari. Mulai dari yang bisa dicek lima menit: gembok HTTPS, pencarian site: di Google, dan daftar pengguna di dashboard. Sisanya jadikan daftar pertanyaan untuk vendor Anda di pertemuan berikutnya. Vendor yang baik akan senang ditanya soal ini, karena artinya Anda peduli pada aset digital sendiri.

    Kalau website Anda dibangun sudah lama dan tidak ada yang bisa menjawab pertanyaan-pertanyaan di atas, mungkin ini waktu yang tepat mempertimbangkan membangun ulang website dengan fondasi yang aman dari awal, lengkap dengan serah terima akses yang jelas.

    Dan kalau dari checklist ini Anda menemukan sesuatu yang mencurigakan tapi bingung harus mulai dari mana, hubungi tim Arrazy. Ceritakan saja gejalanya, nanti kami bantu memetakan langkahnya.

  • Aplikasi Kasir Laundry: Fitur Nota Digital sampai Langganan

    Aplikasi Kasir Laundry: Fitur Nota Digital sampai Langganan

    Kalau Anda pemilik laundry dan mulai capek dengan nota kertas, jawabannya singkat. Aplikasi kasir laundry yang layak dipakai minimal punya empat fitur inti: nota digital yang otomatis terkirim ke WhatsApp pelanggan, tracking status cucian per tahap (diterima, dicuci, disetrika, siap diambil), riwayat pelanggan lengkap dengan paket langganan atau deposit, dan laporan omzet harian yang bisa dicek dari HP.

    Empat fitur itu menyelesaikan hampir semua drama harian di laundry kiloan maupun satuan. Nota tidak hilang, pelanggan tidak perlu bolak balik tanya “cucian saya sudah selesai belum”, dan Anda tahu persis berapa uang masuk hari ini tanpa menghitung bon satu per satu. Sisanya di artikel ini kita bahas detailnya, plus satu pertanyaan penting: kapan cukup pakai aplikasi jadi, dan kapan perlu bikin custom.

    Masalah nota kertas yang setiap pemilik laundry hafal

    Nota kertas kelihatannya murah. Satu buku nota harganya tidak seberapa. Tapi biaya sebenarnya muncul di kejadian sehari hari yang bikin pusing.

    • Nota hilang atau luntur. Pelanggan menaruh nota di saku celana, ikut tercuci, tulisannya hilang. Atau kertasnya sudah lecek waktu mau diambil dua minggu kemudian.
    • Pelanggan datang tanpa nota. Karyawan harus membongkar rak sambil mengandalkan ingatan. “Yang tas biru itu punya siapa ya?” Kalau salah kasih, urusannya panjang.
    • Rebutan klaim. Dua pelanggan merasa punya cucian yang sama. Tanpa catatan berat, jumlah potong, dan tanggal masuk yang jelas, Anda tidak punya pegangan.
    • Rekap manual tiap malam. Menjumlahkan bon satu per satu, sering selisih, dan tidak ketahuan selisihnya di mana.

    Satu insiden salah serah cucian saja bisa membuat pelanggan kapok. Padahal bisnis laundry hidup dari pelanggan yang balik lagi tiap minggu. Di titik inilah aplikasi kasir bukan lagi gaya gayaan, tapi alat kerja.

    Alur kerja laundry dengan aplikasi, dari terima sampai diambil

    Supaya kebayang, begini alur yang umum dipakai di aplikasi kasir laundry. Prosesnya mengikuti cara kerja laundry yang sudah ada, bukan mengubahnya.

    1. Terima cucian dan timbang

    Pelanggan datang, cucian ditimbang. Karyawan memasukkan nama atau nomor HP pelanggan. Kalau pelanggan lama, datanya langsung muncul, tidak perlu ketik ulang.

    2. Pilih layanan dan hitung otomatis

    Pilih jenis layanan: kiloan reguler, ekspres, satuan seperti bed cover, jas, atau sepatu. Harga terhitung otomatis sesuai daftar yang Anda set. Tidak ada lagi salah hitung karena karyawan lupa tarif ekspres.

    3. Nota otomatis terkirim ke WhatsApp

    Begitu transaksi disimpan, nota digital terkirim ke WA pelanggan. Isinya jelas: berat, jenis layanan, harga, estimasi selesai, dan nomor nota. Nota ini tidak bisa hilang, tidak bisa luntur, dan pelanggan selalu bawa HP nya.

    4. Update status per tahap

    Karyawan tinggal tap untuk memindah status: sedang dicuci, sedang disetrika, siap diambil. Anda sebagai pemilik bisa lihat dari rumah ada berapa cucian yang menumpuk di tahap mana. Kalau setrikaan menumpuk terus, itu sinyal butuh tambahan tenaga di situ.

    5. Notifikasi selesai dan serah terima

    Saat status berubah jadi siap diambil, pelanggan dapat notifikasi WA. Ini yang membuat telepon “sudah selesai belum” nyaris hilang. Waktu pengambilan, karyawan cukup cari nomor nota atau nama, cocokkan, selesai. Klaim ganda hampir mustahil karena semua tercatat.

    Pelanggan langganan dan deposit, mesin cashflow yang sering dilewatkan

    Fitur ini yang paling jarang dipakai padahal dampaknya paling besar ke keuangan. Konsepnya sederhana: pelanggan bayar di depan untuk paket tertentu, misalnya deposit 100 ribu dapat kuota 12 kilo, atau paket bulanan 40 kilo untuk anak kos.

    Kenapa ini penting untuk cashflow? Karena uang masuk dulu, layanan menyusul. Anda pegang kas di awal bulan, bukan menunggu recehan tiap transaksi. Untuk laundry di sekitar kampus atau perkantoran, pola ini cocok sekali dengan kebiasaan anak kos yang gajian atau dapat kiriman sebulan sekali.

    Efek sampingnya juga bagus: pelanggan yang sudah setor deposit hampir pasti balik ke tempat Anda, bukan ke laundry sebelah. Aplikasi yang baik mencatat sisa kuota otomatis, memotong saldo tiap transaksi, dan memberi tahu pelanggan kalau saldonya mau habis. Kalau dicatat manual di buku, fitur langganan justru rawan ribut karena beda catatan antara Anda dan pelanggan.

    Riwayat pelanggan juga bekerja diam diam. Anda jadi tahu siapa 20 pelanggan paling sering datang, siapa yang sudah sebulan tidak muncul. Pelanggan yang menghilang bisa disapa lewat WA dengan promo kecil. Murah, dan jauh lebih efektif daripada sebar brosur.

    Laporan yang pemilik laundry benar benar lihat

    Banyak aplikasi kasir menjual puluhan jenis laporan. Kenyataannya, pemilik laundry sibuk. Yang benar benar dibuka biasanya cuma ini.

    • Omzet hari ini dan bulan ini. Dicek sambil rebahan malam hari. Cukup satu angka besar, bukan tabel rumit.
    • Jumlah kilo atau potong per hari. Untuk tahu kapasitas mesin masih cukup atau sudah waktunya nambah.
    • Cucian yang belum diambil. Barang numpuk lebih dari seminggu itu makan tempat dan berisiko. Daftar ini jadi bahan untuk follow up via WA.
    • Setoran per shift karyawan. Uang di laci harus cocok dengan angka di aplikasi. Kalau selisih, ketahuan di shift siapa.

    Laporan seperti ini yang mengubah cara Anda mengambil keputusan. Mau buka cabang, nambah mesin, atau naikkan harga ekspres, semuanya berangkat dari angka, bukan perasaan.

    Aplikasi jadi atau bikin custom, jujur saja

    Sekarang bagian yang sering ditanyakan ke kami sebagai software house. Dan jawabannya mungkin mengejutkan.

    Untuk laundry kiloan satu outlet dengan alur standar, aplikasi jadi biasanya sudah cukup. Di pasaran ada banyak aplikasi kasir laundry berlangganan dengan biaya ratusan ribu per bulan. Fitur nota WA, status cucian, dan langganan umumnya sudah tersedia. Bikin custom untuk kebutuhan sesederhana ini seperti membangun rumah untuk sekadar tempat parkir motor. Bisa, tapi tidak masuk akal secara biaya.

    Custom mulai masuk akal kalau bisnis Anda punya alur yang aplikasi jadi tidak bisa ikuti. Beberapa contoh nyata dari sisi operasional:

    • Antar jemput dengan armada sendiri. Anda butuh penjadwalan kurir, rute penjemputan, bukti foto serah terima, dan tracking posisi. Kebutuhan seperti ini biasanya berujung pada aplikasi mobile untuk kurir dan pelanggan, bukan sekadar kasir di konter.
    • Banyak cabang dengan pusat produksi. Cucian diterima di outlet A, dicuci di workshop pusat, dikembalikan ke outlet A. Perpindahan antar lokasi harus tercatat supaya tidak ada yang nyasar.
    • Model B2B. Melayani hotel, klinik, atau restoran dengan kontrak, tagihan bulanan, dan harga khusus per klien. Aplikasi kasir ritel biasa tidak dirancang untuk pola tagihan seperti ini.
    • Integrasi dengan sistem lain. Misalnya data omzet harus masuk otomatis ke software akuntansi yang sudah dipakai, atau ke sistem franchise pusat.

    Kalau salah satu poin di atas terasa seperti bisnis Anda, membangun sistem aplikasi custom layak dihitung. Sistemnya mengikuti alur Anda, bukan Anda yang menyesuaikan diri dengan aplikasi. Dan tidak ada biaya langganan per bulan yang terus berjalan seumur hidup bisnis.

    Saran praktisnya begini. Mulai dari aplikasi jadi dulu kalau alur Anda masih standar. Catat hal hal yang aplikasi itu tidak bisa lakukan. Kalau daftarnya makin panjang dan mulai menghambat operasional, itu waktunya bicara soal custom. Jangan sebaliknya, bikin custom duluan padahal alur bisnisnya sendiri belum stabil.

    Pertanyaan yang sering muncul

    Bisa untuk laundry satuan dan kiloan sekaligus?

    Bisa, dan memang harus. Aplikasi kasir laundry yang baik memakai daftar layanan yang fleksibel. Kiloan dihitung per kilogram, satuan dihitung per item seperti bed cover, boneka, jas, gaun, atau sepatu. Dalam satu nota keduanya bisa digabung, misalnya 5 kilo reguler plus 1 bed cover ekspres. Harga terhitung otomatis sesuai tarif masing masing. Yang perlu Anda pastikan waktu memilih aplikasi: daftar layanan dan harganya bisa Anda ubah sendiri tanpa harus menghubungi vendor.

    Perlu printer thermal atau cukup nota WA saja?

    Nota WA sebenarnya sudah cukup sebagai bukti transaksi, dan justru lebih aman karena tidak bisa hilang. Tapi printer thermal tetap berguna untuk dua hal: mencetak label yang ditempel di tas atau keranjang cucian supaya mudah dicari di rak, dan melayani pelanggan yang nomor WA nya tidak aktif atau memang minta nota fisik. Printer thermal harganya mulai ratusan ribu rupiah dan tanpa tinta, jadi bukan investasi berat. Saran kami, pakai keduanya: label fisik untuk internal, nota WA untuk pelanggan.

    Bagaimana kalau karyawan saya gaptek?

    Ini kekhawatiran paling umum, dan biasanya berlebihan. Karyawan yang bisa pakai WhatsApp bisa pakai aplikasi kasir, asalkan aplikasinya dirancang sederhana. Alurnya cuma itu itu saja tiap hari: pilih pelanggan, masukkan berat, pilih layanan, simpan, lalu tap untuk update status. Umumnya satu sampai dua hari pendampingan sudah lancar. Yang penting, jangan langsung buang buku nota di hari pertama. Jalankan keduanya paralel seminggu, setelah karyawan percaya diri baru lepas yang manual. Dan pilih aplikasi yang tampilannya berbahasa Indonesia supaya tidak ada alasan bingung istilah.

    Mulai dari mana sekarang

    Kalau laundry Anda masih satu outlet dengan alur standar, coba dulu satu atau dua aplikasi kasir laundry jadi yang ada di pasaran. Kebanyakan menyediakan masa uji coba gratis. Rasakan sendiri bedanya seminggu tanpa rekap manual.

    Tapi kalau Anda sudah di tahap punya armada antar jemput sendiri, beberapa cabang, atau klien B2B, dan aplikasi jadi mulai terasa sempit, ceritakan alur bisnis Anda ke kami lewat halaman kontak Arrazy. Kami biasa membantu pemilik usaha memetakan dulu apakah kebutuhannya memang perlu sistem custom atau sebenarnya masih bisa ditangani aplikasi yang ada. Konsultasi awal tidak dipungut biaya, dan kalau memang belum perlu custom, kami akan bilang apa adanya.