Kenikmatan Membuat Perangkat Lunak Mainan
(blog.jsbarretto.com)- Membuat perangkat lunak mainan adalah cara untuk memulihkan kegembiraan dan kreativitas yang esensial dalam pengembangan perangkat lunak
- Di era ketika kegembiraan murni dalam pengembangan perangkat lunak memudar karena AI dan industrialisasi, membuat program mainan sederhana sebagai proyek pribadi bisa menjadi kesempatan untuk memperoleh pengetahuan yang berguna dalam praktik serta pemahaman yang lebih dalam
- Perangkat lunak mainan mengikuti kaidah 80:20, yaitu mewujudkan fungsi maksimal dengan kode minimal, dan kuncinya adalah menghindari desain berlebihan atau obsesi terhadap kesempurnaan
- Pengalaman membuat sesuatu sendiri tanpa bergantung pada alat AI seperti LLM adalah kegembiraan mendasar dari belajar dan berkembang
Mengapa kita perlu membuat lebih banyak program mainan
- Kutipan terkenal Richard Feynman: “Apa yang tidak bisa saya buat, berarti tidak saya pahami” → pengalaman membuat sesuatu secara langsung mengarah pada pemahaman yang mendalam
- Berbeda dengan nasihat lama “jangan menemukan kembali roda”, pengalaman membuat roda itu sendiri mengajarkan lebih banyak daripada membaca atau belajar teori
- Belakangan ini AI dan industrialisasi perangkat lunak mengancam kegembiraan dan jiwa craftsmanship dalam pengembangan
- Membuat perangkat lunak mainan mengembalikan kegembiraan sederhana yang membuat kita jatuh cinta lagi pada komputer
Prinsip program mainan: Keep it simple
- Perangkat lunak mainan mengikuti prinsip 80:20: mencapai 80% fungsi dengan 20% usaha
- Tujuannya bukan produk akhir, melainkan kesederhanaan dan mengimplementasikan sendiri prinsip-prinsip utamanya
- Menekankan cara kerja yang waspada terhadap over-engineering dan hanya menulis kode yang benar-benar diperlukan
- Disarankan untuk membiarkan semua jalur kode tetap belum diimplementasikan, lalu menambahkan implementasi seperlunya saat dibutuhkan
- Bahkan sistem yang tampak kecil pun, saat benar-benar dicoba, sering terasa lebih mudah dibuat daripada dugaan awal
Manfaat tambahan dari perangkat lunak mainan
- Pengetahuan yang diperoleh dari proyek mainan sering kali jauh lebih membantu daripada perkiraan dalam pekerjaan nyata, seperti melacak masalah, memperbaiki bug, dan mencegah kesalahan
- Mengalami sendiri batasan-batasan saat berhadapan langsung memberi wawasan tentang hakikat perangkat lunak, dan juga bisa membuka jalan pada solusi yang inovatif
Contoh: daftar berbagai proyek perangkat lunak mainan
Jenis-jenis proyek mainan yang telah dibuat sendiri selama 15 tahun terakhir dirangkum beserta tingkat kesulitan dan perkiraan waktu pengerjaan. Setiap proyek disertai penjelasan singkat dan bahan referensi tambahan
- Regex engine (tingkat kesulitan 4/10, 5 hari) : Menafsirkan regex gaya POSIX dan mengidentifikasi string yang cocok, sehingga memberi pemahaman mendalam tentang cara kerja internal regex
- x86 OS kernel (tingkat kesulitan 7/10, 2 bulan) : Mencakup CLI, driver sederhana, memory manager, dan lainnya; bisa diperluas dengan tantangan tambahan seperti in-memory filesystem, executable ELF, GUI, isolasi proses, dan sebagainya
- GameBoy/NES emulator (tingkat kesulitan 6/10, 3 minggu) : Memahami instruction set sederhana dan hardware, serta mengimplementasikan PPU, PSG, dan format cartridge yang khas
- GameBoy Advance game (tingkat kesulitan 3/10, 2 minggu) : Game sederhana berbasis sprite; komunitas pengembangan GBA aktif, dan struktur sistemnya cukup mudah dipahami sendirian
- 2D physics engine (tingkat kesulitan 5/10, 1 minggu) : Newtonian mechanics dasar dan penanganan tabrakan sederhana, dengan kemungkinan dikembangkan ke bentuk kompleks, inersia, algoritme penyelesaian, soft body/interaksi gabungan, dan lain-lain
- Dynamic interpreter (tingkat kesulitan 4/10, 1~2 minggu) : Tree-walking interpreter; membuat bahasa sendiri memberikan kegembiraan teknis sekaligus kreatif
- Compiler keluarga C (tingkat kesulitan 8/10, 3 bulan) : Merancang arsitektur yang mendukung type system sederhana dan lingkungan target, beserta berbagai optimisasi dan backend yang beragam
- Text editor (tingkat kesulitan 5/10, 2~4 minggu) : Mulai dari file I/O sederhana; bisa memakai UI toolkit (QT/GTK, dll.), banyak yang lebih suka berbasis konsol, lalu menambah fitur seperti unicode, syntax highlighting, multi-buffer, LSP, dan lainnya
- Async runtime (tingkat kesulitan 6/10, 1 minggu) : Dalam kasus Rust, menangani task
impl Futuredan mengimplementasikan konkurensi, lalu menambahkan I/O waking - Hash Map (tingkat kesulitan 4/10, 3~5 hari) : Mempelajari cara kerja internal, closed dan open addressing, aturan Robin Hood, serta memahami performa dan kapan struktur ini tepat digunakan
- Rasteriser / Texture Mapper (tingkat kesulitan 6/10, 2 minggu) : Mempelajari struktur 3D graphics pipeline, vector math, Z-buffer, dan bisa diperdalam hingga texture mapping serta algoritme shading
- Signed Distance Field rendering (tingkat kesulitan 5/10, 3 hari) : Representasi ruang secara matematis, visualisasi sederhana, serta pemahaman tentang shader dan vector math
- Voxel engine (tingkat kesulitan 5/10, 2 minggu) : Mudah dipahami jika sudah punya pengalaman 3D graphics atau game development; bisa diperluas dengan texture, procedural generation, networking, dan tantangan lain
- Threaded Virtual Machine (tingkat kesulitan 6/10, 1 minggu) : Interpreter cepat yang dioptimalkan tanpa code generation spesifik arsitektur, dan bisa memberi pengalaman performa yang menyaingi compiler
- GUI toolkit (tingkat kesulitan 6/10, 2~3 minggu) : Setelah mencoba membuat alat UI dasar, bisa lanjut mengimplementasikan fitur lanjutan seperti layout engine, text shaping, accessibility, dan lain-lain
- Simulator mekanika orbit (tingkat kesulitan 6/10, 1 minggu) : Mengimplementasikan model gravitasi Newton secara sederhana, lalu memperluasnya ke interaksi banyak benda langit, algoritme integrasi, visualisasi, hingga penerapan data NASA
- Bitwise Challenge (tingkat kesulitan 3/10, 2~3 hari) : Game yang direpresentasikan hanya dengan state 64-bit, melatih pengelolaan state secara kreatif, dan aturan detailnya bisa dilihat di GitHub
- Framework ECS (tingkat kesulitan 4/10, 1~2 minggu) : Mengimplementasikan sendiri struktur Entity-Component-System, mengintegrasikannya dengan type system bahasa, serta menyesuaikannya untuk performa tinggi dan batasan tertentu
- CHIP-8 emulator (tingkat kesulitan 3/10, 3~6 hari) : Virtual machine sederhana dari era 1970-an, cepat dibuat, dan bisa dipakai untuk mengamati maupun menjalankan berbagai fan game
- Chess engine (tingkat kesulitan 5/10, 2~5 hari) : Mulai dari aturan dasar lalu berkembang sedikit demi sedikit; pengalaman kalah dari engine buatan sendiri adalah salah satu momen pertumbuhan seorang developer
- POSIX Shell (tingkat kesulitan 4/10, 3~5 hari) : Memahami prinsip dan keterbatasan shell berbasis POSIX, sekaligus memperoleh pemahaman mendalam dan merasakan banyak trik melalui implementasi kompatibilitas bahasa Shell yang nyata
Saran tentang penggunaan alat seperti LLM
- Alat canggih seperti LLM tetap berguna, tetapi pembelajaran sejati menjadi lebih dalam ketika kita mengeksplorasinya sendiri secara langsung
- Daripada melihat solusi yang sudah ada, kita bisa mendapatkan rasa pencapaian yang lebih besar lewat proses menjelajahi wilayah yang belum dikenal dan menemukan jawaban sendiri
- Saat menjalankan proyek mainan tanpa LLM, pada awalnya mungkin terasa sulit karena belum terbiasa, tetapi seiring waktu kita akan merasakan kegembiraan teknis yang khas dan rasa pencapaian yang tinggi
- Jika bepergian dengan mobil, kita tidak akan merasakan ‘runner’s high’ sebagai pelari → pengalaman langsung, bukan jalan pintas, adalah sumber kegembiraan yang lebih mendalam
3 komentar
Saya setuju dengan pendapat untuk mencobanya tanpa LLM. Kalau tidak butuh pengembangan yang serba cepat, membuatnya sendiri sambil memahami satu per satu rasanya lebih menyenangkan dan lebih memuaskan.
Oh, jadi yang dimaksud itu proyek iseng ya. Dari judulnya saja, saya sempat mengira ini tentang membuat perangkat lunak yang masuk ke dalam mainan. Haha
Komentar Hacker News
Penasaran apakah ada orang lain yang memakai LLM seperti mesin pencari. Dulu saya biasa mencari di Google dengan kueri seperti “pros cons mysql mongodb”, lalu menghabiskan banyak waktu membaca dokumentasi resmi, forum, blog, sampai Stack Overflow. Tapi waktu yang dipakai untuk belajar sambil membaca itu sendiri selalu saya sambut baik. Sekarang saya memberi prompt ke LLM yang lebih spesifik, misalnya “kelebihan dan kekurangan mysql vs mongodb untuk penyimpanan foto, sertakan tautan referensi”. Jadi saya bisa cepat menangkap intinya, dan karena ada tautannya juga, saya tidak perlu bergantung pada halusinasi. Kadang saya juga memberi permintaan yang lebih spesifik seperti “buatkan data schema untuk menyimpan metadata foto di postgres, saya ingin memisahkan X ke tabel lain”, tapi saya hanya melakukan ini saat saya sudah tahu persis hasil seperti apa yang seharusnya keluar. Saya memakainya hanya ketika sayang membuang waktu untuk mengetik atau saat sesaat lupa nama tipe yang spesifik seperti
intdanintegerbarFeaturediimplementasikan. Sekarang lihat proyek /src/baz dan jelaskan kenapa pendekatan di foo sulit diterapkan ke baz”. Saya tidak memintanya melakukan hal baru, tapi memakainya untuk menerjemahkan sesuatu dari proyek yang sudah ada ke ide saya sendiri. Untuk development yang benar-benar baru dan menantang, saya tetap merasa harus menulis kodenya sendiri agar menyenangkanSalah satu hal terbaik yang saya lakukan untuk karier saya adalah proyek pribadi yang saya kerjakan saat libur 6 bulan di antara pekerjaan. Awalnya saya punya banyak proyek yang ingin dimulai, tapi karena tidak ada batasan, cakupannya terus membesar dan akhirnya sering tidak selesai. Jadi saya memutuskan untuk hanya mengalokasikan 1 minggu untuk tiap proyek. Saya hanya membuat sebanyak yang bisa diselesaikan dalam 1 minggu. Pengalaman membuat sesuatu yang lumayan berguna hanya dalam 1 minggu, mulai dari nol, dengan bahasa atau framework baru, atau di bidang yang asing, benar-benar membangun rasa percaya diri saya. Itu juga mengingatkan saya kenapa saya dulu suka pemrograman. Kalau suatu saat ada jeda beberapa bulan di antara pekerjaan, alih-alih persiapan wawancara Silicon Valley, membuat proyek mainan justru akan membuat Anda kaget betapa banyak hal yang sebenarnya sudah Anda kuasai
Mengembangkan software mainan itu mirip merawat sepeda, mobil, atau perahu. Menyenangkan. Tapi memperbaiki sepeda untuk berangkat kerja itu membuat stres. Membuat software mainan itu menyenangkan, tapi begitu suatu hari saya benar-benar ingin memakainya, saya malah menemukan semua bug-nya dan tidak punya waktu untuk memperbaikinya. Di situlah dilemanya
Agak mengejutkan melihat banyak opini negatif tentang LLM. LLM itu menyuapi informasi langsung ke kita. Saat memulai proyek baru, tentu kita tidak memulainya dengan sudah tahu segalanya. Mencoba sebaik mungkin lalu gagal, setelah itu belajar, memahami kenapa gagal, dan menyesuaikan pendekatan baru—itulah pembelajaran yang sesungguhnya. Kalau kita merasa sudah tahu semuanya lalu hanya mengikuti tutorial, kita tidak akan benar-benar mengalami batasan atau kelebihan-kekurangan nyata dari tiap metode. Misalnya, mencoba membuat parser dengan regex lalu menemukan sendiri bahwa ia tidak bisa menangani ekspresi rekursif, atau belajar secara nyata soal struktur yang lebih kompleks dan isu kompleksitas waktu. Saat benar-benar mengimplementasikan compiler pengoptimal sendiri dan frustrasi oleh berbagai trik optimisasi, kita baru paham kenapa compiler sungguhan dirancang seperti itu. Saat menulis layout engine sendiri, kita bahkan bisa merasakan sulitnya menangani konsep seperti
widthdengan benar. Tidak ada pengalaman yang lebih baik daripada belajar lewat trial and error. Jangan sampai karena LLM mencegah kesalahan, kita juga kehilangan kesempatan belajar yang pentingSaya juga selama bertahun-tahun menghabiskan akhir pekan dan malam untuk mengerjakan proyek-proyek aneh demi belajar computer graphics. Saya tidak menghasilkan uang sepeser pun, tapi berkat itu saya mendapatkan pekerjaan impian saya. Tautan karya yang representatif:
Saya merasa semangat “kesenangan dalam pemrograman” yang diajukan tulisan ini benar-benar dibutuhkan. Di era coding dengan agen AI, ini malah jadi makin berharga. Tapi saya merasa estimasi waktu penulis untuk proyek mainan terlalu pendek. Saya memang mungkin tidak secepat rata-rata, tapi bahkan dengan asumsi hanya bekerja 2–3 jam per hari, saya rasa kebanyakan proyek di daftar itu bukan proyek yang selesai dalam hitungan beberapa hari. Rasanya riset sebelum mulai saja sudah makan waktu cukup banyak. Sebagai contoh, baru-baru ini saya mengganti blog Pelican saya dengan personal Odin static site generator, dan itu butuh 2 minggu meski saya hanya mengerjakan 2–3 jam per hari. Padahal itu termasuk yang lebih mudah dibanding proyek-proyek lain di daftar tersebut
Saya juga setuju dengan nasihat “jangan pakai LLM untuk proyek seperti ini”, tapi saya tidak ingin orang menerimanya secara terlalu ekstrem. Menarik juga bahwa nasihat soal bagaimana menerima bantuan dari AI terasa berbeda dibanding meminta bantuan pada manusia. Kalau di bagian bawah blog tertulis “kalau kamu punya teman yang jago programming, jangan pernah minta bantuan darinya”, itu akan terdengar aneh. Teman yang ahli akan memahami konteks dan membantu kita menyelesaikan sendiri. Hampir tidak ada orang yang benar-benar mencoba meminta AI untuk “jangan selesaikan masalahnya untuk saya, tapi bimbing saya seperti teman ahli”. Tentu saat ini mungkin belum bisa atau masih kurang bagus, tapi 1–2 tahun lagi gaya panduan seperti ini bisa jadi terasa sangat alami. Jadi, sebaiknya kita membiasakan diri menyampaikan dengan jelas bentuk bantuan seperti apa yang kita inginkan. Tidak perlu berpegang pada anggapan tetap bahwa LLM pasti hanya akan memberi jawaban salah
Berkat vibe coding berbasis Claude, saya akhirnya memulai lagi side project yang benar-benar menyenangkan setelah sekian lama. Setelah terbiasa dengan tool dan prosesnya, dalam beberapa minggu saya cepat membuat berbagai aplikasi: dashboard kalender/cuaca untuk keluarga, aplikasi pembaca Bluesky (menyembunyikan posting yang sudah dibaca), dashboard PM perusahaan yang digamifikasi, ekstensi Chrome yang menyembunyikan posting Reddit setelah jangka waktu tertentu, dan aplikasi pengganti plugin WordPress yang tidak terawat. Di awal saya menyerahkan banyak hal ke Claude seperti perbaikan UI, tapi sekarang saya sudah belajar puas di tingkat penyelesaian 90% dan fokus pada fitur aplikasi baru daripada terus menyempurnakan
Daftar ini benar-benar mengesankan. Banyak proyek yang menurut penulis terasa mudah, tapi buat saya mungkin tingkat kesulitannya langsung jauh lebih tinggi. Meski begitu, efek motivasinya untuk membuat saya mulai lagi mengerjakan proyek mainan sendiri jelas nyata. Hanya saja, kesimpulan soal pembelajaran dengan LLM terasa lebih bernuansa. Semuanya benar-benar tergantung bagaimana kita memakainya. Misalnya, permintaan seperti “tolong langsung implementasikan masalah ini” itu buruk sekali untuk belajar, sedangkan “tolong jelaskan struktur ELF pada tingkat abstraksi tertinggi, dengan fokus pada ‘mengapa’” justru pendorong belajar yang luar biasa. Mungkin ada sisi negatif karena kita jadi tidak selalu melakukan riset sendiri, tapi kalau sikap kita benar-benar intelektual dan mau berpikir, bisa mendapat tanya-jawab ala Socrates kapan saja adalah akselerator belajar yang luar biasa
Proyek-proyek yang diperkenalkan di sini memang ide yang bagus, tapi bagi saya tidak ada satu pun yang menarik. Di saat seperti ini saya jadi bertanya-tanya apakah saya memang benar-benar pernah menyukai pemrograman