Kütüphane yazma deneyimim bir kibir anıyla başladı. Bir projede tekrar eden kod blokları fark ettim ve şöyle düşündüm: "Neden bunu kütüphane haline getirmeyeyim?" Çok net, çok temiz, çok akıllıca bir fikir gibi görünüyordu. Kağıda planladım. Adını koydum. Klasörü oluşturdum. Sonra gerçek başladı. Kütüphaneyi yazmak, o kütüphaneyi kullanacak kişinin kim olduğunu bilmeden yazmak demek. Ama ben o kişiydim. Kendi ihtiyacımı karşılayacak kütüphaneyi kendim için yazıyordum. Bu çok kolay görünüyordu. Değildi. İlk sorun API tasarımıydı. Fonksiyonları nasıl adlandıracaktım? Parametreler ne olacaktı? Hangi davranışlar varsayılan olacak, hangisi kullanıcıya bırakılacaktı? Kütüphane yazma deneyimi beni bu sorularla karşı karşıya bıraktı ve cevapların hiçbiri açık değildi. Bir fonksiyonu üç farklı şekilde yazdım, üçünü de sildim. Sonunda dördüncü versiyona karar verdim. Ertesi gün o fonksiyonu kullanmaya çalışırken fark ettim ki yanlış tasarlamışım. Nasıl kullanılacağını düşünmeden nasıl tasarlanacağını düşünmeye çalışmışım. Bu tersine çevrilmiş düşünme biçimi kütüphane yazma deneyiminin en değerli dersi oldu. Artık şöyle yaklaşıyorum: Önce nasıl kullanılmasını istiyorum diye yazıyorum. Hayalî bir "kullanım örneği" kodluyor, sonra geriye gidip kütüphaneyi o kullanım örneğine uygun yapıyorum. Dokümantasyon meselesi de beni şaşırttı. Kod çalışıyordu ama nasıl kullanılacağını anlatan bir satır bile yoktu. Bir ay sonra kütüphaneyi başka bir projede kullanmak istediğimde ne işe yaradığını hatırlamakta zorlandım. Kendim yazmıştım, kendim okuyamamıştım. O noktada dokümantasyonu sonradan değil, kod yazarken yazmaya başladım. O ilk kütüphane mükemmel değildi. Birkaç kez tamamen yeniden yazdım. Ama bu kütüphaneyi yazmak, herkesin hazır kütüphanelerini kullanan biri olmaktan çıkıp biraz daha derine inen biri olmamı sağladı. Bir araç yaratmanın getirdiği anlayış, o aracı kullanmaktan çok daha farklı bir şey.