2013 yılının bu ilk günlerinde, yakın zamanlarda kafamı meşgul eden bir hususta görüşlerimi paylaşmak istedim. İkibinli yılların ortalarından itibaren Facebook'un kurucusu Mark Zuckerberg'inki gibi hikayeler tüm dünyada olduğu gibi ülkemizde de "girişimcilerin" gözlerini parlatır oldu. Kısacık zamanlarda milyonlarca insana erişmenin getireceği zenginlik çok kimsenin rüyalarını süslüyor. Ancak....
Ne yazık ki iş artık hiç ama hiç kolay değil!...
Milyonlarca insana hitab edebilecek bir sistemin geliştirilmesi çok ileri düzey mühendislik bilgisi ve tecrübesi gerektiriyor. Özetle
muhteşem bir fikrim var, bulurum yeni mezun birkaç yazılımcı, veririm üç beş kuruş, yazdırırım yazılımı...
türünden düşüncelere sahip olanlar, hayallerine veda buselerini hemen verebilirler zira bu iş ne yeni mezun yazılımcıların yapabileceği bir iş, ne de üç beş kuruşa yapılabilecek bir iş!
Neden bu işin bu kadar basit olmadığını tüm cepheleriyle anlatmaya kalkarsam çok uzun bir yazı yazmam gerekir. Bu yazıda işin sadece teknoloji boyutunu, onun içinde de sadece yazılım mimarisi boyutunu ele almaya çalışacağım.
Muhteşem fikirlerimizi dünyanın kullanımına arz etmek için bir yazılım uygulaması geliştirmemiz gerekiyor. Yazılımın tıpkı yeni yapılacak bir bina gibi önce mimarisinin belirlenmesi gerekiyor. İşte ilk zorluk burada karşımıza çıkıyor: Öyle başdöndürücü gelişmeler var ki bırakın derinlemesine öğrenmeyi, neredeyse takip etmek bile çok zor. Sadece son bir sene içerisinde ortaya çıkıveren mimari bileşenleri ve yazılım trendlerini listeleyen bir çalışma rahatlıkla bir master tezi olabilir!...
Ciddi, gelecekte yeniden yazılması gerekmeden varlık gösterebilecek bir web 2.0 projesinin yazılım mimarisini şekillendirirken düşünülmesi gereken o kadar çok şey var ki! Mesela kimsenin düşünmediği en basit yerden başlayalım: "loglama"! Kod seviyesinde debugging amaçlı seviyesi belirlenebilir logging için mesela log4j, slf4j, logback gibi ilk anda aklıma gelen altenatif logging frameworkler var. Uygulama seviyesinde daha çok güvenlik amaçlı loglama (kim oturum açtı, ne işlem yaptı vs.) tamamen ayrı bir konu. Performansı düşürmeden, ayarlanabilir seviyelerde planlanmalı. Zira biliyoruz ki bu tür logları tutmak kanuni açıdan gerekli olabilir.
Güvenlik meselesi tamamen ayrı bir dünya. Authentication - Authorization için role based backend'ler kurgulanacak. Apache Shiro, Spring Security, JAAS gibi kendini ispatlamış framework'ler var ama hangisinin seçileceğini bilmek için ön çalışma sürecine ek olarak -hangisi seçilirse seçilsin- bir öğrenme süreci olacak. Arka tarafta openldap, active directory, OID gibi seçeneklerden birinin kullanılıp kullanılmayacağı da ayrı bir konu. Session management, SSL, encyrption gibi konulara hiç girmiyorum.
Artık neredeyse hiçbir modern uygulama klasik teknolojilerle kodlanmıyor. Servis odaklı mimari için de bir framework seçimi gerekiyor. REST, SOAP, WCF, RPC, JAVA RMI gibi seçenekler var. REST'i seçsen XML, JSON alternatiflerinden birini seçmek gerekiyor. Şu an RestEasy ya da Jersey gibi implemantasyonlardan birinin seçimi de önemli. Biri ya da diğerini tercih etmek için gereken araştırma-öğrenme sürecini yazmak lazım bir kenara.
Yoğun servis odaklı bir sistemde gelen mesajlar için bir queing mekanizması kullanmak artık şart. Asenkron çağrılarla gelen mesajların mutlaka işlendiğini garanti etmek için seçebileceğimiz messaging framework'ler içinde ilk aklıma gelenler ActiveMQ, OpenMQ, FuseMQ, RabbitMQ.
Ana platform için JAVA tarafında J2EE, Spring 3, EJB 3, JSF 2 gibi alternatifler var. Her biri kendi içinde derya deniz. Frontend tabi ki çok çok önemli. Kesinlikle HTML5 uyumlu bir javascript framework seçilmeli GWT, Primefaces, Sencha, Dojo, jQuery, YUI, Prototype, MooTools.. İşin mobil tarafı unutulmamalı: Sencha Touch, jQuery Mobile, vs....
Mobil uygulamalar, IOS, Android ve artık Windows 8 platformları için Native Os App olarak ayrı ayrı mı geliştirilecek. HTML5 tabanlı bir çözüm mü olacak? PhoneGAP gibi hem crossplatform hem native bir yol mu seçilecek...
Abartmamak için service orchestration - ESB konularına girmiyorum ama UltraESB, FUSEESB, Apache Camel, Apache ServiceMix, Mule, WSO2, Talend alternatifleri bir yerlerde bekliyor.
ORM kullanılıp kullanılmayacağı önemli bir karar. Hibernate 4 en kuvvetli aday ama performans üzerinde olumsuz etkisi ortada. MyBatis ya da Apache DBUtils gibi tam ORM sayılmayan daha lightweight kütüphaneler tercih edilebilir. Tabi relational database kullanacaksak. Şu an trend NoSQL veritabanları yönünde. Meşhur Bigdata konsepti gündemdeyken artık MySQL-MariaDB, PostrGreSQL, MsSQL, Oracle, DB2 gibi veritabanları pek tercih edilmemeye başladı. Yeni adaylar sayıca bayağı çok: MongoDB , Cassandra, CouchDB, Redis, Riak, HBase, Couchbase, Neo4j, Hypertable, ElasticSearch, Accumulo, VoltDB, Scalaris.
Bu yazdıklarım sadece JAVA tarafındaki alternatifler. PHP ve .Net tarafında bu derece haberdar değilim doğrusu. Ruby On Rails hatta Python gibi popülerlik atağındaki teknolojileri daha da az biliyorum. Mesela son zamanlarda bir Node.js humması var ki şu anda daha yeni yeni bakmaya başladım...
Yazılım mimarisinin belirlenmesi derken kastettiğim bu kadar çok alternatif arasından doğru seçimleri yaparak kimliklendirme, yetkilendirme, loglama, servis, ui, ve temel db işlemleri gibi herşeyin standardize edildiği bir integrated framework'un hazırlanması. Bütün bunlar görüldüğü gibi, "yeni mezun yazılımcı çocukların" falan altından kalkabileceği şeyler değil. Hatta çok tecrübeli bir mühendisin dahi altından kalkabileceği şeyler değil. Birkaç tane ateş gibi, meraklı, araştırmacı, neyin ne olduğunu bilen, işin belli bir kısmına iyice odaklanmış, mesleğini seven, tecrübeli mühendisi bir araya getirmek ve birlikte çalıştırabilmek lazım. Bunun için bol bol para ve ayrıca da zaman lazım. 2000'lerin başlarında, hatta ortalarında olsaydık belki Zuckerberg tarzı (bir developer + bir iş geliştirmeci ile) bir mucize gerçekleştirme şansımız daha fazla olabilirdi ama artık milyonların aktif kullanıcının yoğun kullanımını hedefleyen web 2.0 projeleriyle rekabet edebilecek yeni sosyal medya projeleri çok ciddi yatırım gerektiriyor maalesef. Sosyal medya olarak değerlendirilecek, yani milyonlar değilse bile yüzbinleri kendine çekebilecek fikirlerin düşük bütçelerle hayata geçirilmesi çok zor.
İşin kötüsü tüm bunların sağlanması da başarıyı garanti etmiyor. Yüksek bütçeler, tecrübeli mühendisler ve yüksek motivasyon sağlansa da başarıyı yakalamak biraz şans işi. Google Plus, arkasında google olmasına rağmen beklenen başarıyı yakalayamadı mesela. Ne maddi destek sıkıntısı vardı, ne teknoloji, ne tanıtım... Ama olmadı işte...
Şu an bir kamu kurumunun altyapısının tasarlanması için bu konularda kafa patlatıyor, araştırmalar yapıyorum. Devletin projelerine bakıyorum hepsi rezil durumda. Yöneticiler vaziyetten habersiz... Mesela son zamanda ortaya çıkan redhack'in YÖK EDYS'sini patlatması hadisesine bakın. Güvenlik işini, dünyadan habersiz junior adamlara bırakırsanız işte aynen böyle madara olursunuz. Bunun, sizin "muhteşem fikrinizin dünyayla buluştuğu" bir sosyal medya sitesinde yaşandığını, insanları gizli ya da sınırlı olarak koyduğu kişisel bilgilerinin ortaya döküldüğünü düşünsenize! O gün o site biter...
Kimsenin hayallerini yıkmak istemem ama bu yola çıkacak olanlar en azından ne ile uğraştıklarını bilsinler istedim. Bir twitter, bir facebook, bir instagram kurgulamak, öyle Joomla ile Wordpress ile web sitesi kurmaya ya da (.net'ci arkadaşlar alınmasın ama) Visual Studio'da sürükle bırak yöntemleriyle web uygulaması yapmaya benzemez.