Muhammed Fatih TAŞATAN
05.01.2024Evolutionary Database Design: Yazılım Geliştirmenin Yeni Yüzü
Evrimsel Veritabanı Tasarımı
Yazılım geliştirme dünyasında sürekli değişen gereksinimler ve hızla ilerleyen teknoloji, yeni yöntemlerin benimsenmesine yol açıyor. Bu değişim dalgasının en önde gelen kavramlarından biri de "Evolutionary Database Design" yani Evrimsel Veritabanı Tasarımı.
Her geçen gün değişen müşteri taleplerini yansıtabilecek bu yaklaşım, yazılım geliştirme sürecinde veritabanlarının sürekli geliştirilmesi gerektiğini savunuyor.
Aslında konuyu detaylı bir biçimde Martin Fowler ve Paramod Sadalage’in makalelerinde bulabilirsiniz. Fakat hem Türkçe bir kaynak eklemek, hem de problemler üzerinden konuyu daha anlaşılabilir kılmak istedim.
Problem Senaryoları
Senaryo 1: Elimizde geliştirmemiz gereken bir proje var. Bu projeyi bir veya birden fazla takım geliştiriyor. Bir veritabanı tasarımı yapılıyor. Ve tüm geliştiriciler ortak bir geliştirme veritabanında çalışıyorlar.
Projenin ikinci ayında, Ali ve Veli’nin elinde iki ayrı senaryo var ve bunları geliştirmek istiyorlar. İkisi de veritabanında çeşitli değişiklikler yapıyorlar. Ve kaynak kod içerisinde de biraz geliştirme yaptıktan sonra sonuçları görmek için projelerini çalıştırıyorlar.
Ali kendi geliştirmelerinin sonuçlarını incelerken, Veli’nin uygulaması hata alıyor. Veli 1 saat zaman harcadıktan sonra Ali’nin yaptığı veritabanı değişikliklerinin Veli’nin çalışmasına engel olduğunu tespit ediyor. Ve Ali’nin yanına giderek durumu biraz ortak zaman harcadıktan sonra ikisinin de çalışabileceği şekilde çözüyorlar. Fakat iki geliştirici de (veya daha fazlası) zaman kaybı yaşıyorlar. Ve bu proje bitimine kadar her hafta neredeyse birçok kez yaşanan düzenli bir zaman kaybı. Proje için de yüksek miktarda verimsizlik ve sorunları barındırıyor.
Senaryo 2: Senaryo 1’deki Veli, ortak veritabanında öyle bir değişiklik yapmıştır ki (drop şema vb. ) tüm ekip veritabanı backup’tan dönene kadar çalışmaya ara verir.
Senaryo 3: Farklı ortamlarda, farklı sürümlerde koşan bir uygulamamız var. Ve bu uygulamayı geliştirmeye devam ediyoruz. Geliştirdiğimiz yeni sürüm 1.6 sürümünde olacak. A kurumu uygulamamızdaki son güncellemeleri almamış ve 1.2 sürümünde. B kurumu ise 1.5 sürümünde. 1.2 sürümü ile 1.5 sürümü arasında A kurumunun uygulaması gereken bir dizi veritabanı değişiklikleri var. Bu durumun manuel takibi gayet zor ve meşakkatli olabiliyor. Ve bu kurum/müşterilerden binlerce olduğunu hayal edin. Ve hepsinin son sürüm değil de örneğin 1.2’den 1.4’e geçmek gibi özel istekleri olduğunu düşünün.
Senaryo 4: Daha önce geliştirilip teslim edilmiş bir sistemin bakımını yapıyoruz. Yine ortak geliştirme ve test veritabanları kullanıyoruz. Kaynak kod ve veritabanı tanımlarını içeren bir sürümü geliştirme ortamında oluştururuz. Sonra bunları test ortamına aktarıp test etmeye çalışırız. Tam da bu noktada geliştirme ortamında daha önce uygulanmış bir çözümün veritabanı scriptinin test ortamına aktarılmadığını, yaptığımız testler sonucunda keşfederiz. Daha olumsuz senaryo da, bunu canlı çalışan ortamda yaşamamız.
Aslında bu senaryoların hepsinin ortak bir noktası var. Hepimiz git, svn vb. yöntemlerle geliştirdiğimiz yazılımların kaynak kodlarındaki değişiklikleri ele alıyoruz. Hiçbirini atlamadan ve bir değişikliğin bir diğerinin çalışmasını engellediği senaryolar da dâhil olmak üzere, hepsinde ne yaptığımızı/yapacağımızı net bir şekilde biliyoruz. Fakat geliştirdiğimiz kod ile alakalı veritabanı değişikliklerimizi de kaynak kod gibi ele almadığımızda yukarıdaki veya benzeri senaryolarla karşılaşabiliyoruz.
Bu sorunların çözümünde ise en etkili yaklaşım olarak “Evolutionary Database Design” yani Evrimsel Veritabanı Tasarımı öne çıkıyor. Çünkü;
- Veritabanı da kaynak kod gibi bir gelişim içerisindedir. Ve değişiklikleri de mevcut kaynak kodun olduğu source control aracı ile tutulmalıdır.
- Kaynak kodumuzu nasıl ki kendi bilgisayarımızda ayağa kaldırıp, görüntüleyip değişiklik yapabiliyoruz, aynı şekilde veritabanımız için de lokal bilgisayarımızda ve istediğimiz şekilde değişikliklerimizi yapıp kimseyi etkilemeden çalışabilmeliyiz.
- İstediğimiz bir anda veritabanımızı sıfırdan oluşturabilmeliyiz. (Bunun ne kadar güçlü bir özellik olduğunu tecrübe ettikçe daha rahat anlayabilirsiniz).
Peki, bu özellikleri uyguladığımızda yukarıdaki sorunlarımız nasıl çözülüyor?
Senaryo 1 ve Çözümü: Ali ve Veli kendi lokal bilgisayarlarında çalıştıkları için birbirlerinin değişikliklerinden kodlarını merge edene kadar haberleri bile olmayabilir. Burada sadece dikkat edilmesi gereken kod merge işleminde bir kişinin veritabanı değişikliği varsa diğerinin conflict alıp (evet veritabanı değişikliğinden dolayı conflict), kaynak kodu ve veritabanı değişikliklerini beraber pull alıp, diğerinin değişikliklerini uygulayıp tekrar göndermesini sağlamak. Bunun için yukarıdaki makalede anlatılan FlyWay ve bunun Continuous Integration ile uygulanması yeterli oluyor.
Senaryo 2 ve Çözümü: Veli sadece kendi lokal bilgisayarındaki veritabanını etkisiz hale getirmiştir. Veritabanımız lokalde sıfırdan oluşturulabildiği için Veli sadece konuyu bilen bir arkadaşının bir defaya mahsus 1–2 dakikasını alarak girdiği durumdan kurtulabilir.
Senaryo 3 ve Çözümü: Her oluşturduğumuz uygulama sürümü, scriptleri ile beraber oluşturulduğu ve Flyway vb. bir araç ile otomatize edilerek scriptleri uygulanabileceği için kullanıcılar istediği sürüme geçmekte özgürdürler. Bu da bizi zor durumda bırakmaz.
Senaryo 4 ve Çözümü: Geliştirdiğimiz kaynak kodlar veritabanı scriptleri ile beraber geliştirici bilgisayarında tüm etkileri görüldüğü ve kodlarla beraber pushlandığı için unutulma ihtimalleri ortadan kalkıyor.
Sonuç
Zaman kaybedebileceğimiz birçok sorunu daha oluşmadan çözebilme şansını bize sunan EvoDB’nin getirdiği birçok avantaj var.
Esneklik ve Hız: Sürekli gelişen gereksinimlere uyum sağlama yeteneği sayesinde iş süreçlerini hızlandırır.
Değişime Kolay Adaptasyon: Geleneksel metodlara göre daha hızlı ve sorunsuz bir şekilde değişiklikleri uygulama imkanı sunar.
Test-First Yaklaşımı: Her güncelleme öncesinde ve sonrasında sistemin kapsamlı bir şekilde test edilmesini sağlayarak sistemin sürekli çalışmasını garanti altına alır.
Yazılım Geliştirme İle Uyum: Yazılım geliştirme yöntemlerine entegre bir şekilde çalışarak veri tabanı gelişimini, yazılımın ilerlemesiyle uyumlu hale getirir.
Evrimsel Veritabanı Tasarımı, geliştiricilerin ve yazılım ekibinin işlerini kolaylaştırırken, değişen müşteri beklentilerine hızlı bir şekilde yanıt verebilen esnek bir yapı sunar. Bu nedenle, günümüzün hızla değişen iş ortamında, Evolutionary Database Design giderek daha fazla kabul gören ve tercih edilen bir yöntem haline gelmektedir. Bu yöntemi benimseyen yazılım ekipleri, değişen ihtiyaçlara anında uyum sağlayarak daha etkin ve verimli bir çalışma ortamı yaratma şansına sahip olmaktadır.