7 poin oleh GN⁺ 2023-12-27 | 1 komentar | Bagikan ke WhatsApp
  • 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
    • Undo/redo mendorong kita membandingkan desain seperti array status sebelumnya, pola memento, dan pola command
    • Line wrapping memaksa kita memisahkan representasi visual baris teks dari representasi di memori
  • 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

Mini Operating System

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

 
GN⁺ 2023-12-27
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.

    • Tidak jelas mengapa mesin pencari dianggap secara khusus menuntut “keterampilan engineering nyata” seperti pemilihan library atau menilai peluang optimasi.
      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.
    • Nasihat itu terdengar masuk akal, tetapi ada masalah saat membuat software hanya dari building block yang sudah tersedia.
      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.
    • Ini mirip seperti mengatakan kepada murid yang belajar alat musik agar tidak berlatih tangga nada atau etude karena ada keterampilan lain yang dibutuhkan dalam orkestra.
      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.
    • Tulisannya menyebut programmer, bukan software engineer.
      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.

    • Untuk tujuan ini, Godot mungkin merupakan alternatif yang lebih baik daripada Unity atau Unreal. Selain tidak perlu terjebak pada lisensi proprietari, kita juga bisa melihat apa yang terjadi di dalamnya.
  • 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)

    • Tautan eksternal pada tulisan kedua menghasilkan 404.
  • +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

    • Dulu juga ada trik-trik menarik yang membantu menangani masalah seperti ini, baik di sisi aplikasi maupun perangkat keras
      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
    • Saya mulai dengan membuat game 2D di TRS-80 Color Computer, dan itu memberi saya pemahaman dasar yang bagus tentang komputer
      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

    • Itu hasil dari 30 tahun pemrograman berorientasi objek dan design pattern
      Begitu otak terinfeksi olehnya, Anda mulai mencari cara untuk menyebarkan infeksinya
    • Di mana pun dalam tulisan itu tidak ada yang mengatakan atau menyiratkan bahwa implementasi Space Invaders membutuhkan factory pattern
      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

    • https://ksp-kos.github.io/KOS/ Kerbal Space Program mungkin tidak mensimulasikan aerodinamika se-realistis yang Anda inginkan, tetapi banyak orang tampaknya senang menulis perangkat lunak GNC di sana
    • Robot roda dua penyeimbang diri sepertinya proyek yang menyenangkan dan relatif aman
      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 penasaran apa yang ingin Anda lakukan dengan “Fundamentals of Astrodynamics”
      Saya ingin mendengar lebih banyak tentang isi bukunya dan proyek seperti apa yang bisa dicoba
    • Saya juga merasa begitu. Hampir semua proyek pribadi saya punya elemen perangkat keras
      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

  • 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