Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…
İnsanoğlunun zaman ilerledikçe bazı aksiyonları almakta ve değişikliklere adapte olmakta zorlanması gibi, “yaşlanmak” dediğimiz gerçekler, yazılım uygulamaları ve çözümleri içinde geçerli. Yazılım çözümlerinin çok yaygın olduğu bir çağda yaşadığımız ve etrafımızın yazılımlar ile çevrili olmasından dolayı bu “yaşlanan” yazılım çözümleri ile daha sık karşılaşıyoruz.

Yaşlanan yazılım uygulamaları için genellikle yazılım dünyası insanları olarak “Legacy” tabirini kullanırız bildiğiniz gibi. Biraz daha net anlamı anlamak için; “Günün şartlarına uymayan uygulamalar ve çözümlere “Legacy” uygulamalar diyoruz” diyebilirim. 10 yıl önce, hatta daha da önce geliştirilen ve hala kullanılan, ama artık negatif yönlerinin ağır bastığı, belli ihtiyaçları karşılamasının zor olduğu “Legacy” uygulamalar eminim bir çok kişinin karşısına çıkıyordur.

“Legacy” uygulamalar günün şartlarına uymamaları, adaptasyon güçlükleri yaşatmalarından dolayı oldukça zorlayıcı uygulamalar olabilir. Günün şartlarına uymamaları derken, atıl kalan donanımlar, desteklenmeyen işletim sistemleri, veri saklama sistemleri, değişim ihtiyaçları, performans durumları, kullanım şekillerinin çeşitliliği vs. bir çok başlık sayabilirim ama şimdi bunlara girmiyoruz.

Windows NT’den nerelere geldik 🙂

Windows NT üzerinde çalışan, PHP 3.0 ile geliştirilmiş, WEB bileşenleri sadece Internet Explorer’da düzgün çalışan, RDBMS olarak SQL Server 7.0 kullanan bir uygulamanın günümüzde hala yoğun bir şekilde kullanıldığını düşünün…Günümüze gelene kadar alt yapı olarak geliştirmelerin ve upgrade’lerin riskleri, iş ihtiyaçlarının en önemli olduğu algısı ve en önemlisi de insan faktörü yüzünden uygulama bu zamanın şartlarına uymayan bir çözüm olarak karşımızda…

Çok uç bileşenler ile bir örnekleri oldu ama benzer senaryolar var.

Bu tarz uygulamalar ne kadar zorlayıcı da olsa, günün IT çalışanları tarafından “offf poff” şeklinde yaklaşılıp, ne kadar çok negatif şey söylense de (bu arada hepsi genelde doğrudur), unutulmaması gereken çok önemli bir nokta var; “Değer”.

“Legacy” dediğimiz uygulamalar, sistemler öyle önemli bir değer yaratmışlar ki hala günümüze denk yaşayabilmişlerdir demek ki. 10, 15, 20 yıldır ayakta olan uygulamaları düşünün; ilk kullanıldıkları dönemlerden beri insanlara ve belli iş modellerine o kadar çok değer katıyorlar ki, hala o değeri koruma mücadelesinde içindeler… Biraz daha toparlamak gerekirse “Legacy” diye adlandırdığımız uygulamalar, ne kadar çok negatif bileşenle günümüze gelse de sahip oldukları “değer” çok önemlidir… Ve bu değer uygulamaların en güçlü özelliğidir.

Bir uygulamanın “Legacy” olarak adlandırılmaması, 10 yıl sonra da günün ihtiyaçlarını kolaylıkla karşılayabilmesi, bir 10 yıl sonra kattığı değerin üstüne yeni değerleri koyabilmesi için neler yapılması lazım, nasıl geliştirilmesi lazım falan filan bunlardan şimdi bahsetmeyeceğim… Derya deniz konular çünkü…15-20 yıl önce bir uygulamayı değişime hazır bir şekilde geliştirmek, bulunduğu zamanın ihtiyaçlarına uygun geliştirmek pek mümkün değildi belki, ama günümüzdeki yaklaşımlar yazılımların ömürlerini biraz daha kaliteli kılmayı sağlıyor. Arada karalarım ama bir şeyler.

Devam…

Kısa olsun… Uzun uzun yazmaya hiç gerek yok bu sefer. Geçenlerde yoğun bir “stored procedure(SP)” kullanımı olan sistemde, geliştirilen SP‘lerde hangi tabloların kullanıldığını öğrenme ihtiyacım oldu. Yoğun iş kuralları içeren, büyük sayıdaki SP’lerde nerelere dokunulmuş öğrenmek için güzel bir yaklaşım olabilir. Kenarda, köşede dursun diye hemen yazasım geldi…Buyrun kullanın, istediğiniz gibi de geliştirin benim bu Gist’i… 🙂

Microsoft’un resmi olarak paylaşmadığı ve kullanmayı tavsiye etmediği ama zaman zaman çok yardımcı olan bazı veri tabanı nesneleri; saklı yordamlar(stored procedure,SP) SQL Server bünyesinde bizlere çaktırılmadan sunuluyor. Benim zamanında çok faydalandığım bu SP’ler ile yakın zamanda tekrardan haşır neşir olma durumum oldu. Hemen kısaca paylaşacak birşeyler de çıkmış oldu böylece 🙂 Dokümante edilmeyen bu SP’ler daha çok Microsoft’un kendi iç uygulamalarında ya da kendi ihtiyaçları doğrultusunda geliştirilmiş SP’ler. SP’lerin çoğunun içeriğini göremiyoruz ve bu SP’ler herhangi bir güncelleme ya da versiyon değişikliğinde değişmiş olabilir. Microsoft’un hizmet olarak sunmadığı ve desteklemediği bu SP’leri bu bilinç ile kullanabiliyoruz. Ama üretim ortamlarında kullanılması Microsoft’un desteklemediği bir durum.

Bahsetmiş olduğum bu dokümante edilmeyen SP’ler, bir çoğumuzun sistem nesneleri diye bildiği sys. şeması altında. sp_MS% ile başlayan bu SP’ler isimlerinden kısmen yaptıklarını anlatır durumda. Tüm SQL Server seviyesinde gerçekleştirmek istediğiniz bir çok operasyonu bu SP’ler sayesinde yapabiliyorsunuz. Mesela SQL Server’daki tüm veri tabanlarında bazı değişiklikler yapmak, bir veri tabanındaki tüm tablodaki INDEX’leri tekrardan oluşturmak, veri tabanındaki tüm tabloların isimlerini değiştirmek ya da spesifik kolon eklemek gibi gibi işlemleri bu SP’ler sayesinde yapabiliyoruz.

Mesela veri tabanındaki tüm tablolara standart bir kolon eklemeniz gerekecek. Veri tabanındaki tablo sayınız 200 civarında diyelim. Örnek senaryoda 200 adet olan tablo içeren veri tabanımızdaki tüm tablolara FirstName ve LastName diye 2 kolon ekleyelim. Bu işlemi tek bir SP yardımı ile çok kolay bir şekilde yapabiliyoruz. Bu senaryo için kullanacağımız SP, sp_MSforeachtable olsun…

  EXEC sp_MSforeachtable N'ALTER TABLE ? 
                                ADD [FirstName] VARCHAR(100),
                                    [LastName] VARCHAR(100)';

Mesela tüm tablolardaki son 5 kaydı görmek istediğimizde de aşağıdaki gibi bir SP kullanabiliriz. Dikkat ederseniz SP’ye parametre olarak isteğimiz her türlü SQL sorgusunu şablon olarak verebiliyoruz. ? anahtar simgesini kullanarak SP’nin tüm tablolar için çalıştığında ? yerine tablo isminin geldiğini söyleyebilirim. Aşağıda da tüm tablolar için çalışacak bir SELECT sorgusu örneğine bakalım…

  EXEC sp_MSforeachtable N'SELECT TOP 5 * FROM ? with (nolock) ORDER BY ID desc'

Örnek olması için sadece tablo seviyesindeki  işlemleri yapabilmek için SP’yi paylaştım ancak bir çok farklı SP mevcut. Dediğim gibi bazı SP’lerin içeriğini görebiliyoruz ama bazıları açılmıyor. SP parametreleri ile SP’lerin nasıl çalıştığını deneyerek biraz debelenmek gerekiyor.

Dokümante edilmeyen bu SP’lerin varlığından haberdar olmak bazı operasyonlar için uğraşmayı kolaylaştırıyor. Fikir vermesi adına umarım faydalı olmuştur… Şimdilik bu kadar.

Not: Bu arada bu yazıyı yazarken MS SQL Server 2017‘yi macOS üzerinde Docker üstünde çalıştırdım. Ayrıca SQL Operations Studio ile SQL sorgularını çalıştırdım.

Machine Learning” nedir sorusuna verilebilecek bir çok cevap var aslında. Günümüzdeki popülerliğinden dolayı dışarı çıkıp sorsak eminim herkesin söyleyecek bir şeyi olacaktır. Yapay zeka, robotlar, otomasyon, tahmin etme gibi gibi günümüzün bir çok konseptiyle ilişkili olduğundan hepimizin bir fikri olacaktır. Ve bu söylenen şeylerin büyük bir kısmı da doğru(?) olarak nitelendirilebilir. Açıkcası profesyonel olarak uğraştığım bir konu değil; araştırma-öğrenme şeklinde takip ettiğim, belli PoC(Proof of Concept) çalışmaları yaptığım bir konu. Dolayısıyla “dışarı çıkıp sorsak” kısmında, benim de söyleyecek bazı şeylerim oluştu ve ben de kendimce paylaşmak istedim, buyrun efenim… 🙂

Peki gerçekten nedir bu “Machine Learning”?

Çok basit ve yalın olması için, “Machine Learning” ’in bilgisayar sistemlerinin bir öğrenme süreci olduğunu söyleyebilirim. Verilerin, bilgiye dönüşmesi için bilgisayar sistemlerinin gücünün kullanıldığı teknik bir süreç… Açıkcası ne olduğu sorusundan çok, nasıl olduğu sorusunun, “Machine Learning” ‘in anlaşılması ve öğrenilmesi için daha önemli olduğunu düşünüyorum. “Nasıl?” sorusunun cevabı tabi ki çok geniş ve ayrıntılı. Ben sadece giriş tadında olması için bazı fikirlerimi paylaşmaya çalışacağım.

Peki nasıl öğreniyor bu sistemler?

Verilerdeki belli kalıpların bulunması, “Machine Learning” sürecinin temeli. Verilerdeki kalıpların bulunması ve bunların üzerinde çeşitli algoritmalar çalıştırılması ile sistemler öğrenebilir hale gelmeye başlıyor. Bu süreç aslına bakarsanız iteratif yani kendini tekrarlayan bir süreç. Sistemlerin öğrenebildiğinin doğrulanması ve geçerli olduğunun kabul edilmesi gerekiyor. Bu sayede öğrenme hızı ve şeklide gelişiyor doğal olarak. Bu doğrulamayı ve kabulu de, aslında biz ya da bizim oluşturduğumuz sistematik süreçler yapıyor. Bilgisayar sistemlerinin öğrenme yaklaşımı çeşitli “tahmin etme” yaklaşımları ile somutlaşıyor. Bizim için en önemli çıktı bu şekilde oluşuyor aslında. Bu tahminlere göre, belli durumlarda da tanımlı aksiyonlar gerçekleştiriliyor. Bu sayede bir çok kolaylık insanoğlu için sağlanıyor. (Yapay zekanın temeli de bu aslında.)

Biraz daha anlaşılır olması için hepimizin geçtiği bir süreçten bir örnek verebilirim. Açıkcası okuma-yazma öğrenme süreci bütün bu “Machine Learning” konseptinin anlaşılması için güzel bir giriş noktası bence. Hepimiz okuma yazmayı; hatırlarsınız belli çizgiler çizerek harfleri öğrenerek başladık. Daha sonra harflerin bir araya geldiği kalıpları bulup, bu kalıpların tekrarlanmasını çıkartıp kelimeleri tanımlayabilir hale gelmiştik. Kelimelerin anlamlarını da çıkartıp, benzer kelimelerin anlamlarının ne olabileceğini tahmin edip, yeni kelimelerin anlamını çıkarmıştık. Bu sürecin sürekli tekrarlanması ile kelime dağarcığımız gelişmiş ve okumayı da böyle böyle çözmüştük. Çok geçmiş zaman kullandım ama temel olarak öğrenme süreci hala böyle aslında. 🙂

“Machine Learning” de direkt olarak böyle aslında. Verilerdeki kalıpları bulup, bu kalıplara anlam yüklememiz ve bu anlamları, artan verilerde yine bulup bilgisayar sistemlerinin belli tahminler yaparak veri kalıplarını öğrenme süreci ve bilgi üretme de direkt böyle oluyor.

Devam…

ASP.NET Core uygulamaları, cross-platform uygulamalar olduğu için, bildiğiniz üzere geliştirdiğimiz web uygulamalar için artık IIS gereksinimi zorunlu değil. ASP.NET Core tarafında geliştirilen yeni “host” modeli sayesinde, uygulamaların nasıl host edileceği, kod seviyesinden yönetilip, geliştirilebiliyor. Bu ASP.NET Core’un ilk versiyonundan beri olan oldukça güzel, kolay ve yeni kapılar açan bir özellik bildiğiniz üzere.

Kod seviyesinde, bu host özellikleri ASP.NET Core’un IWebHost ve IWebHostBuilder arayüzlerinden yaratılan sınıflar ile gerçekleşiyor. ASP.NET Core uygulamalarının ilk giriş noktası olan kodlarda, WebHost.CreateDefaultBuilder() eminim dikkatinizi çekmiştir.

Bu method varsayılan host modelini oluşturmak için ve arka tarafta bazı standart işlemleri yapıp, geliştiricilerin işini kolaylaştırmak için sunulmaktadır. Özetle WebHost.CreateDefaultBuilder() ile web uygulamamızın, varsayılan bazı özellikleri kendiliğinden tanımlanmaktadır.

GitHub’dan da bakarsanız, varsayılan bazı özellikleri zaten görebilirsiniz. Açık kaynak geliştirmeyi bu yüzden çok seviyorum 🙂

Loglama, konfigürasyon, uygulama root dizini, Kestrel kullanımı, IIS entegrasyonu ve “dependency-injection” gibi temel şeyler bu şekilde biz direkt çok kafa yormadan mümkün oluyor ve Web uygulamasının çalışması sağlanıyor. Daha basitçe özetlemek için; basit bir konsol uygulaması ile bir web uygulamasını ayağa kaldırmak ve çalıştırmak bu sayede mümkün olabiliyor. ASP.NET Core’un en büyük artı noktalarından biri de bu. Az önce dediğim temel şeyler aslında “cross-cutting concerns” olarak adlandırdığımız tüm yazılım sistemlerinde olabilecek konular.

Farklı tipteki uygulamalar için nasıl oluyor?

WebHost, doğal olarak sadece web uygulamaları için olan özellikler de içerdiğinden farklı tipte uygulamalarda bu tarz şeyleri kullanmak çok mümkün değildi. WebHost sınıfında olduğu için, HTTP dışında,herhangi farklı bir tipte protokolü host eden bir uygulama; mesela konsol, için bu şekilde “cross-cutting concerns” leri eklemek uğraştırıcı ya da mevcut şekilde pek mümkün değildi .NET Core’un mevcut versiyonlarında. .NET Core 2.1 ile beraber farklı uygulama tiplerinde de “host” yaklaşımı ile “cross-cutting” konularını kolayca geliştirmek mümkün oluyor.

Şu an Preview aşamasında olan, ama önümüzdeki günlerde RTM olacak .NET Core 2.1 ile hayatımıza yeni bir “host” modeli geliyor. HostBuilder, IHostedService, IHostBuilder gibi, arayüz ve sınıflar ile farklı uygulama tiplerini de geliştirmek ya da arka planda sürekli çalışan operasyonları servis olarak geliştirmek mümkün. Sadece “Web Uygulaması” yaklaşımı değil de biraz daha genel kullanıma imkanlar sunan bir servis yaklaşımı, .NET Core 2.1 ile geliştirici hayatımıza girecek.

Kısaca ve özetle farklı Network servisleri(TCP,UDP…vs.), Message Queue(MQ) servisleri ya da “arka plan işleri” gibi yapılarda da “cross-cutting” konularını kolayca geliştirmek mümkün olacak .NET Core 2.1 ile.

Devam…