4 puan yazan GN⁺ 2024-04-29 | 1 yorum | WhatsApp'ta paylaş
  • Web tefrikası bittikten sonra bile Crafting Interpreters’ın gerçek bir kitaba dönüşmesi için 15 ay daha ek çalışma gerekti ve sonunda basılı kitap, e-kitap ve PDF olarak tamamlandı
  • Markdown ve PNG paketlerini kitaba dönüştürmek için Dart build sistemi, InDesign XML içe aktarma, JavaScript otomasyonu ve dizgi doğrulaması gibi şeylerin baştan kurulması gerekti
  • Nihai ürün 8×10 inç, 640 sayfa, 200 binden fazla kelime, 1.133 kod parçacığı ve yüzlerce illüstrasyon içerdi; bu yüzden sıradan web içeriğine göre çok daha zorlu yerleşim kısıtlarına sahipti
  • 5 aylık genel yeniden inceleme, profesyonel copy editing, 2 aylık dizgi, 2 haftalık dizin çalışması, prova baskı kontrolü ve PDF karşılaştırma otomasyonu birbirini izledi
  • Kendi kendine yayımlanan bir teknik kitap yalnızca yazmakla bitmiyor; build, yerleşim, doğrulama ve dağıtım otomasyonu kitabın kalitesini ve tamamlanmışlık düzeyini belirliyor

Web içeriği tamamlandıktan sonra da kalan işler

  • Crafting Interpreters’ın metni zaten tamamlanmıştı, ancak o dönemdeki çıktı Markdown ve PNG dosyalarını Python koduyla web sitesine dönüştüren bir yapıdaydı
  • Hedef en başından beri gerçek bir kâğıt kitaptı ve son bölüm web’e konduktan sonra yaklaşık bir ay dinlenildi
  • Neredeyse 4 yıl boyunca her gün yazdıktan sonra ciddi ölçüde tükenmişti; 2020 başındaki koşullar da çalışmayı sürdürmeyi zorlaştıran bir dönemdi

Dart ile yeniden yapılan build sistemi

  • Önce okurların GitHub issue’larıyla bildirdiği yazım hataları ve yanlışlar düzeltildi
  • Ardından kitabın tüm build sistemi Dart ile yeniden yazıldı
    • İlk kitabın build betiği, bölüm bazlı Markdown dosyalarını HTML’e render eden ve kod parçalarını araya yerleştiren tek bir Python betiğiydi
    • Crafting Interpreters’ta iki eksiksiz yorumlayıcının kodunu 30 bölüm boyunca kademeli olarak oluşturmak gerektiğinden daha karmaşık bir build gerekiyordu
  • Yeni build sistemi, yorumlayıcı kodunu belirli bir bölüme ya da bölüm içindeki belirli bir noktaya kadar programatik olarak üretebiliyor, bunu derleyip otomatik testlere sokabiliyordu
  • Python tabanlı araçlar, yazarın uzmanlık düzeyine göre bakımı zor ve ayrıca yavaştı
  • Dart sürümü istenen HTML’i ve sözdizimi renklendirme kodunu tam olarak üretti; mevcut Python sürümünden 10 kat daha hızlıydı
  • Markdown işleme üzerinde daha fazla denetim sağlanması, daha sonra InDesign için XML dışa aktarımında da işe yaradı

Kitap tasarımı ve format kararı

  • Kitap tasarımı, web geliştirme ya da oyun geliştirmede olduğu gibi önce bir framework kurup içeriği onun içine dökmeye benziyordu
  • InDesign’da sayfa kenar boşluklarını ve grid’i belirleyen master’lar; metin ve nesnelerin yazı tipini, stilini ve rengini belirleyen style’lar ayarlanır
  • Crafting Interpreters’ta tasarım zorluğu yüksek çok sayıda unsur vardı
    • Çok fazla gövde metni vardı
    • Belirli cümleleri, kodu ve illüstrasyonları hemen yanında açıklayan uzun aside’lar çoktu
    • Çok fazla kod vardı ve her kod parçacığının yanında sonuç programdaki konumunu açıklayan not yer alıyordu
  • Yatay genişlik; koddaki uzun satırlar, aside alanı ve kalın kitabın iç kenar boşluğu birlikte düşünülerek belirlenmeliydi
  • Yazarın kitaplığındaki yaygın CS ders kitaplarının çoğu 7,5 inç genişliğindeydi; ancak kod, aside ve boşlukları sığdırmak zor olduğundan 8 inç genişliğe karar verildi
  • Kendi kendine yayıncılıkta KDP ve IngramSpark’ın desteklediği sınırlı formatlar kullanılmak zorundaydı; 8 inç genişlikte makul seçenek 8×10 inçti
  • Dikey yönde metin, klasik 12pt baseline grid’e hizalandı

InDesign’a aktarmak için XML pipeline’ı

  • InDesign Markdown’u ya da yazarın build sistemini doğrudan anlamadığından, elle kopyala-yapıştır yapmak gerçekçi değildi
  • InDesign XML içe aktarmayı ve etiket bazlı stillerin otomatik uygulanmasını destekler
  • Ancak XML desteğinin iç içe etiketleri işlemede kısıtları vardır; HTML’deki gibi bir başlık içinde italik etiketi iç içe kullanmayı düzgün işleyemez
  • Yazar build sistemini doğrudan kontrol edebildiği için, InDesign’ın kolayca kabul edeceği etiketler üreten bir custom XML exporter yazdı

InDesign JavaScript otomasyonu ve sınırları

  • XML içe aktarma, InDesign’ın “story” dediği, ana metin kutusunu takip eden tek bir kesintisiz metin akışı oluşturur
  • Gövde metni ve kod parçacıkları ana akışa girer; ancak aside ve location marker’ların yana alınması gerekiyordu
  • Önceki kitapta aside’lar elle kesilip yeni metin kutularına yapıştırılmıştı; bu kitapta kod parçacığı sayısı 1.133 olduğu için aynı yöntem mümkün değildi
  • InDesign JavaScript scripting’i destekler, ancak dokümantasyon ve hata ayıklama ortamı çok zayıftı
    • Debugger yok
    • Stack trace yok
    • Alışıldık debug print yok
    • Yalnızca alert() kullanılabiliyor ve çağrıldığında script duruyor
  • JavaScript script’i aside ve location marker’ları bulup ana metin akışından çıkardı ve ayrı metin kutularına dönüştürdü
  • Konumlandırma otomasyonu sonuna kadar tamamlanamadı
    • InDesign’ın anchor özelliği ve Object Style ile yerleştirme yapılmaya çalışıldı, ancak bazı durumlarda çevredeki kod parçacıklarının kenarlıklarının kaybolması sorunu ortaya çıktı
    • Sonunda bazı location tag’lerin konumunun elle ayarlanması gerekti

Düzenleme ve copy editing

  • Tüm metni baştan sona yeniden okumayı içeren bir düzenleme turu yapıldı
  • Her bölüm yazım sırasında zaten üç draft’tan geçmişti, ancak kitabın genel akışını görmek için bir kez daha incelendi
  • Bu çalışma 5 ay sürdü ve tekrarlanan şakaların çoğu düzeltildi
  • Ardından profesyonel copy editor Kari Somerton işe alındı
  • Yaygın düzenleme iş akışlarında Microsoft Word ve Track Changes çok kullanılır, ancak yazar plaintext ve Git tabanlı iş akışını korumak istiyordu
  • Kari Somerton Git’i ve özel build sistemini öğrendikten sonra kitabın tamamını inceledi ve yüzlerce hata buldu
  • Zaten dört draft ve okurlardan gelen yüzlerce issue olmasına rağmen profesyonel copy editor çok sayıda sorun yakaladı

640 sayfalık dizginin kısıtları

  • Kelimeler yeterince parlatıldıktan sonra InDesign’da bölüm bölüm dizgi yapıldı
  • Bölüm bazlı çalışma şu akışla tekrarlandı
    • Yeni InDesign dosyası oluşturma
    • XML dışa aktarma
    • XML’i InDesign’a içe aktarma
    • JavaScript ile aside ve location marker’ları çıkarma
    • Kenar çubuğu öğelerine anchor ayarlama
    • Sayfa sonlarındaki boşlukları ayarlama
  • İlk beş adım bölüm başına yaklaşık 30 dakikada yapılabiliyordu, ancak son boşluk ayarı en zor kısımdı
  • Kitap dizgisinde çeşitli dikey yerleşim kısıtları vardır
    • İllüstrasyonlar sayfa ortasında kesilemez
    • Aside’ın tek bir sayfa içinde kalması anlamayı kolaylaştırır
    • Kod parçacıklarının da mümkünse sayfa bölünerek parçalanmaması daha iyidir
    • Yalnızca başlığın sayfa sonunda kalmasından kaçınmak gerekir
    • Widows and orphans’tan kaçınmak da tercih edilir
  • InDesign bu durumlarda içeriği sonraki sayfaya iter, ancak bu da sayfanın altında büyük beyaz boşluk oluşturur
  • İllüstrasyonlar ve kod parçacıkları birbirine geçmiş bir bin-packing problemi gibi çalıştı; bu yüzden tüm bölümlerin dizgisi 2 ay sürdü
  • Boşlukları azaltmak için kod parçacıklarını ikiye bölmek, görsellerin etrafındaki boşlukları ayarlamak veya illüstrasyon yüksekliğini değiştirmek gerekti

İllüstrasyonlar, dizin ve ön/arka bölümler

  • İllüstrasyonlar baskıya uygun siyah-beyaz kalem çizimleri olarak seçildi ve ilk taramada 1200 DPI ile alındı
  • Yüksek çözünürlüklü bitmap olarak dışa aktarmak kolaydı, ancak bunları sayfa yerleşimine yerleştirmek zordu
  • Metin “Figure 123’e bakın” biçiminde değil, hemen yanındaki illüstrasyonu doğrudan işaret eden cümle yapısında olduğu için illüstrasyonların yakın konumda olması gerekiyordu
  • Profesyonel bir dizin yazarı tutulmadan, 2 hafta boyunca tüm bölümler tekrar taranarak dizin oluşturuldu
  • InDesign’ın dizin özelliği seçilen metni dizin maddesine dönüştürebiliyor ve tüm dizini oluşturabiliyordu; ancak madde ekleme işleminin kendisi tekrarlı ve sıkıcıydı
  • Kitabın arkasında dizin; başında ise başlık sayfası, telif hakkı sayfası, ithaf, teşekkürler ve InDesign’ın oluşturduğu içindekiler yer aldı

Kapak tasarımı

  • Yazar, teknik kitap kapaklarında sanatsallığın romanlardaki kadar önemli olmayabileceğini düşünüyordu; ancak profesör konumuyla satışları zorunlu kılabileceği bir durumda olmadığı için kapağa çok zaman ayırdı
  • Başta kendi çektiği bir fotoğrafı kapakta kullanmayı düşündü, ancak uygun fotoğraf bulamadı
  • Sonunda kitabın görsel dili olan kalem ve mürekkep illüstrasyonlarını kullanmaya karar verdi
  • Derleme sürecini açıklayan dağ çizimini daha büyük ve ayrıntılı şekilde yeniden çizdi; başlık harflerini de yeni, el yazısı hissi veren bir biçimde yaptı
  • Başlık için Acumin Pro Extra Condensed çıktısı alınıp elle üzerinden geçilerek kusurlu bir his verildi; 1950’lerin teksir baskılı izci el kitaplarını andıran bir renk paleti seçildi

Prova baskı ve PDF değişiklik doğrulaması

  • PDF KDP’ye yüklendi ve prova baskı sipariş edildi; bir hafta sonra ağır bir kutu geldi
  • Fiziksel kitabı görünce projenin ölçeği ilk kez veri dosyaları değil, fiziksel bir nesne olarak hissedildi
  • Dizgi sürecinde çok fazla el işi olduğu için prova baskı bizzat okunarak hatalar bulundu ve sticky note’larla işaretlendi
  • InDesign dosyaları Git deposuna kondu, ancak devasa opak ikili dosyalar oldukları için kaynak kod gibi diff görülemiyordu
  • InDesign, gerçek bir değişiklik yokmuş gibi görünse bile dosyayı değiştirebildiğinden, neyin değiştiğini doğrulamak zordu
  • Yazar, kitap PDF’indeki tüm sayfaları çıkarıp tek bir büyük PNG karo görseline dönüştüren bir Dart script yazdı
  • Her commit’te PDF dışa aktarılıp karo görseli oluşturuldu; Photoshop action ile iki görseldeki farklı piksellere kırmızı kenarlık çizilerek değişen sayfalar bulundu
  • Bu yöntem ayrıntılı değişiklikleri doğrudan göstermiyordu, ancak hangi sayfaların görsel olarak kontrol edilmesi gerektiğini söylüyor ve yalnızca beklenen değişikliklerin girip girmediğini doğrulamayı sağlıyordu

E-kitap ve lansman

  • Basılı sürümün prova düzeltmeleri bittikten sonra Kindle ve EPUB e-kitapları da üretildi
  • Özel build sistemi, EPUB’ın gerektirdiği eski XHTML’i, metadata’yı ve manifest’i dışa aktarabilecek şekilde değiştirildi
  • Birkaç komut satırı çalıştırıldıktan sonra Kindle ve EPUB e-kitapları oluşturuldu; çeşitli okuyucularda test edilerek CSS ayarlandı
  • Nihai dosyalar hazırlandıktan sonra kitabın web sitesinin ilk sayfası satın alma noktalarına bağlanacak şekilde güncellendi; fotoğraflar ve responsive yerleşim de düzenlendi
  • Mağazaya yüklemeler, site güncellemesi ve mailing list duyurusu da bittikten sonra kitap “gerçekten” tamamlanmış hale geldi

Sonraki planlar

  • Son bölüm bittikten sonra bile insanlar sonraki işi ya da sonraki kitabın konusunu sordu
  • Yazar, 6 yıl boyunca tek bir projeye bağlı kaldıktan sonra bir süre yeni kitap planlamamaya çalışıyor
  • Pandemi sırasında ertelediği çok iş de vardı; bir süre ne yapacağına karar vermeden dinlenmeyi planlıyor
  • Müzik yapmak, balık tutmak, arkadaşları ve ailesiyle zaman geçirmek, roguelike projesi üzerinde çalışmak gibi olasılıklardan söz ediyor; ancak ne yapacağına hemen karar vermiyor
  • Bir gün yeniden büyük bir proje yapmak isteyebilir, ancak bir projeye tekrar 6 yıl harcamak istemediğini belirtiyor

1 yorum

 
GN⁺ 2024-04-29
Hacker News yorumları
  • Bu sayfada hem kitabı satın alma bağlantısı hem de ücretsiz çevrimiçi sürüm bağlantısı var: https://craftinginterpreters.com/
    Bu kitap kesinlikle satın almaya değer. Nystrom’un fiziksel kitap tasarımına verdiği özen bile basılı yayınları sevenler için tek başına yeterli ve buna el çizimi illüstrasyonlar ile harika metin de eklenince teknik kitapların %99’undan daha iyi olduğunu düşünüyorum

  • Şimdiye kadar okuduğum teknik kitaplar arasında açık ara en iyilerden biriydi. Her bölümde aşamalı olarak gelişen kod ve sonunda çalıştırılabilir bir program bırakılması inanılmaz bir kurgu ve bunu gerçekten başarmış olması karşısında yazara hayran kaldım
    Daha önce benzer bir şey yazmış olduğum için ağaç gezme yorumlayıcısı kısmını hızlı geçtim, C tabanlı bytecode yorumlayıcısını takip ederken ise çok daha fazla şey öğrendim

  • Yazının yeni olduğunu sanıp ikinci baskının çıktığını düşündüm
    Yazarı tebrik etmek isterim. Bu kitap, dil alanındaki teknik derinliğinin yanı sıra düzen ve grafiklerdeki küçük ayrıntılara kadar okuru okumaya devam ettiren harika bir kaynak. Uzun süre geçerliliğini koruyacak bir kitap gibi hissettiriyor

  • 2017’de Crafting Interpreters’ı takip etmeye başladım ve kitabın ilk yarısında ilerlerken lox uygulamasını Java yerine Scala ile yazdım; bu süreçte tokenizer/sözcüksel çözümleyici/parser/interpreter kavramları tamamen gizemli olmaktan çıktı
    Eskiden bunu yalnızca belli bir tür programcının uğraşabildiği vizyoner bir alan sanırdım; bunda Nystrom’un mükemmel yazımı ve konuya derin hakimiyetinin payı büyük diye düşünüyorum. İkinci yorumlayıcıyı Rust ile yazmaya başladım ama hayat yoğunlaşınca fazla ilerleyemedim ve sonunda da bitiremedim. Sanırım artık geri dönme zamanı geldi. Bu yazı birkaç yıl öncesine ait ama bunun basılı kitap olarak yayımlandığını bilmiyordum; öğrenme tarzım için en ideal format olmasa da bir kopya edinip yazarı desteklemek istiyorum

    • Ben de benzer olabilirim. Web tabanlı yayınlar bana daha çok uyuyor ama Bob’u desteklemek için ben de kitabı satın aldım
  • Şimdiye kadar okuduğum bilgisayar teknik kitapları arasında en üst düzeylerden biriydi. Gerçekten çok keyifle okudum ve çok şey öğrendim
    Sadece teknik içeriği harika değil, yazımı da güçlü, eğlenceli ve illüstrasyonları da çok iyi. Anıtsal bir başarı olduğunu düşünüyorum

  • Bob’un bu kitap hakkında konuştuğu harika bir röportaj var, dinlemeye değer: https://corecursive.com/032-bob-nystrom-on-building-an-inter...

  • İronik biçimde, kitabı tamamen okuyup bitirmem 15 ay sürdü :). Yazarın durumuna çok empati duydum. Disiplinli ve çok yetenekli bir yazarın kaleminden çıkmış harika bir kitap ve kitaba o kadar bağlandım ki öğrendiklerime dayanarak şu sayfayı bile yaptım: https://hexmos.com/compiler

  • Yazar grafik tasarımcıdan derleyici mühendisine mi dönüştü? Şaşırtıcı ve etkileyici

    • Kitabın baskıya uygun PDF’sini hazırlamak için InDesign, LaTeX’ten çok daha hızlı olurdu gibi geliyor. Ben de InDesign’ı seçerdim. Ben de eski bir tasarımcıyım
  • Bu kitap kitaplığımda duruyor. “Writing an interpreter in Go”dan sonra okuyacağım yorumlayıcı kitabı olacak; o kitap yaklaşık 200 sayfa ve bu da gerçekten hoşuma gidiyor

  • Java yerine Rust ile sözcüksel çözümleyiciyi yeni bitirdim, geri kalanı için de heyecanlıyım. Şimdiye kadar harika bir kitap