Proyek yang Harus Dicoba Semua Programmer (2019)
(austinhenley.com)- Jika sulit memilih side project, proyek seperti editor teks, game 2D, compiler, atau mini operating system adalah titik awal yang baik karena semakin sering dibuat, semakin luas pembelajaran yang didapat
- Editor teks membuat kita mempelajari struktur data dan abstraksi dengan mengimplementasikan sendiri struktur penyimpanan dokumen, pergerakan kursor, undo/redo, dan line wrapping
- Bahkan game 2D sederhana seperti Space Invaders juga memperlihatkan struktur dasar pemrograman game mulai dari rendering layar, penanganan input, game loop, pengelolaan status objek, AI musuh, suara, shader, hingga networking
- Compiler Tiny BASIC dan mini operating system masing-masing membuat kita berhadapan langsung dengan konsep tingkat rendah seperti lexing, parsing, semantic analysis, code generation, serta cross compiling, bootloading, memory management, dan scheduling
- Spreadsheet dan emulator konsol menggabungkan tingkat kesulitan proyek-proyek sebelumnya, lalu meluas ke tahap membuat virtual machine yang meniru perilaku sistem nyata
Proyek yang Layak Dibuat Berulang Kali
- Saat membutuhkan side project atau ingin mempelajari bahasa pemrograman/framework baru, membuat proyek yang sama beberapa kali tetap bisa memberi pelajaran yang berbeda setiap kali
- Proyek yang direkomendasikan memiliki tingkat kesulitan dan area pembelajaran yang berbeda-beda
- Editor teks: struktur data, pergerakan kursor, undo/redo, representasi layar
- Game 2D: rendering layar, penanganan input, game loop, pengelolaan objek dan status
- Compiler: lexing, parsing, semantic analysis, code generation
- Mini operating system: booting, memory management, scheduling, file system
- Spreadsheet dan emulator konsol: menggabungkan konsep dari proyek-proyek sebelumnya ke dalam struktur yang lebih besar
Editor Teks
- Editor teks adalah alat yang dipakai setiap hari, tetapi jika diimplementasikan sendiri tanpa komponen textbox bawaan, kita jadi harus menangani detail pergerakan kursor, seleksi, penyisipan, dan penghapusan
- Tantangan terbesarnya adalah bagaimana menyimpan dokumen teks di memori
- Array sederhana buruk performanya saat menyisipkan teks di posisi selain akhir dokumen
- Struktur yang bisa dibandingkan meliputi array, rope, gap buffer, dan piece table
- Kursor tidak hanya bergerak naik dan turun secara sederhana
- Saat pindah ke baris yang lebih pendek, kursor akan pergi ke posisi yang memungkinkan, lalu ketika nanti ada baris yang cukup panjang, ia berusaha kembali ke kolom semula; ini adalah perilaku mengingat kolom
- Setelah editor dasar selesai, kita bisa menambahkan undo/redo dan line wrapping
- Referensi
Game 2D - Space Invaders
- Bahkan game sederhana pun membutuhkan struktur data dan design pattern yang khas
- Dibanding game engine besar, memakai library grafis 2D dasar seperti SDL, SFML, atau PyGame membuat bagian-bagian menariknya tidak tersembunyi
- Game menciptakan efek objek bergerak dengan membersihkan layar lalu menggambar ulang setiap elemen dengan cepat
- Alur nyatanya adalah struktur yang berulang di dalam game loop: menggambar, menerima input pengguna, lalu memproses logika game
- Penanganan input harus mempertimbangkan detail seperti tekanan pertama tombol keyboard atau mouse, tombol ditahan, dilepas, dan double-click
- Jika hanya terus memeriksa input, bagian lain dari game akan berhenti
- Pengelolaan objek dan status game juga harus ditangani langsung
- factory pattern membantu saat membuat musuh yang jumlahnya bertambah dinamis
- state machine bisa diterapkan pada AI musuh
- Setelah game dasar selesai, kita bisa menambahkan menu judul, layar game over, penanganan agar game berjalan pada kecepatan yang sama di komputer berbeda, dan AI musuh yang lebih menarik
- Jika diperluas lagi, kita bisa mengimplementasikan efek shader, suara, hingga multiplayer online
- Referensi
Compiler - Tiny BASIC
- Compiler adalah proyek untuk membuat alat yang memungkinkan orang lain membangun lebih banyak hal
- Dengan bahasa kecil keluarga BASIC yaitu Tiny BASIC, kita bisa menulis compiler dari nol yang menghasilkan bahasa lain yang sudah kita kuasai
- Misalnya membuat compiler Tiny BASIC dengan Python lalu menghasilkan kode C#
- Jika tidak menghasilkan assembly atau C, kita bisa lebih fokus pada compiler itu sendiri
- Alur implementasinya mengikuti tahapan pemrosesan bahasa langkah demi langkah
- lexical analysis untuk memecah kode input menjadi token
- syntactic analysis untuk memeriksa struktur input dan membuat representasi pohon
- recursive descent parsing
- abstract syntax tree
- semantic analysis untuk memastikan kode benar secara makna dan mengikuti aturan tipe
- optimization passes
- code generation
- Compiler sederhana bisa selesai dalam beberapa hari, lalu setelah itu kita bisa menambahkan standard library, optimization pass, dan perbaikan pesan error
- Di PeayBASIC, fitur grafis 2D sederhana ditambahkan ke standard library
- Referensi
Mini Operating System
- Algoritme dan struktur data operating system mungkin terasa abstrak atau tidak berguna di kelas, tetapi sebenarnya bisa diterapkan ke banyak bidang lain seperti game atau model prediksi perilaku manusia
- Dengan mengimplementasikannya sendiri, kita akan memahami lebih dalam apa yang terjadi di dalam operating system
- Karena ketergantungan pada hardware, ada hambatan awal dan kurva belajar, tetapi dengan mengikuti buku atau tutorial, kita bisa membuat OS yang dapat di-boot dan menjalankan program buatan sendiri
- Materi pembelajarannya meliputi
- Cross compiling
- Bootloading
- BIOS interrupts
- mode x86
- memory management dan paging
- Scheduling: misalnya round robin
- File systems: misalnya FAT
- Referensi
Proyek yang Lebih Sulit: Spreadsheet dan Emulator Konsol
- Aplikasi spreadsheet seperti Excel menggabungkan tantangan editor teks dan compiler
- Kita harus merepresentasikan isi sel di memori
- Kita harus mengimplementasikan interpreter untuk bahasa pemrograman yang dipakai dalam formula
- Referensi spreadsheet
- Emulator konsol video game adalah proyek yang menyatukan kesulitan implementasi compiler, operating system, dan game engine
- Untuk mengemulasikan konsol sungguhan, kita harus menulis virtual machine yang berperilaku seperti CPU dan komponen hardware lainnya
- Di virtual machine ini, game untuk konsol tersebut bisa dijalankan
- Sebagai titik awal, disarankan mengemulasikan konsol virtual CHIP-8 yang lebih sederhana daripada konsol sungguhan
- NES, SNES, Gameboy, dan Gameboy Advance juga bisa diemulasikan dan tersedia cukup banyak dokumentasi serta emulator open source, tetapi tiap konsol punya keunikan yang menarik
- Game tertentu bisa bergantung pada bug atau fitur hardware tertentu yang tidak terdokumentasi
- PICO-8 telah menjadi konsol “fantasy” yang menguntungkan
- Referensi emulator
Proyek Tambahan yang Diusulkan
- Ide proyek tambahan dikumpulkan dari Hacker News, Reddit, Twitter, dan email
- database dari nol
- ray tracer
- klon MS Paint
- editor grafis vektor
- image decoder
- aplikasi web ruang obrolan
- penghitung digit pi
- utilitas terminal umum seperti grep
- klien dan server FTP
1 komentar
Komentar Hacker News
Membuat editor teks, kompiler, sistem operasi, atau ray tracer memang bisa membuat seseorang menjadi programmer yang lebih baik, tetapi tidak berarti menjadi software engineer yang lebih baik.
Justru bisa membuat seseorang menyerap doktrin “Not Invented Here” yang destruktif dan menjadi lebih buruk dalam software engineering.
Para hacker terobsesi pada teori tingkat tinggi seperti Big-O, struktur data, atau HoTT, tetapi hal-hal yang esensial dalam engineering nyata seperti “memutuskan kapan harus membuat sendiri dan kapan memakai library”, “mengidentifikasi library dan framework yang baik”, “menilai titik mana yang layak dioptimalkan”, “menulis kode yang masih bisa dibaca beberapa tahun kemudian”, dan “melihat proyek sebagai sistem kompleks berskala besar yang mencakup dependensi software maupun non-software” hampir tidak pernah dibahas atau dilatih.
Karena itu, sebagai tugas alternatif dia mengusulkan mesin pencari web. Tidak perlu terlalu memikirkan hal seperti algoritma pencocokan string karena itu sudah dikerjakan orang lain; cukup “buat saja” crawler dan mesin pencari yang benar-benar berjalan, meskipun awalnya hanya mendukung sebagian web dan satu pengguna bersamaan.
Editor teks, kompiler, sistem operasi, dan ray tracer juga bisa melatih semua aktivitas yang sama.
Dari sudut pandang seseorang yang pernah mengerjakan ray tracer yang dipakai di beberapa film panjang, semua poin di atas juga berlaku sepenuhnya untuk proyek itu.
Pada akhirnya, ini lebih mendekati perbedaan antara mengerjakan sesuatu yang kecil dan menyenangkan, atau menerapkan semua batasan yang menggerogoti jiwa dari pekerjaan berbayar di perusahaan hingga keseruannya hilang.
Pertama, building block yang tersedia jauh lebih sering buruk daripada bagus, dan akibatnya software yang dibuat juga mencerminkan keburukan itu, sehingga hidup jadi bukan tentang memakai software, melainkan memelihara dan menenangkan komponen-komponen buruk tersebut.
Kedua, sekalipun kualitas building block bagus, itu tetap membatasi jenis software yang bisa dibuat. Idealnya, kita membayangkan perilaku yang diinginkan, lalu menulis software agar melakukan hal itu, dan dalam prosesnya membuat building block yang diperlukan.
Jika hanya memakai building block yang sudah ada, banyak software hebat bahkan tidak akan pernah bisa dibuat, dan menurut saya itulah alasan mengapa di sekitar kita tidak banyak software yang benar-benar hebat.
Jika yang dibuat adalah “software yang hampir sama dengan yang selalu kita lihat”, masalah kedua jadi kurang relevan, dan masalah pertama pun mungkin masih bisa ditanggung karena kebanyakan hanya memakai happy path. Namun software seperti itu sebentar lagi akan ditulis bukan oleh manusia, melainkan oleh AI.
Keterampilan-keterampilan itu memang penting, tetapi pada titik tertentu orang tetap harus membangun dasar kemampuan, dan menjadi programmer yang lebih baik jelas membantu seluruh keterampilan yang disebutkan di atas.
Secara pribadi, software engineering adalah sesuatu yang saya lakukan untuk membayar tagihan, sedangkan programming adalah sesuatu yang awalnya saya lakukan karena menyenangkan.
Proyek-proyek dalam tulisan ini adalah jenis hal yang akan saya coba untuk bersenang-senang jika punya waktu.
Dari sudut pandang UI/Web, selain spreadsheet yang sangat berguna untuk memahami sistem aliran data, saya juga merekomendasikan hal-hal berikut.
Mencoba membuat video game sederhana dengan Unity atau Unreal akan membantu memahami batasan performa pada game yang membutuhkan 30~60fps, dan itu juga membantu membuat antarmuka yang cepat di tempat lain, termasuk web.
Membuat framework JavaScript sederhana yang mirip React akan membantu memahami aliran data dan penanganan event.
Jika membuat sendiri library HTTP yang membungkus XMLHTTPRequest, meskipun sekarang sudah ada fetch, kita jadi memahami dari dasar bagaimana request HTTP dikirim dan dibaca, yang nantinya membantu saat debugging masalah seperti CORS atau request OPTIONS.
Ini juga sudah dibahas saat itu.
Challenging projects every programmer should try - https://news.ycombinator.com/item?id=21790779 - Dec 2019 (297 comments)
Ada juga tulisan terkait.
More challenging projects every programmer should try - https://news.ycombinator.com/item?id=25489879 - Dec 2020 (223 comments)
+1 untuk mini OS.
Developer aplikasi bergantung pada banyak fitur sistem operasi seperti manajemen memori dan file system, dan pada akhirnya akan bertanya, “sebenarnya bagaimana hal-hal ini bekerja di balik layar?”
Karena itu saya mencoba mengutak-atik xv6(https://github.com/mit-pdos/xv6-public) di waktu luang.
Mempelajari berbagai algoritma penjadwalan proses dari buku teks dan benar-benar mengimplementasikannya sendiri adalah dua hal yang sama sekali berbeda, dan saya belajar banyak.
Sebagai developer aplikasi mobile, kemungkinan pengetahuan ini relevan dengan pekerjaan saya nyaris mendekati nol, tetapi jelas sangat menyenangkan.
Mengembangkan game 2D tanpa engine adalah salah satu pengalaman paling merendahkan hati yang membuat saya sadar betapa tidak masuk akalnya cepatnya komputer saat ini
Bahkan jika Anda melakukan sesuatu yang Anda yakini akan terlalu lambat, Game Boy saja bisa melakukan sejuta operasi per detik, jadi tetap saja berjalan. Ternyata angka satu juta itu lebih besar dari yang dibayangkan
“Tunggu, menggambar dengan mencari dan merender semua sprite setiap saat? Tanpa perhitungan diff cerdas yang hanya tahu apa yang perlu diubah, dan tanpa buffer kedua yang merujuk frame sebelumnya untuk mengurangi pekerjaan?” lalu ketika melihat game yang jauh lebih kompleks yang benar-benar mulai memakai teknik seperti itu, rasanya makin mengejutkan
Misalnya, sprite atlas adalah cara yang khas untuk memanfaatkan struktur data semacam ini. Karena biasanya tidak ada alasan untuk mengunggah banyak sprite yang dirender dengan pola yang bisa diprediksi berulang kali, cukup unggah satu gambar besar lalu sampling sebagian darinya
Menurut standar masa kini, itu benar. Hampir semua perangkat keras komersial kelas bawah sekitar 15 tahun lalu, bahkan yang bukan PC gaming, mampu menangani rendering kasar ala gambar-ulang-seluruh-scene
Karena hanya ada perangkat keras murni dan assembly, semua hal seperti grafis, suara, input, dan manajemen memori harus dikerjakan manual
Jika ada lingkungan yang disederhanakan sehingga programmer pemula bisa menangani semua itu untuk membuat game 2D, tetapi tanpa beban berlebihan yang diperlukan agar semuanya berjalan, itu akan jadi pengantar yang ideal
Jika Anda merasa perlu factory pattern untuk membuat Space Invaders, berarti ada yang keliru
Rasanya hampir mustahil konsep desain seperti itu ada di versi aslinya
Begitu otak terinfeksi olehnya, Anda mulai mencari cara untuk menyebarkan infeksinya
Apa kita membaca tulisan yang berbeda?
Saya ingin mencoba sesuatu yang jauh lebih bersifat fisik, seperti simulasi presisi dinamika terbang untuk robot, drone autopilot, atau wahana antariksa dengan parameter GNC yang bisa diprogram
Saya punya “Fundamentals of Astrodynamics” oleh Bate, Mueller, dan lainnya, dan ingin mencoba sesuatu saat liburan kali ini
Sisanya tampaknya akan mahal, jadi maksud saya simulasi. Saya benar-benar tertarik pada sisi GNC pada robot, dan akan senang jika ada rekomendasi materi yang bagus
Maksudnya sesuatu seperti Segway yang bisa berdiri diam di satu tempat tanpa jatuh atau meluncur dari meja
Sepertinya Anda akan butuh mikrokontroler, IMU, pengendali motor stepper, motor, roda LEGO, mungkin juga sepotong kayu
Saya sendiri belum pernah mencobanya, jadi tebakan saya bisa saja jauh meleset
Saya ingin mendengar lebih banyak tentang isi bukunya dan proyek seperti apa yang bisa dicoba
Setelah seharian bergelut dengan perangkat lunak, rasanya sangat menyenangkan bekerja menuju benda fisik
Saya rasa ray tracer kecil-kecilan juga tugas yang sangat bagus untuk dicoba
Cukup dengan bola, beberapa sumber cahaya, menangani refleksi difus dan specular, lalu menghasilkan grafis bitmap
Selama tidak dibesarkan secara berlebihan, ini bisa menjadi proyek dengan cakupan yang cukup terbatasi
Saat mencoba merender grafis, Anda benar-benar belajar seberapa jauh Anda bisa memeras geometri dan struktur data
https://austinhenley.com/blog/morechallengingprojects.html
https://raytracing.github.io/
https://raytracing-iow.shuttleapp.rs
Daftar yang menarik, dan meski tentu tergantung kepribadian serta situasi masing-masing, ini titik awal yang bagus jika mencari ide
Saya tidak akan bilang semua programmer harus mencoba semuanya, jadi saya hanya menuliskan yang pernah saya pilih sendiri
Di Sinclair ZX Spectrum saya pernah membuat editor not balok musik dan tracker yang sangat kasar, lalu untuk game 2D saya membuat Space Invaders dengan hanya satu penyerbu
Komputer itu bahkan bukan milik saya. Di 386, yang merupakan komputer pertama saya, saya membuat kompresor Huffman, indeks B-Tree yang lebih cepat daripada DBase/Clipper, generator form berorientasi objek, dan beberapa program latar DOS, salah satunya kemudian dipakai dalam proses instalasi di sebuah perusahaan besar
Beberapa tahun kemudian saya juga membuat pemeriksa email dial-up, parser manual untuk syntax highlighting, sesuatu yang mirip spreadsheet, dan saya masih melakukan hal semacam itu sampai sekarang. Pasti masih ada yang terlewat
Daftar yang bagus. Akan lebih baik jika ini dipertahankan sebagai daftar yang hidup agar bisa terus berkembang seiring waktu
Saya ingin menambahkan dua hal
Membuat memcached ringan akan menuntut perpaduan antara algoritme dasar dan praktik desain sistem yang baik. Ini masalah yang “sederhana”, tetapi perlu dipikirkan matang-matang dari berbagai sudut seperti invalidasi, konkurensi, dan manajemen memori
Mencoba membuat Docker versi sendiri juga bagus. Ini tidak serumit kedengarannya, dan memberi kesempatan untuk memahami dasar-dasar pemrograman sistem operasi yang belakangan ini tidak terlalu sering digunakan para engineer dalam pekerjaan sehari-hari