Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…

Hep böyle uzun aralar oluyor, hiç sevmiyorum… Ayıp bana. Neyse, uzun bir aradan sonra yeni bir yazı ile ASP.NET Core tarafındaki sıcak konulardan birine, gRPC servislerine farklı bir açıdan yine bakalım. Yine bakalım diyorum çünkü daha önce “gRPC, .NET Core ve “streaming”” başlıklı yazıda az biraz .NET Core ve gRPC’den bahsetmeye çalışmıştım.

gRPC, Google tarafından geliştirilen bir “Remote Procedure Call” framework’ü… Aktarım protokolü olarak HTTP/2 üzerinde yüksek performanslı bir yapısının olması, platform ve dil bağımsız olması da birçok kompleks çözüm için tercih edilmesinin en önemli sebeblerinden. “Protocol Buffers” ile oluşturalan kontratlar ile servis tanımlarını net belirtme ve bu tanımların “binary serialization” ile hızlı çözümlenmesi de “microservices” dünyası için oldukça değerli.

Google’ın back-end tarafındaki birçok servisinin bu framework üzerinde kurulmuş olması ve bir çok büyük organizasyonun gRPC yaklaşımını tercih etmesi ile de gRPC‘nin, kendini zaten ispatlamış bir teknoloji olduğunun ispatı.

Şu an gRPC‘nin en büyük handikapı tarayıcılar(browser) tarafında kullanılabilen varsayılan API’lar olmaması. Yani tarayıcılar üzerinden gRPC servis çağrılarının yapılabilmesi için ekstra bir yapıya gereksinim var. gRPC-Web‘de bu ihtiyaç için ortaya çıkmış bir protokol. Basitçe özetlemek gerekirse, ara bir JS katmanı ile tarayıcıların gRPC çağrıları yapılması sağlanıyor.

.NET Core 3.0 ile .NET tarafında gRPC ile tanışmıştık ama gRPC-Web tarafının daha karışılığı tam olarak yoktu. Geçtiğimiz hafta .NET için de gRPC-Web, resmi olarak yayınlandı. Yani ASP.NET Core gRPC servislerini de artık tarayıcılardan da çağırabiliyoruz. Bir servisin, bir tarayıcıdan çağrılabiliyor olması çok büyük bir olay değil belki… “Bu mu yani, öhhhhh???” gibi ifadeler ile yaklaşabiliriz ama WebAssembly, Blazor, SPA(Single-Page Application) uygulama modelleri geliştikçe ve gRPC servislerinin kullanımı arttıkça, dönüp baktığımızda önemli bir gelişme diyeceğiz.

Geçtiğimiz haftalarda hatırlarsanız ASP.NET Core Blazor WebAssembly uygulama modeli de yayınlanmıştı. C# ile WebAssembly alt yapısı ile, direkt tarayıcılarda çalışan .NET uygulamaları geliştirmek mümkün hale gelmişti. gRPC-Web de bu açıdan daha bir anlamlı duruma gelmiş oluyor.

Önceki gRPC yazımda çok basit bir örnek yapmıştım. O örneği biraz genişleterek, yeni bir Blazor WebAssembly uygulamasından geliştirdiğimiz gRPC servisini çağırmaya bakalım. Dolayısıyla önceki yazıyı okumadıysanız önce ona bir bakmakta fayda olacaktır.

Devam…

“Uzaktan çalışmak” yazılım sektörü için uzun zamandır var olan ve etkin bir şekilde de değerlendirilen bir çalışma modeli aslında. Sadece değerlendiren şirket sayısı oldukça az. Gelişen teknoloji, çeşitlenen iş modelleri ve şirketlerin cazibesini arttırmak için artış gösterse de, yine de sahip olduğumuz imkânlara göre çok tercih edilmiyor(du).

Bu yaşadığımız abuk dönemle beraber farkındalığı ve tercih edilme durumu da arttı. İnsanoğlu olarak içinde bulunduğumuz çağa ayak uyduramadık sanırım, bulunduğumuz “çağ” da, Covid-19’u bize göstererek, seve seve bazı kavramlara ayak uydurmamız için ittiriyor belki de, kim bilir… 🤔

Yazılımcılar için, herkesin ağzında pelesenk olmuş bir ifade vardır; “Yazılımcılar her yerden çalışabilir” gibi. Bu farkındalık ve teknik imkânlar olmasına rağmen, mutlaka ofis ortamında çalışılması şirketlerin zorladığı bir yaklaşım. “Yooo” diyenleri buradan duyuyorum ama çoğunluk açısından örnek veriyorum… Hemen atlamayalım, lütfen.😀

Mutlaka ofis ortamında olmanın; çeşitli çalışma şartları/kuralları gibi kâğıt üstünde geçerli olan zorunluluklar da olabileceği için bu döneme kadar “uzaktan çalışmak” modeline uzaktık.

Şartların zorlaması ile yakınlaştığımız bu “uzaktan çalışmak” modelini gerçekten ne kadar sağlıklı ve doğru, kendimce bir şeyler karalamak istedim…

“Uzaktan çalışmak”, sektör ve iş modellerine göre çeşitlilik gösteren, getirilerinin ve götürülerinin olduğu bir model. Bu yüzden sektör ve iş modellerine göre bir genelleme yapmak doğru olmaz diye düşünüyorum. Sektörlerden, iş modellerinden bağımsız olarak, bu tarz çalışma modelinin, temelinde olduğu ve dokunduğu için “insan” açısından sorgular oldum son birkaç zamandır.

İş hayatı, yaşantımızın çok büyük bir parçası. Ne kadar böyle olmaması gerekir diye düşünsem de, bulunduğumuz çağın yine bizi “seve seve” sürüklediği bir yer. Zamanımızın çok büyük bir kısmını geçirdiğimiz bir hayat…

Peki bu hayatta “uzaktan çalışmak” ne kadar katkı sağlıyor?

Sabahları ofise geldiğimizde, sabah kahvesini beraber içmek, gündem ile ilgili şakalar/kakalar yapmak, dünkü maç hakkında konuşmak, akşam öğrenilen değişik bir tarifi anlatmak…

Öğlen yemeğe çıkmak, nereye gideceğiz diye kafa yormak… Açık unutulan bilgisayarlardan, tüm ekibe tatlı ısmarlamak, Play Station da iki maç yapmak… Arkadaşlara şaka yapmak, herkesin yüzünde tebessüm yaratan şakaların kurbanı olmak…

Toplantılarda fikirlerimizi anlatmak, savunmak… Kakara-kikiri ile arada başlayan fikirlerin paylaşılarak olgunlaşması, yeni kapıların açması… Yüz ifadelerini anlamaya çalışmak, üzüntüleri paylaşmak, mutlulukları yaymak…

Tartışmak, sinirlenmek… Sinirli olduğumuzu bütün gün yüz ifademiz ile belli etmek. Sinirli ya da mutsuz olan arkadaşımızı görmek, anlamaya çalışmak ve sonra beraber gülebilmek…

Bunlar gibi bir sürü örnek verilebilir. İnsana dokunan bu durumlardan “uzaktan çalışarak” uzak kalıyoruz. Belki birçoğumuz için çok aranan ya da tercih edilen durumlar da değiller. Ama benim için sanırım değerli konular.
Sonuçta mekanik birer dişli değiliz, hele robot hiç değiliz. Yani henüz… 🤖

Uzaktan çalışmanın, iş yapma açısından getirileri sektör ve iş modeline göre yüksek olabiliyor. Odaklanarak çalışmak, zaman yönetimi, rahat ortam gibi iş kalitesini arttıran yönlerini görmezden gelmek mümkün değil. Bu artı yönlerine, gözlerimizi kapatıp bu getirilerini değerlendirmemek de yine çağa ayak uyduramamak gibi bir şey. Uzaktan çalışmanın getirdiklerinin farkına vardığımız gibi, götürdüklerinin de farkına varıp, orta yolu bulmaya çalışmak belki önümüzdeki mücadelelerden biri olacak.

Çalışanın kendi çalışma ortamlarını yaratması ve kendi “çalışma” disiplinini oluşturmasını sağlamak işverenlerin kafa yormaya başlayacağı bir konu olmalı diye düşünüyorum. Sektöre yön veren büyük firmaların, proje ve proje ekiplerine göre uygulamaları belki daha çok gündeme gelecek… Hem insanın yaşam kalitesini, hem de iş hayatındaki mutluluğunu arttırmak için, çalışmalar, “sözde” değil, gerçekten belli çalışmalara göre ölçülebilir şekilde gerçekleşir umarım.

Neyse… Daha fazla uzatmadan, ara sıra düşünmek için kafamda biraz dursun. Çıkarsa bir şeyler yine paylaşırım zaten.

*Ulan yoksa yaşlanıyor muyum? Abovvvv….

Bu arada bulunduğumuz bu Covid-19 dönemine göre değil, genel olarak her dönem ki “uzaktan çalışmak” modeli hakkındaki sesli düşünmem olarak yaklaşırsanız sevinirim. Çünkü şimdiden, “uzaktan çalışmak çok iyi yeahhh, ne saçmalıyorsun” diyenleri duyar gibiyim. Uzaktan çalışmanın yanlış bir model olduğu çıkarımının yapılmasını istemem. Sadece, gerçekten yanlış bir model olmaması için bazı yaklaşımları kendimce sorguluyorum…

* Yazılım konusunda kendimi geliştirmek istiyorum, nereden başlamalıyım?
* Bilgisayar mühendisliği 2. sınıf öğrencisiyim, mobil uygulama yapmak istiyorum, nereden başlamalıyım?
* Programlama öğrenmek istiyorum, nereden başlamalıyım
* Üniversiteye yeni başladım turizm okuyorum ama bilgisayarlara ilgim var, yazılım öğrenmek istiyorum nereden başlamalıyım?

Hayatımın belli dönemlerinde bunlar gibi soruları çok alıyorum. Açıkcası cevaplamakta da en zorlandığım sorular bunlar oluyor. Bu dönem de benzer sorulara yine çok denk geldim ve önce kendime dönüp bu soruyu kendime sordum. Nereden başladım?

Önce kendime cevap verebilirsem belki etrafımdaki insanlara daha iyi yardımcı olabilirim. Yazılımla nasıl tanıştım, nasıl haşır neşir oldum kısaca üzerinden buradan da bir geçim ki, yıllar sonra okur okur eskiyi de tekrar tekrar anarım hem dedim.

Ortaokul dönemimde rock/metal 🤘 müzik dinlemeye başladım. Grupları, albümleri takip etmek zordu. Yazılı basın zaten yok gibiydi. Fanzinler ve düzensiz yayınlar ile takip etmeye yaşımızın yettiği kadar çalışıyorduk. İnternet ile yeni yeni tanışmaya başlıyordum. mIRC, ICQ falan derken internet ortamında bir dergi/fanzin yapmak istedim. Günümüzün havalı tabiri ile sanırım dergicilik kavramının dijitalleşmesi…

O zamanlar web sitesi yapmak için, Geocities herkesin ilk bulaştığı platformdu. Bazı sağladığı kolaylıklar ile statik HTML içerikler yaratmak ve düzenlemek oldukça kolaydı. HTML ve CSS ile tanışmam da bu vesile ile başlamış oldu. Albüm yorumları, grup tanıtımları, röportajlar falan derken içerik büyümeye başlamıştı. Album1.html, Album2.html, Roportaj1.html, Grup1.html…. falan filan. İçeriklerin artması, ergen tripleri ile sürekli görsellerin değişmesi, yeni düzenlemeler falan derken statik içerikleri kontrol etmek zorlaştı. Basit bir değişiklik için onlarca *.html dosyasında aynı değişikliği yapmak…Poffff.

Dinamik hale getirmek lazımdı ki, içerikleri yönetmek daha kolay olsun. ASP ve MS Access gibi şu an tarihin tozlu raflarında duran teknolojiler ile tanıştım. Kitaplar alıp, direkt oradaki kod örneklerini yazıp denemeler ile hızlıca bir şeyler çıkarmaya başladım. Açıkcası sadece resimlerine bakıp, dergi okumama yaklaşımı vardır ya; onun gibi. Sadece kodları yazıp, onları değiştirip, deneyerek istediğim şeyleri oluşturuyordum. Kodda if(true) ise, ben if(false) yapıp deniyordum. Hatalar yapıyordum, hata yapmaya çalışıyordum ki, neden öyle olmaması gerektiğini öğrenim. Ummadığım sonuçlar ya da hatalar olduğu zaman kitaplardaki açıklamaları okuyordum. Ziyaretçi defteri, hava durumu, ziyaretçi sayısı, download dosyaları vs… o dönemlerin alengirli parçaları ile biraz daha interaktif hale getiriyordum. Amacım sevdiğim müziği paylaşıp, benim gibi musiki insanlarına katkı sağlamaktı. Ama aslında kodlar ve yazılım müzik eşliğinde kanıma giriyormuş da haberim yokmuş.

Web sitem kendi kitlesi için, o dönemler için az biraz popüler olmuştu. IRC ortamlarında muhabbetler, yurt dışı albüm şirketlerinden gelen promo albümler, dergiler ile iletişim, konserlerde gruplar ile tanışıp muhabbetler, gelen güzel mesajlar… Bütün bunların arkasında çok farkında olmadan öğrenmeye başladığım yazılım teknolojileri vardı aslında. ASP ile başlayan PHP ile evrilen, MySQL ile çeşitlenen, HTML, CSS ve javascript ile süslenen bir alet çantam olmuştu. “Yazılım olayını öğrenmeyi” çok sevmeye başlamıştım. if…else… bir tutku haline gelmişti.

Devam…

“Kod” yazmak aslında çok eskiye dayanan bir iletişim yöntemi. Mağaralara, duvarlara, kitaplara belli işaretler ile bazı kavramları, bazı insanlara anlatmak için insanoğlunun çok eskiden beri çabaladığı bir iletişim yöntemi. Artık bilgisayar denen cihazı yarattığımız ve yaşantımızda önemli noktalara yerleştirdiğimiz için onunla iletişime girebilmemiz için de “kod” yazmak daha da önemli hale geldi. Bilgisayarların anlayabildiği diller ile onların çözümleyebileceği kompleks problemleri çözmek ve bazı ihtiyaçları gidermek artık insan hayatının önemli bir parçası haline geliyor…

Offff yeter, bu kadar felsefe yeter, konumuza geçelim. 😜 Son bir kaç zamandır “Infrastructure as Code(IaC)” kavramı ile ilgili ellerimi kirletiyorum. Daha önce sadece okuduklarım kadar bir hakimiyetim vardı kavrama. Artık biraz dokunmanın da zamanı geldi sanırım. Açıkcası IaC ile ilgili çok uzun uzun bir şeyler anlatacağım bir yazı olmayacak. Biraz daha, anahtar kelimelerin bol olacağı, “Infrastructure as Code(IaC) nedir?”, “Neden gerekir?” ve “Avantajları nedir?” gibi sorulara cevap olabilecek ve IaC kavramı ile tanışmak isteyenlere yol gösterebilecek bir yazı olacak. Hadi bakalım…

Nedir bu Infrastructure as Code(IaC)?

“Kod olarak altyapı” diye direkt chicken translate tadında çevirince çok çirkin oluyor. Ama anlamaya başlamak için birkaç ip ucu veriyor. Yazılım çözümlerinin çalıştığı altyapılar artık sadece elektronik birer kutu değil. Günümüzde hele hiç değil. Altyapılar da ihtiyaç çerçevesinde karmaşık bir hal alabiliyor. Yönetmesi zorlaşıyor. Yönetmeye gelene kadar kurması ve altyapıları ayağa kaldırmak zorlaşıyor. Bu zorlukların, zaman ve maddi açılardan götürüleri de oluyor. Günümüzde de önemli konular. Artık “kod” yazarak belli problemleri çözmeye başladığımız için bu problemleri de kod yazarak çözebilir miyiz diye ortaya çıkan bir kavram IaC. Özetle ve basitçe; IaC için altyapıların oluşturulması, kurulması, güncellenmesi, kopyalanması ve ayağı kaldırılması konularını güvenilr ve hızlı bir şekilde yapabilmek için reçete hazırlama diyebilirim. En azından ben bu şekilde bakarak biraz daha kolaylaştırmaya çalışıyorum. Bu reçetenin belli bir standart içinde oluşturulması için de Chef, Terraform, Puppet, Ansible, Google Cloud Deployment Manager, Azure Resource Manager, AWS CloudFormation gibi farklı teknolojiler mevcut.

Devam…

ASP.NET Core‘un en önemli özelliklerinden biri de “Middleware” yapısı. “Request-Response” modelinin ortasında özelleştirilmiş operasyonlar gerçekleştirip, request-response akışını yönetmek için oldukça etkili bir özellik. Gelen bir request‘in geçerliliğini kontrol etmek, response‘ları cache‘den oluşturmak gibi gibi birçok farklı ihtiyacı bu araya koyduğumuz yapılar ile ASP.NET Core‘da yapabiliyoruz.  

“Middleware”ler temelinde IApplicationBuilder arayüzünden türeyen bir sınıfa eklenti şeklinde eklenen metotların çalıştırılmasını sağlayan bir yapı. Web uygulamalarında da uygulamanın “request-response” yönetimini sağlayan sınıfın, yeni metodlar ile yapabileceklerinin artması ya da çeşitlenmesi şeklinde de basitçe düşünebiliriz. Çok daha ayrıntıya girmeden yavaştan konumuza geçelim…

Şartlı “middleware” kullanımı…

Eklediğimiz middleware‘lerin farklı şartlarda/durumlarda geçerli olmasını ya da olmamasını çok kolay bir şekilde ASP.NET Core‘da sağlayabiliyoruz. Bu ne demek hızlıca bakalım… 

Biraz daha anlaşılır olması için, basit bir senaryo örneği oluşturalım. Bir “middleware” geliştirdiğimizi düşünün, web uygulamasına gelen request‘in header bilgisindeki bir değeri kontrol etsin; “GET www.abc.com/v1/user/” eğer bu request‘in header‘ında key:abc123 varsa geçerli bir request olsun, yoksa da 401 dönsün… Çok tanıdık ve standart bir senaryo. Bu senaryoyu biraz daha kompleks hale getirelim. Eğer yeni geliştirdiğimiz v2 versiyonuna bir request gelirse de ek olarak farklı bir kontrol daha yapılsın. 

Şimdi “Ama bu çok kolay zaten, ne var ki bunda” dediğinizi duyar gibiyim.😉 Geliştirdiğimiz “middleware” içerisinde bir if-else kontrolü ile akışı kontrol eder ve ihtiyaca göre istenilen operasyonları gerçekleştirebiliriz. 

if(v1==true)
{
    ......
    ...
    ..
} else if(v2==true) {
    ......
    ...
}

Ne yazık ki yazılım geliştirme için bu basitlik yeterli değil, daha da basit olmalı. 🤔 Geliştirdiğimiz bu “middleware“i farklı projelerinde de kullandığımızı ve projelere göre farklı adreslerin olabileceği (/v1/user değil, versiyon1/user/ mesela) ya da farklı ek özelliklerin gerektiğini düşünün… 

UseWhen() 

Az önce yukarıda “middleware” yapısının, eklenti(extension) metodlar ile oluştuğunu belirtmiştim. ASP.NET Core içerisinde olan UseWhen() metodu da yine bir extension metot ve bununla diğer “middleware”‘leri belli şartlara göre uygulamamızda geçerli olacak şekilde kullanabiliyoruz. 

            app.UseExceptionHandlingMiddleware();

            app.UseWhen(context => context.Request.Path.StartsWithSegments("/v1"), appBuilder =>
            {
                appBuilder.UseMiddleware<ApplicationAuth>();
            });

            app.UseHttpsRedirection();
            app.UseStaticFiles();

Yukarıdaki örnekte eğer request yapılan adres “/v1” şeklinde bir içerikle başlıyorsa, ApplicationAuth diye bir “middleware” kullanılsın şeklinde bir tanım var. Eğer request yapılan adres “/v1” şeklinde başlamıyorsa araya eklediğimiz “middleware” etkili olmayacaktır. Ve alttaki diğer “middleware”‘ler etkili olacaktır. 

Bu sayede ApplicationAuthmiddleware“‘in içindeki kodu temiz ve sade tutarak, kütüphane şeklinde birden fazla projede kullanabilir hale getirebiliyoruz. 

MapWhen() 

Benzer bir yapıyla da bir “middleware”‘den sonra “request-response” arasındaki akış devam etmesin ve farklı bir şekilde sonuçlansın istenebilir. Bunun içinde MapWhen() extension metodu yardımımıza koşuyor. 

            app.UseExceptionHandlingMiddleware();

            app.MapWhen(context => context.Request.Path.StartsWithSegments("/v1/user/"), appBuilder =>
            {
                appBuilder.UseMiddleware<ActiveEndPointCheck>();
            });

            app.UseHttpsRedirection();
            app.UseStaticFiles();

Yukarıdaki örnekte de MapWhen() ile, request yapılan adres “/v1/user/” şeklinde başlıyorsa, ActiveEndPointCheck “middleware”‘i etkin olacak ama sonrasındaki diğer “middleware”‘ler etkin olmayacaktır. Bu yüzden MapWhen()’nin kullanımına ekstra dikkat etmek gerekiyor.  

Hem MapWhen() hem de UseWhen() parametre olarak Func<HttpContext, bool> şeklinde bir boolean dönen delege bir metot bekliyor. boolean dönen her hangi bir ifade ile de metotlar için geçerlilik oluşturabiliyoruz.

            app.UseWhen(context => DateTime.Now.Date.Month==2, appBuilder =>
            {
                appBuilder.UseMiddleware<CampaignControl>();
            });

ASP.NET Core içinde gelen bu iki extension metotu GitHub’dan da kontrol edebilir, kendi projelerinizde de benzer yaklaşımları uygulamak için ilham alabilirsiniz. 😀

“Middleware”‘ler kullanım yöntemleri ile de ASP.NET Core çözümlerine oldukça değer katıyor. Basit ama etkili bu iki metot benim ihtiyacımı hızlıca çözümlememde çok yardımcı oldu, aynı hızla ben de paylaşmak istedim. Umarım size de yardımcı olur.