Merhaba Arkadaşlar,
Üniversiteden yeni mezun olmuş bir yazılımcı çoğu zaman kendisini, olimpiyat oyunlarındaki 10bin metre maraton yarışı eleme turunun başlangıç noktasındaymış gibi hisseder. Aslında pekte haksız sayılmaz. Bir kaç senelik üniversite eğitimi boyunca kazandığı nosyona rağmen, gerçek hayat çok daha acımasızdır. Sayısız rakip yetmezmiş gibi bir de iş bulma kaygısı söz konusudur. Üstelik hangi teknoloji ile ilerleyeceği meçhuldur. Kulaktan dolma bilgiler ile hareket etmek zordur. Bir kulağınızda .Net diye bağıran Bill amcayı, diğer kulağınızda iPhone development diye haykıran Steve' i duymakla kalmaz, Java aromalı kahve çekirdeklerinin kokusunu da burun deliklerinizden taaa en derin beyin hücrelerinize ulaşıncaya kadar çekersiniz. Şanslısınız ki bu yazıyı okuyorsunuz. Çünkü yazıyı okuduğunuz kişi uzun uzun zaman öncesinde .Net platformuna geçiş yapmış birisidir. Aslında Anders Hejslberg' in ayak izlerini takip ettiğimi ifade edebilirim. Bildiğiniz üzere Anders, Delphi takımındayken Microsoft' a geçmiş ve sonrasında .Net platformu doğmuştur. Kendisini C# programlama dilinin Babası olarakta tanımlayanlar vardır. Pekte haksız sayılmazlar. Peki biz yarı teknik dışı bu yazımızda neyi araştırıyor olacağız?
Uzun zamandır .Net Framework üzerinde geliştirme yapmaktayım. Bu zaman süresi içerisinde bu alanda ilerlemek isteyen pek çok genç arkadaşımızın bana yönelttiği soruların başında "Nereden Başlayacağım?" gelmekte. Bu cevaplanması çok zor olan, yoruma açık ve her profesyonelin farklı şekilde çözebileceği bir soru aslında. Aslında olaya destekli bir yerden başlamakta yarar var. Bana göre ilk hedef "hangi ürün?" olmalı. Sonuç itibariyle .Net çok geniş bir yelpazeyi hedef almakta ve geliştirilebilecek ürün çeşitlerine bakıldığında "Nereden Başlayacağım" sorusunun aslında gerekli bir soru olduğu da ortaya çıkmakta. Herşeyden önce .Net Framework ile neler yapılabileceğini, bir başka deyişle neler geliştirilebileceğini bilmek önemli.
Bir kere en basit haliyle Console uygulamaları geliştirebilirsiniz ki pek çoğunuzun "Iykkk" dediğinizi duyar gibiyim. Oysaki C#, VB.Net gibi programlama dillerinin saf olan özelliklerini, kabiliyetlerini öğrenmek, gerektiğinde test etmek için bulunmaz bir uygulama çeşididir. Nitekim sizi Windows Forms,WPF veya ASP.NET' in ve benzerlerinin görselliğinden uzaklaştırır ve sadece programlama diline odaklanmanızı sağlar. Tabi şu önemli noktayı da unutmamak gerekir; örneğin Sistem Yöneticileri bazı işlerini Console ekranından yapmayı daha çok tercih ederler. Bu ilk işletim sistemlerinden gelen bir alışkanlık olarak düşünülebilir de.
İkinci bir ürün grubu olarak Windows Forms veya .Net Framework 3.0 sonrasında çıkan Windows Presentation Foundation uygulamalarını düşünebiliriz. Bu tip uygulamalar görsel arayüzleri sayesinde kullanıcıların daha fazla ilgisini çekebilecek veya kullanıcı deneyimi(User Experience) olarakta bilinen tecrübelerin daha fazla yaşanabileceği ortamlar sunmaktadır. Genellikle Intranet tabanlı olan veya sadece masa üstünde yerel olarak çalışan pek çok uygulamanın Windows Forms veya WPF tabanlı olması söz konusudur. Ancak bu ürün grupları arasında keskin farklılıklar bulunmaktadır. Özellikle WPF tarafında yazılımcının XAML gibi kavramlarla karşı karşıya kalması söz konusudur. Windows Forms uygulamaları geliştiren yazılımcılar bile, WPF tarafına ilk geçiş yaptıklarında kısa bir süre afallamaktadır. Çünkü farklı bir dünyanın kapıları açılmaktadır.
Bir de, "Ah şu Facebook, google gibi bir fikir bulsam, ya da Amazon gibi bir site geliştirsem de...köşeyi şuradan dönsem..." diyerek hayaller kuranlar için ASP.NET dalı söz konusudur. Web tabanlı uygulamaları geliştirmek aslında sanıldığı kadar kolay değildir. Alt tarafta yatan pek çok temel kavramı bilmek gerekmektedir. HTML(Hyper Text Markup Language) den iyi anlamak, yeri geldiğinde Javascript ile müdahalelerde bulunmak şarttır. Ama daha ileri seviyelerde, bu alanda ilerlemek isteyen yazılımcıları AJAX(Asynchron Javascript And Xml), XML(eXtensible Markup Language), JSON(JavaScript Object Notation), MVC(Model View Controller), SEO(Search Engine Optimization), CSS(Cascading Style Sheet) gibi konular ağırlar. Üstelik Web' in doğası Windows/WPF/Console gibi uygulamalardan çok daha farklıdır. Stateless olmak, performans için Cache' leme yapmak, kullanıcıyı doğrulamak ve yetkilendirmek, profilini yönetmek, Web Part' lar ile sayfayı kişiselleştirilebilir hale getirmek gibi kavramların havada uçuştuğu bir dünyadır.
Tabi Web uygulamaları diyince akla son yıllarda Silverlight gibi RIA(Rich Internet Application) uygulamaları da gelmektedir. Bu tip uygulamalar sayesinde, Web tarafındaki kullanıcı deneyiminin en üst seviyeye çıkartılması ve çok daha zengin içeriklerin sunulması söz konusudur. İlk zamanlarında emekleme aşamasında olan bu ürün, son zamanlarda çıkan versiyonları sayesinde çok daha iyi bir duruma gelmiştir. Tabi Silverlight tarafında da WPF kökleri bulunmaktadır. Bu nedenle XAML(eXtensible Application Markup Language) tarafına hakim olmak önemli olabilir. Diğer yandan yazılımcılar, tasarımcıyı geliştiriciyle ayırt eden konsept nedeniyle belki de sadece kod tarafıyla ilgilenmelidir. Nitekim tasarımı kolaylaştırmak adına Expression ürün ailesinin kullanılması önerilmektedir.
Yaşananlardan : Web dünyasına adım attıktan bir süre sonra kendime bir site yapmananın gelişimim açısından çok önemli olacağını düşünmüştüm. www.bsenyurt.com' un ilk temellerini attığımda tasarım yönünden sınıfta kaldığım çok açık ve belliydi. Bir türlü doğru renkleri seçemiyor, sayfanın HTML giydirilmesi konusunda başarı sağlayamıyordum. Açıkçası içime sinmeyen bir tasarım oluşmaktaydı. Kod tarafında bir sorun yoktu. Ama zaten ilerleyen zamanlarda çalıştığım tüm yazılım şirketlerinde, web uygulamalarının tasarımı ile ilgilinen ayrı arkadaşların olduğunu görmüştüm. Halen daha da böyledir ve böyle olmasında yarar vardır. Kendi sitemi görsel açıdan toparlayamayacağımı anlayınca çocukluk arkadaşımdan yardım istedim. Kendisi Bilkent Üniversitei Grafik Tasarım bölümünü burslu okumuş ve yüksek başarı ile bitirmişti. Bir web sitesinde hangi font' ların kullanılacağını, kurumsal kimliği yansıtacak renklerin neler olması gerektiğini, sayfa tasarımında neyin nerede bulunabileceğini çok iyi bilen yetenekli bir arkadaşımdı. Sadece 3 renk kullanarak sitemin görüntüsünü bir anda değiştirmiş ve benim için bir sanat şahaseri gibi görünen arayüzü bir kaç dakika içerisinde oluşturmuştu. Sonra tabi o tasarımı hayata geçiremedim ama yine de bir tasarımcı ile geliştiricinin keskin çizgiler ile bir birlerinden ayrılan ikililer olduklarını da gördüm.
İşte bu keskin çizgiye rağmen her iki tarafın rahat çalışabilmesi adına yazılım şirketlerinin de yatırımlar yaptığını görmekteyiz. Söz gelimi Microsoft' un Expression ailesi buna verilebilecek en güzel örneklerden birisidir. Visual Studio geliştirme ortamı ile olan entegrasyonu sayesinde birlikte çalışılabilirlik hem ayrık hem de bir arada olmasının önemi ortaya çıkmaktadır.
Görsel tarafta sayılabilen ve aslında bilgisayarı olmayanların dahi kullanabileceği bir ürün grubu da söz konusudur. Mobil uygulamalar. Smartphone, PDA cihazları, kısacası Windows Mobile işletim sistemine sahip ve bir anlamda da üzerlerinde .Net Compact Framework yüklü olan aygıtlar için geliştirmeler yapılabilir. Aslında Mobil dünyası çok farklıdır ve bu tarafta pek çok zorluk vardır. Cihazların bilgisayarlara göre daha sınırlı kapasitede donanıma sahip olması, ekran boyutlarının küçük olması gibi faktörler bunların arasında sayılabilir.
Yaşananlardan: Eğitmen olarak yaşadığım ilk kurumsal tecrübem, Boehringer-ingelheim isimli ilaç firması için olmuştur. Tesadüfe bakın ki bu ilk kurumsal eğitimin konusu zayıf olduğum alanlardan birisi olan Mobil Uygulama geliştirmedir. Eğitimi verdiğim sırada .Net Framework 2.0 henüz Beta aşamasındaydı. Eğitimde en çok üzerinde durulan konular, mobil cihazların donanım kapasitelerinin yetersiz olması, offline konuma sık sık düşmeleri nedeniyle sunucu üzerindeki kaynaklar ile olan senkronizasyonlarının zor teknikler ile gerçekleştirilmek zorunda kalışı vs gibi güçlüklerdi. Aslında teorik bilgimiz ne kadar iyi olursa olsun saha tecrübesini yapmadığımız takdirde yeteneklerimizin gerçek hayattaki sınamalarını asla öğrenemeyebiliriz. Hatta söz konusu alanlarla ilişkili olarak pek çok Case Study okusak bile fiziki saha tecrübesinin yerini tutmayacaktır.
Ürün ailesi içerisinde yer alan önemli parçalardan birisi de Servis uygulamalarıdır. Bu uygulamalar .Net Framework 3.0 çıkana kadar çeşitlilik göstermiştir. XML Web Service' leri, Windows Service' leri, COM+ veya MSMQ hizmetleri vb. .Net Framework 3.0 sonrasında ise WCF(Windows Communication Foundation) ortaya çıkmış ve Microsoft' un servis tabanlı uygulama geliştirme modelinin yeni yüzü haline gelmiştir. İşe yeni başlayan bir yazılımcı için servis geliştirmek çok basit öğrenilebilecek bir süreçtir. Aslında bu bir yanılgıdır. Nitekim servislerin asıl hedef noktası Servis Yönelimli Mimari(Service Oriented Architecture) tarafıdır. Gerçekten de SOA için servis geliştirilecekse, olayların bambaşka bir hal aldığı ve sayısız SOA Tasarım Kalıbının bilinmesi gerektiği gibi korkutucu bir senaryo ile karşılaşılmaktadır. Hatta pek çok büyük çaplı projede servisler sadece entegrasyonu sağlamak amacıyla kullanılan birer piyondur.
Yaşananlardan: Şu anda çalışmakta olduğum firmadan önce uluslar arası bir banka da yine dış kaynaklı yazılımcı olarak görev almaktaydım. Buradaki asli görevim, geliştirilmekte olan WinForms tabanlı uygulamanın, banka içerisindeki yabancı sistemler ile olan konuşmaları sırasındaki entegrasyonunu sağlamaktı. Yeri geldiğinde uzak sunucularda bulunan ve sadece soketler aracılığıyla erişilebine C tabanlı uygulamalar ile konuşulması, yeri geldiğinde COM nesnelerinin Wrap edilmiş halleri üzerinde ele alınan bileşenler(RightFax API gibi ) ile haberleşilmesi, yeri geldiğinde Windows Service' leri veya XML Web Service' lerinin yazılarak projeye entegre edilmesini gerçekleştirmeye çalıştım. İnanılması güç ama servisleri yazmak ne kadar kolay olduysa da, projenin çalıştığı banka ortamının kısıtları nedeniyle onları dağıtmak(Deployment) ve onlarla etkili bir şekilde konuşmak bir o kadar zor oldu. Dolayısıyla yine aynı noktaya geliyoruz. Saha tecrübesi bambaşka bir heyecan...
Peki ya bir Windows uygulaması veya Web Portalı ya da basit bir WCF Servisi tek başına yeterli midir? Çoğu zaman bu uygulamaların tabir yerinde ise button arkası olacak şekilde geliştirildiklerine şahit oluruz. Oysaki büyük çaplı projelerde yazılım mimarları sürekli olarak uygulamanın katmanlarını düşünür ve en uygun olanını tespit ederek tasarlarlar. Bu katmanlarda yer alan vazgeçilmezlerden birisi de Sınıf Kütüphaneleridir(Class Libraries) ve görsel bir arabirim sunmadıkları için pek çok yeni yazılımcı tarafından Console uygulaması muamelesine tabi tutulurlar(Aslında bir Class Library uygulaması içerisine static Main metodunu dahil ederek ve Visual Studio üzerinde çıktının Console Application olacağını söyleyerek Console uygulamasına çevirebileceğinizi de biliyor muydunuz?) Oysaki Enterprise Libary, .Net Framework' ün kendisi pek çok sınıf kütüphanesini ihtiva eder. Açıkçası bir Framework geliştirilmesi gerektiğinde veya katmanlı mimari tercih edildiğinde her yazılımcı er ya da geç Class Library kavramı ile karşılacaktır.
Bitti mi? Aslında saymadığımız pek çok uygulama çeşidi ve kavram söz konusu. Ado.Net Entity Framework, Workflow Foundation, Parallel Development, Component Development vb...Yine de buraya kadarki düşüncelerimizi göz önüne alarak yapabileceklerimizi gördüğümüzü var sayalım. Bir yazılımcı için bu yine de yeterli olmayacaktır. .Net Framework tarafında yazılımcıların en az bir .Net dilini etkin bir şekilde kullanabilmesi şarttır. Bu çoğunlukla C# veya VB.Net dillerinden birisi olacaktır. Tercih yaparken daha önceden C++,C veya Visual Basic kökenli olmak karar vermeyi kolaylaştıracaktır. Fakat unutulmaması gereken önemli bir nokta da, gerçek hayat projelerinde başımıza ne gelebileceğinin bilinmemesidir. Bir bakmışsınız sıradaki projede Iron Pyhton veya F# kullanacaksınızdır. Ya da tamamen platform değiştirip Java tarafında ilaveler yapacaksınızdır...Hatta kendinizi Java tarafında yazılmış servisler ile konuşacak bir entegarasyonun içerisinde bulabilirsiniz. Kim bilebilir? Son sözü söyleyen yöneticiniz değil midir? Ama her ne olursa olsun .Net tarafında ilerlerdiğimizi varsayarsak, C# veya VB.Net dillerinin her ikisine de hakim olmak bir avantaj olabilir.
Yaşananlardan: Bir kaç yıl önce çalıştığım bir .Net projesinde Türkiye' nin önde gelen bir Holding' i için önemli bir ASP.NET uygulaması geliştirmekteydik. Ben her zamanki gibi dış kaynak elemanı olarak projeye dahil olmuş ekibin bir parçasıydım. Projede, Holding tarafında yer alan ekip arkadaşlarımız da mevcuttu. Gelin görünkü bizim sahip olduğumuz hazır alt yapı C# tabanlı iken, Holding tarafındaki arkadaşlarımız VB.Net kökenli idi. Bir arada çalışılacağına göre biz biraz VB.Net onlar biraz C# yazmak durumundaydı. Aynen de böyle oldu. Ben ASP.NET tarafındaki ekranların arka planlarını VB.Net ile geliştirirken Business Layer tarafı C# tabanlıyıdı. Dolayısıyla bir anlamda dilden bağımsız harkete edebilir formasyonda uçmaktaydık. Nitekim .Net destekli birden fazla dil aynı proje içerisinde kullanılabilirdi.
Peki neler yapabileceğimizi görmek ve uzmanlaşmak için bir ürün ailesini seçmek, hangi dilleri öğrenmemiz gerektiğini bilmek yeterli midir? Ne yazık ki hayır. Başlamak için beynimizi paralel çalışabilen parçalara bölmemiz de gerekecektir. Nitekim öğrenilmesi gereken kavramların sayısı çok fazladır ve bunlar zamanlar acımasız bir şekilde beynimizin her noktasına enjekte edilmeye başlanacaktır. Buna göre biraz programlama dillerini çalışırken biraz .Net Framework içeriği araştırılmalı, biraz Tasarım Desenlerini(Design Patterns) incelerken biraz mimari modellere bakılmalı, biraz uzmanlaşmak istediğimiz taraftaki(Windows, Web, Mobile, Service Oriented vb...) güvenilir makaleleri karıştırırken biraz yeni gelen teknolojilere bakmalı vb... şeklinde bir yol izlenilmelidir.
Ancak şu an için kendimizi bu kadar fazla korkutmaya da gerek yoktur. Nereden mi başlamanız gerekiyor? Bence .Net Framework üzerinde geliştirme yapabileceğiniz bir dili iyi bir şekilde öğrenerek. İyi bir şekilde öğrenmekten kastımız, tabiki tüm anahtar kelimeleri(Keywords) bilip "button arkası" kodlama yapmak demek değildir. Dile öylesine iyi bir şekilde hakim olmasınız ki bilerek, görerek, hissederek, hatasız kodlama yapabilmeli, Nesne Yönelimli Programlama(Object Oriented Programming) terimlerini su emen sünger misali yutarak anında uygulayabilmeli veya çözüm için gerekli tasarım kalbını o dil ile birlikte kullanabilmelisiniz.
Sonrası mı?... .Net Framework' ün kabiliyetlerini tanımak olabilir. Öylesine iyi bilinmelilerdir ki, bir sınıf kütüphanesi içerisinde yazdığınız tipler yardımıyla gerçekleştireceğiniz IO, Database, XML gibi işlemleri yeri geldiğinde bir Windows uygulamasına, yeri geldiğinde çok az konfigurasyon değişikliği ile belki bir Web uygulamasına açabilecek kadar. Hatta bunlarda yetmeyecektir ki, geliştirdiğiniz projenin nasıl bir mimari modele oturduğunu görerek .Net Framework materyallerini kullanmayı bilmek, AOP(Aspect Oriented Programming) tadında bir yaklaşım olacaksa eğer, niteliklerin veya konfigurasyon dosyasının ne kadar etkili kullanılabileceğini görmek gerekecetir.
Sonrası mı? Aslında sizi daha da öteye taşıyacak materyaller hemen yanı başınızdadır. Yurt dışından bizzat veya şirketiniz aracılığıyla getirttiğiniz kitaplar, içerisinde yer almakta olduğunuz projeler ve tabiki en önemlisi takım arkadaşlarınız. Yeter mi? Elbette hayır. O yüzden yeni başlayan arkadaşlarım bu koşulları tamamladıklarında lütfen bana mail atsınlar... Tekrardan görüşünceye dek hepinize mutlu günler dilerim.