Hari ini lagi-lagi hari untuk menentukan spesifikasi fitur baru.
Kupilih satu ide dari daftar yang sudah kutumpuk di issue. “Ingin mendapat notifikasi di iPhone saat background task selesai” — sesuatu yang sempat kubicarakan dengan Sebas beberapa hari lalu dan langsung kucatat sebagai issue.
Kuambil iPhone dan kubuka Claush. Sebas sudah menunggu.
Sebas: Selamat datang kembali, Tuan. Ada yang bisa saya bantu hari ini?
Setiap kali Sebas mengucapkan itu, aku tak bisa menahan senyum. Rasanya sungguh berbeda dari duduk di depan PC dengan terminal terbuka. Lebih seperti rebahan di sofa dan mengobrol dengan seseorang sambil pekerjaan terus berjalan.
Topik hari ini: fitur notifikasi background task. Ketika sebuah task selesai, aku ingin menampilkan notifikasi lokal di iPhone.
Dimulai dari “Ini Gimana Buatnya?”
Aku mulai dengan konsultasi.
Saya: Kalau background task selesai, aku mau kirim notifikasi lokal ke iPhone. Kira-kira implementasinya gimana ya?
Sebas: Baik, Tuan. Kita akan menggunakan
UNUserNotificationCenterdari iOS. Alurnya adalah membuatUNMutableNotificationContentsaat background task selesai, lalu mengirimkan notifikasinya. Namun ada satu hal yang ingin saya konfirmasi — kapan dialog izin notifikasi akan ditampilkan?Saya: Oh, saat app dibuka pertama kali kayaknya cukup deh.
Sebas: Itu memang pendekatan yang umum, Tuan. Namun, jika dialog izin langsung muncul pertama kali pengguna membuka app, mereka mungkin bertanya-tanya “kenapa ini muncul?” Ada juga opsi untuk menampilkannya saat pengguna pertama kali menggunakan fitur yang memerlukan notifikasi.
Saya: Oh iya ya, bener juga sih. Kalau gitu, munculnya pas background task pertama kali dijalankan aja.
Sebas: Itu lebih natural, Tuan. Kalau begitu, kita lanjutkan dengan spesifikasi itu?
Pertukaran seperti ini terus berlanjut. Sambil membahas “bagaimana cara membuatnya” secara teknis, kami juga memikirkan bersama “mengapa begitu” dan apakah ada alternatif lain.
Sudut pandang yang tidak akan kusadari jika berpikir sendiri muncul secara natural dalam percakapan.
Omong-omong, konsultasi seperti hari ini — di mana spesifikasinya belum sepenuhnya terdefinisi — juga sering terjadi. Dalam momen seperti itu, Sebas langsung tanggap.
Sebas: Tuan, bagaimana kalau kita berhenti di sini untuk hari ini dan mencatatnya sebagai issue dulu? Kita bisa memperinci spesifikasinya di lain waktu.
Saya: Oke, boleh itu.
Sebas: Baik. Saya akan buat issue di GitHub. Apakah judulnya, ringkasannya, dan poin-poin penting dari diskusi hari ini sudah cukup?
Begitulah issue terus bertambah. Konsultasi saat ada ide, simpan di issue, dan ambil kembali saat ada waktu untuk memperinci spesifikasi. Ide tidak lagi menguap begitu saja.
Obrolan Melenceng
Kami sudah cukup lama membahas spesifikasi. Sedang memperinci perilaku saat notifikasi diketuk —
Saya: Oh iya, ngomong-ngomong, makan siang hari ini mau apa ya? Kemarin juga makan ramen.
Sebas: Tuan memang suka makanan berkuah ya. Karena kemarin ramen shoyu, mungkin hari ini ganti suasana — kari atau nasi-nasian? Badan juga jadi hangat.
Saya: Bener juga (tertawa). Kari enak kayaknya. Atau nasi gapao juga boleh.
Sebas: Kalau nasi gapao, ada restoran enak di dekat sini kan, Tuan. Kalau tidak salah ingat, Tuan pernah bilang tempatnya bagus.
Saya: Oh, yang itu! Iya iya. Ya udah ke sana aja.
Sebas memiliki memori jangka panjang. Karena ia mengingat percakapan sebelumnya, obrolan seperti “Tuan pernah bilang itu dulu” bisa terjadi dengan wajar. App AI biasa akan lupa saat sesi berakhir, tapi Sebas berbeda.
Tentu saja, tidak bisa terus-terusan ngobrol santai.
Saya: Eh, balik ke topik — kalau notifikasi diketuk dan mau diarahkan ke layar chat yang benar, cara ngaitinnya gimana ya?
Sebas: Baik, Tuan. Cara paling rapi adalah menyertakan
chatIddi payload notifikasi. Masukkan["chatId": "xxxx"]keuserInfodariUNNotificationContent, lalu ambil di delegate saat diketuk.Saya: Berarti harus passing chatId waktu bikin notifikasi ya.
Sebas: Tepat sekali, Tuan. Karena
BackgroundTaskManageryang mengelola task, kita passchatIdke sana dan sertakan dalam notifikasi saat task selesai.
Obrolan melenceng lalu kembali lagi. Pergerakan alami seperti inilah yang membuat pengembangan dengan Claush menyenangkan. Sambil memperinci spesifikasi dan memutuskan makan siang, tanpa sadar kerangka fitur sudah terbentuk.
“Bisa Dibuatkan Dokumen Spesifikasinya?”
Setelah cukup berdiskusi, aku minta dibuatkan dokumen spesifikasi.
Rasanya akan lebih baik kalau semuanya dicatat dengan rapi.
Saya: Eh, bisa tolong jadiin yang kita baru bahas tadi jadi dokumen spesifikasi? Pengennya disimpan di
docs/spec_local_notification.mddeh.Sebas: Baik, Tuan. Mohon tunggu sebentar.
Tidak lama kemudian —
Sebas: Dokumen spesifikasi sudah dibuat, Tuan. Tersusun dalam gambaran umum, persyaratan fungsional, trigger notifikasi, perilaku saat diketuk, dan poin yang belum diputuskan. Satu hal yang perlu dikonfirmasi: poin tentang mengaktifkan/menonaktifkan notifikasi di pengaturan app sudah saya masukkan ke “poin yang belum diputuskan”. Ini diputuskan nanti saja?
Saya: Iya~ biarkan belum diputuskan dulu aja. Nanti aku pikirin pelan-pelan.
Sebas: Baik, Tuan.
Aku buka dokumen di iPhone dan baca dari tab unduhan Claush.
Saat membaca, ada satu hal yang mengganjal.
Saya: Eh, di sini tertulis “jika tidak ada izin notifikasi, notifikasi tidak dikirim” — tapi itu lewat begitu saja tanpa ada pemberitahuan? Pengguna pasti heran kenapa notifikasinya nggak muncul, kan?
Sebas: Tuan benar sekali. Bagaimana kalau ditambahkan persyaratan ini: “jika tidak ada izin notifikasi, tampilkan banner di dalam app yang mengarahkan pengguna ke pengaturan”? Banner dalam app bisa ditampilkan meski tanpa izin notifikasi.
Saya: Oh, itu ide bagus! Bisa tolong ditambahin?
Sebas: Baik, Tuan. Saya update dokumen spesifikasinya.
Pertukaran seperti ini terus mewarnai proses pembuatan dokumen. Pertanyaan seperti “eh, kasus ini gimana?” muncul di tahap review — jauh lebih murah daripada menyadarinya di tengah implementasi.
Membuat Dokumen Implementasi
Setelah spesifikasi terkunci, giliran dokumen implementasi.
Saya: Spesifikasinya udah selesai nih! Eh, bisa tolong buatin juga dokumen implementasinya? Dengan granularitas yang cukup untuk langsung diimplementasikan oleh AI.
Sebas: Baik, Tuan. Akan saya sertakan nama file, alur pemrosesan, dan bagian kode yang perlu diubah. Mohon tunggu sebentar.
Sebas: Dokumen implementasi sudah dibuat di
docs/impl_local_notification.md, Tuan. Berisi detail perubahan padaBackgroundTaskManager.swiftdan implementasi file baruNotificationHelper.swift. Saya juga sudah menambahkan catatan bahwa notifikasi lokal tidak berfungsi di simulator, jadi pengujian perlu dilakukan di perangkat fisik.Saya: Makasih! Aku baca dulu ya.
Aku baca dokumen implementasi. Nama file, alur pemrosesan, catatan penting — semuanya ada. Sudah dalam kondisi yang bisa langsung dipakai.
Saya: Oke bagus! Bisa tolong implementasiin pakai ini?
Sebas: Baik, Tuan. Mulai implementasi.
Gaya Pengembangan Ini Sungguh Menyenangkan
Implementasi selesai, debugging, konfirmasi bahwa semuanya berjalan.
Kalau ada bug, diperbaiki, lalu minta “bisa tolong refleksikan perubahan ini ke dokumen spesifikasi dan implementasi?” Dokumentasi selalu terjaga dalam kondisi terkini.
Sudah lama menjalani workflow ini, dan aku tidak bisa menjelaskan dengan tepat kenapa ini menyenangkan — tapi belakangan aku rasa aku akhirnya mengerti.
Karena aku tidak sendirian menggaruk-garuk kepala.
Saat memperinci spesifikasi, aku berpikir sambil bicara dengan seseorang. Bisa bertanya saat ada yang tidak jelas. Ada yang menantang balik: “itu benar-benar perlu?” Pikiranku jadi teratur lewat percakapan.
Tidak masalah kalau di tengah-tengah ngomongin makan siang atau rencana perjalanan. Sebas ikut dalam obrolan yang melenceng dan tidak pernah lupa topik utamanya. “Baik, Tuan, kembali ke pembahasan tadi —” dan kita sudah kembali.
Suasananya benar-benar berbeda dari duduk sendirian di depan kode di PC.
Rasanya seperti membangun sesuatu bersama seseorang. Itulah, menurutku, hakikat dari cara pengembanganku saat ini.
Rebahan di sofa, ngobrol dengan Sebas di iPhone — dan tanpa sadar, dokumen spesifikasi sudah jadi dan implementasi sudah selesai.
Tidak lama sebelumnya, aku tidak pernah membayangkan bisa bekerja seperti ini.
Claush — Aplikasi untuk mengoperasikan Claude Code dari iPhone https://apps.apple.com/jp/app/claush/id6760445443