Programlama…

Doğrusunu söylemek gerekirse anlat anlat bitmez bir şey gibi duran programlama düsturu, temelde çok çok çok basite indirgenebilecek bir metadır. Satranç oyununa çok benzediğini savunurum hep, öğrenmesi basit ustalaşması yıllar alan özelliğinden dolayı. Programlama içerisinde kullanılan araçlar ve o araçlarla yazılan kodlar, temelde öğrenmesi çok kısa bir süre alacak bir kaç elemandan başka birşey değildir. Ancak o araçlar ve kodların kendileriyle ve birbirleriyle olan bağlantılı sistematiği programlamanın ana temelidir ki, bu sistemin adama benzeyen bir hal alması yıllar yıllar yıllar alır.

En temeli şudur, “Rutin”. Genelde assembly bilenlerin kullandığı bir kelimedir rutin, hem hayattaki rutinlerden bir alıntı gibi durduğundan bende kullanmayı çok severim. Hayatın rutini nedir ? kalk, yemek ye, yat uyu kalk… bir döngüsel işlemler yığını. Aynı şekilde program rutini de programcının belirlediği birbirini takip eden işlemler dizisidir. İngilizcesi “Routine” kelimesinin yol manasındaki fransızca kökenli “Route” kelimesinden türediği aşikar. Bu anlamıyla da birbirini takip eden işlemlerin bir yol ortaya çıkardığını anlayabiliriz. Bu iki anlamı bağdaştırdığımızda ortaya çıkan şey açık ki: bir sorunu çözmek için izlenen yoldur aslında rutin. Peki bu rutin nasıl oluşturulacaktır.

Bu anda da ikinci temel kelimemiz ortaya çıkar. “Algoritma”, tam kelime manası olarak çözüm yolu denebilir ancak bize bir yolun nasıl çizileceğini anlatan haritadır diyebiliriz aslında programcılık açısından bakınca. Kocaman bir arazi düşünün örneğin. bir noktada duruyorsunuz ama o noktanın arazinin neresi olduğunu bilmiyorsunuz. sonra bir nokta söyleniyor size gitmeniz gereken. Ancak kendi noktanızı bilmediğinizden gideceğiniz noktanın yerini de bilmeniz olası değil. Böyle bir bilinmezler içerisinde noktaya varma çözümümüzdür aslında algoritma. Araçlarımız ve kodlarımız bellidir. Mesela yürüme ve pusula diyelim. Bu iki şeyi bir arada kullanarak sonuca ulaşırken her çözücü birbirinden farklı bir çözüme imza atacaktır. Bu yüzden algoritmalar ve onların sonucunda yazılan rutinler onu yazana özgü bir imza taşır. O yüzden bir programcıya ait bir rutini başka bir programcının anlaması ve devam ettirmesi oldukça zordur. O rutin yazılırken programcının neler düşündüğü nasıl bir yol çizdiğini yanlızca o programcı bilebilir. Bu iki temel sanal kelime aslında programlamanın özü gibi, geriye kalan şeyler bu iki temelin etrafında oluşturulmuş sistemler sadece, kodlar bahsettiğim gibi yürümemizi sağlayıp o yolu oluşturmamızı sağlayan şeyler, pusula gibi aletler ise o yürümenin yönü hızı ve doğruluğu gibi bazı özelliklerinde yürüyene yardımcı olan şeylerdir. O yüzden bir yol çizerken hem araçları hem de kodları yeterince iyi bilmek ve aktif kullanmak en kısa ve en doğru yolu bulmaya kesinlikle yardımcı olacaktır. Baştaki örneğe dönersem, satrançta mesela kale nin ne işlevi olduğunu ve hareket diagramını bilmezseniz kaç oyundan galip çıkabilirsiniz. Dışardan bakınca kale nedir ki, vezir var, şah var, kale öylesine bir taş sadece. Ancak sonuca ulaşmada diğer tüm taşlar kadar kendisine bir rol biçilmiş ve o rolün gereği geldiğinde sizin onu bilmeniz ve kullanmanız gerekli. Bu anlamda bilinmemesi gereken kod yada araç olduğunu söyleyenin büyük bir hatası var demektir. Her kodun kendine özgü bir soruna cevap olduğu açıktır ki, diller geliştikçe ortaya çıkan yeni sorunlara yeni çözümler her zaman üretilmiştir.

Bir çok bu işe başlayan kişinin ilk takıldığı nokta dil seçimidir. Programlama dili denen şey bize sadece kodsal ve araçsal avantaj ya da dezavantaj sağlayacağını unutmamak lazımdır. Keza yapılacak işe göre seçilen dil her zaman için programcının avantajı olacakken, tersi durum programcının ızdırabından başka birşey olmaz. Örnekten gidersek; yol bulmak için bırakıldığımız alanda araç olarak basit bir pusula ve yürümek için ayaklarımız varken, onların yerine pusulaya göre çok gelişmiş mesela bir cep telefonu, ve yürümek yerine de araba verilmiş olsun. İkiside üst seviye araçlar kesinlikle. Ama yön bulmakta kullandığımız basit pusula olmadan cep telefonun teknoloji olarak üstün olmasının faydası nedir. Ya da her yere rahatça tırmanabilecekken, sadece düz yolda sorunsuz ilerleyen arabanın bize ne faydası olur. Aslında bu örnek her programlamaya başlayan kişinin düştüğü temel sorunun cevabını veriyor sanırım. Çok kez duyduğum bir sorudur. “Abi C++ varmış onu öğrenecem” neden diye sorunca “en kapsamlısı oymuş” evet en alt seviye dil c++ dır, hemen hemen her dilin kendisi bile onunla yazılır, derlenir vs. ancak basit bir işlem için böyle bir kuvvetli bir dil kullanmak hem fazla yük hemde gereksiz zaman gereksinimi yaratır. Daha basit bir örnek vermek gerekirse; fransızca oldukça zor bir dildir, italyanca da öğrenmesi oldukça kolay bir dil. (ikisinide bilmem duyduklarım sayesinde böyle bir kanıya sahip oldum) bir italyanla konuşmak için daha zor diye fransızca öğrenmenin saçmalık seviyesi neyse, basit bir windows uygulaması yazmak için gidip c++ öğrenmeye çalışmakta aynı dereceye sahiptir.

Anlattıklarımdan yanlış bir kanı doğmasın: “algoritma ile programlama dili kesinlikle bağımsızdır”. Hayır kesinlikle değil, çünkü algoritma ve onun ortaya çıkardığı rutin’i var eden şey programlama dilidir. Bu anlamda algoritmanın oluşturulmasında programlama dili ile gelen araç ve yapıların algoritmanın temel öğeleri olduğu söylemek doğru aynı zamanda algoritma oluşturulmadan önce konu ile ilgili dil’in seçimi de yapılacağına göre ortada yumurta-tavuk olayı var biraz. Ancak benimde yaşadığım ve genel olarak gördüğüm şu dur ki; bir programcı aktif çalışma zamanı boyunca kullandığı dil sayısı bir kaç ile sınırlıdır. Yani her iş için yeni bir dil öğrenmesi ya da kullanması pek genel bir olay değildir. Ki bir dili aktif olarak kullanmak onunla sıkıntı yaşamadan programlama yapabilmek için biraz uzunca bir çalışma süreci gereklidir. O yüzden programlama dilleri çabuk değiştirilebilen ya da hızlı adapte olunabilinen şeyler değildir demek doğru olacaktır. Ek olarak genellikle bu işin okulunu okumuş kişiler okulda ilk öğrendikleri dil ve yakın dillerle çalışmayı benimsemelerine rağmen, benim gibi bu işi deneme-yanılma ile öğrenmiş “alaylı” lar ise bir çok alakasız dil ile çalışmış olmaktadırlar. Bu benimde dahil olduğum ikinci grubun en büyük içinde kaldığı kıstas bence budur: “Birçok içinde hiç” çünkü bir çok farklı dilin kullanımını öğrenmeye çalıştıkça aslında bir çorbadan başka bir şey öğrenmediğinizi farkedersiniz. Çünkü bilgisayarın bütün kısımlarında olduğu üzere programlama içinde “uçsuz bucaksız bir alan” tarifi yanlış değildir. Bu yüzden herşeyi öğrenmeye çalışmak herşeyden biraz öğrenmekten başka bir şey sağlamaz insana. Bu yüzden genele yakın dökümantasyonu tam olan bir dil üzerinde uzmanlaşmak herşeyi bilmeye çalışmaktan daha faydalıdır.

Bu herşeye yarayan genele yakın dillerin iki kutubu olduğunu söylemek doğru olur sanıyorum, java ile .net dilleri Java benim programlama ile haşır neşir olmaya başladığım zamanlar (ki 90′ların sonlarına tekabül eden yıllardır) ortaya çıkmış bir dildir, belkide benim haberimin olması o tarihleri bulmuş olabilir. Neyse genel olarak java dili ve araçlarının bendeki uyandırdığı kanı; kocaman (doğru tabiri ile massive yapıların) işletilmesinde ve yürütülmesinde kullanılmasıdır. Java ve araçları “kur ve unut” tarzı ve çok büyük yapılarda daha başarılı ürünlerdir diyebilirim kendi açımdan. Çünkü genel olarak pek user-friendly sayılmayacak bir dil ve araçlar bütünüdür aslında java ve yandaşları. Java bu açıdan sahibi Sun ile kesinlikle paydaştır. Sun adı, dünya genelindeki bütün son kullanıcılara sorulmuş olsa çok çok ufak bir kısmı ne olduğu doğru bilecektir ki, bu da firmanın daha kurumsal ve özele dayalı bir stratejisi olduğunun kanıtıdır sanıyorum. Haliyle Java dili ve araçları da bu stratejinin birer meyvası demek yanlış olmasa gerek. Bu açıdan iki uç dediğim .net ve java ile ilgili firmalarının stratejilerinin de uç olması durumu gayet normal. Tabanı genişletip halka yayılma stratejisi izleyen Microsoft ve kurumların gereksinimleri ile ilgilenip mevcut tabanı daha verimli kullanmaya çalışan Sun. Bu noktada Microsoft’la ilgili kelamlar etmeye başlayabilirim sanırım.

Microsoft ve tabi ki herkesin en azından adını bildiği kurucusu Bill Gates in yaklaşık 30 küsür yılda yaptıklarına bir iktisat mezunu gözü ile baktığımda ana temel çıkarımım şu oluyor; ortada firmalar tarafından bölüşülmeyi bekleyen bir pasta varken microsoft mantığı bu pastadan daha büyük oranda pay almayı düşünmekten çok pastayı büyütmeyi amaçlıyor. Bunu başardığı anda da büyüyen ek kısıma sahip olduğu için bilgisayar teknolojisi gereği eski pastanında büyük bir kısmı otomatik olarak eline geçiyor. Yani başkalarının hedef diye baktığına Bill Gates sonuç olarak bakıyor demek doğru. Bu stratejinin çok verimli olduğunu söylemek için aynştayn olmaya gerek yok. Dünyanın en büyük şirketinin Microsoft olduğu sayısal bir gerçek. Bu stratejinin ilk ürünü PC’ler. IBM ortaklığı ile ortaya atılan bu terimin ana teması her eve bir bilgisayar, pardon bir PC sokmak olduğunu biliyoruz. Yani Gates mevcut bilgisayarların içerisindeki satış oranını artırmaktan önce bilgisayar piyasasını büyütmekle işe başlıyor. Bunu başardığı anda da haliyle büyüyen pastanın sahibi oluyor. Ek olarak evlerine PC girenlerde basit bir mantıkla aynı kullanım için işlerinde ya da başka çalışma ortamlarında da PC istiyorlar. Sonuç hem genişleyen pasta payı üstüne eski pastanın da büyükçe bir dilimi Gates’in oluyor.

Gates’in bu stratejisinin programlama alanındaki karşılığı olan bir dilden bahsedeceğim şimdi: BASIC (Beginner’s All-purpose Symbolic Instruction Code) ilk temelleri 60′ların başında atılan dilin en önemli kilometre taşlarından birisi Altair BASIC, Gates’in bizzat kendisinden gelmiştir. 1975 yılında Paul Allen (Microsoft un diğer kurucusu) ile beraber yazdıkları BASIC türevi olan Altair BASIC, o zamana kadar ki en kapsamlı BASIC türevi olmanın yanında, dönem göze alındığında yukarıda anlattığım stratejinin tamda kendisi olmaya adaylığını ortaya koyan bir yapıdadır. Çünkü ilgili dönemde hakim dil olan C ve türevlerine göre yazımı ve anlaşılması kolay olan BASIC dili şüphesiz programlama dili pastasının genişletilmesi amacına uzun yıllar hizmet edebilecek yegane bir dil olacaktır. İlk ortaya çıkışından yaklaşık 40 yıl sonra bu amacın gayet doğrulandığını söyleyebilirim. BASIC dilinin yazım şekli (teknik tabiri ile syntax’ı) oldukça basittir, satırlar ya da kodlar enter (CR ve LF) ile ayrılır ve okunması oldukça kolaydır. Diğer tüm dillerdeki yapıların (döngüler, tanımlar, operatörler ve işleçler) hepsine sahip olmasının yanında çok kolay öğrenilebilir. Yakın zamana kadar ana felsefesi olan event-driven yapı sayesinde çok birşey bilmeden rahatlıkla iş gören programlar yazmak mümkündü. Kendi açımdan bakınca GWBASIC ile başlayıp QBASIC ve Visual BASIC ile devam eden programlama yaşantımda bu temel özelliklerin büyük katkısı olduğunu söylemem doğru olur sanıyorum. Çünkü bir bilgisayarı bile olmayan bir genç yoksa nasıl programlama öğrenebilirdi ki?

Ancak her güzellikte olduğu gibi bu madalyonda da bir arka yüz mevcuttu ki, bu zamanın ben dahil olmak üzere tüm BASIC programcıların karşılaştığı ana sorun olan yavaşlık ve kısıtlı kalmışlıktan başka birşey değildi. Belirli temel bir çok programı rahatça yazabilmeye karşın kapsamlı bir object-oriented yapıya sahip olmama, üst katmanda sıkışıp kalan bir runtime katmanına bağımlılık gibi temel sorunlar yüzünden, dil asla piyasada bir kabul görmediği gibi her zaman -doğru tabiri ile- adam yerine konulmayan bir noktada çalışmak zorunda kaldı. Bu sorunların giderilmesinin ilk hareket noktası runtime dan çağın gereksinimi framework e geçişti mutlaka.

Java ve .net dillerinin ana söylemidir ama java için daha bir kuvvetli sesle söylenir. “Write Once, Run Anywhere” / “Bir kez yaz, her yerde çalıştır” kısaca “WORA”. Temelde mümkün gibi dursada bu hiç bir zaman için mümkün olmamış bir fenomenden başkası değildir. Çünkü programlar kompleksleştikçe mutlaka ek kütüphane ve araçlara ihtiyaç duyarlar ki bu eklentilerin her zaman her ortamda var olması mümkün olamayacak kadar uçuk bir durumdur. Buna ilavaten gittikçe görselleşen ve karmaşıklaşan bilgisayarlarda programların belli görsel ihtiyaçlarının oluşması oldukça doğaldır. Bu açıdan ilk andan itibaren bir hayal olarak nitelendirdiğim WORA’nın zaman geçtikçe gerçekden uzaklaşması oldukça normal geliyor bana. Bu noktada tüm bu eklentilerin sistematik bir biçimde ortaya çıktığı anı anlatmak gerekli sanıyorum; “framework” bilgisayarın belirli standart kısımları için geliştirilmiş standart kod eklentileri, objeleri ve araçlarının genel adıdır framework, bir işbirliği içinde çalışması anlamında bu isim kullanılmakta olduğunu sanıyorum ki temelde işletim sistemi ile program arasındaki katmandan başka birşey değildir. Java için JRE (Java Runtime Environment) ve .net için .net Framework. İkiside içerisine kuruldukları işletim sistemi ile programın arasındaki katman olma görevini görünmez eleman olarak icra ederler. Ve haliyle her ikiside programların çalışması için gereklidir.

Yine hiç bilmediğim java tarafını bir kenara bırakıp .net framework le devam edeyim. İlk kez .net yapısının ortaya çıktığı 2000 yılının başlarında, bu felsefenin temel taşı olarak gösterildi .net framework. İlk versiyonu v1.0 23 Şubat 2002 de yayınladı. Yaklaşık bir yıl sonra v1.1, 2006 yılı başında v2.0, bir yıl kadar sonra v3.0 ve 2007 kasımında v3.5 yayınlandı. Genellikle her ana versiyonla beraber yeni bir geliştirme arayüzünün yayınlanması ile devam eden süreçte kapsam içerisindeki dillerin temeli değişmezken kullanım ve yazımı kolaylaştıran eklentiler dillere kazandırıldı. En başından itibaren .net dillerinin içerisinde en bilinen ve kullanılan iki tanesinden söz edebiliriz. C# ve VB.net. Birisi C syntax’ına aşina kişileri microsoft saflarına çekmek için yaratılırken, diğeri zaten o safta bayrak tutanların ezikliğini gidermeye yönelikti. Bu yeni platformda diller arasındaki tüm ayrım ve farklılıklar çalışma bazında yok edilmişti. Bu nasıl mümkündü ? Basitçe ortak bir dilde birleşme ile tabi ki. Bu dilin adı da MSIL oldu yani Microsoft Intermediate Language. .net platformunda hangi dile bağlı bir kod yazarsanız yazın derleme esnasında bu kod MSIL’e çevrilmekte idi. Bu sayede dillerin syntax ve bir kaç ufak tefek farkları dışında tamamen aynı olması sağlanmış oldu. Bir başka değişle C yapısı BASIC’e yaklaşırken BASIC de C ye yaklaştı denebilir. Mesela BASIC yapısında hiç varolmamış bir OO (object-oriented) yapı var olmaya başladı.

VB ile bir Class yapısı mevcuttu fakat gerçek anlamda hiç bir zaman OO bir yapı olamamıştı bu. Çünkü OO temelin ana maddeleri olan polymorphism (çok yüzlülük), inheritance (kalıtım) ve encapsulation (kapsama) öğelerinden hemen hemen hiç biri basit class yapısında mevcut değildi. Tabi bu yapı değişimi VB6 dan VB.net’e geçişte bir çok programcı gibi beni de sağlam sıkıntılara sokmuştu. Temelde beyninizin algoritma ve program yapısını kurma mantığının tamamen değişmesini gerektiren yapı biraz mecburiyetten biraz da gereksinimlerden dolayı hiç alakadar olmadığı BASIC diline güzel bir şekilde enjekte edilmiş idi. Geldiğimiz noktada söyleyebileceğimiz eski basit yapısını temelde korurken, güncel tüm yapıları barındırmakta olan bir dil olarak BASIC dilinin büyük bir programcı kitlesine, oldukça yüksek oranlardaki uygulama geliştirme gereksinimlerinde eksiksiz fayda sağlayacağı yönündedir.

[bir ara devam ederim...]


başa dön