Bazı üniversitelerimizde düzenlenen teknoloji etkinliklerinde geçmişte katılımcı olarak yer aldım. Fırsat bulduğumda ne öğrendiklerini ve nasıl uyguladıklarını aralarda öğrenmeye çalıştım. Kurumsal yazılım yapan profesyonel firmaların yazılımlarını nasıl bir altyapıyla yazdıklarını onlarla paylaşma fırsatını da buldum ve bilgilendirmeye çalıştım. Yapay zeka, derin öğrenme, artırılmış gerçeklik, blockchain, IOT, signaling vs vs . Maalesef en iyi bildiğiniz üniversiteler de dahi bu konuda iyi değiliz. Kabahat öğrenci veya öğretmende değil aslında. Müfredata, notlara bağlı gidiyoruz. Proje ve uygulama bazlı olarak gitsek daha harika olur. Daha az ama etkili dersler çok proje ve uygulama. Piyasa ile üniversite bu açıdan daha yakın çalışmalı.
Bu konuda kariyer günleri adı altında düzenlenen üniversite etkinlikleri öğrencileri iyi bilgilendiremiyor. Sorun burada. Bunun yerine yazılım ve teknolojiyi çok iyi bilen ve bu altyapıları tasarlayan ve yazan mühendisleri davet edip bu konuları enine boyuna anlattırsalar bunlar kesinlikle olmaz.
Bilişim grup ve örgütleri ise düşünce topluluğu ve bol konuşma ötesine gidemiyor ki zaten gitmesi de mümkün gözükmüyor. Sebepleri var onları kızdırmayalım. Devam etsinler 4.0 , 5.0 ha gayret !.
Biz hands-on (yani uygulamış yapmış olarak) tecrübelerimiz ve uyguladıklarımız ile hem konuşalım-anlatalım ve paylaşalım hem de gerçek ve sahici ! yapılmış uygulamalarımızın özellikleri ve çalışmasını video larla gösterelim. Gençlerimiz umarım ilham alırlar ve katkımız olur. Kolayı değil zoru seçmelerini ancak bunun bize ve ülkemize fayda getireceğini görmelerini isterim.
Şimdi konumuzu anlatmaya başlayalım. Burada anlattıklarımın hiçbiri bir yerlerden aşırılıp ya da öğrenilip copy-paste yapılarak yazılmış değil tamamen kendi tecrübe , uygulama ve birikimlerimden sizlerle paylaştığım bilgilerdir.
Bir yazılım projesi aldığınızda ya terzi usulü yazılımı yaparsınız ya da bir açık kaynak kodlu framework ya da para ile satın aldığınız bir diğer framework ü kullanır ya da çok vizyoner iseniz kendi yazdığınız framework ü kullanarak bu yazılımları yazarsınız.
Konumuz esasında kurumsal framework.. Yazılım altyapı iskeleti.. Güvenlik, log tutma, menüler, kullanici sayfa ve kontrol haklari, DAL-BLL-UI nin bir çok kısmını otomatik yapması vs vs .. Yani bir nevi program yazan program.. Faydası nedir? Yazılım geliştirme süreçlerini zaman açısından kısaltıyor, hata-bug olma olasılığını düşürüyor, kolayca ayar değiştirilebiliyor, hatalar kolay bulunuyor, mühendisin yazılım dilinden çok süreçlere odaklanıp yazılımsal olarak çözmesini sağlıyor, bununla yapılan yazılımların da kendisinin de bakımı kolay oluyor, DAL-Data Access Layer, BLL-Business Logic Layer ve UI nin bir çok kısmını otomatik hallediyor, OOP nin tüm özelliklerini çok iyi kullandığından altyapıda yapılan bir değişikliğin türetilen sınıflara yansıması otomatik olduğundan bakım sorunsuz oluyor vs vs Aklınıza gelebilecek tüm dünyadaki kurumsal yazılım yapan yazılım evleri bu yapıyı kullanır..
Terzi usulünde genelde ORM (Object Relational Mapping) dediğimiz ve veri katmanı (DAL- Data Access Layer) ve iş mantığı tanımlarının olduğu (BLL-Business Logic Layer) katmanını otomatik oluşturan yazılımları kullanarak veri tabanındaki her tablo için 2 tane class-sınıf oluşturur işlerinizi bunlar üzerinden yaparsınız.
Buna ek olarak bir de sizin ekran yani UI (user interface) sınıfı kodunuz da (ki iş mantığı bunun da içine yazılabilir) 3. sü olarak projenizde yer alır. Bunu bilmiyorsanız saldım çayıra mevlam kayıra hepsini kendiniz yazarsınız. ORM yazılımlarının faydası oldukça fazladır. Birtakım dezavantajları da vardır. Performans sorunları ve örneğin veritabanındaki herhangi bir tablo da değişiklik olduğunda yeniden oluşturulmaları gerekir.
Bunun yanında UI dediğimiz kullanıcı ara birimini ve diğer iş mantığını da sizin yazmanız gerekir. Burada yazılım mühendisi DAL ve BLL yerine UI ve iş mantığına odaklanır. Zaten zamanının çoğu burada geçer. Oluşturduğu UI sınıfı ki ekran görüntüsüdür bu örneğin 2000 ekran kadar olsa başımıza ne gelebilir sorusu ortaya çıkar. Eğer klasik ekran kontrollerini sürükle bırak ile ekrana koyarsanız ve ileride örneğin tüm textbox ların bir özelliğini değiştirmek istediğinizde ne olur? 2000 ekrana gidip tek tek değiştirmeniz gerekir. Halbuki ekranlarda kullandığınız tüm kontrolleri de subclass dediğimiz yöntemle OOP (Object Oriented Programming) ile inheritance dediğimiz miras veya kalıtsallık özelliğiyle ana sınıftan türetirseniz bunlar başınıza gelmez. Türettiğiniz textbox da yaptığınız tek değişiklik 2000 ekrana da anında etki edecektir otomatikman. Bundan başka benzer çok fazla da faydası vardır.
Peki biz ORM yaklaşımı yerine çok daha kapasiteli bir altyapı yani örneğin Hibernate veya NHibernate gibi bir yazılımı yazsak nasıl olur? (Bugün bir çok kişi ve firma bu yazılımı kullanarak yazılım çözümleri üretiyor. Ben hiç kullanmadım. Kendi yazdığım framework leri kullandım.) Tabii ki harika olur. Çalıştığınız şirketler kurumsal ve büyük ise mutlaka böyle bir altyapınız olmalı.
Mimari yapı ve tasarım olarak nasıl bir tasarım uygulayacağınıza çok tecrübeli yazılım mimarı ve paydaşları karar vermeli. Sizin ve müşterilerinizin tam olarak ne istediğini bilen, esnek, performanslı, güvenli, geleceğe yönelik, riski minimum olan, teknolojideki gelişmelerden çok az etkilenebilecek, bir çok işi otomatik yapan, iş mantığına odaklanılıp o tarafta yazılım mühendisine fokuslanma olanağı veren bir yapı.
Bunun için küçük ve çalışan prototipler yapıp paydaşlarla paylaşıp fikirlerini dinlemelisiniz. Burada gerçek prototipten bahsediyorum öyle mockup lar yazıp işin kolayına kaçmayın. Tasarım her şeydir. Bu nedenle yazılım mimarı veya mimarları donanım, mikro işlemciler, network, web, Windows, api, entegrasyonlar, güvenlik vb tüm konularda çok tecrübeli olmalıdırlar. Örneğin C#.NET ile yazılım yapıyorsunuz ve web altyapınızda session ları nasıl tutacağınız konusu çok önemli. Eğer yazılımınızda leakage dediğimiz sızıntı yani kod hataları olursa çalışan web uygulamanız recycle olur (tüm sessionlar sona erdirilir ve aspnet process i uygulamanızı yeniden başlatır. (Örmek olarak 500.000 kayıt olan bir tablodan yanlışlıkla tüm kayıtları getirirseniz bu veri hafızada aspnet process için ayrılan sınırlı ! hafızayı kullandığından ve yer kalmadığı durumda tüm yazılımı recycle yapar. Bu çok ilginçtir.) Her kullanıcı login e düşer). Bunu aşmak için sorun çıktığında şaşırıp sessionları In-Process yerine Out-of-Process e çevirip (SQL veya ASPNET state machine) dışarıda tutarak recycle olsa bile dışarıdan bakıldığında sessionları kaybedilmediği bir ortama çeviren cin fikirli yazılım mühendisleri de görürüz. ( Sorun çözülmemiştir çünkü sorunun kaynağını bulamamıştır ya da pek çok şeyi düzeltmesi gerekeceğinden dokunmaz hiçbir koda ve etrafından dolaşıp kimse anlamadan sorunu sanki çözmüş olur. Zaten kimse de anlamaz buna güvenir aklınca.) Ya da ana bilgisayarda 4 adet mikro işlemci var ve siz hepsini kullandığınızı sanırsınız. Halbuki öyle değil. Bu ayarı nasıl yapmalısınız bunu bilmelisiniz. Daha da ötesi bunu yapsanız bile CPU affinity konusunu bilmeli ve sessionlarınızın başına ne gelebileceğini de hesaplamanız gerekir. Bunun yerine tasarımın üzerine odaklanılmalı. Bunların tümü düşünülmeli. Tasarımda session yönetimi konusu ileri düzeyde ele alınmalıdır. Tüm seçenekleri çok az ayar ile kullanabilmeli bu konularda esnek olunmalıdır.
Bir web framework ü yazmak Windows ya da desktop uygulamasını yazmaktan 4-8 kat daha da zordur. Özellikle web de postback mekanizması ve ajax (Asynchronous JavaScript and XML) gibi her konu özenle tasarımlanmalıdır. Entegrasyonlar ve api için de Web Servisleri (xml over http) de tasarımda yer bulmalıdır gerekirse.
Yazılım framework ü tasarımında ilk anda veritabanı da dikkate alınmalıdır. Özellikle tablo bazında reflection veya ekran (UI) üzerinde kontrollerin reflection ile taranarak property dediğimiz kontrollerin özelliklerinin değerleri alınıp yazılım tarafından otomatik olarak bir çok işin yazılım mühendisine hiç zorluk çıkarmadan yapılması düşünülebilir. Tablo bazında reflection ise özel bir notasyon ile BAL yani tablolardaki kolonların bir class a (sınıfa) çevrilip kodlanması ve yine reflection ile UI den girilen değerlerin buradan alınıp işlenmesi olayıdır.
Bir başka yaklaşım ise ki SAP , Axapta vb yazılımların yaptığı gibi META veri ile çalışmaktır. Nedir META? Verinin ne olduğunu açıklayan veridir. Örneğin HTML verinin nasıl gösterileceği üzerine odaklanır. META ise verinin ne olduğunu anlatır. Veri tablolarınızı veri tabanında oluşturduktan sonra ayrıca META veriyi saklayacağınız tabloları da oluşturmanız gerekir bu tasarımda. Ne var peki bu tablolarda.? Örneğin kişi bilgilerinizi tutan bir tablonuz var. Bunun tüm alanlarının çok daha fazla detayını bu META tabloda tutup ileriye yönelik tasarım yapabilirsiniz. Veya kişi tablonuzda olmayan ancak daha sonradan kullanıcı tarafından eklenmesine çalışan yazılımdan müsaade edilen bir alanı bu META tablosuna ekleyebilirsiniz. Böylece taban olarak kendi koyduğunuz alanlar dışında bir de kullanıcı tanımlı alanlar da kullanılabilecektir. Bu alanların ekranda gösterilmesi ve işlenebilmesi için işte yazacağınız altyapı yazılımı bunları da destekleyebilmelidir. Kendi yazdığım framework de BPM tarafı hem normal şekilde hem de bir direktifle META üzerinden XML olarak çalışmaktadır.
Bundan başka örneğin yazılım ayar dosyalarında yapılacak tek bir değişiklikle veya yazılım içinden yapılacak bir işlem ile değişik veri tabanlarına veya tansaction la ra göre çalışabilmeli.
Yazılım mühendisi sadece analizi yapılan işin mantığına odaklanıp yazılım yapmalı ve yazılım altyapısına koyacağınız ezilebilir yöntemlerle yazılımın belli anlarında içinde çalışma mantığına müdahale edip değiştirebilmelidir. Subclass ettiğiniz tüm kontrollere ekstra özellikle ekleyip (tasarımdan) yazılım mühendisinin işini kolaylaştırmalısınız. Örneğin ekrana koyduğunuz bir textbox için yazılım mühendisi client tarafta yani browser da çalışacak javascript kodlarını (Web Server tarafında değil web kullanıcısının browser ında çalışacak) hiç yazmamalı siz bunları o kontrolün framework de ki kodundaki property dediğimiz özelliklerine bu javascriptleri koymali ve yazılım mühendisi yazılımı yaparken ekrandan sadece o kontrolün özellğine gelip istediğini şöyle olsun işte büyük harf olsun, emal olsun kontrol et, baş harfi büyük olsun, sadece rakamlar olsun, sadece harfler olsun vb diye sadece tek tık ile seçebilmelidir. Herhangi bir anda bu javascriptlere bir ekleme ya da bugfix yapıldığında sadece tek bir yerde yani altyapıda değişiklik yaparak daha önce yapılan binlerce ekranın otomatik güncellenmesi yapılması sizi zamandan kurtaracak ve aykırı kodlar yazılmasına izin vermemenizi sağlayacaktır.
Daha onlarca yaklaşım vardır buraya şimdilik yazmayacağım. Bunun yanında yapılacak bir yazılımın tasarımı aslında veritabanından başlar. Ancak bu tür bir framework yani altyapı yazılımı ya da program yazan program yapıyorsanız veritabanı bu işin sadece bir parçasıdır ve illa oradan başlamanız gerekmez. Ancak veritabanı tarafındaki optimizasyonlara da vakıf olmanız gerekir. Yazılım tarafında veritabanını etkileyen isolation level ı da zaman zaman ayarlamanız gerekebilir. SQL komutlarınızın veritabanında lock atması ve özellikle deadlock oluşması hiç istenmez. Burada deadlock a uğrayan iki kayıttan biri veritabanı tarafından victim yani kurban olarak seçilip işlemi öldürülürse bu size yazılımda yavaşlama ve sonrasında tutarsız veriler olarak geri dönebilir. Deadlock ları önlemek de sizin sorumluluğunuzda. Güvenlik, session, kullanıcı, veritabanı, UI, BAL vs vs bir çok ayağı vardır bu yazılımların. Tabii ki yapılırken varmak istediğiniz hedef ne kadar net ise ve ne kadar ileri düzey bilginiz var ise ve ne kadar her konuyu paydaşlarla paylaşıp fikir alıyorsanız o kadar başarılı olursunuz.
Bazı yazılım şirketleri ise iş mantığını veritabanı katmanına koymakta. Yani Sp dediğimiz stored procedure lar içine bu mantığı koyup size sadece verileri bu SP lere gönderip işi veritabanındaki kodlamaya bırakıyorlar. Bu doğal olarak hız ve bakım maliyeti avantajı da sağlıyor. Tabii SQL lerin ölçeklenmede bu konularda memory yani hafıza kapasitesine çok bağımlı olduklarını unutmamamız gerekir. Bunun yanında hatta bazı tablo alanlarına kaynak kodu dahi yazmak (iş mantığı) ve bunu yazılım tarafında alarak on-the-fly derleme ile derleyip çalıştırarak işlem yapan yaklaşımlarda kullandık geçmişte.
Web Farm üzerinde Load Balancing (Yük dengeleme) ve hatta sticky IP (O an web server a bağlanan web kullanıcısı session i bitene kadar web farm içindeki aynı web server a bağlanıyor. Yani aynı IP li server a bağlanıyor yapışıyor ! Niye bilin bakalım!?) ile yükü paylaşarak ölçeklendirme yapmak da kapasitenin ne olduğunun bilindiği anlarda dikkate alınmalıdır. Veritabanı tarafında failover Clustering de düşünülmelidir. Yazılımın performansı ve güvenli (reliable) , robust olması son derece önemlidir. Ve bu da tamamen tasarımdan gelmektedir.
Burada çok daha ilginç deneyimlerimden ikisini daha paylaşayım.
Birincisi: Framework ünüz içine bir library yani kütüphane ekleyerek aynen DAL katmanında çalışanlar gibi sql kodunuzu önce buradaki bir metoda gönderip istediğiniz SQL ürünü hangisi ise (Oracle, MS SQL Server vb) ona göre bu sql kodunuzu değiştirip optimize edebilirsiniz. Böylece veritabanlarındaki komutların farklı isim ve kullanımlarını da düşünmek zorunda kalmazsınız.
İkincisi: Oracle veritabanı ve orta katman ürünleriyle çalışırken bakın neler yapabiliriz. .Net ile yani C# vb kodlama ve proje yapıyorsunuz ama çalışan web uygulamanız zaman zaman Oracle orta katman ürünleriyle örneğin Oracle BPM ile haberleşecek ve orada oluşturduğunuz süreci çalıştırmak isteyecek. Oracle bize Oracle ADF (Application Development Framework) kullanarak (alt yapısı Java EE) yazmamızı istiyor. Hele de özellikle .NET tarafta projeden çağıracaksanız istemiyor .. Halbuki Oracle SSO (Single Sign On) teknolojisini bilirseniz .NET tarafta http header larınıza SSO ile ilgili uygun veriyi gömerseniz ve bu web sayfası ile bu Oracle tarafına sign in yani login yapıp sorun olmadan bu BPM sürecini otomatik çağırabilirsinz. Böylece yatırımınız boşa gitmez. Oracle ADF maalesef bana göre çok kötü. Özellikle BPM tarafındaki ekran hazırlamalar vb. Çok iyi bilen yok, kaynak bulmak zor. İnanın dediğim şekilde yapın harika sonuçlar alırsınız. Bazıları da deli olur. !
Tabii yukarıda açıkladığım çözüm ve yaklaşım Oracle BPM de süreç için anlattım. Diğer parçalar içinde geçerli olur. Ama siz kendi BPM Workflow çözümünüzü kendi framework ünüz içinde altyapı olarak yazarsanız başkasının BPM altyapısına ihtiyacınız olmaz. Yine bu BPM kodlarınızın içinde kritik yerlere ezilebilir metodlar koyarak sürecinizin içindeki çalışırken o anlara gidilip yazılım mühendisinin istediği her şeyi yapabilmesini de sağlarsınız. Bu tür bir framework ile birlikte BPM çözümünü de yazdığımdan size de tavsiye ederim. Zor oluyor ancak çok kolay süreç yönetimi yapılabiliyor. Çok esnek, reliable, robust ve performanslı oluyor. Bu yazılımımın video larını bu yazının en sonundaki linkte bulabilirsiniz.
Peki mobil bunun ne tarafında diye sorabilirsiniz. Biz bu framework ile örneğin mobil tarafta ne yapabiliriz. Şöyle diyelim: Cross-Platform tool lar. Örneğin Xamarin diye bir firma ve ürün var. (PhoneGap, Cordova vb) Microsoft aldı sanıyorum bunu. Bu üründe C# ile yazıyorsunuz mobil yazılımınızı ve hem IOS hem de Android için kod üretiyor. Bu tür ürünler native kodlama dediğimiz Android için Java ve IOS için Objective C veya swift ile yazdığınız programlardan daha fazla kod içinde overhead yaratıyor. Xamarin biraz daha native e yakın kod üretiyor ve tek bir yazılım yapıp her iki ortama da hemen derleyip koyabiliyorsunuz. Ancak ileri düzey mobil yazılımlar mutlaka native dediğimiz Android Java/Kotlin ve IOS için Objective C veya swift ile olmalıdır. Zaten ileri düzey grafik, oyun, ui vb yazamazsınız bununla. Tamamen native koda çeviren bir tool ile de işinizi görmeniz mümkün eğer varsa !. Xamarin dışında diğerleri daha çok javascript ile cross-platform çözüm üretiyor ve daha çok interpreter (kodu yorumluyor dolayısı ile yavaş.. Aslında daha derin bir inceleme ile sizin kodunuzu derlerken içine light bir browser koyuyor siz ve kullanıcı bunu göremiyorsunuz ve o browser içinde kodu çalıştırıyor. Dolayısı ile overhead yani çalışan kod büyüyor.) gibi çalışıyor. Web framework ümüz ise gerekirse başta anlattığımız entegrasyon ile yani web servisleri ve api larla mobil tarafa destek verebilir. Ben şahsen her zaman Android Java / Kotlin native kullanarak mobil tarafta yazdım. Yine de siz bilirsiniz. Bu arada Özellikle Google Flutter-Dart ( Dart yazılım dili ) ve facebook un React Native (javascript) cross platform yazılım dillerine de çok dikkat edin derim… En azından birini öğrenin..
Bu yazıda bahsedilen konular ve daha fazlasını UDEMY de ki C# ile Hayatın Gerçekleri kursumda anlattım.. Özellikle C# dilini vb giriş seviyesinde anlatmadım.. O kadar çok anlatan kurs vardı ki ben de gençlere ve meraklılarına tüm bunlardan farklı ve bulamayacakları bir eğitim vermek istedim.. En azından konu başlıklarına bir göz atın isterim..
Tarafımdan yazılan böyle bir framework ile ilgili özellikler ve çalışması ile ilgili video lara şu adresten ulaşabilirsiniz: Yazılımın adı : SmartLib Web Application Framework
https://www.youtube.com/user/socialmediagent
Sağlıcakla kalın.
Selcuk Celik