Desain Berpusat pada Data (2018)
(dataorienteddesign.com)- Edisi online Data-Oriented Design adalah materi yang dibuka agar pembaca yang ingin mempelajari desain berpusat pada data dapat melihat inti isinya secara gratis
- Beberapa bab non-inti dari keseluruhan buku dihilangkan, tetapi materi ini disusun dengan fokus pada isi esensial yang diperlukan untuk belajar
- Karena dokumen ini dikonversi otomatis dari LaTeX ke HTML, mungkin masih ada kesalahan format, gambar rusak, dan daftar kode sumber yang rusak
- Untuk daftar kode sumber yang rusak, kode referensi dapat dilihat di repositori GitHub terpisah
- Membeli buku cetak adalah cara membaca dengan format yang lebih baik, sekaligus membantu mempertahankan edisi online bagi pembaca yang kesulitan membeli
Karakter edisi online
- Data-Oriented Design disediakan sebagai edisi ringkas online gratis yang membahas desain berpusat pada data
- Beberapa bab non-inti dikecualikan, tetapi alur inti yang diperlukan sebagai materi pembelajaran tetap disertakan
- Materi ini ditujukan bagi pembaca yang ingin mempelajari pendekatan melihat desain dengan menempatkan data itu sendiri sebagai pusatnya
Kualitas konversi dokumen dan referensi kode
- Dokumen online dibuat secara otomatis sehingga beberapa formatnya mungkin terasa janggal
- Alat untuk mengonversi dari LaTeX ke HTML belum sempurna, sehingga gambar atau daftar kode sumber bisa rusak
- Jika daftar kode sumber rusak, kode yang dirujuk dapat ditemukan di GitHub
Buku cetak dan masukan
- Buku cetak dapat dibaca dengan format yang lebih baik dibanding edisi online
- Membeli buku cetak membantu menjaga versi online tetap tersedia bagi pembaca yang tidak memiliki kemampuan untuk membeli
- Masukan dapat dikirim ke support@dataorienteddesign.com
1 komentar
Komentar Hacker News
Salah satu nasihat terbaik yang pernah saya terima untuk menulis kode yang berkinerja tinggi dan mudah dikomposisikan adalah “structure of arrays, bukan array of structures”, dan tulisan ini sangat terasa sejalan dengan itu
Ternyata arsitektur entity-component cocok bukan hanya untuk game, tetapi juga untuk aplikasi bisnis
Hanya saja banyak pengembang perusahaan sudah terlalu terbiasa dengan model CRUD bergaya penyimpanan record, sehingga sulit berpikir dalam kolom, bukan baris, dan sering kali terasa tidak alami membayangkan memasukkan ID entitas ke tabel
publishedalih-alih mengubah field booleanpublishedmenjaditrueMeski begitu, begitu menyadari betapa mudahnya pendekatan ini diperluas secara polimorfik, kita jadi ingin memakai pendekatan ini untuk semua data. Lalu muncul peluang baru untuk memanfaatkan data komponen secara silang, dan kita mulai bertanya-tanya kenapa antarmuka jaringan boleh punya tanggal lahir, atau kenapa invoice bisa punya alamat IPv6, kenapa kucing bisa masuk ke pool DHCP, dan kenapa limegreen dihapus serta pada hari Selasa nilainya 5 dolar — dan itu adalah separuh dari keseruannya
Saya tidak setuju dengan klaim bahwa pendekatan ini sepenuhnya tidak cocok dengan pemrograman berorientasi objek. Saya pernah memakai pendekatan seperti ini juga dengan Active Record di Ruby, dan itu tetap berjalan baik bahkan di ranah yang biasanya tidak dilekati istilah “berkinerja tinggi”. Ini sangat cocok terutama karena sistem objek Ruby lebih dekat ke Smalltalk daripada C++/Java, sehingga jauh lebih menyukai komposisi daripada pewarisan
Dalam bahasa berorientasi objek, biasanya kita fokus pada satu “objek yang ingin kita pikirkan” seperti pengguna, posting blog, atau transaksi uang, lalu mengimplementasikannya secara terpisah dari yang lain, menyembunyikan data, dan memikirkan metode apa yang akan diekspos ke bagian lain dari sistem. Konsep enkapsulasi sangat kuat
Dalam desain berorientasi data, lebih umum jika data dari domain yang berbeda tetap dapat diakses, dan subsistem memilih apa yang dibutuhkannya untuk menyelesaikan pekerjaannya. Java atau Ruby tidak melarang ini, tetapi jelas ada hambatan psikologis bagi programmer
Itu juga membahas dukungan perangkat lunak yang memungkinkan SoA diakses seolah-olah AoS, seperti data frame di R, Pandas di Python, dan DataFrames.jl di Julia
Saya sangat menyukai Snowflake dan merasa itu akan merebut pasar para pesaingnya. Menarik juga bahwa Snowflake “mendukung” foreign key tetapi tidak menegakkannya. Dengan kata lain, Snowflake adalah “NoSQL” sebanyak yang masih bisa saya toleransi
Yang kedua adalah menyerah pada enkapsulasi, memisahkan data dari metode yang menanganinya, dan memodelkan seluruh aplikasi berdasarkan bagaimana data mengalir agar lebih mudah dipahami dan diubah. Untuk ketepatan yang lebih tinggi, kita juga bisa memakai struktur data immutable dan fungsi murni
Bagi yang penasaran, ini pengantar ECS yang sangat singkat: https://dev.to/ovid/the-unknown-design-pattern-1l64
“Apakah tata letak data didefinisikan oleh satu interpretasi tunggal yang berasal dari satu sudut pandang?” mungkin merupakan pertanyaan terpenting saat memilih teknologi dan meninjau arsitektur. Biasanya, untuk menjawab pertanyaan ini, kita perlu berbicara dengan bisnis dan pelanggan
Jika yakin bahwa benar-benar hanya ada satu “view” valid atas data yang akan dipakai di seluruh sistem, masuk akal untuk menanamkannya ke dalam kode. Jika ada sedikit saja keraguan, model bergaya relasional kemungkinan lebih cocok. Banyak perusahaan pada akhirnya bermuara ke SQL setelah menyadari teori permainan dari masalah ini
Banyak orang bertanya-tanya mengapa semua orang tampak menjauh dari satu basis data SQL besar. Memang ada kasus tepi “web scale” yang mengancam skalabilitas vertikal untuk operasi tulis, tetapi saya rasa sebagian besar perusahaan, termasuk perusahaan F100, bahkan tidak akan mencapainya
Itu tidak ada hubungannya dengan cara terbaik memodelkan dataset tertentu atau performa terbaik, melainkan sepenuhnya karena riwayat gangguan akibat fleksibilitas skema yang rendah dan kegagalan migrasi skema. Dalam desain NoSQL, masalah seperti itu tidak muncul, dan keunggulan yang diberikan basis data SQL tidak cukup untuk mengimbangi manfaat besar NoSQL yang tidak memiliki skema kaku
Tentu saja, jika key-value store dipakai dengan buruk, performa dan biaya bisa rusak parah. Di platform cloud seperti DynamoDB, saya sering melihat kasus data tidak distrukturkan dengan benar sehingga terjadi banyak scan dan biayanya meledak
Karena ini perusahaan besar yang sudah lama berdiri, sering kali solusi teknis yang dibuat orang nonteknis di masa lalu mengeras dan harus terus dipertahankan. Ada 5 tahap transformasi data SQL yang dimulai dari basis data operasional lalu berlanjut ke model data dari generasi berbeda setiap kali jenis bisnis berubah
Semakin banyak layer yang menumpuk, semakin banyak pula kami terus menambah di atas layer sebelumnya. Jika aplikasi yang dibuat 10 tahun lalu di atas layer abstraksi 2 kini membutuhkan data dari layer 4, kami membuat skrip untuk mengembalikan data itu ke layer sebelumnya lalu terus lanjut. Pada akhirnya, ini menjadi gumpalan besar tabel dan view yang saling bergantung dan membaca data dengan cara yang aneh serta tidak intuitif, dan proyek untuk merapikannya dinilai terlalu mahal sehingga ditunda sampai tahun 2030-an
Saya paham orang melihat masalah seperti ini dan bertanya-tanya bagaimana itu bisa dihindari. Namun entah kenapa, tampaknya mustahil menerapkan cara yang membutuhkan disiplin pada software engineer, jadi Anda harus membuat mereka tidak bisa membuat spaghetti bagaimanapun caranya. Di sinilah pemisahan muncul. Jika Anda tidak bisa membaca data milik layanan lain, Anda tidak bisa membuat spaghetti yang memperlambat kedua sisi
Pemisahan vertikal aplikasi menjadi solusi perangkat lunak untuk masalah manusia berupa disiplin engineering yang buruk di perusahaan
Baru-baru ini saya merilis framework open source yang sepenuhnya berbasis desain berorientasi data, dan saya banyak mendapat tanggapan bahwa desain ini sangat pas. Ada sangat banyak hal yang menjadi lebih mudah jika semua data berada di satu tempat
https://sql.ophir.dev
Di DB raksasa ada banyak sisa-sisa yang tidak dipakai siapa pun dan tidak jelas kenapa masih ada, tetapi belum ada yang yakin apakah itu masih diperlukan, dan strategi optimasi untuk baca dan tulis juga harus berbeda
Selain itu, agar tim bisa bergerak cepat, mereka perlu memiliki ownership atas basis data dan penyimpanan data tanpa harus menunggu DBA menjawab tiket
Saat saya bekerja di perusahaan besar yang tua, sebagian besar masalahnya bersifat politis dan administratif. Satu basis data SQL besar memang efisien, tetapi masalah muncul saat organisasi yang memilikinya tidak sejalan dengan strategi CTO baru atau unit bisnis inti lain
Jika kemudian terjadi gangguan yang menunjukkan rendahnya ketahanan model ini, itu cepat menjadi masalah politik, dan meski solusi teknisnya masih terlihat jelas bagi semua orang, tetap sulit untuk mendorongnya
Seluruh saran ini bergantung pada konteks
Dalam game memang ada banyak operasi yang membutuhkan pendekatan berbasis kolom, tetapi tidak semua domain seperti itu. Jika praktik terbaik dari dunia game dipaksakan secara buta ke domain lain, itu hanya akan mempersulit hidup semua orang dan memperburuk sebagian besar sistem
Field boolean pada struct bisa menjadi bitset, field yang nullable bisa menjadi sparse atau dense map, dan field pointer atau reference bisa menjadi array integer dengan lebar lebih kecil yang mengindeks pool
Dalam lingkungan di mana CPU sering berhenti karena akses memori, dampak perubahan seperti ini tidak bisa diremehkan. Perbedaan latensi antara cache L3 dan RAM bisa berada di kisaran 10 kali lipat
Jika sebuah program punya masalah performa sekecil apa pun, kemungkinan besar ini adalah salah satu cara untuk menjamin performa yang baik
Satu-satunya hal yang tampaknya akan terus berkembang pada perangkat keras modern adalah kepadatan logika. SRAM dan ukuran cache tidak lagi skala dengan baik pada litografi modern, dan bandwidth RAM juga sudah lama tidak meningkat banyak. Bandwidth per core bahkan mungkin menurun. Akses memori sudah menjadi bottleneck cukup lama
Desain berorientasi data sangat masuk akal di dalam subsistem tertentu, tetapi pada kode gameplay tingkat tinggi, kecuali untuk genre tertentu, itu belum tentu demikian
Presentasi Mike Acton di CppCon 2014, Data-Oriented Design and C++, menurut saya adalah presentasi pemrograman terbaik yang pernah ada. Wajib ditonton: https://youtu.be/rX0ItVEVjHc
Sebelumnya ia juga memimpin Unity DOTS, tetapi sayangnya sekarang Unity tampak sedang goyah. Pekerjaan DOTS sendiri meski belum selesai tetap solid
Saya menghabiskan sebagian besar karier dengan menulis web app, tetapi setelah melihat presentasi ini saya jadi paham “mengapa seseorang memakai C?”
Andrew Kelley juga pernah memberikan presentasi yang informatif dan menarik tentang bagaimana desain berorientasi data memengaruhi pekerjaannya pada kompiler Zig: https://vimeo.com/649009599
Pemula pun bisa belajar pemrograman dengan pendekatan berorientasi data sejak awal
Buku untuk mengajarkan gaya ini kepada pemula antara lain How to Design Programs dan A Data-Centric Introduction to Computing
https://htdp.org/
https://dcic-world.org/
Saya menemukan ulasan online tentang buku ini: https://gist.github.com/seece/25ed1b2108cf5782718b026382f2c5...
“Penyebab utama yang menyiksa dan menunda banyak proyek adalah keras kepala untuk tidak melakukan optimisasi terlalu dini. Alasan optimisasi tahap akhir begitu sulit adalah karena banyak perangkat lunak dibangun dengan menaruh instance objek di mana-mana, bahkan saat itu tidak diperlukan.”
Jelas ada aplikasi yang menempatkan performa sebagai prioritas utama, dan ada juga yang tidak. Ini membuat saya bertanya-tanya apakah dalam aplikasi yang sensitif terhadap performa, optimisasi dini memang bisa masuk akal. Saya penasaran apakah pembacaan seperti ini tepat
Ada juga yang disebut Data-Oriented Programming: https://www.manning.com/books/data-oriented-programming
Saya penasaran apakah kedua konsep ini sama
Desain berorientasi data ramah bagi pemula. Karena ia berurusan dengan kemurnian pemodelan data, bukan dengan manusia dan bisnis
Dulu, langkah pertama proyek baru adalah menggambar model relasi entitas, dan itu menjadi dasar bagi semuanya
Sekarang, sebelum memulai model data, kita cenderung memahami masalah dan domainnya dulu, lalu memikirkan kapabilitas serta bagaimana mengelompokkan dan memberi batas padanya
Meski begitu, tulisan ini tampaknya ingin mengatakan bahwa jika sejak awal fokus pada pengumpulan kebutuhan data, diskusi tentang kebutuhan bisnis itu sendiri bisa jadi berkurang
Saat memakai DoD, salah satu konsep intinya adalah tidak menyembunyikan data di balik abstraksi. Arah pikirnya adalah semakin sedikit semakin baik
Namun ketika saya membaca cepat tulisan pengantarnya, kesannya justru kebalikan. Terlalu banyak kata dan konsep intinya malah diabstraksikan. Saya merasa ironis, seperti tidak meminum anggurnya sendiri; saya penasaran apakah hanya saya yang merasa begitu
Paragraf pembukanya cukup hebat. Tulisan yang mengalir dan ide-ide yang menarik membuat saya ingin terus membaca
“Data adalah satu-satunya yang kita miliki. Data adalah sesuatu yang harus kita transformasikan untuk menciptakan pengalaman pengguna. Data adalah apa yang kita baca saat membuka dokumen. Grafik di layar, denyut tombol gamepad, penyebab speaker menciptakan gelombang di udara, cara naik level, dan cara musuh mengetahui posisi Anda lalu menembak juga merupakan data. Waktu yang dibutuhkan dinamit untuk meledak dan jumlah cincin yang hilang saat jatuh ke duri juga adalah data. Semua posisi dan kecepatan partikel saat ini dalam adegan indah setelah Anda menamatkan permainan, dan hal yang dibaca dari disk lalu masuk ke hidup Anda, adalah hasil transformasi pada mesin yang dijalankan oleh instruksi yang didekode, yang berasal dari instruksi yang diarahkan assembler, yang berasal dari source code yang Anda berikan ke kompiler.”
Mungkin ini berguna sebagai “siraman air dingin” untuk menyiapkan suasana dan membantu orang keluar dari pola pikir abstraksi berorientasi objek. Tetapi selain itu, manfaatnya terasa seperti seorang insinyur berkata, “Lihat sekeliling! Semua terbuat dari atom! Rekayasa pada dasarnya adalah pekerjaan memindahkan atom!”
Itu tidak salah, tetapi tidak terlalu membantu untuk benar-benar melakukan rekayasa