Arda Çetinkaya Yazılım ve arada kendim ile ilgili saçmaladıklarım…

Güvenlik konusu yazılım için oldukça ilginç bir nokta. Herkesin bildiği ama farkında olmadığı garip bir konu. Gerçek hayatta da aslında böyle. Başımıza kötü bir olay gelmediği sürece, güvenliğe çok dikkat etmiyoruz. Gelişen dünya düzeninde, gündelik hayatta bu farkındalık artık çok daha fazla olsa da yazılım konusunda gereken önemi hala tam veremiyoruz.

Bilişim dünyasının bir parçası olmaktan kaçınamadığımız bu çağda, teknolojinin ve yazılımın hayatımızın bir parçası olması güvenlik konusunun daha önemli olmasını sağlıyor aslında. Çoğu işimizi bilgisayar ile yapabiliyor, internet ile 7/24 her yere bağlanabiliyor ve ekonomik/sosyal ihtiyaçlarımızı elimizden düşürmediğimiz telefonlar ile her yerden karşılayabiliyoruz. Bunları yaparken son kullanıcı olarak, bu sistemleri geliştirenler olarak, yazılımları kodlayanlar olarak ya da bu sistemlere destek veren kişiler olarak hepimizin güvenlik konusunda dikkat etmesi gereken şeyler var. Kısacası, güvenlik hepimizin problemi

Guvenlik

Hepimizin problemi olduğu için, herkesin kendince dikkat etmesi noktalar var. “Şifrelerimizi doğum yılımız ya da 123456 gibi ardaşık sayılar yapmıyoruz” ya da “SSL sertifikası olmayan sitelerden kredi kartımızla alışveriş yapmıyoruz”,”Şifrelerimizi kağıtlara yazıp, sağa sola yapıştırmıyoruz” gibi şeylerden çok bahsetmeye gerek yok. Bu farkındalık daha hızlı bir şekilde oluşmaya başlıyor artık. IT sektöründe çalışan kişiler olarak, bu farkındalığın oluşmasında biz ne kadar rol oynuyoruz ya da neler yapıyoruz biraz da artık bunu sorgulamak lazım.

“123456”‘nın şifre olarak kullanılmaması gerektiğini bilmemize rağmen, şifre gerektiren üyelik sistemleri geliştirirken “123456”nın şifre olarak seçilememesine, yazdığı kodda kaç yazılımcı dikkat ediyor; merak ediyorum şahsen… Hala bir çok uygulama, üyelik aşamasında bu tarz şeylere izin veriyor. Ya da SSL sertifikası olmayan sitelerde verilerimizi paylaşmıyorken, neden kendi geliştirdiğimiz uygulamalarda SSL’i zorunlu tutmuyoruz. Statik olarak kullanıcı isimlerini ve hatta şifreleri hala uygulamaların içinde “hard-coded” tutan yazılımlar var mesela. Aynı şekilde IP adresleri de mevcut…

Guvenlik

Neler güvenli ve neden güvenli olması gerekiyor?” sorusu aslında en başta hepimizin sorması ve hepimizin beraber cevap bulması gereken bir soru. Sistem güvenliği, yazılım güvenliği, veri güvenliği ve daha farklı gruplamalar ile tüm ilgili paydaşların ilgisini gerektiren konular var. Sistem açısından; belli ağ içerisinde, belli bir sunucunun belli port’ları önemli olurken, veri sistemi tarafında da, verinin öneminden dolayı sunucu ve disk çeşiti önemli olabilir. Kritik olan, bu noktada bunların hep beraberce konuşulması. Neler güvenli ve neden güvenli olması sorularındaki cevaplar net olduğu zaman bazı şeyler daha kolay olacaktır.

Geliştirdiğimiz sistemlerin dışarıya açılan, son kullanıcıya hitap eden kısmı, “uygulamalar” oluyor genelde. Web, mobil(cep telefonu,tablet..vs) ya da masa üstü gibi farklı ön yüzler ile artık hayatımızın her alanında karşımıza çıkan “uygulamaları” geliştirirken çeşitli güvenlik prensiplerine daha fazla önem vermek gerekiyor sanırsam. Televizyondaki bir uygulamadan havale yapabiliyor olmak, ya da tüm kişisel bilgilerimizi herkesle paylaşabilmek(?) kötü niyetli insanların güvenlik açıklarını tespit etmesinde büyük motivasyon sağlıyor. Uygulamaları geliştirirken de benzer motivasyonun bizde olması lazım.

Uygulamaların girdilerinin doğrulanması, kripto işlemlerinin belli standartlar içerisinde yapılması, yetkilendirme adımlarına dikkat edilmesi gibi daha bir çok çeşitli güvenlik prensipleri artık yazılım geliştirme sürecimizin bir artık parçası olmalı. Sonradan yapılacak güvenlik iyileştirmeleri daha zorlayıcı olacağından baştan eşeği sağlam kazığa bağlamakta fayda var. Mesela yazılım geliştirirken atladığımız “input validation“lar, kötü niyetli insanlar için açık kapı oluşturabiliyor. “SQL Injection” ya da “XSS” bunun bilinen en büyük örnekleri… Kullanılan teknolojiye göre “Buffer overflow” hatalarından hafızaya müdahale edip, istenmeyen komutların çalıştırılabilmesi, hatalardan sistemin açık kapılarını bulup erişim yetkisi olmayan verilere erişim gibi konular uygulamalarımızı geliştirirken engelleyebileceğimiz bir kaç örnek. Genelde sistemlere ya da son kullanıcıya güvenip, bazı varsayımlar içerisinde bulunduğumuz için bu tarz noktalara dikkat edemiyoruz. “Hiç kimseye güvenme” yaklaşımı bu noktada geliştirdiğimiz uygulamalar içinde geçerli…Zaman kötü, kolla kodu.. 😛

Guvenlik

IoT(Internet of Things) ile uygulamaların(yazılımların) artık her yerde olacak olması ile güvenlik konuları daha önemli olacak. Güvenlik konusuna gereken özeni vermezsek, teknoloji bir çözüm olmaktan çok bir problem olmaya başlayacaktır, benden söylemesi… Umarım bilişim dünyası insanı olarak bu konulara daha fazla önem verip, nelerin, neden güvenli olması gerektiğini daha fazla sorgulayıp, güvenli sistemler geliştirmeyi amaçlarız.

Microsoft’un geliştiriciler için sanal olarak düzenlediği Connect(); etkinliğinde bugün neler oldu kısa kısa özetlemeye çalışacağım. Merak edenler için derlemiş olalım. Daha fazla ayrıntı ve etkinliğin videoları için tabi ki https://channel9.msdn.com adresini ziyaret etmenizi öneririm.

Connect()

.NET Core ve ASP.NET 5 RC versiyonu çıktı.

1 yılı aşkın zamandır açık kaynak olarak geliştirilen .NET Core ve ASP.NET 5, Release Candiate olarak bugün itibari ile RTM versiyonuna yaklaştı. Bir derleme yazısı olduğu için, uzun uzun neler değişti, neler geldi tek tek anlatmayacağım. Yayınlanan “Release Notes”‘lardan tüm ayrıntılara bakabilirsiniz.

RC ile hem .NET Core’un hem de ASP.NET 5’i “Go Live” lisans modeli ile üretim ortamlarında da isterseniz kullanabilirsiniz. ASP.NET 5’in son versiyonunu http://get.asp.net adresinden indirebilirsiniz.

Entity Framework 7 RC versiyonu çıktı.

.NET Core ile beraber Entity Framework 7‘nin de Release Candiate versiyonu çıktı. Takip edenleriniz bilecektir. EF 6.x ve EF 7 şeklinde bir farklılaşma oldu. Yaklaşım 1 yıldır, .NET Core ve açık kaynak vizyonuna uygun bir şekilde EF 7 de geliştirilmekteydi. Biraz daha lightweight olması ve cross-platform olması ile geliştirme yatırımın büyük bir kısmı buna gidiyordu. Bugün itibari ile RTM’e en yakın versiyonu yayınlanmış oldu. RTM’e kadar bu versiyonuna yeni bir özellik eklenmeyecek ve bildirilen bug’ların düzeltilmesi ve dökümantasyon geliştirilecek. Entity Framework 7 ile ilgili geliştirmelere başlamak, neler oldu, neler değişti bunları takip etmek için http://docs.efproject.net/en/latest/ adresini takip edebilirsiniz.

System.Data.SqlClient da artık cross-platform

.NET Framework’ün veri erişim yöntemleri açısından en çok tercih edilen System.Data.SqlClient da artık cross platform. Yani OS X ve Linux’da da bu uzayadının sınıflarını falan kullanmak mümkün artık. Tabi ki eksiklikleri var. Named Pipes desteği yok, sadece TCP bağlantı desteği var gibi bir kaç handikapı olsa da ilerleyen zaman içerisinde bütün bu eksiklerde giderilecektir. https://gist.github.com/cartermp/3c826e1d15577268eda6 adresinden biraz daha ayrıntılı bilgilere ulaşabilirsiniz.

Visual Studio Code açık kaynak oldu…

Cross-platform olarak geçtiğimiz aylarda Visual Studio Code ile tanışmıştık hatırlarsanız. Artık kendisi de açık kaynak dünyasında yerini aldı. Node.js’den, Go’ya, PHP’den Javascript’e, C#’a, HTML’e kadar aklınıza gelebilecek bir çok geliştirme dilini yazabildiğimiz bu basit ama etkili text editörü aynı zamanda “extensions” özelliğini kazandı. Yani artık bu editör için eklenti yazıp, eklenti indirebileceğiniz.

Visual Studio MarketPlace Preview oldu…

Eklenti demişken, daha önce Visual Studio Gallery olarak bildiğimiz, Visual Studio’nun eklenti havuzu çeşitlendi ve Visual Studio MarketPlace duyuruldu. Daha sonra Visual Studio Gallery’nin de yerini alacak bu eklenti havuzu, Visual Studio versiyonları için çeşitli eklentiler indirip, eklentiler yükleyebileceğiniz bir yer olacak. https://marketplace.visualstudio.com/ adresinden eklentilere göz atabilirsiniz. Şimdilik biraz az ama kısa zamanda hızlı bir şekilde artacaktır. Aynı zamanda buradan Visual Studio üyelik modeli de sunulmaya başlanıyor. Yıllık ya da aylık üyelik seçenekleri ile Visual Studio’nun özelliklerinden yararlanabileceksiniz.

Visual Studio Online’da isim değişikliği ve dahası…

Daha önce de isim değişikliği olmuştu ama bu sefer sanırım artık son. Visual Studio’nun TFS ile entegre olan “cloud” ürünü Visual Studio Online artık Visual Studio Team Services. Tabi ki sadece isim değişikliği söz konusu değil. Code Search özelliği, JMeter ile Load test özelliği, test adımlarında yeni özellikler ve daha bir çok buradan öğrenebilirsiniz.

Azure Service Fabric, microservice tabanlı uygulamalar için Preview oldu…

En son Build// etkinliğinde duyurulan, microservices tabanlı uygulamalar geliştirmek ve yönetmek için Azure’da hizmet veren Azure Service Fabric bugün Preview oldu.

Azure ile ilgili tabi başka yeniliklerde duyuruldu. Mesela Azure SDK 2.8 versiyonu çıktı.

 

Geliştiriciler için yeni Visual Studio Dev Essentials programı…

Microsoft, geliştiriciler için yeni bir ücretsiz programı da bugün duyurdu. Visual Studio Dev Essentials adı altındaki bu programla, geliştiricilerin bir çok Microsoft ürününe ücretsiz erişim sağlaması mümkün olacak. Xamarin, Pluralsight gibi farklı şirketlerin ürün ve servislerini de içerecek bu programdan yararlanmak için https://www.visualstudio.com/products/visual-studio-dev-essentials-vs adresini ziyaret etmeniz yeterli.

Microsoft artık çok hızlı çıktı üreten bir yazılım ve servis firması haline geldi. Dolayısıyla yetişmek zor. Umarım başlangıç için bu derleme biraz faydalı olmuştur. Zamanınız olursa, yarın da sanal olarak devam edecek etkinlik. Kaçırmayın derim.

 

vNext kavramı ile tanıştığımız Microsoft’un farklı işletim sistemlerinde de çalışan yeni framework’ü .NET Core ile ilgili önceki yazılarda birşeyler paylaşmaya çalışmıştım hatırlarsanız. Önümüzdeki günlerde RC1, 2016’nın ilk çeyreğinde de RTM versiyonun çıkması planlanan bu framework’e ben de ilerleyen zaman içerisinde biraz daha değinmek istiyorum. Bu zamana kadar çok fazla değinmek istemedim çünkü hala gelişmekte olan ve tam stabil halini almış bir versiyon henüz yok. Ama yavaş yavaş RTM’e yaklaştığımız için, yavaş yavaş ben de karalayabilirim sanırım artık.

.NET Core, Microsoft tarafından açık kaynak olarak geliştirilen, dışarıdan da katkı alan bir framework. Dolayısıyla tüm gelişme anına tanıklık edebiliyorsunuz. GitHub‘dan takip edip, siz de katkıda bulunabilirsiniz. Bunu özellikle hatırlattıktan sonra .NET Core içindeki Dependency Injection(DI) kavramından bahsetmeye çalışacağım. DI, .NET Core’un bir parçası olarak, ASP.NET 5’in de temel bir bileşeni olarak karşımıza çıkıyor. Tüm framework içerisindeki bağlılıkları yönetmek ve geliştirmek bu yeni yaklaşım ile beraber daha kolay bir hal alıyor. Kısaca ve basitçe yeni DI yaklaşımı ile .NET Core’da, tek bir yerde uygulamamızın bağlılıkları yönetebiliyoruz.  Farklı DI bileşenlerini de, bu yapının yerine geçebilecek şekilde kullanabiliyoruz tabi ki.

.NET Core içinde DI yapısı, Service Locator tasarım kalıbı ile tasarlanmış. Microsoft.Framework.DependencyInjection.IServiceCollection arayüzünden geliştirilen ServiceCollection üzerinden bağlılıklar oluşturuluyor. Uygulamalardaki bağlılıkları, uygulamaların kullandığı servisler olarak düşünebilirsiniz yani.

            var services = new ServiceCollection();

ServiceCollection sınıfı ile servisleri, yaşam döngülerine göre ekleyebiliyoruz.

            services.AddTransien<IUserService>(s=> new UserManagementService());
            services.AddInstance(typeof(IUserService),new UserManagementService());
            services.AddScoped(typeof(IUserService),s=> new UserManagementService());
            services.AddSingleton(typeof(IUserService),s=> new UserManagementService());

Bağlılıkları 4 tane farklı yaşam döngüsü ile tanımlayabiliyoruz.

  • AddTransient: Her seferinde bağlı nesnenin tekrar yaratılmasını sağlar
  • AddSingleton: Bağlı nesneye erişildiğinde tek bir nesne yaratılmasını sağlar
  • AddInstance: Her nest çağrısında, tanımlanan nesneyi sağlar
  • AddScoped: ServiceCollection’nın kapsamına göre nesnenin yaratılmasını sağlar.

Bu yaşam döngülere göre oluşturulan nesnelere; daha doğru isim ile servislere, IServiceProvider arayüzünden geliştirilen sağlayıcı sınıfı ile ulaşabiliyoruz.


            IServiceProvider provider = services.BuildServiceProvider();
            
            IUserService userService = provider.GetService<IUserService>(); 
            var userName = userService.GetUserName();

Yine tabi ki kendi sağlayıcı sınıfımızı yazmak mümkün. Sağlayıcı sınıfından gelen GetService() metodu ile bağlı olan nesneye/servise erişebiliyoruz.

VS Code

DI yeni ASP.NET 5 ve MVC 6’da built-in bir özellik olarak karşımıza çıkıyor. MVC tarafında çeşitlik konfigürasyon yöntemleri ile web uygulamalarındaki bağlılıkları yönetmek oldukça kolaylaşıyor. Bu yazıda bahsettiğim konunun örnek kodunu GitHub’a ekledim, buradan eklemeler ve düzenlemeler yapabilirsiniz diyerekten bitirelim.Bu giriş yazısı ile umarım biraz merak uyandırmayı başarmışımdır.

Bu yazıyı CoreCLR’ın Beta8 versiyonu ile yazdım. Bu versiyondan sonra Microsoft.Framework.DependencyInjection.* namespace’i Microsoft.Extensions.DependencyInjection.* olarak değişiyor.

 

Biraz geç oldu ama kaldığımız yerden devam edelim. Bir önceki yazılarda dağıtık sistemlerdeki yanılgılardan bahsetmeye başlamıştım. İlk 4 tanesini bitirmiş, geri kalanlarının üstünden de bir sonraki yazıda geçeceğimi belirtmiştim…İşte bir sonraki yazı.

8fallacies

5- Topoloji değişmez

(Topology doesn’t change)

NetworkTopologySistemleri oluştururken, ilk tasarımımız hiç değişmeyeceğini düşünmek bu yanılgıya düşmemizin en büyük sebebi. Hiç müdahale etmesek bile zaman faktörü bu değişikliğe sebep olacaktır. Bundan dolayı sistem tasarımlarımızı yaparken dış etkenlere dikkat etmemiz gerekir. IP değişiklikleri, hatta biraz daha kapsamlısı network değişiklikleri, firewall benzeri güvenlik katmanları ve benzeri fiziksel parçalar dağıtık sistemler tasarlarken mutlaka dikkat etmemiz gereken konular. Bu tarz fiziksel yapıların ayrılmış ve soyutlanmış olması çok önemli.  En basitinden “hard-coded” IP adresleri kullanıyor olmamız, değişen network’de problem yaratacaktır. Dolayısıyla DNS isimleri tercih edilmeli. İletişim protokolü olarak, daha esnek yapıların(mesela multicast) tercih edilmesi topolojideki değişikliklerden minimum derecede etkilenmemiz sağlayacaktır.

6- Sadece bir tane yönetici vardır

(There is one administrator)

system-admin-horrorKüçük sistemlerde belki bir tane “admin” gerçekten(?) vardır. Ama sistemler büyüdükçe ve dağıtık bir yapı oluştuğu zaman, bu sistemlerde yetkili olan; “admin” rolündeki kişi sayısıda artar. Bunun farkında olmadan, sistemin bir parçasında yapılan bir değişiklik ciddi sıkıntılara yol açabilir. Dolayısıyla sistemleri tasarlarken, birden fazla farklı sistem yöneticisi olabileceğinin farkında olmak lazım. Sistemin farklı bileşenlerine yapılan güncellemeler ya da patch geçişleri, geçildiği bileşeni iyileştirebileceği gibi o bileşeni kullanan diğer parçaları olumsuz etkileyebilir. Tabi bir sistemde ne kadar çok “admin” varsa o sistemde kordineli bir çalışma yapmak o kadar zordur. LDAP ya da Domain’de yapılan bir değişiklik, uygulama sunucusundaki “Authentication” modunu etkileyebileceği için, bu tarz değişiklikler tüm sistem yöneticilerinin kordineli çalışmasıyla yapılmalıdır.

 

7- Veri aktarım maliyeti sıfırdır.

(Transport cost is zero)

Veri aktarım maliyeti sıfır olsaydı gerçekten, “leased line” kavramı hayatımızda olmazdı. Dağıtık sistemlerin en önemli noktalarından biri, sistemler arasındaki verinin taşınmasının kolay olmadığı. Firmalar, dağıtık olarak tasarlardıkları sistemleri için özel network’ler kurup, network seviyesinde izole olmak için binlerce dolar harcıyor.  En basitinden böyle düşünürken maliyet sıfır değil. Ama buradaki maliyet sadece bu değil.  Günümüzde artık veri aktarırken 1sn.’nin üzerinde bir zaman problem olabiliyor. Bu zaman kavramı işte maliyetin diğer bir ayağı. Mesela network’de taşınan verinini serialization ve deserialization işlemlerinin uzun sürmesi(-ki uzun sürer) bu zaman maliyeti için önemli bir noktadır. Ama çok farkında olmayız… Bu noktada hem yazılım, hem donanım maliyetlerine dikkat edebildiğimiz, kontrol edip yönetebildiğimiz sistemler tasarlayabilmek önemli. Her ne kadar donanımsal olarak ölçeklendirebilsekte, aynı şekilde yazılımsal olarakta ölçeklendirebileceğimiz aktarım yöntemlerini düşünmemiz mutlaka gerekecektir.

8- Ağ homojendir

(The network is homogeneous)

Günümüzde artık hiç bir network homojen değil.  Tüm sistemlerin homojen olabileceği yanılgısına sanırım artık kimse düşmüyordur. Düşen varsa da, umarım biran önce farkına varır gerçeklerin. Artık öyle bir zamandayız ki, sistemlerin bir kısmı Java olurken, başka bir kısmı .NET, başka bir kısmı ise node.js olabiliyor. Veri platformu olarak Oracle tercih eden bir sistem, NoSQL veri platformunda herhangi bir ürünü kullanan sistemle beraber çalışabiliyor. SOAP mesajları alan bir sistem, başka biriyle JSON ile konuşuyor. Dolasıyla sistemleri tasarlarken bu gerçeklerin farkında olmak lazım. .NET’in ilk zamanlarında *.asmx servislerinin java ile uyumsuzluğu bir çok kişinin yaşamış olduğu bir problemdir diye düşünüyorum. Dağıtık sistemlerin farklı özelliklere sahip bileşenler ile geliştirilebileceğini ve bu bileşenlerin birlikte çalışabilmesinin sağlanması oldukça önemli. Yoksa dağıtık sistem olmasının bir önemi olmuyor zaten…

Umarım biraz olsun faydalı olmuştur ve bazı noktalara neden dikkat etmemiz gerektiğini anlatabilmişimdir. Daha az yanılgıya düştüğümüz sistemler dileyerek kapatalım konuyu…Kapattık…

Bir kaç önceki yazımda dağıtık sistemler ile ilgili bir şeyler karalamaya çalışmıştım. Daha çok kurumsal oluşumlarda büyük ve orta ölçekli çözüm ve sistemler, dağıtık sistemlere benzerlik gösterse de, Cloud kavramı ile çeşitlenen yazılım çözümlerini anlamak, hatta bu çözümlerin bir parçası olmak için temel bir kaç anahtar kelimeyi bilmek ve anlamak gerekiyor diye düşünüyorum. Bu yüzden dağıtık sistemler ile ilgili bir kaç şey daha karalayacağım, bir önceki yazının sonunda belirttiğim gibi…

Büyüyen ve gelişen teknoloji dünyasında, kompleks problemlere çözüm sağlarken çoğu zaman büyük yanılgılar içerisinde olabiliyoruz. “Yaaa onun olması zor, milyonda 1 ihtimal” diye atladığımız bazı yazılım kavramlarının saniyede 3 milyardan fazla iş yapabilen işlemcilerde çalıştığını unutuyoruz. Problem olana kadar bu yanılgıların çok farkında olamıyoruz genellikle. Özellike birden fazla parçadan oluşan dağıtık sistemlerde bu yanılgılar daha fazla oluyor. 90’larda Peter Deutcsh‘ın ortaya çıkardığı “The Eight Fallacies of Distributed Computing”, günümüzde hala çoğumuzun yanılgıya düştüğü konular olarak karşımıza çıkıyor.

8fallacies

Her ne kadar dağıtık sistemler için söylemiş olsa bile, günümüzdeki çoğu yazılım çözümleri için dikkat edilebilecek başlıklar olduklarını düşünüyorum. Açıkcası sadece bu yanılgılardan bahsetmek istemiyorum, bu yanılgılara düşmemek için çözümlerimize farklı nasıl bakabilir ile de kafanızı biraz karıştıracağım. 🙂

1- Network güvenilir…

(The network is reliable)

cayb0İş yerlerinde, yerel ağ içinde olduğumuz ve genellikle sahip olduğu kapasite zorlanmadığı için network’lerin sağlam olduğu, problem yaşanmayacağını düşünürüz. Donanım olarak artık switch’ler ve router’lar farklı özellikler ile bu problemleri çok hissettirmese de, her zaman sağlam bir network üzerinde çalışacağız diye kesin bir yargı yok. En basitinden, bilinçsizce sökülen güç kabloları yaşanan şeyler…Network üzerinde farklı sistemlerin bir araya gelmesi ile oluşan çözümlerde özellikle, network problemleri ciddi sorunlara yol açabilir. Dolayısıyla network güvenilir değil…

Bu yanılgıya düşmemek için yazılımlarımızda çeşitli iyileştirmeleri başta geliştirebiliriz. Mesela kaçımız web servis request’lerinde HttpTimeoutException‘ı dikkate alıp, bir retry mekanizması oluşturuyor. Ya da ACK/NACK(acknowledge messages) yapısı kurup, request’lerin sağlıklı gittiğini doğruluyor… Network’ün güvenilir olduğu yanılgısı içerisinde olursak, en basitinden bir e-ticaret sitesinden bir bankaya yapılan request’de oluşan timeout’ları atlayabiliriz. “Yapılan işlemler başarılı mı yapıldı, ya yapılmadıysa…Bir daha request yapalım o zaman…Ama ya başarılı olduysa, çift işlem olmasın…”

2- Network’deki geçikme sıfır…

(Latency is zero)

impossibruLatency” olarak adlandırılan bir kavram vardır; bir verinin bir noktadan, bir diğer noktaya taşınmasında geçen süreye denir. Ve ne yazık ki bu süreyi sıfıra yakın varsayarız genelde… Genelde lokal network’lerde(LAN) çalıştığımızdan böyle bir yanılgıya sahip oluyoruz. Geliştirdiğimiz uygulamalar internet üzerinde çalışacak ya da geniş bir kapalı network’lerde çalışacaksa, mutlaka ama mutlaka performans testi yapmalıyız. İstanbul’da LAN’da sorunsuz çalışırken, internete açtığınız uygulamaya 1 milyar nüfuslu Çin’den erişmek istediklerinde network’deki git-gel’lerden dolayı kesin problem yaşarsınız… Ben şimdiden söyliyim…

Mesela bir örnek olması için; genelde uygulama ve veri tabanı arasındaki iletişim bu açıdan problem yaratır. O/R Mapping araçları ile lazy-loading kavramı hayatımıza girince, uygulama-veri tabanı arası git gellerin artması network’de geçikme problemlerine sebep olabilir. DTO’ların varlık sebeplerinden bir tanesi de bu problem zaten… Bundan dolayı sadece ihtiyacımız olduğu zaman network’e çıkmalıyız, çıkmamız gerektiği durumlarda da kullanacağımız verinin hepsini almalıyız.

Read More

Bulut bilişim ile yazılımların, servis olarak her yere ve herkese ulaşabilmesinden sonra, her cihazın internete bağlanabilecek olması, önümüzdeki 5-10 yılın teknolojik olarak sanırım en büyük olayı. Sosyal medyanın öncülüğünde zaten insanoğlu 7/24, bir birine bağlı bir hale girdi. Dakikalar hatta saniyeler mertebesinde, bu teknolojiyi benimsemiş kişilere ulaşmak mümkün. Kısacası artık herkes “online” olmaya başladı.

IoTBunun bir sonraki adımı, kullandığımız cihazların da “online” olmaya başlaması. Internet of Things(IoT) yani nesnelerin interneti dediğimiz bu kavram ile; teoride, günlük hayatta kullandığımız bir çok elektronik ve mekanik cihaz internet üzerinden erişebilir ve yönetilebilir olacak. Hatta hatta bir birleri ile internet üzerinden konuşabilecek olacaklar. İçerisindeki malzemelere göre size ne yemek yapabileceğinizi öneren ya da içerisindeki azalan domatese göre yeni sipariş veren buzdolabı, eve geliş saatinize göre klimayı ya da kombiyi açan akıllı ev sistemleri, arabanızda oluşan arıza için otomatik olarak servisten randevu alan arabalar ve daha bir çok benzer değişik sistem IoT adı altında hayatımıza girecek. Bir çoğu girmeye başladı bile hatta.

Hayatımızı kolaylaştıracak şeyler olsa da, daha farkına varmadığımız bir çok problemi de getirecekler tabi ki. Güvenlik konuları daha fazla önem kazanacak. İnternet üzerinden bir şekilde erişime açık olan bu cihazların güvenliği bir noktada en büyük endişe noktamız olacak belki de… Düşünsenize, internette bağlı çamaşır makinanız, hack’leniyor ve en sevdiğiniz tişörtünüz yıkanırken çekiyor ve küçülüyor…Eyvahlar olsun… 🙂

Her cihazın internet üzerinden iletişim içerisinde olması ve yönetilebilir olması, yazılım açısından da yeni yaklaşımları ortaya çıkaracak. Yine bize iş yani… Yazılım açısından yeni kavramların, yeni problemlerin ve çözümlerin hayatımıza girecek olması heyecan verici. Bütün bunların içinde olabilmek, içinde olmasak bile neler olup bittiğini takip etmek bir yazılımcı için ayrıca önemli. Son 10 yılın en popüler mesleklerinden biri olan “yazılım geliştirici”, şimdi herkesin yazılım yapabilecek konuma geliyor olmasından dolayı daha farklı bir duruma geldi diye düşünüyorum.  Ciddi anlamda bu konuda çok becerikli bir nesil geliyor çünkü…

Ey yazılımcı, eğer doğal seleksiyonla elenmek istemiyorsan, zaten sahip olduğun becerileri korumak ve geliştirmek durumundasın. 🙂

Raspberry Pi ve hareket sensörüNeyse…Bütün bunları yazmamın sebebi, neler olup bittiğini merak edip, küçük bazı projeler geliştirmek istemem aslında. Hobi amaçlı ya da belki değil… Yeni çağın, yetişkinlerin oyuncan anlayışı belki de. Bunları da GitHub üzerinden paylaşmaya çalışacağım, hani takip edip öğrenmek isteyen olur belki diye… İnternet üzerinde yüzlerce kaynak var, eğer sizde IoT falan ilgileniyorsanız, küçük bir merakınız varsa bir göz atın derim.  Ben Raspberry Pi ve bir kaç sensor ve Azure ile başladım… Sizde başlayın, geliştirin, paylaşın…Zevkli…

 

Bonus…

Direkt konu ile alakalı değil belki, ama önümüzdeki yıllar için bizi neler bekliyoru başka bir açıdan yorumlayan bir video paylaşmak isterim. Biraz heyecanlanacak, biraz moraliniz bozulacak belki ama 15 dakikanızı ayırmanızı tavsiye ederim…

Dağıtık SistemlerBulut bilişim kavramı son bir kaç yılın, hatta gelecek bir kaç yılın da en önemli yazılım kavramlarından bir tanesi. Tanışma fırsatı elde etmediyseniz, çok yakında yollarınız kesişecektir zaten. Ama biraz öncesine gidip, “cloud-computing“(bulut bilişim)’in de bir parçası hatta belki temeli olarak yorumlanabilecek “distributed system“den (dağıtık sistemler) bahsetmek istiyorum. Cloud, biraz daha pazarlama üzerine ortaya çıkan bir kavram olduğu için, temelinde yatan “dağıtık sistemler” kavramlarının bazen atlandığını düşünüyorum. Bundan dolayı, eski konulara gidip biraz daha temellerden bahsetmek ihtiyacını hissettim…

Dağıtık sistem…

Ortak bir amaç için, çeşitli iletişim protokolleri ile birbirleri ile iletişim halinde olan birden fazla yazılım sisteminin oluşturduğu sistemlere dağıtık sistemler diyoruz. Basit olması ve daha kolay anlaşılması adına, multi-player bilgisayar oyunlarını örnek verebilirim. Tek bir bilgisayarda bir oyunu, aynı anda 100 kişi oynamaya çalıştığınızı düşünün…Yemez, ayy pardon olmaz… 🙂 Bunun  için ne yeriniz, ne işlem gücünüz ne de zamanınız yeterli olacaktır. Ama bir çok bilgisayar ile, farklı lokasyonlardan yüzlerce kişi ile, büyük bir işlem gücü ile oyunun en zor bölümünü daha rahat bir şekilde geçebilirsiniz.

Bir dağıtık sistem anatomisi…

Dağıtık sistemler ile, pratikte tek bir işlem gücüyle yapılabilecek işleri daha büyük ölçekte yapabilmek amaçlanır. Geliştirilen yazılım sistemlerinin belli bir süreden sonra çeşitli problemlere çözüm sağlayamaması, bu yazılım sistemlerini değiştirmeyi ya da genişletmeyi gerektirir. En basitinden CPU, RAM ve disk boyutu arttırma gibi fiziksel değişiklikleri düşünebiliriz. Hem ekonomik, hem de teknolojik bazı kısıtlamalardan dolayı ne yazık ki bir bilgisayara sınırsız CPU ya da hafıza eklemeniz mümkün değil. Teknolojik kısıtlarına gelene kadar, ekonomik olarak zaten herkes zorlanacaktır.

Dağıtık Sistemler

Zamanla birden fazla kullanıcı ile de problemlere çözüm sağlama ihtiyacımızdan dolayı, belli bir ağ içerisinde birbiri ile iletişim halinde olan bilgisayarları devreye almaya başlarız. İşte bu noktada artık merkezi sistemimizi dağıtmaya başlamış oluyoruz. Yeni problemlere de merhaba diyoruz tabi ki. Bu problemlere sonradan geleceğim…Şimdilik devam edelim.

Birbiri ile iletişimde olan farklı bilgisayarların iletişimlerini sağlıklı yapabilmesi için, belli protokoller radarımıza girer. Sistemimizi buna göre geliştiririz. Bazen bu protokoller yeterli olmaz ya da farklı ihtiyaçlar ortaya çıkar, dolayısıyla farklı yeni protokoller ile de iletişim sağlayacak ara katmanlar yapmamız gerekir. Fazla bileşen ve farklı sistemler olunca güvenlik konuları da ortaya çıkar. Hem iletişimin, hem de yapılan işlemlerin güvenilir olmasını sağlamak birden öncelikli olur.

Bir bakmışız, sistemle büyüyen ve gelişen iş ihtiyaçları artık farklı coğrafyalarda da sistemin 7/24 çalışmasını gerektirir. Farklı coğrafyalarda, aynı verinin güvenli bir şekilde iletilmesi ve işlenmesi gibi bir durum ortaya çıkar. Bütün bunları yaparken de, bu ayrı sistemlerin hata durumlarını yönetebileceğimiz bir senaryomuz ve hatta belli ölçekte yedek ikinci sistem ihtiyaçlarımız ortaya çıkar…

Basit olarak neden dağıtık sistemlere ihtiyaçımız olduğu ortaya çıktı aslında. Biraz daha canlanması adına havayolu yönetim sistemleri, multi-player bilgisayar oyunları, tedarik zinciri sistemleri ve ödeme sistemleri günümüzde hepimizin karşısına çıkan dağıtık sistem örnekleri olarak düşünülebilir. Hatta son zamanlarda oldukça popüler olan yazılım mimari stili olan Microservices yaklaşımı da, bu dağıtık sistem modellerinden biridir. Neyse…Şimdi tekrar oraya girmeyelim.

Karakteristik özellikleri…

Dağıtık sistemler ortaya çıktıkça belli özellikleri sağlamak ile yükümlü olurlar. Bu karakteristik özellikleri sağlıyor olmak, dağıtık sistemlerin en büyük ve en zor problemidir.  Önce bu özelliklere bir bakalım, sonra gerçekten sağlamak mümkün mü bakarız…

  • Yüksek Erişebilirlik: Dağıtık sistemlerin, erişebilirliğinin olabildiğince yüksek olması beklenir. Başarısız bir işlem olsa bile, işlemi tetikleyen kaynağın mutlaka sisteme bir şekilde erişimi olması beklenir.
  • Güvenlik: Dağıtık sistemlerde, işlemlere ve veriye erişim yetkilendirilir.
  • Performans: Dağıtık sistemlerin, kendi performanslarının farkında olması beklenir. Belli sistem yoğunluklarında alacağı aksiyonların belirli olması sistem tasarımında önemlidir.
  • Açıklık: Dağıtık sistemler genişletilmeye açık olmalıdır. Sisteme kolaylıkla alt sistem bileşenleri eklenebilmelidir.
  • Ölçeklenebilirlik: Dağıtık sistemler kaynak kullanımı konusunda kolayca ölçeklenebilmelidir. Kaynak kullanımına göre sistemin verimli çalışmaya devam etmesi bir şekilde sağlanmalıdır.
  • Tutarlılık: Sistemin tutarlı olması beklenir. Aynı anda, aynı veri kaynağına erişen sistemlerin uyumlu ve tutarlı çalışması gerekmektedir.

Bu özelliklere sahip olmak ve bunları belli bir kalite düzeyinde sağlamak oldukça zor. Hatta hepsinin birden sağlanamayacağına dair teoriler olsa da sonradan farklı yaklaşımlarda olmuştur. Eric Brewer’ın CAP teorisi ve sonrasındaki yaklaşımına göz atmanızı tavsiye ederim. (CAP Twelve Years Later: How the “Rules” Have Changed)

Dağıtık sistemlerin bu karakteristik özelliklerinden dolayı, çeşitli programlama yaklaşımları, prensipler ve kalıplar bu sistem tasarımlarında kullanılmaktadır. SOA prensipleri, mesajlaşma kalıpları, kuyruklama alt yapıları, senkron ve asenkron programlama modelleri dağıtık sistem programlama yaklaşımlarında temel olarak tercih edilen bir kaç kavramın başında gelir.  Tabi sistemin amacına göre başka farklı kavramlar da gündeminize girecektir. “Service Bus”lar, “Message Broker”lar falan filan…

Dağıtık sistem tasarlarken ya da bir şekilde içinde bir geliştirme yaparken, yukarıda bahsetmiş olduğum özellikleri sağlamanın da vermiş olduğu bir kaç yanılgıya düşeriz. Peter Deutsch, zamanında bunları çok güzel tanımlamış ve “The 8 fallacies of distributed systems” diye yazmış. Bir sonraki yazılarda bu yanılgıların ne olduğunu ve bu yanılgılardan nasıl kurtulabiliriz bunları anlatmaya çalışacağım…Şimdilik bu kadar. Fazla dağıtmayın… 🙂