Editor Teks
- Kita memakai editor teks setiap hari, tetapi apakah kita tahu bagaimana sebenarnya itu bekerja? Mulailah dengan mengimplementasikan fitur-fitur dasar.
- Tantangan terbesar adalah bagaimana menyimpan dokumen teks di memori. Menggunakan array memiliki masalah performa, sehingga perlu mempelajari berbagai struktur data untuk mengatasinya.
- Pelajari cara kerja kursor teks, lalu setelah editor dasar selesai dibuat, coba implementasikan undo/redo dan fitur pembungkusan baris otomatis.
Game 2D - Space Invaders
- Bahkan game sederhana pun memerlukan struktur data khusus dan design pattern. Alih-alih berfokus pada desain game dan art, fokuslah pada implementasi keseluruhan game.
- Pelajari menggambar layar, game loop, penanganan input pengguna, pembuatan dan pengelolaan objek dinamis, serta penerapan logika game.
- Setelah game dasar selesai, proyek ini bisa dikembangkan dengan menu layar judul, layar game over, menjaga kecepatan yang sama di berbagai komputer, penerapan AI, dan lainnya.
Compiler - Tiny BASIC
- Mengimplementasikan compiler adalah proyek yang menuntut pemahaman mendalam tentang pemrograman. Mulailah menulis compiler dengan bahasa sederhana seperti Tiny BASIC.
- Pelajari proses tokenisasi kode (lexical analysis), parsing (memeriksa struktur dan membuat tree), analisis semantik, pembuatan kode, dan sebagainya.
- Setelah compiler dasar selesai, proyek ini bisa dikembangkan dengan menambahkan standard library, tahap optimisasi, dan peningkatan pesan error.
Sistem Operasi Mini
- Konsep dasar sistem operasi dapat diterapkan di berbagai bidang. Mengimplementasikan sistem operasi membantu meningkatkan pemahaman tentang hardware.
- Ada kurva belajar yang bergantung pada hardware, tetapi dengan mengikuti buku atau tutorial, kita bisa membuat OS yang dapat melakukan boot.
Spreadsheet
- Aplikasi spreadsheet menggabungkan tantangan dari editor teks dan compiler. Kita akan mempelajari cara merepresentasikan isi sel di memori serta mengimplementasikan interpreter bahasa pemrograman untuk formula.
Emulator Konsol Video Game
- Menulis emulator menggabungkan tantangan dari compiler, sistem operasi, dan penulisan compiler menjadi satu. Memainkan game sungguhan di emulator yang kita buat sendiri adalah pengalaman yang memuaskan.
- Mengemulasikan konsol video game nyata berarti menulis virtual machine yang bekerja seperti CPU terkait dan komponen hardware lainnya.
Pendapat GN⁺
- Untuk membangun dasar-dasar pemrograman, mengimplementasikan editor teks atau game sederhana sangat membantu dalam memahami cara kerja internal perangkat lunak yang benar-benar kita gunakan.
- Proyek kompleks seperti compiler atau sistem operasi menuntut pemahaman mendalam tentang bahasa pemrograman dan arsitektur komputer, dan hal ini penting untuk mengembangkan keterampilan software engineering tingkat lanjut.
- Proyek-proyek ini memberikan pengalaman yang menarik dan menantang bagi programmer ketika mempelajari bahasa atau framework baru, atau memperdalam pengetahuan yang sudah ada.
1 komentar
Pendapat Hacker News
Mengerjakan proyek seperti editor teks, compiler, sistem operasi, dan ray tracer dapat meningkatkan kemampuan pemrograman, tetapi tidak meningkatkan kemampuan software engineering. Bahkan, proyek semacam ini pada praktiknya mengandung prinsip bencana "Not Invented Here", sehingga bisa berdampak buruk bagi software engineering.
Untuk proyek berbasis UI/web, berikut yang direkomendasikan:
fetchsudah ada, memahami bagaimana request HTTP dikirim dan dibaca dari nol membantu saat men-debug masalah CORS, request OPTIONS, dan sebagainya)Pendapat positif tentang mini operating system. Sebagai pengembang aplikasi, kita bergantung pada fungsi sistem operasi (manajemen memori, file system, dan sebagainya), dan wajar untuk penasaran bagaimana semua itu bekerja di balik layar. Menggunakan xv6 untuk mempelajari dan mengimplementasikan berbagai algoritma penjadwalan proses di waktu luang adalah pengalaman yang sangat bermanfaat dan menyenangkan.
Ada keinginan untuk menyentuh hal-hal yang bersifat fisik, misalnya robot atau drone dengan autopilot, atau simulasi akurat dinamika penerbangan pesawat luar angkasa dengan parameter GNC yang dapat diprogram. Memiliki buku berjudul "Fundamentals of Astrodynamics" dan ingin memanfaatkannya selama musim liburan ini. Ingin mendapatkan referensi yang bagus tentang GNC (guidance, navigation, and control).
Ini tergantung pada selera pribadi dan situasi masing-masing, tetapi jika sedang mencari ide, ini bisa menjadi daftar yang bagus sebagai titik awal. Pernah membuat editor staff musik dan tracker, 2D game (Space Invaders), dan sebagainya dengan Sinclair ZX Spectrum. Dengan komputer pertama (386), pernah membuat kompresor Huffman, indeks B-Tree, pembuat form OOP, pengecek email untuk dial-up, parser manual, dan sebagainya.
Diskusi tentang editor teks: tantangan terbesar adalah bagaimana menyimpan dokumen teks di memori. Menggunakan array adalah ide pertama, tetapi performanya sangat buruk saat menyisipkan teks di tempat selain akhir dokumen. Namun, menggunakan string JavaScript dan selama lebih dari 2 tahun memakai editor tersebut, tidak ada masalah performa. Tentu saja ada banyak masalah lain, misalnya merender garis horizontal yang panjang menjadi masalah karena pendekatan optimisasi mengasumsikan bahwa rendering satu baris akan murah.
Mencoba ray tracer mainan yang sederhana juga merupakan ide bagus. Membuat ray tracer yang melakukan rendering bola pada grafik bitmap serta pantulan diffuse dan reflektif bisa menjadi proyek yang relatif terbatas selama proyeknya tidak dibuat terlalu rumit.
Jika berpikir bahwa menulis Space Invaders membutuhkan "factory pattern", berarti ada masalah. Rasanya sulit percaya bahwa konsep desain seperti itu dipakai di game aslinya.
Pendapat tentang editor teks yang menggunakan array sebagai struktur data. Yang dibutuhkan adalah kecepatan tinggi saat mengetik, dan hanya satu baris yang berubah. Saat memasukkan baris baru, jeda tambahan yang diperlukan untuk menyusun ulang array setelah menekan Enter tidak akan terasa bahkan untuk jutaan baris. Bagian editor teks yang lebih menantang adalah memastikan hanya apa yang dilihat pengguna yang dirender.