SICP: Satu-satunya buku ilmu komputer yang layak dibaca dua kali? (2010)
(simondobson.org)- Berawal dari meminjamkan sebuah buku kepada seorang mahasiswa sebagai bacaan musim panas, Simon Dobson kembali menegaskan bahwa SICP adalah buku ilmu komputer yang paling besar memengaruhi karier dan minat risetnya
- Berbeda dari pendidikan pengantar yang berpusat pada Pascal, buku ini berangkat dari nilai, nama, binding, dan kontrol untuk menunjukkan apa yang bisa menjadi bentuk pemrograman
- Buku ini menghubungkan lambda abstraction, komputasi orde tinggi, stream, evaluasi malas, interpreter dan compiler, garbage collection, virtual memory, bahasa mesin, hingga bahasa spesifik domain di dalam Scheme
- Pengaruh terbesarnya terletak pada desain berlapis yang menyusun sistem kompleks dengan berbagai lapisan bahasa, dan pada sudut pandang yang melihat ilmu komputer sebagai disiplin tentang “bagaimana melakukannya”, bukan sekadar “apa itu sesuatu”
- Buku yang dibelinya pada 1988 ini masih layak dibaca ulang secara praktis pada 2010, dan SICP tetap menjadi buku dasar yang bertahan lama dalam ilmu komputer
Pertemuan pertama dengan SICP
- Setelah meminjamkan Structure and Interpretation of Computer Programs kepada seorang mahasiswa untuk dibaca selama musim panas, Simon Dobson teringat bahwa buku ini baginya adalah karya yang paling mendasar di seluruh ilmu komputer
- Judul resminya adalah Hal Abelson dan Jerry Sussman, Structure and Interpretation of Computer Programs, diterbitkan oleh MIT Press pada 1984 dan juga dikenal sebagai SICP
- Buku ini masih terus diterbitkan, dan tersedia lengkap secara online
- Dobson pertama kali mengenal buku ini sebagai bacaan yang direkomendasikan setelah menyelesaikan mata kuliah pemrograman pertamanya pada tahun kedua program sarjananya di Newcastle upon Tyne
- Saat ia masih mencari arah dalam ilmu komputer, SICP menunjukkan kepadanya bukan “pemrograman pada masa itu” yang diwakili Pascal, melainkan bentuk-bentuk pemrograman yang mungkin
Konsep-konsep yang dibangun di dalam Scheme
- SICP dimulai dari elemen dasar pemrograman—nilai, nama, binding, dan kontrol—lalu meluas ke topik yang sangat luas
- lambda abstraction dan komputasi orde tinggi
- struktur data kompleks yang memuat isi komputasi
- modularitas, kemampuan untuk diubah
- stream
- evaluasi malas
- konstruksi interpreter dan compiler
- manajemen penyimpanan, garbage collection, virtual memory
- bahasa mesin
- bahasa spesifik domain
- Cakupan yang dibahas begitu luas hingga terasa mengejutkan, tetapi tetap konsisten berkat cara menulis dan penyusunan para penulisnya
- Secara khusus, semua konsep dibahas dalam satu kerangka bahasa, yaitu Scheme, sambil membangun konsep berikutnya di atas hal-hal yang telah dipelajari sebelumnya
Desain program melalui desain bahasa
- Ciri kedua SICP yang sangat berpengaruh adalah bahwa Hal Abelson dan Jerry Sussman memandang segalanya sebagai latihan desain bahasa
- Buku ini menekankan desain berlapis yang menyusun sistem kompleks dari berbagai tingkat bahasa
- Setiap tingkat dibangun dengan menggabungkan komponen yang dianggap primitif pada tingkat tersebut
- Komponen yang dibuat pada satu tingkat digunakan sebagai elemen primitif pada tingkat berikutnya
- Bahasa pada setiap tingkat memiliki elemen primitif, sarana penggabungan, dan sarana abstraksi yang sesuai dengan tingkat detail itu
- Abstraksi hierarkis sendiri sudah akrab bagi ilmuwan komputer, tetapi perbedaan penting di sini adalah pandangan bahwa setiap lapisan harus dapat diprogram
- Dari sudut pandang ini, lapisan bukan sekadar mekanisme untuk menyembunyikan informasi, melainkan sarana untuk menangani komputasi dan transformasi
- Dalam bahasa pemrograman arus utama, pelapisan seperti ini sulit berkembang menjadi perluasan bahasa itu sendiri
- Java tetaplah Java dari atas sampai bawah; ada kelas dan pustaka, tetapi tidak ada struktur kontrol baru
- Walaupun struktur bahasa khusus untuk domain tertentu bisa berguna, menambahkannya di dalam bahasa tidak mudah
- Sebaliknya, meskipun ingin melarang penggunaan struktur tertentu pada sebuah domain, menghapusnya dari dalam bahasa juga tidak bisa dilakukan dengan mudah
- Java-ME memang menghilangkan sebagian fitur agar dapat berjalan pada perangkat kecil, tetapi itu bukan sesuatu yang bisa dilakukan tanpa menulis ulang compilernya
“Bagaimana melakukannya” alih-alih “apa itu sesuatu”
- Pengaruh penting ketiga adalah pandangan SICP tentang apa yang sebenarnya ditangani oleh ilmu komputer
- SICP melihat revolusi komputer sebagai revolusi dalam cara berpikir dan cara mengekspresikan pikiran
- Buku ini menjelaskannya sebagai procedural epistemology
- Jika matematika klasik menyediakan kerangka untuk menangani “apa itu sesuatu” secara presisi
- maka komputasi menyediakan kerangka untuk menangani “bagaimana melakukannya” secara presisi
- Dobson pernah mengambil sudut pandang bahwa komputer itu seperti mikroskop jenis baru, yang membantu pendekatan lama sekaligus membuka ilmu pengetahuan baru
- Sisi “bagaimana melakukannya” dalam ilmu komputer ini muncul kembali di berbagai bidang
- penjelasan perilaku jaringan sensor yang dapat beradaptasi sambil terus mencerminkan fenomena yang terdistribusi
- interpretasi data berskala besar yang ditambang dan digabungkan dari seluruh web
- penangkapan untuk mengotomatisasi metode dan proses ilmiah
- Kekayaan bidang-bidang ini mendorong integrasi melalui bahasa pemrograman alih-alih perangkat lunak paket, serta membuat antarmuka dan struktur tetap fleksibel dan dapat dieksperimenkan lewat bahasa seperti R
Mengapa buku lama ini masih tetap dibaca
- Di bagian dalam buku Dobson tertulis tanggal pembelian September 1988, dan pada 2010 buku yang hampir berusia 22 tahun itu masih tetap relevan
- Ia menilai SICP bukan sekadar menarik secara historis, melainkan hampir satu-satunya buku ilmu komputer seusia itu yang masih berguna untuk dibaca ulang
- Dalam buku matematika, isi yang bertahan lama bukan hal langka, tetapi dalam ilmu komputer—yang idenya bergerak cepat dan dipenuhi topik sementara—hal itu sulit ditemukan
- Fakta bahwa isi SICP hampir tidak terasa usang menunjukkan bahwa buku ini menangkap konsep inti ilmu komputer dengan sangat baik
- Karena alasan inilah SICP menjadi salah satu dari sedikit buku ilmu komputer yang layak dibaca lebih dari sekali, dan dinilai sebagai buku yang, seperti Lectures on Physics karya Feynman dalam fisika, menyuling hakikat bidangnya menjadi sesuatu yang mudah diakses dan mampu bertahan terhadap ujian waktu
- Dalam pembaruan 27 Januari 2024, buku ini juga dimasukkan ke annotated Lisp bibliography melalui entri Structure and interpretation of computer programs
1 komentar
Komentar Hacker News
“Klasik” seperti SICP berbicara tentang desain program, tetapi sekarang desain sistem tampaknya menjadi kemampuan yang jauh lebih penting
Saya tidak tahu apakah sistem terdistribusi termasuk dalam “ilmu komputer”, tetapi dalam praktiknya itu adalah masalah yang jauh lebih sering harus diselesaikan
Saya cenderung membuat sistem sesederhana mungkin, lalu menggunakan alat observabilitas untuk menemukan titik-titik yang desainnya kurang memadai, dan baru mengeluarkan struktur data atau solusi yang “bernuansa ilmu komputer” saat memang diperlukan
Dalam kebanyakan kasus, notasi Big-O dan kompleksitas waktu eksekusi tidak terlalu penting, dan banyak masalah bisa diselesaikan dengan array dan CPU yang cepat
Bahkan jika ada masalah performa, kita tetap harus lebih dulu menemukan bottleneck lewat profiling
Ilmu komputer tidak terlalu mengajarkan bagaimana cache memori CPU bekerja
Algoritme graf yang keren bisa saja punya kompleksitas waktu eksekusi yang baik, tetapi merusak cache CPU sehingga lebih lambat daripada array yang memanfaatkan cache dengan baik
Masalah yang lebih umum di dunia nyata justru berkaitan dengan toleransi kegagalan, ketepatan distributed lock dan queue, serta skalabilitas sistem
Mungkin saya bias karena berlatar belakang computer/electrical engineering
Cache memori CPU saya pelajari 30 tahun lalu pada semester pertama S1 CS lewat buku Hennessy dan Patterson, dan setahu saya itu masih dipakai sampai sekarang
Toleransi kegagalan, distributed lock dan ketepatan queue, serta skalabilitas sistem juga dibahas di S1 CS, dan saya tidak punya latar belakang khusus di computer engineering/electrical engineering
Masih ada pekerjaan membuat framework, engine database, dan alat version control, dan pekerjaan seperti ini menuntut pengetahuan CS yang mendalam seperti algoritme dan struktur data setiap hari
Tetapi pekerjaan seperti itu lebih sedikit dibanding dulu, dan untuk aplikasi orang lebih sering memakai Postgres daripada mengimplementasikan sendiri engine DB
Sebagian besar pekerjaan adalah mengimplementasikan business logic, dan meskipun memahami cara kerja internal database membantu menghasilkan hasil yang lebih baik, Anda tetap bisa membuat banyak software yang berfungsi tanpa tahu bagaimana indeks disimpan di disk
Banyak lulusan CS keliru mengira pekerjaan mereka adalah menulis framework, padahal kenyataannya mereka memakai framework yang sudah ada dan mengimplementasikan business logic, sambil memakai latar belakang CS mereka untuk memahami framework tersebut secara mendalam
Data ada sebagai “page” di disk, dan RAM memiliki sejumlah tetap “slot page”
Memindahkan page antara disk dan RAM itu lambat, jadi harus diminimalkan sebanyak mungkin
Karena itu, masalah yang tampak sepele pun menjadi menarik. Dalam ilmu komputer klasik bahkan tidak ada konsep terpisah bernama “join”, karena itu dianggap tidak cukup rumit untuk diberi nama
Mudah untuk menganggap riset algoritme sebagai esensi yang murni, tetapi efisiensi algoritme juga bisa dipandang hanya bermakna dalam konteks data dan hardware tertentu
Itulah yang membuat pekerjaan ini menarik, dan karena Anda tidak bisa sekadar menerapkan library atau solusi ala buku resep di mana-mana, keahlian algoritme tetap berguna
Saat ini saya sedang pusing dengan sebuah komponen yang mendapat perubahan kecil, karena state-nya terlalu banyak tanpa perlu dan ia menangani dua abstraksi sekaligus
Ia memproses file sambil memakai file system dan database untuk penyimpanan state, dan saya benar-benar terkejut melihat betapa buruk desainnya
Saya menghabiskan beberapa hari untuk menghindari sekadar menambal seperti sebelumnya dan membuatnya makin sulit dipahami
Budaya pull request tampaknya membuat orang menyetujui sembarang kode tanpa ruang untuk benar-benar memikirkan kode secara mendalam
Saya berharap code review tatap muka kembali
Tanggung jawab yang terbit pada 2021
Tautan ke salinan gratis artikelnya rusak
https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
https://web.mit.edu/6.001/6.037/sicp.pdf
Sampai hari ini saya belum pernah melihat versi PDF resminya
Sekitar tahun 2001, yang tersedia gratis hanya versi HTML, dan seseorang mengonversinya ke TeXinfo: https://www.neilvandyke.org/sicp-texi/
Jika ingin mengikuti SICP sekarang, Anda bisa menjalankan kodenya di MIT Scheme atau DrRacket: https://www.neilvandyke.org/racket/sicp/
.dmg, tetapi MIT Scheme versi x86_64 bisa diunduh lalu dibangunRilis saat ini (v12.1) berjalan di Mac Intel dengan Sequoia atau di Apple silicon melalui Rosetta
Namun kompiler kode native-nya agak rusak, dan mungkin tidak diperlukan untuk SICP
Sepertinya dulu masih berfungsi di macOS sebelum Monterey, jadi bisa jadi dependensi dari Apple berubah, tetapi saya belum menelusurinya
Jika MIT Scheme tidak wajib dan Anda tidak ingin repot dengan proses kompilasi, Racket mungkin pilihan yang lebih baik
Setahu saya ada mode SICP yang eksplisit
Saya pernah mencobanya dengan GNU Guile, tetapi ada perbedaan sintaks kecil antara Guile dan MIT Scheme sehingga cukup merepotkan
Formatnya lebih baik daripada versi asli MIT: https://sarabander.github.io/sicp/
Dulu ada paketnya, tetapi sudah hampir 20 tahun tidak dipelihara
Sebaliknya, DrRacket memiliki paket khusus untuk menyelesaikan soal-soal tersebut
Anda bisa menonton rekaman kuliah tahun 1986 ketika Abelson dan Sussman mengajarkan isi buku ini
Penjelasan tentang cara membangun dan mengikat abstraksi di beberapa lapisan masih berguna bagi saya secara pribadi maupun saat membimbing orang lain
Di videonya, itu ada di lesson 3A, menit 1:07:55
https://m.youtube.com/playlist?list=PLE18841CABEA24090
The Elements of Programming Style layak dibaca tiga kali, dan saya sudah membacanya jauh lebih sering serta sangat terbantu olehnya
Jika tertarik, ada ulasan yang saya tulis pada 2010: https://reprog.wordpress.com/2010/03/06/programming-books-pa...
https://elementsofprogramming.com/
Bagian dari SICP yang paling saya sukai dan masih saya ingat selama bertahun-tahun adalah gagasan wishful programming
Ini adalah cara membangun sesuatu dari atas ke bawah seolah-olah rutinitas tingkat rendahnya sudah ada
Lalu Anda benar-benar membuat rutinitas tingkat rendah itu dan turun sampai ke dasar
Menurut saya cara berpikir ini sangat cocok dengan pengembangan berbasis pengujian
Anda menulis pengujian terlebih dahulu untuk kemampuan yang Anda harap ada, lalu pergi memenuhi harapan itu
Kebanyakan pengembang tampaknya membangun dari bawah ke atas, dan akhirnya mendapatkan sesuatu yang tidak pernah diinginkan siapa pun
Anda bisa tanpa sengaja menginginkan sesuatu yang sifat aslinya belum benar-benar Anda pahami, lalu berakhir dengan kekacauan rapuh di lapisan dasar
Itu biasanya terjadi, karena sifat algoritmik dari banyak hal jarang terasa intuitif
Memulai dari bawah seperti memulai dari quark yang benar-benar Anda miliki, bukan dari “andaikan sihir itu ada”
Sihir itu tidak ada, dan ketika Anda mencapai dasar, yang ada bukan partikel sihir melainkan quark, dan dalam prosesnya Anda juga kehilangan petunjuk konteks yang membantu menerjemahkan antara dua fisika itu
Kedua pendekatan sama-sama berguna. Untuk memecahkan masalah yang dalam, kadang kita memang perlu berani berharap
Hanya saja secara pribadi saya lebih suka menempatkan sihir itu tepat satu lapisan di bawah puncak
Caranya, bangun dulu dari bawah ke atas, lalu buat lapisan sihir kenyamanan yang saling menerjemahkan dengan bahasa bisnis tepat sebelum logika bisnis
Dengan begitu, sistemnya bisa disetel dan tidak menjadi kekacauan yang kusut sampai ke bawah
Ia mula-mula menuliskan cara pemformatan/penandaan yang terasa tepat, lalu memikirkan cara pemrograman yang cocok untuk markup itu—yakni makro—dan setelah itu baru masuk ke implementasi
Saya juga sedang mencoba pendekatan serupa untuk pekerjaan membuat pustaka yang memodelkan G-code di OpenSCAD
Baru-baru ini saya menulis ulangnya lagi dalam OpenPythonSCAD yang “murni”, jadi semoga sekarang menjadi cukup layak pakai
Sebaiknya coba Pharo
SICP adalah buku terbaik untuk dibaca sebagai buku pertama saat mempelajari ilmu komputer
Setelah bertahun-tahun memrogram sebagai hobi, membaca buku tentang pemrograman terstruktur, dan mengenal berbagai bahasa dari Pascal hingga Common LISP, saya menggunakan Abelson & Sussman di program sarjana ilmu komputer, dan itu benar-benar membuka wawasan saya
Buku ini menunjukkan kesederhanaan, keindahan, dan interaktivitas Scheme, sekaligus mengajarkan bahwa ilmu komputer adalah pekerjaan menyusun berbagai jenis abstraksi secara berlapis-lapis
Dimulai dari abstraksi prosedural dan abstraksi data, lalu berlanjut hingga mendefinisikan bahasa spesifik domain sendiri, mengimplementasikan kompiler-nya, dan bahkan mendefinisikan perangkat keras baru di dalam perangkat lunak
Semuanya terlihat begitu alami, dan hanya seorang maestro sejati yang bisa membuatnya tampak seperti itu
Tetapi, Anda harus membeli edisi ke-2, bukan edisi pertama atau edisi yang lebih baru
Edisi terbaru menggunakan Python alih-alih Scheme, dan itu kurang bagus
Saya benar-benar ingin menyukai SICP, tetapi Lisp justru menjadi penghalangnya
Saya menyukai Haskell dan Standard ML
Saya penasaran apakah ada orang lain yang punya pengalaman serupa
Akan menarik jika ada buku yang semangatnya mirip dengan SICP, tetapi menggunakan bahasa lain sebagai mediumnya
Saya tidak ingin mempelajari SICP dalam JavaScript
Penulisnya mengusulkan penggunaan KRC atau Miranda sebagai alternatif Scheme
Saya tidak terlalu tahu soal KRC, tetapi Miranda adalah bahasa pemrograman fungsional bertipe statis yang memengaruhi Haskell
Jika ada buku mirip SICP yang tidak menggunakan Scheme atau Lisp, maka buku itu akan sangat berbeda dari SICP, atau setidaknya tidak akan bisa mengajarkan hal yang sama
Dari pengalaman saya, Haskell dan ML jauh lebih sulit dipahami daripada Scheme, jadi saya penasaran bagian mana yang terasa sulit bagi Anda
Saya mulai membacanya bulan lalu, tetapi terasa membahas terlalu banyak hal secara luas
Terlalu banyak prinsip matematika menarik yang hanya disapu sekilas, lalu saat mulai terasa seru, buku itu sudah berpindah ke topik berikutnya
Dengan kata lain, terlalu dangkal
Kalau dipikir-pikir lagi, tidak membantu juga bahwa saya sudah melihat banyak kuliah atau dokumen turunan dari SICP, jadi setiap kali suatu topik diperkenalkan, saya merasa, “oh, ini lagi”
Meski begitu, saya tetap memaksakan diri menyelesaikannya, dan justru karena saya tidak cukup pintar untuk menangani Lisp, saya belajar luar biasa banyak
Karena saya menghabiskan begitu banyak waktu hanya untuk membaca kodenya, rasanya saya malah belajar lebih banyak dibandingkan jika saya memakai bahasa yang sudah familier
Ada juga versi Python dari SICP
Saya sendiri belum benar-benar menyelesaikannya dan hanya melihat-lihat sekilas, jadi ini bukan rekomendasi, tetapi saya tinggalkan tautannya sebagai bukti bahwa itu memang ada
https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
Di rak buku saya, kedua buku itu juga berdiri berdampingan, dan jelas layak dibaca
Saat membaca untuk kedua kalinya, saya menggali catatan kaki dan daftar pustakanya, dan di sana pun ada dunia besar yang indah
Kalau saya ingat dengan benar, ada makalah tentang Sussman dan timnya yang merancang prosesor terprogram khusus untuk menghitung sifat benda langit, yaitu lintasannya
Seperti biasa, isinya benar-benar membuat kepala berputar
SICP membantu saya memahami sejak awal bahwa ada banyak model pemrograman, ketika di jenjang sarjana saya baru mempelajari sejumlah model yang terbatas
Ini adalah salah satu buku yang memberi saya rasa percaya diri bahwa saya bisa menemukan arah saat membaca dokumentasi bahasa, pustaka, atau framework apa pun
Di samping SICP, saya juga menaruh seluruh seri The Little * sebagai bacaan yang layak dibaca dua kali atau lebih
Types and Programming Languages juga bagus
Untuk pekerjaan yang saya lakukan, itu adalah ilmu komputer yang dapat diterapkan, tetapi tidak cukup hanya dibaca, harus juga diimplementasikan
Jika tidak diulang, sebagian akan terlupakan
Secara pribadi, mungkin juga karena saya mengenal dan menghormatinya, saya cukup sering membaca ulang buku dan makalah Dijkstra
Sekarang memang sulit diterapkan secara langsung, tetapi baik untuk melatih otak, dan menurut saya pribadi dia adalah penulis yang hebat