5 Aturan Pemrograman dari Rob Pike (1989)
(cs.unc.edu)- Aturan 1: Tidak mungkin memprediksi di mana program akan menghabiskan waktu. Bottleneck muncul di tempat yang tak terduga, jadi jangan mencoba meningkatkan kecepatan sampai benar-benar terbukti itulah bottleneck-nya
- Aturan 2: Pengukuran adalah yang utama. Tuning performa hanya dilakukan setelah pengukuran, dan optimisasi dipertimbangkan hanya ketika satu bagian kode benar-benar mendominasi keseluruhan
- Aturan 3: Algoritme kompleks lambat untuk n kecil. Algoritme kompleks memiliki konstanta besar, jadi gunakan cara yang sederhana kecuali n sering menjadi besar. Bahkan jika n membesar, terapkan dulu Aturan 2
- Aturan 4: Algoritme kompleks lebih banyak bug dan lebih sulit diimplementasikan. Lebih baik menggunakan algoritme sederhana dan struktur data yang sederhana
- Aturan 5: Data adalah inti. Jika memilih struktur data yang tepat dan menatanya dengan baik, algoritme akan hampir tampak dengan sendirinya. Pusat pemrograman bukanlah algoritme, melainkan struktur data
Filosofi dan kutipan terkait
- Aturan 1 dan 2 memiliki makna yang sama dengan pepatah Tony Hoare, “optimisasi dini adalah akar dari segala kejahatan”
- Ken Thompson menafsirkan ulang Aturan 3 dan 4 sebagai “kalau ragu, gunakan cara yang sederhana (Brute Force)”
- Aturan 3 dan 4 adalah contoh filosofi desain KISS(Keep It Simple, Stupid)
- Aturan 5 sudah pernah disebutkan Fred Brooks dalam 『The Mythical Man-Month』,
dan sering diringkas sebagai “menulis kode sederhana dengan menggunakan objek yang cerdas”
1 komentar
Komentar Hacker News
Mengingatkan pada ceramah Jonathan Blow
Ia mendekatinya dari sudut pandang produktivitas. Pada tahap awal pengembangan Braid, hampir semuanya diimplementasikan sebagai array sederhana, lalu hanya diubah saat muncul bottleneck
Ucapan “yang lebih penting daripada kecepatan atau memori adalah waktu hidup manusia yang dibutuhkan untuk mengimplementasikan sebuah program” terasa sangat membekas
Jika Rule 1 diterima dengan sungguh-sungguh, maka Rule 3~5 akan mengikuti secara alami
Jika kita mengakui premis bahwa bottleneck tidak bisa diprediksi, maka menulis kode sederhana dan mengukurnya menjadi satu-satunya strategi yang rasional
Kegagalan yang paling sering sebenarnya bukan optimisasi prematur, melainkan abstraksi prematur. Orang membuat lapisan yang rumit demi fleksibilitas yang belum diperlukan, dan itu justru menaikkan biaya pemeliharaan
Saya pernah harus mengimplementasikan fitur pencarian dataset pada pukul 2 pagi di era 90-an
Karena lelah, saya membuatnya dengan pencarian linear dulu dan berniat memperbaikinya nanti, tetapi dalam praktiknya selisihnya hanya 6 detik dalam pengujian selama 4 jam
Akhirnya memang saya ubah, tetapi tidak ada perbedaan yang berarti
Saya sepenuhnya setuju dengan Rule 5
Semakin sulit masalahnya, semakin sering ia diselesaikan lewat perbaikan iteratif pada struktur data dan API. Jika strukturnya tertata baik, alur kontrol akan mengikuti dengan alami
LLM lemah dalam cara berpikir struktural seperti ini. Mereka pandai mengusulkan alur kontrol yang kompleks, tetapi kurang mampu merancang struktur data yang bisa dikomposisikan
Saya berlatar belakang teknik elektro (E.E.), dan berkat Rule 3 saya tidak mengalami masalah besar di awal karier
Namun, setelah pindah ke sistem berskala besar, n membesar dan kompleksitas benar-benar menjadi penting
‘Big iron’ pada masa yang dibicarakan Rob Pike mirip dengan lingkungan embedded saat ini
Jika dua algoritme punya tingkat kesulitan implementasi yang mirip, saya memilih yang lebih cepat untuk input besar
Tulisan terkait: Less Than Quadratic
Sering kali orang memilih pendekatan O(n²) yang terlalu sederhana lalu mengalami ledakan di production
Saya pikir aturan Pike lebih baik daripada pepatah lama yang sudah ada
Kalimat seperti “optimisasi prematur adalah akar dari segala kejahatan” mudah disalahpahami karena konteksnya hilang
Versi Pike jelas dan sulit disalahgunakan
Dulu ada ungkapan lama bahwa “Rule 5 bisa diringkas menjadi ‘biarkan kode bodoh memakai objek pintar’”,
tetapi di era pemrograman berorientasi objek, itu justru berubah menjadi keyakinan keliru yang menyembunyikan kompleksitas
Setelah mengelola codebase yang sama selama lebih dari 10 tahun, saya benar-benar sudah menginternalisasi aturan Pike
Menjaga prinsip KISS/DRY dan mempertahankan teknologi yang sudah teruji, alih-alih mengejar tren, terbukti lebih stabil dalam jangka panjang
Faktanya, dokumen prinsip pengembangan tim kami hampir sama persis dengan aturan Pike
Pada era awal C++ di tahun 1990-an, saya pernah mengganti doubly linked list dengan realokasi array sederhana,
dan bukan hanya bug-nya hilang, performanya malah lebih cepat.
Saya belajar bahwa melakukan operasi mahal lebih jarang adalah strategi yang baik
Menarik membandingkan aturan “jangan tuning tanpa mengukur” dengan Latency Numbers Every Programmer Should Know dari Jeff Dean
Dean mengatakan bahwa dengan pengetahuan sebelumnya kita bisa memprediksi performa
Pada akhirnya, kedua posisi ini bisa selaras — pada tahap desain kita memilih struktur yang secara intuitif cepat, lalu setelah implementasi kita melakukan penyesuaian halus berbasis pengukuran
Rule 1 dan 2 bersifat mutlak hanya saat menangani masalah baru
Jika kita berulang kali membangun sistem di domain yang sama, kita bisa memprediksi titik bottleneck sebelumnya
Developer berpengalaman bisa punya intuisi kasar soal performa bahkan sebelum desain dimulai