SICP: İki Kez Okunmaya Değer Tek Bilgisayar Bilimi Kitabı mı? (2010)
(simondobson.org)- Simon Dobson, bir öğrenciye yazın okuması için ödünç verdiği kitap vesilesiyle SICP’nin kariyerini ve araştırma ilgi alanlarını en çok etkileyen bilgisayar bilimi kitabı olduğunu yeniden fark ediyor
- Pascal merkezli giriş eğitiminden farklı olarak bu kitap, değerler, adlar, bağlama ve kontrolden başlayıp programlamanın ne olabileceğini gösteriyor
- lambda soyutlaması, üst düzey hesaplama, akışlar, tembel değerlendirme, yorumlayıcılar ve derleyiciler, çöp toplama, sanal bellek, makine dili ve alana özgü dillere kadar her şeyi Scheme içinde birbirine bağlıyor
- En büyük etkisi, karmaşık sistemleri birden fazla dil katmanı olarak kuran katmanlı tasarım yaklaşımında ve bilgisayar bilimini “ne olduğu”ndan çok “nasıl yapıldığı”nı inceleyen bir alan olarak gören bakışta yatıyor
- 1988’de satın aldığı kitap 2010’da da pratik olarak yeniden okunmaya değerdi; SICP, bilgisayar biliminde kalıcı bir temel eser olmaya devam ediyor
SICP ile İlk Karşılaşma
- Simon Dobson, bir öğrenciye yaz boyunca okuması için Structure and Interpretation of Computer Programs kitabını ödünç verdikten sonra, bu kitabın kendisi için tüm bilgisayar bilimindeki en temel eser olmaya en yakın kitap olduğunu hatırlıyor
- Kitabın tam adı Hal Abelson ve Jerry Sussman’ın Structure and Interpretation of Computer Programs adlı eseri; MIT Press tarafından 1984’te yayımlandı ve SICP olarak da biliniyor
- Kitap hâlâ basılıyor ve tamamı çevrimiçi olarak sunuluyor
- Dobson, Newcastle upon Tyne’da ilk lisans derecesinin ikinci yılında ilk programlama dersini tamamladıktan sonra bu kitapla önerilen ders kitabı olarak tanıştı
- O dönemde bilgisayar biliminde yolunu bulmaya çalışan Dobson için SICP, Pascal ile temsil edilen “o dönemin programlamasını” değil, programlamanın alabileceği olası biçimleri gösteren kitaptı
Scheme İçinde İnşa Edilen Kavramlar
- SICP, programlamanın temel öğeleri olan değerler, adlar, bağlama ve kontrolden başlayarak geniş bir konu yelpazesine uzanır
- lambda soyutlaması ve üst düzey hesaplama
- hesaplama içeriği barındıran karmaşık veri yapıları
- modülerlik, değiştirilebilirlik
- akışlar
- tembel değerlendirme
- yorumlayıcı ve derleyici yapımı
- depolama yönetimi, çöp toplama, sanal bellek
- makine dili
- alana özgü diller
- Ele aldığı kapsam şaşırtıcı derecede geniştir, ancak yazarların anlatımı ve kurgusu sayesinde tutarlılığını korur
- Özellikle tüm kavramları Scheme adlı tek bir dil çerçevesi içinde ele alır ve önce öğrenilenlerin üzerine sonraki kavramları inşa eder
Dil Tasarımı Olarak Program Tasarımı
- SICP’nin büyük etki yaratan ikinci özelliği, Hal Abelson ve Jerry Sussman’ın her şeyi dil tasarımı alıştırması olarak görmesidir
- Kitap, karmaşık sistemleri birden fazla dil düzeyi olarak kuran katmanlı tasarımı vurgular
- Her düzey, o düzeyde ilkel kabul edilen parçaların birleştirilmesiyle kurulur
- Bir düzeyde oluşturulan parçalar, bir sonraki düzeyin ilkel öğeleri olarak kullanılır
- Her düzeyin dili, ilgili ayrıntı düzeyine uygun ilkel öğelere, birleştirme araçlarına ve soyutlama araçlarına sahiptir
- Hiyerarşik soyutlama bilgisayar bilimciler için tanıdıktır; ancak buradaki kritik fark, her katmanın programlanabilir olması gerektiği bakışıdır
- Bu açıdan katmanlar yalnızca bilgiyi gizleyen araçlar değil, hesaplama ve dönüşümü ele alan araçlardır
- Ana akım programlama dillerinde bu tür katmanlaşmanın dilin kendisinin genişletilmesine dönüşmesi zordur
- Java yukarıdan aşağıya Java’dır; sınıflar ve kütüphaneler vardır ama yeni kontrol yapıları yoktur
- Belirli bir alana özgü dil yapıları yararlı olsa bile bunları dilin içinde kolayca eklemek zordur
- Tersine, bir alanda belirli yapıları kullandırmamak isteseniz bile bunları dilin içinden kaldıramazsınız
- Java-ME, küçük cihazlarda çalışmak için bazı özellikleri çıkarmıştı; ancak bu, derleyiciyi yeniden yazmadan yapılabilecek bir yöntem değildir
“Ne Olduğu”ndan Çok “Nasıl Yapıldığı”
- Üçüncü önemli etki, SICP’nin bilgisayar biliminin gerçekte neyle ilgilendiğine dair bakışıdır
- SICP, bilgisayar devrimini düşünme biçiminde ve düşünceleri ifade etme biçiminde bir devrim olarak görür
- Kitap bunu prosedürel epistemoloji (procedural epistemology) ile açıklar
- Klasik matematik “ne olduğunu” kesin biçimde ele alan bir çerçeve sağlıyorsa
- hesaplama da “nasıl yapıldığını” kesin biçimde ele alan bir çerçeve sağlar
- Dobson, bilgisayarın yeni bir mikroskop gibi mevcut yaklaşımlara yardımcı olurken aynı zamanda yeni bir bilimin kapısını açtığı görüşünü benimsemişti
- Bilgisayar biliminin “nasıl yapıldığı” yönü birçok alanda yeniden ortaya çıkar
- konuşlandırıldıkları olguları sürekli yansıtarak uyum sağlayabilen sensör ağlarının davranışını açıklamak
- web genelinde çıkarılıp birleştirilen büyük ölçekli verileri yorumlamak
- bilimsel yöntemleri ve süreçleri otomatikleştirmek için yakalayıp temsil etmek
- Bu alanların zenginliği, paket yazılımdan çok programlama dilleri üzerinden entegrasyonu teşvik eder ve R gibi dillerle arayüzlerin ve yapıların esnek ve deney yapılabilir kalmasını sağlar
Eski Bir Kitabın Hâlâ Okunmasının Nedeni
- Dobson’ın kitabının iç kapağında Eylül 1988 satın alma tarihi yazılıydı; 2010 itibarıyla neredeyse 22 yaşındaki kitap hâlâ güncelliğini koruyordu
- Ona göre SICP, yalnızca tarihsel ilgi nedeniyle değil, yararlı biçimde yeniden okunabilecek yaştaki neredeyse tek bilgisayar bilimi kitabıydı
- Matematik kitaplarında uzun süre geçerli kalan içerik nadir değildir; ancak fikirlerin hızlı hareket ettiği ve geçici konuların çok olduğu bilgisayar biliminde bu zor rastlanan bir durumdur
- SICP’nin içeriğinin neredeyse eskimemiş olması, kitabın bilgisayar biliminin çekirdek kavramlarını iyi yakaladığını gösterir
- Bu nedenle SICP, iki veya daha fazla kez okunmaya değer az sayıdaki bilgisayar bilimi kitabından biridir; fizikte Feynman’ın Lectures on Physics eseri gibi, alanın özünü erişilebilir biçimde damıtıp zamanın sınavına dayanmış bir kitap olarak değerlendirilir
- 27 Ocak 2024 güncellemesinde bu kitabın Structure and interpretation of computer programs maddesiyle annotated Lisp bibliography içinde de yer aldığı belirtiliyor
1 yorum
Hacker News görüşleri
SICP gibi “klasikler” program tasarımından bahsediyor, ama bugünlerde sistem tasarımı çok daha önemli bir yetkinlik gibi görünüyor
Dağıtık sistemlerin “bilgisayar bilimi”ne dahil olup olmadığından emin değilim, ama pratikte daha sık çözülmesi gereken sorun bu
Ben sistemleri mümkün olduğunca basit kurup, gözlemlenebilirlik araçlarıyla tasarımın yetersiz kaldığı noktaları bulduktan sonra gerektiğinde veri yapıları ya da “bilgisayar bilimi usulü” çözümlere başvuruyorum
Çoğu durumda Big-O gösterimi ve çalışma zamanı karmaşıklığı önemli olmuyor; diziler ve hızlı CPU’larla birçok sorun çözülebiliyor
Performans sorunu çıksa bile önce profiling ile darboğazı bulmak gerekir
Bilgisayar bilimi, CPU’nun bellek önbelleğinin nasıl çalıştığını pek iyi öğretmiyor
Şık bir grafik algoritması, çalışma zamanı karmaşıklığı iyi olsa bile CPU cache’ini bozduğu için, cache kullanımı iyi olan bir diziden daha yavaş olabilir
Gerçekte daha yaygın sorunlar hata toleransı, dağıtık kilitler ve kuyrukların doğruluğu, sistem ölçeklenebilirliği gibi konular
Bilgisayar/elektrik mühendisliği geçmişim olduğu için önyargılı olabilirim
CPU bellek cache’i konusunu 30 yıl önce CS lisansının ilk döneminde Hennessy ve Patterson kitabından öğrenmiştim, bildiğim kadarıyla hâlâ da kullanılıyor
Hata toleransı, dağıtık kilitler ve kuyrukların doğruluğu, sistem ölçeklenebilirliği de lisans CS eğitiminde işleniyordu; özel bir bilgisayar mühendisliği/elektrik mühendisliği geçmişim yoktu
Hâlâ framework, veritabanı motoru ve sürüm kontrol araçları geliştiren işler var; bu tür işler derin CS bilgisini, örneğin algoritmalar ve veri yapıları bilgisini, her gün gerektiriyor
Ama bu işler eskisine göre daha azaldı ve uygulamalar için kendi DB motorunuzu yazmak yerine çoğu zaman Postgres kullanılıyor
İşlerin büyük kısmı iş mantığını hayata geçirmek; veritabanının içeride nasıl çalıştığını bilmek daha iyi sonuç verir ama indekslerin diskte nasıl saklandığını bilmeden de çalışan çok yazılım yapılabilir
Birçok CS mezunu işinin framework yazmak olduğunu sanıyor, ama gerçekte mevcut framework’leri kullanıp iş mantığını geliştirirken CS geçmişi sayesinde o framework’leri derinlemesine anlaması gerekiyor
Veri diskte “page”ler halinde bulunur ve RAM’de sabit sayıda “page slot” vardır
Disk ile RAM arasında page taşımak yavaş olduğu için bunu mümkün olduğunca azaltmak gerekir
Bu yüzden önemsiz görünen problemler bile ilginçleşir. Klasik bilgisayar biliminde “join” diye ayrı bir kavram yoktur, çünkü isim verilecek kadar karmaşık sayılmaz
Algoritma araştırmasını saf öz gibi görmek kolaydır, ama algoritma verimliliğinin yalnızca belirli veri ve donanım bağlamında anlam taşıdığını da söyleyebilirsiniz
Bu da işi ilginç kılar; her yere sadece kütüphane ya da yemek tarifi gibi çözümler uygulayamadığınız için algoritma uzmanlığı hâlâ faydalıdır
Şu anda küçük bir değişiklik yapmam gereken bir bileşen yüzünden uğraşıyorum; gereksiz yere çok fazla durum var ve aynı anda iki soyutlamayı ele alıyor
Dosya işlerken hem dosya sistemi hem de veritabanını durum saklamak için kullanıyor, tasarımın ne kadar kötü olduğuna şaşırdım
Eskisi gibi üstüne ekleyip daha da anlaşılmaz hale getirmekten kaçınmak için günler harcadım
Pull request kültürü, insanları gerçek kod üzerine derinlemesine düşünmeye vakit bulamadan her türlü çöpü onaylamaya itmiş gibi görünüyor
Yüz yüze kod incelemelerinin geri gelmesini isterdim
2021’de yayımlanan, sorumluluk
Yazının ücretsiz kopyasına giden bağlantı bozuk
https://mitp-content-server.mit.edu/books/content/sectbyfn/b...
https://web.mit.edu/6.001/6.037/sicp.pdf
Bugüne kadar resmi bir PDF sürümünü hiç görmemiştim
2001 civarında yalnızca HTML sürümü ücretsizdi ve birisi bunu TeXinfo'ya dönüştürmüştü: https://www.neilvandyke.org/sicp-texi/
SICP'yi şimdi takip etmek istiyorsanız kodu MIT Scheme veya DrRacket'ta çalıştırabilirsiniz: https://www.neilvandyke.org/racket/sicp/
Mevcut sürüm (v12.1), Intel CPU'lu Sequoia çalıştıran Mac'lerde ya da Rosetta üzerinden Apple silicon'da çalışıyor
Ancak yerel kod derleyicisi biraz bozuk ve SICP için muhtemelen gerekli değil
Monterey öncesi macOS'ta çalışıyor gibiydi, dolayısıyla Apple tarafından sağlanan bağımlılıklar değişmiş olabilir ama bunun izini sürmedim
MIT Scheme şart değilse ve derlemeyle uğraşmak istemiyorsanız Racket daha iyi bir seçenek olabilir
Bildiğim kadarıyla açık bir SICP modu var
GNU Guile ile denedim ama Guile ile MIT Scheme arasında küçük sözdizimi farkları var ve bu epey can sıkıcıydı
MIT'nin orijinalinden daha iyi biçimlendirilmiş: https://sarabander.github.io/sicp/
Eskiden bir paket vardı ama neredeyse 20 yıldır bakımı yapılmıyor
Buna karşılık DrRacket'ta bu problemleri çözmek için özel bir paket var
Abelson ve Sussman'ın bu kitabın içeriğini anlattığı 1986 tarihli kaydedilmiş dersleri izleyebilirsiniz
Soyutlamayı birden çok katmanda oluşturup bir araya getirme açıklamaları bugün bile hem kişisel olarak hem de mentorluk yaparken bana faydalı geliyor
Videoda lesson 3A, 1:07:55 kısmı
https://m.youtube.com/playlist?list=PLE18841CABEA24090
The Elements of Programming Style üç kez okunmaya değer ve ben ondan çok daha fazla kez okuyup faydasını gördüm
İlgilenirseniz, 2010'da yazdığım bir inceleme var: https://reprog.wordpress.com/2010/03/06/programming-books-pa...
https://elementsofprogramming.com/
SICP'te en sevdiğim ve yıllardır aklımda kalan kısım arzusal programlama fikri
Bu, alt düzey yordamlar zaten varmış gibi dileyerek yukarıdan aşağıya bir şey inşa etme yaklaşımı
Sonra gerçekten o alt düzey yordamları yaparak en alta kadar iniyorsunuz
Bence bu düşünme biçimi test güdümlü geliştirmeyle çok iyi örtüşüyor
Önce var olmasını istediğiniz işlev için testi yazıyor, sonra gidip o arzuyu gerçekleştiriyorsunuz
Çoğu geliştirici aşağıdan yukarıya inşa ediyor gibi görünüyor ve sonunda kimsenin istemediği bir şey ortaya çıkıyor
Henüz gerçek doğasını bilmediğiniz bir şeyi yanlışlıkla dileyebilirsiniz ve bu da altta kırılgan bir karmaşa yaratır
Genellikle olan da budur, çünkü şeylerin algoritmik doğası nadiren sezgiseldir
Aşağıdan başlamak “keşke sihir olsaydı” demek yerine fiilen sahip olduğunuz kuarklardan başlamak gibidir
Sihir yoktur; en alta indiğinizde sihir parçacıkları yerine kuarklar bulursunuz ve süreç içinde iki fizik arasındaki dönüşüme yardımcı olacak bağlamsal ipuçlarını da kaybedersiniz
İki yaklaşımın da faydası var. Derin problemleri çözmek için bazen cesurca dilekte bulunmak gerekir
Yine de kişisel olarak sihri en üst katmanın hemen altına koymayı tercih ediyorum
Aşağıdan yukarıya inşa edip sonra iş mantığından hemen önce iş diliyle karşılıklı dönüşüm yapan bir kolaylık sağlayan sihir katmanı kurmak gibi
Böylece ayarlanabilir olur ve en alta kadar dolanan bir karmaşa yaratmaz
Önce uygun görünen biçimlendirme/etiketleme yöntemini yazdı, sonra işaretlemeye uygun programlama yöntemini—yani makroları—tasarlayıp uygulamaya geçti
Ben de OpenSCAD içinde G-code modelleyen bir kütüphane oluşturma çalışmamda benzer bir yaklaşım deniyorum
Bunu yakın zamanda “saf” OpenPythonSCAD ile yeniden yazdım, umarım kullanılabilir hâle gelir
Pharo'yu denemekte fayda var
SICP, bilgisayar bilimini çalışırken ilk kitap olarak okunabilecek en iyi kitap
Yıllarca hobi olarak programlama yaptıktan, yapısal programlama kitapları ve Pascal'dan Common LISP'e kadar çeşitli dillerle tanıştıktan sonra lisans bilgisayar bilimi programında Abelson & Sussman'ı kullandım ve ufkum açıldı
Scheme'in sadeliğini, güzelliğini ve etkileşimliliğini gösterirken bilgisayar biliminin farklı türde soyutlamaları katman katman inşa etme işi olduğunu öğretiyor
Prosedürel soyutlama ve veri soyutlamasıyla başlayıp, doğrudan alan özel dilleri tanımlamaya, onların derleyicilerini gerçekleştirmeye ve yazılım içinde yeni donanım tanımlamaya kadar gidiyor
Her şey o kadar doğal görünüyor ki, bunu ancak gerçek bir usta böyle gösterebilir
Yalnızca 1. baskıyı ya da daha yeni baskıyı değil, 2. baskıyı almalısınız
Daha yeni baskı Scheme yerine Python kullanıyor ve pek iyi değil
SICP'yi gerçekten sevmek istedim ama Lisp buna engel oldu
Haskell ve Standard ML'i seviyorum
Benzer bir deneyim yaşayan başka biri olup olmadığını merak ediyorum
SICP ile ruhen benzer ama başka bir dili araç olarak kullanan bir kitap varsa ilginç olabilir
SICP'yi JavaScript ile yapmak istediğim söylenemez
Yazar, Scheme'e alternatif olarak KRC ya da Miranda kullanılmasını öneriyor
KRC'yi pek bilmiyorum ama Miranda, Haskell'i etkilemiş statik tipli fonksiyonel bir programlama diliydi
Scheme ya da Lisp kullanmadan SICP'ye benzeyen bir kitap, ya SICP'den tamamen farklı olur ya da en azından aynı şeyleri öğretemez
Benim deneyimimde Haskell ve ML, Scheme'den çok daha zor anlaşılırdı; bu yüzden tam olarak hangi kısmın zor geldiğini merak ediyorum
Geçen ay okumaya başladım ama bana fazla geniş kapsamlı geldi
Çok sayıda ilginç matematiksel ilkeyi hızla geçiyor ve tam eğlenceli olmaya başlarken bir sonraki konuya geçiyor
Başka bir deyişle, fazla yüzeysel
Geriye dönüp bakınca, SICP'den türemiş pek çok ders ve belgeyi zaten görmüş olmam da yardımcı olmadı; her konu tanıtıldığında aklımdan “yine mi bu” düşüncesi geçiyordu
Yine de kendimi zorlayıp sonuna kadar gittim ve Lisp'i ele alacak kadar zeki olmadığım için aslında inanılmaz derecede çok şey öğrendim
Kodu okumaya çok fazla zaman harcadığım için, bana öyle geliyor ki alışık olduğum bir dil olsaydı öğreneceğimden daha fazlasını öğrendim
SICP'nin bir Python sürümü de var
Bizzat baştan sona tamamlamadım, yalnızca göz gezdirdim; bu yüzden tavsiye etmiyorum ama var olduğuna kanıt olarak bağlantıyı bırakıyorum
https://wizardforcel.gitbooks.io/sicp-in-python/content/0.ht...
Benim kitaplığımda da bu iki kitap yan yana duruyor ve kesinlikle okumaya değer
İkinci okuyuşumda dipnotlara ve kaynakçaya daldım; orada da güzel, büyük bir dünya vardı
Doğru hatırlıyorsam Sussman ve ekibinin gök cisimlerinin özelliklerini, yani yörüngelerini hesaplamak için özel amaçlı programlanabilir işlemci tasarladığı bir makale var
Her zamanki gibi insanın aklını başından alan türden bir içerik
SICP, lisans eğitimimde yalnızca sınırlı sayıda model öğrenmiş biri olarak bana birden fazla programlama modeli olduğunu erken dönemde kavrattı
Hangi dilin, kütüphanenin ya da framework'ün belgelerini okursam okuyayım yönümü bulabileceğim hissini veren kitaplardan biriydi
SICP'nin yanına, iki kereden fazla okunmaya değer kaynaklar olarak The Little * serisinin tamamını da koyarım
Types and Programming Languages de iyidir
Yaptığım iş açısından bunlar uygulanabilir bilgisayar bilimi ama sadece okumak yetmez, uygulamak da gerekir
Tekrar etmezseniz bir kısmını unutursunuz
Kişisel olarak, o kişiyi tanıyıp saygı duyduğum için de olabilir ama Dijkstra'nın kitaplarını ve makalelerini epey sık yeniden okurum
Artık doğrudan uygulamak zor olsa da zihne iyi geliyor ve bence kişisel olarak mükemmel bir yazar