Tek Kural: Sayabileceğin Bir Sayıyı Asla Elle Yazma
Bu siteyi ayakta tutan tek bir kural var. Bir sayı, hâlihazırda var olan içerikten türetilebiliyorsa şablonun içine elle yazılmaz. Ana sayfadaki proje sayısı, bir başlığa rakam yazdığım için orada durmuyor; derleme anında projeler koleksiyonu sayıldığı için orada duruyor.
Kural kulağa önemsiz geliyor. Buradaki diğer bütün kararların bu biçimi almasının sebebi ise tam olarak bu kural.
Portfolyo, bir insan hakkında öne sürülmüş iddialar bütünüdür ve iddialar zamanla kayar. Yeni bir kayıt eklersiniz, üstündeki özet satırını güncellemeyi unutursunuz. Bir çalışmayı arşive alırsınız, toplam onu saymaya devam eder. Hiçbir şey çökmez. Derleme yeşildir. Sayfa yalnızca yanlıştır — hem de fark edilmesi en zor biçimde, çünkü bir zamanlar doğruydu ve kimse dönüp okumadı. Bu tür bir hata kendini duyurmaz, üstelik birikir. İki yıllık ufak düzenlemeden sonra sayfadaki hiçbir sayıya güvenmez olursunuz; güvenmediğiniz için bakımını bırakırsınız, bıraktığınız için daha da bozulur.
Sayıyı türetmek bu hata sınıfını tümüyle ortadan kaldırıyor. Güncellenecek ikinci bir yer yoksa unutulacak ikinci bir yer de yok. Sayının içerikten bağımsız bir varlığı olmadığı için gerçekle çelişmesi mümkün değil.
Tek Doğruluk Kaynağı Olarak Tipli İçerik Koleksiyonları
Site Astro 7 ve TypeScript ile kurulu. Hakkımdaki her olgu tipli bir içerik koleksiyonunda yaşıyor: projeler, ödüller, sertifikalar, patentler, blog ve dönüm noktaları. Her koleksiyonun bir şeması var. Her kayıt, hiçbir şey render edilmeden önce şema tarafından doğrulanan YAML ön bilgisine sahip bir Markdown dosyası.
Asıl karşılığını haftalar içinde değil yıllar içinde veren kısım burası. Şema, bir kaydın neleri içermek zorunda olduğuna dair gelecekteki kendinizle yaptığınız bir anlaşmadır. Yeni bir alan eklediğimde — bir durum, bir kategori, bir yarışma adı — şema mevcut bütün kayıtları bu alanla hesaplaşmaya zorluyor ve derleme, sayfa görüntülendiği anda sessizce değil, değişikliğin yapıldığı anda yüksek sesle kırılıyor. Derleme sırasındaki doğrulama hataları ucuzdur. Yayındaki yanlış sayfalar değildir.
Tipleme aynı zamanda toplulaştırmayı güvenli hâle getiriyor. Her kaydın biçimi bilindiği için sayfalar içeriğe gerçek sorular sorabiliyor: belirli bir kategoride kaç proje var, hangi ödüller uluslararası, zaman çizelgesindeki en erken ve en geç tarih nerede. Bunlar tipli bir dizi üzerinde çalışan, derleyicinin denetlediği sıradan TypeScript sorguları. Kırılgan olmadıkları için gözetim de istemiyorlar.
Denetimli sözcük listeleri bir kat aşağıda aynı işi görüyor. Kategoriler, ödül türleri ve proje durumları serbest metinden değil sabit listelerden geliyor. Bu, kuralcılık olsun diye değil; veritabanı olmadan filtrelemeyi, gruplamayı ve çapraz bağlamayı mümkün kılan şey bu. Serbest metinde yapılan bir yazım hatası sessiz bir öksüz kayıt yaratır. Denetimli listede yapılan bir yazım hatası derlemeyi durdurur.
İki Dil, Tek Slug Kümesi
Site iki dilli ve oradaki kural, kılık değiştirmiş hâliyle yine aynı kural: yapı bir kez, içerik iki kez.
Her koleksiyonun dil başına bir dizini var ve aynı kayıt iki dilde de aynı slug’ı kullanıyor. İngilizce dosya ile Türkçe dosya, iki dilde söylenmiş tek bir şey. İngilizce tanımlayıcıları Türkçeye eşleyen bir katman yok, çünkü tanımlayıcı bir dil değil. Kayıtlar arasındaki çapraz bağlar — bir projenin bir ödülü, bir yazının başka bir yazıyı işaret etmesi — slug üzerinden kurulduğu için her iki dilde de aynı şekilde çözülüyor.
Çeviri henüz yoksa site boşluk ya da kırık bağlantı göstermek yerine İngilizceye düşüyor. Bu, kulağa geldiğinden daha önemli. Yedek dil olmadan iki dilli siteler dengesiz biçimde çürür: bir dil güncel kalır, diğeri sessizce eskir ve durumu bir okurdan öğrenirsiniz. Yedek dil varsa eksik çeviri, Türkçe bir bağlamda duran İngilizce bir sayfa olarak görünür — apaçık, biraz utandırıcı ve tam da bu yüzden düzeltilir.
Çerçevesiz Bir Tasarım Sistemi
Görsel katman elle yazılmış CSS özel özelliklerinden oluşuyor. Boşluklar, tipografi ölçeği, köşe yarıçapları ve renkler tek bir yerde token olarak duruyor; bileşenler ham değerleri değil bu token’ları tüketiyor.
Açık ve koyu tema CSS’in light-dark() fonksiyonuyla çözülüyor. İki değer token tanımında yan yana durduğu için senkron tutulması gereken paralel bir koyu tema ya da işaretlemenin içinden geçen bir sınıf anahtarı yok. Tema, ikinci bir stil dosyası değil tek bir bildirim hâline geliyor. Bir rengi değiştirdiğimde bir kez değiştiriyorum ve iki mod da yapısı gereği doğru kalıyor.
Arayüz çerçevesi kullanılmıyor, dolayısıyla neredeyse hiç JavaScript gönderilmiyor. Bu, performans kararı olduğu kadar bakım kararı. Çerçeve, kendi görüşleri ve kendi sürüm temposu olan bir bağımlılıktır; portfolyo ise beş yıl sonra bir göç haftası sonu gerektirmeden derlenebilmesi gereken bir belgedir. Düz HTML, CSS ve Markdown’ın takip etmem gereken bir sürümü yok.
Bu Kısıt Gerçekte Ne Kazandırıyor
Bütün bunların amacı zarafet değil. Amaç, sitenin çaba harcamadan doğru kalması.
Bir ödül eklemek tek bir Markdown dosyası yazmak demek. Liste onu alıyor, sayılar kayıyor, zaman çizelgesi yerine yerleştiriyor, ilgili kayıtlar buluyor. Şablona dokunmuyorum. Toplam güncellemiyorum. Sonrasında iki yıl önce yazdığım bir sayının hâlâ doğru olup olmadığını denetlemek için ana sayfayı gözden geçirmiyorum, çünkü hiç sayı yazmadım.
Sürekli dikkat isteyen bir portfolyo o dikkati göremez. On yıllık düzenlemeye dayanan tek sürüm, doğru olmanın en az direnç gösteren yol olduğu sürümdür — dürüst olanla tembel olanın aynı şey olduğu sürüm. “Sayabileceğin bir sayıyı asla elle yazma”, bu düzeni anlatmanın bildiğim en kısa yolu.