Dün gece yine sabahladım. Amacım basitti: API'den gelen JSON verisini al, biraz işle, veritabanına kaydet. Standart bir CRUD işi. Ama hayır, projede "veri katmanı soyutlaması" için yeni bir kütüphane (Prisma) eklemişiz. "Daha temiz kod" diye. Meğer kendi başına bir evrenmiş.
Nereden Çıktı Bu Schema?
Artık doğrudan SQL yazamıyorsun. Önce bu kütüphanenin kendi dilinde bir schema tanımlaman lazım. Sonra onu migrate etmen... Migration dosyası patladı, hata verdi. Hatanın İngilizcesi bile 3 satır. StackOverflow'da "prisma migration conflict" diye arattım, çıkan sonuçların yarısı "rollback yap" diyor, diğer yarısı "database'i sil baştan yap". Kafayı yiyecektim.
Gördüğün gibi, aslında yaptığımız iş aynı. Ama şimdi prisma.user objesinin nasıl davrandığını, data objesinin beklediği formatı öğrenmem gerekti. Yani, SQL bilgimin üstüne, bu soyutlamanın kendi konseptlerini de öğreniyorum. Sorun şurada: Bu soyutlama sızdırıyor. Altındaki SQL bazen yüzünü gösteriyor ve o zaman iki dünyanın da kurallarını bilmen gerekiyor.
Soyutlama Cenneti mi, Karmaşa Tuzak mı?
Şaka gibi ama, bazen basit bir WHERE koşulu yazmak için kütüphanenin dokümanlarında 10 dakika kaybediyorsun. "Bu işi daha kolay hale getirecek" diye eklediğimiz her katman, aslında anlaşılması gereken yeni bir "dil", yeni bir "mantık" getiriyor. TypeORM, Sequelize, Prisma... Hepsi aynı işi yapmaya çalışıyor ama her biri kendi dünyasını kuruyor.
Bu katmanlar gerçekten karmaşıklığı azaltıyor mu, yoksa sadece onu başka bir yere mi taşıyor? Basit bir projeye, "ileride büyür" diye eklenen onlarca abstraction layer, şu anki geliştiricinin kafasında fırtınalar estiriyor.
Sonuç olarak, dün gece yapmam gereken 1 saatlik iş, yeni katmanın konseptlerini öğrenmem ve hata ayıklamam nedeniyle 4 saat sürdü. "Best practice" diye koşa koşa gittiğimiz şeyler, bazen pratikte tam bir verimlilik katliamına dönüşebiliyor.
Siz de bu tür "soyutlama katmanı" tuzaklarına düştünüz mü? Yoksa "Bunlar olmazsa olmaz, alışınca çok rahat" diyenlerden misiniz? Tartışalım.
Artık doğrudan SQL yazamıyorsun. Önce bu kütüphanenin kendi dilinde bir schema tanımlaman lazım. Sonra onu migrate etmen... Migration dosyası patladı, hata verdi. Hatanın İngilizcesi bile 3 satır. StackOverflow'da "prisma migration conflict" diye arattım, çıkan sonuçların yarısı "rollback yap" diyor, diğer yarısı "database'i sil baştan yap". Kafayı yiyecektim.
JavaScript:
// Eskiden böyleydi:
db.query('INSERT INTO users SET ?', userData);
// Şimdi böyle:
await prisma.user.create({
data: { ...userData, metadata: {} }
});
Gördüğün gibi, aslında yaptığımız iş aynı. Ama şimdi prisma.user objesinin nasıl davrandığını, data objesinin beklediği formatı öğrenmem gerekti. Yani, SQL bilgimin üstüne, bu soyutlamanın kendi konseptlerini de öğreniyorum. Sorun şurada: Bu soyutlama sızdırıyor. Altındaki SQL bazen yüzünü gösteriyor ve o zaman iki dünyanın da kurallarını bilmen gerekiyor.
Şaka gibi ama, bazen basit bir WHERE koşulu yazmak için kütüphanenin dokümanlarında 10 dakika kaybediyorsun. "Bu işi daha kolay hale getirecek" diye eklediğimiz her katman, aslında anlaşılması gereken yeni bir "dil", yeni bir "mantık" getiriyor. TypeORM, Sequelize, Prisma... Hepsi aynı işi yapmaya çalışıyor ama her biri kendi dünyasını kuruyor.
Bu katmanlar gerçekten karmaşıklığı azaltıyor mu, yoksa sadece onu başka bir yere mi taşıyor? Basit bir projeye, "ileride büyür" diye eklenen onlarca abstraction layer, şu anki geliştiricinin kafasında fırtınalar estiriyor.
Sonuç olarak, dün gece yapmam gereken 1 saatlik iş, yeni katmanın konseptlerini öğrenmem ve hata ayıklamam nedeniyle 4 saat sürdü. "Best practice" diye koşa koşa gittiğimiz şeyler, bazen pratikte tam bir verimlilik katliamına dönüşebiliyor.
Siz de bu tür "soyutlama katmanı" tuzaklarına düştünüz mü? Yoksa "Bunlar olmazsa olmaz, alışınca çok rahat" diyenlerden misiniz? Tartışalım.