Yeni ve uzun soluklu iki makale serisine başlıyoruz. (Allah utandırmasın) Bu seride reaktif programlamayı ele alacağız. Paralelinde ise microservisler konusunda ilerlemeye çalışacağız. İki konunun özüne kısa bir göz attığımızda data üzerinde yoğunlaştıklarını görmekteyiz. Aslında birbirleriyle de iyi anlaşırlar.

Bu yazı dizisinde konuşacaklarımız tüm programlama dillerine uyarlanabilir. Herhangi bir dil üzerinden ya da salt herhangi bir dili baz alarak ilerlemeyeceğiz.

Bu yazı dizisinde Reactive Programlama, Functional Programlama, Functional Reactive Programming, Stream, Big Data ve Microservice konularında uzunca konuşacağız. Serinin anahtar kelimeleri bunlar olacaklar. İlk olarak temel tanımlamaları yapacağız ardında kod anlamında örnekler eşliğinde ilerleyeceğiz.

Functional Programlama ile Reactive Programlama aynı şeyler değillerdir. Sürekli bir arada kullanıldıklarından zaman zaman aynıymış gibi tanımlandıklarını görmekteyiz. Birbirlerini tanımlamazlar ancak birbirlerini tamamladıklarını rahatlıkla söyleyebiliriz.

Aslında tüm yazılım dilleri ve paradigmaları data ve/veya veri üzerinde yoğunlaşmıyorlar mı? Yazılım dediğimiz serüven en nihayetinde; veriyi bir yerden alıp, bir şekilde işleyip, bir yere taşıyıp, bir yere yazmak değil midir?

Büyükmüş küçükmüş ne farkeder, datayı işlemek ruhumuzda var diyerek olaya arabesk bir boyut katmaktan zarar gelmeyecektir. Canlılık bile katacaktır. Müslüm Gürses – Hangimiz Sevmedik

Evet data’nın büyüğü küçüğü yoktur, olmamalıdır. Data her anlamda biz yazılımcıların en değerli varlığıdır. Yazılım evriminin bir döneminde veriyi yaratmak ve bir yerlerde saklamak çok büyük önem arz etmekteydi. Günümüzde ise kaydedilmiş veriyi başarılı şekilde işlemek büyük önem arzetmektedir.

Bu iki makale serisinde veri işleme, veriyi işlemek gibi terimler kullanıldığında

veriyi bir yerden alıp, bir şekilde işleyip, bir yere taşıyıp, bir yere yazmak

şeklindeki genel veri işleme süreçleri kastedilmektedir

Günümüzde veri işleme yöntemleri çeşitlendiği gibi verilerin elde edildiği ve işlendiği ortamlarda çok çeşitlenmiştir. Nihayetinde veriyi elde etme ve işleme ortamlarımız arasında bir senkronizasyona, kaliteli ve tutarlı işlem yapma becerisine ihtiyacımız bulunmaktadır. (Data Integrity ve Data Consistency gibi kavramlar incelenebilir.) Bu bağlamda işin tarihsel akışına girmeden ve girişi daha uzatmadan reaktif programlamaya girelim.

Günümüzde çok yaygın olan ve ana akım olarak adlandırabileceğimiz programlama dillerinin bir çoğu imperative (procedural) programlama kategorisine girmektedirler. C#, C++, ve Java vb. Bu yaklaşım ya da paradigmaya sahip olan dillerde yazılımcı; problemin çözüm aşamalarını detaylıca adım adım kodlar ve makineler bu kodları adım adım çalıştırıp verileri işleyerek sonuç üretirler. Burada yazılan kod odak noktasını kaybetmez. Yani sadece üzerine aldığı işi bitirmeye odaklanmıştır. Bu kod içerisine bu işlem ile ilgili başka bir değişken, yeni bir değer eklemeye çalıştığımızda çarşı karışır. (side effect) Doğru sonucu üretmek isteyen uygulama yeni gelen veri işlemek için yaptığı tüm işlemleri geri sarmalı (callback) ve hesaplamalarını baştan yapmalıdır. Yani bir işlem bir sıralama içerisinde yapılmalıdır.

Side effects olarak da adlandırabileceğimiz sonradan yapılmış veri değişiklikleri ve/veya veri istekleri ele alınırken kullanılan yöntem, günümüzdeki hız ve verim ihtiyacı düşünülünce yetersiz kalmaktadır.

Güncel hayata uyarlama yaparsak;

  1. Bir kahveciden kahvenizi aldınız ve çıktınız. Belirli bir süre sonra kahvenizden ilk yudumu aldığınızda şeker ve süt eklenmediğini farkettiniz. Bu durumda kahveciye dönerek yeni bir kahve siparişi vermeli ve tüm süreci yeniden işletmelisiniz.
  2. Bir kahvecide kahve alma sırasına girdiniz. Kahvenizi alıncaya kadar başka bir iş yapamazsınız. Telefonuza bakamaz, tweet atamazsınız. Belki de o tweet ile dünyayı kurtaracaktınız. Kim bilebilir?

Bu noktada başka bir manifesto ya da paradigma olan Reaktif Programlama öne çıkmaktadır. Peki nedir bu Reaktif Programlama.

Reactive Programlama Nedir?

Yan etkileri işleyebilecek veya yan etkileri de anında işleme alabilecek şekilde yapılan tasarımlara sahip uygulamalara / kod parçacıklarına Reactive denir. Örneğin kahve sırasında beklerken başka bir işlemi yapmak side effect’i de program içerisinde işleme almak demektir.

Reaktif programlar; uygulama çalışırken kod satırlarındaki akışı takip etmek yerine olayları takip ederler. (event)

Event

Olayları gelecekte oluşabilecek herhangi bir işlem ya da işlem isteği olarak düşünebiliriz. Bir nevi oluşabilecek side effects olarak da adlandırabiliriz.

Stream

Genelde programlar birden fazla olayı ele aldıklarından bu olaylar bir dizi gibi düşünülebilir ya da bir dizi oluşturabilirler. Bu olaylar dizisine ise Stream denir. (stream of events) Reaktif programlama; stream’ler üzerine kuruludur. Bu stream’ler bir çok yolla uygulamaya ulaşabilir. Uygulama daima bu stream’lere cevap verebilecek durumda olmalıdır.

Güncel hayata uyarlama yaparsak;

  1. Kahvecide beklerken twitter akışını takip etmek kahve alma stream’i içerisinde yan bir olaydır. (side effect)
  2. Ya da kahvecinin iyi bir twitter kullanıcısı olduğunu düşünelim. Kahveci tweet atarak takipçileriyle promosyon kodu paylaşmaktadır. Siz de kahvecinin takipçisi iseniz bu promosyon kodunu kullanarak indirim kazanabilirsiniz. Bakın kahve alma sürecine; dışarıdan ve süreci doğrudan etkileyen bir olay eklemiş olduk. (side effect)

Buradan hareketle Reaktif uygulamalar; aynı anda birden çok olayı –Stream– dinleyerek ya da takip ederek pozisyon alabilen ya da değiştirebilen kod parçacıklarından oluşurlar.

Not: Bu stream’ler birbirlerini refere edilebilir, map’lenebilir ya da karşılatırılabilirler.

Object Oriented Programming, nesneleri baz alarak oluşturulan yazılım deseninin adıdır. Yani yazılımlar; gerçek hayattaki nesneler ve nesnelerin bileşenleri / organları baz alınarak tasarlanmaktadır.

Reactive Programming ise olaylar baz alınarak tasarlanan yazılım deseninin adıdır diyebiliriz. Hayatlarımızda anlık / günlük olarak yüzlerce olay ortaya çıkmaktadır. Bu olayları bazen biz yaratır bazen de sadece tepki veririz. Bu bakımdan reaktif programalamayı yaşanan bir hayat gibi cap canlı bir mekanizma olarak düşünmek oldukça yerinde olacaktır. Bir yerde bir olay var ise bir yerde de bu olaya bir tepki oluşacaktır.

Günümüzde biz mi uygulamaları yönetiyoruz uygulamalar bizi mi çok net değil. Oldukça gri bir çağda yaşıyoruz. Öyle ki yazılımları; hayatımızın her alanında bizlerle birlikte yaşayan elektro organizmalar olarak düşünmeden edemiyor insan. (side effect)

Böyle bir çağda uygulamaları sadece katı nesnel kalıplar içerisinde düşünmek yerine olaylara karşı tepki veren elektro organizmalar olarak düşünmek daha yerinde olmaz mı? (Reactive Programming)

Bir sonraki yazımızda Reactive Manifestoya değineceğiz. Merak edenler buradan Reactive Manifesto inceleyebilirler.

Sonrasında; Functional Programlama, Functional Reactive Programming, Stream, Big Data ve Microservice metodolojilerinin tanımlamalarını yaparak Elektro Organizma evrenindeki yerlerine bakacağız.

8 YORUMLAR

  1. Ağzınıza sağlık, çok teşekkürler hocam.Reaktif programlama da tüm işler asenkron şekilde yürütülüyor diyebilir miyiz?Reaktif programlamayı gerçekleyebilmek için alakalı tüm sistemlerin reaktif özelliği olması gerekir mi mesela veritabanı gibi.

    • Teşekkürler Sefa’cım.
      Side efect diyebileceğimiz olaylar uygulamaya zaten asenkron olarak dahil olmuyor mu? 🙂
      Umuyorum ki tüm sorularına makale serisi içerisnde cevap bulacaksın, az sabır. Burada yazarsak makaleyi yazmayalım değil mi. 🙂

CEVAP VER

Please enter your comment!
Please enter your name here