Objective C: Back to the Future!

Apple patladı, patlattı, gidiyor.
iPod dedi, iPhone dedi, MacBook dedi, iPad dedi, dedi de dedi.
Kullanıcı deneyimi olarak dövebilen, yenebilen yok adamları. Yapıyor ve güzel yapıyor “adamlar”.
Öte yandan, son kullanıcı için sağladıkları konforu, maalesef programcı tayfasına sağlamıyorlar.
iPhone/iPad uygulaması yazmaya kalkanlar, ne dediğimi biliyorlar.
XCode, bu işin IDE’si. XCode 4 daha kabul edilebilir oldu ama, daha geçen sene XCode 3 vardı henüz. Onunla ilgili yorumum, “insan bunu insana yapmamalı” şeklindeydi.
iOS için seçtikleri programlama dili de bizi yirmi sene geri götürdü. Objective C! Kapağını açınca naftalin kokuyor. Objective C dediğin, preprocessor kullanarak C diline Smalltalk’dan feature taşımak için ITT’de icad edilmiş bir dil. Sene 1981. Apple’ın neden seçtiği belli, az RAM’li yerlerde overhead minimum olacak şekilde çalışıyor programlar. Fakat programcıya yazık değil mi ağalar?
Aynı durum ile karşı karşıya olan Google (tamam taraflıyım burada) Java seçerek daha doğru bir seçimde bulunudu. Dalvik JVM de pek ağır siklet değil, dünya da batmadı.
Objective C’de kıl olduğum durumlar:

Arkaik notasyon. Köşeli parantez ile metod çağırma, ya da mesaj gönderme.
İlk maddede de belli olan kavram kakafonisi. Class’a interface, interface’e protocol, protokole Mahmut dememiz gerekiyor.
Kategori diye bir şey var, adı ile kendisi alakasız.
Yeniden manuel memory management’a döndük. Birinci seviye memory leak yine mümkün. Yaşasın!
Ayrı header dosyası, ayrı kod dosyası yaz. Sene 1994 sanki.
Compiler ayrı, linker ayrı arıza çıkartsın. Yine sene 1994.

Tabi esas rezillik, mobil cihazların da kapasiteleri tavanı aştığı zaman olacak. Objective C’nin orijinal seçilme nedeni olan kısıtlı donanımda çalışma gereği ortadan kalkınca, tamamen sebepsiz yere 2011 yerine 1994′te kod yazıyor olacağız programcılar olarak.
Yahu şu Apple’ın bize ettiğini yedi düvel bir araya gelse edemez…
Ha bir de şu mesele var: “Alışınca güzel valla” diyenler falan var. Bu arkadaşlar, çatala karşı Çin çubuğunu, otomatik vitese karşı manuel vitesi savunanlarla aynı kamptan. Maksada göre değişir. Otantik deneyim istiyorsanız, Çin çubuğu kullanabilirsiniz. Ancak çatal daha iyi teknolojidir. Araba yarış cihazı ise, manuel vites sevebilirsiniz (hoş son gelişmelerden sonra bu da yalan oldu; F1 araçlarında tiptronik dedikleri otomatik vites var). Ama otomatik vites gereksiz arkaikliği kaldıran bir teknolojidir. Yani genel olarak, insanı eğitmek yerine makinayı eğitmek, düzeltmek doğru olan opsiyondur. Böylece dikkatinizi ve eforunuzu daha yüksek seviyeden işlere aktarabilirsiniz.
Üç gün compiler’ı mutlu etmek için uğraştım… Neyse ki eski C’cilerden kim kaldı diye sorulunca elini yükseğe kaldıran tayfadanım.
Şimdi kod yazmaya devam…

Source: safkan.org/blog/  

Internet Devrimi…

Wikipedia
Devrim falan, öyle laf çok sevmem ben. Fazla iddialıdır çünkü. Hem neyi devireceksin Internet ile?
Ama tut ki attık başlığı öyle. Demek ki iddialı bir iddiada bulunulacak.
Internet, ilk yıllarında fazla şişirildi. “Dot com” balonunu ve patlamasını hep beraber gördük. Zannedildi ki, işleri sanal ortamda yapınca, tüm iş kuralları değişecek. Herkes bir koyup üç alacak. Pek öyle olmadı. Balonun patlaması hemen bir “ince ayar” yaptı ortama. Daha temkinli yaklaşılır oldu balonlara.
Internet, tabi aslında bir haberleşme protokolü. Ama Internet deyip büyük harfle yazınca, herkesi birbirine bağlayan ağdan bahsediyoruz, tekil olduğu için de büyük harfle yazıyoruz.
Internet’in başlangıçtaki amacı askeri… Word Wide Web dediğimiz şeyin ise başlangıç amacı daha çok bilimsel, verilerin paylaşımı için. Yani, düşünülen hep belli grupları birbirine bağlamak.
Ama, pek çok zaman, insanlar kendilerinden büyük şeyler yaratırlar. Sonra o “şey” kendi kaderini kendi belirler…
Internet de öyle oldu. Elbette, “dünyayı değiştireceği”ni söyleyen çoktu, ama bu şekilde mi?
Ne oldu da şimdi adına devrim demeye cesaret ettim? Internet ohoo, çok senedir var.
Internet artık hızlı. Yani, yazıların yüklenmesi artık anında. Birkaç MB sorun değil. Film indiriyoruz artık, hem de filmi seyretme süresinden kısa sürede.
Internet artık hep var. “Bağlan” demeye gerek yok. Desktop’lar zaten bağlı, laptop’larda wireless’ı olmayan kalmadı. Bağlantı yoksa cep telefonu şebekesinden bağlanılıyor.
Diyeceksiniz herkes mi? Hayır. Ama yayılıyor. Cep telefonu da üç beş kişide vardı, şimdi basbayağı herkeste var. Herkeste mobil Internet olacağı zamanlar pek uzak değil.
Eee? Yani?
Yanisi şu… Elektrik kadar hayatımıza girdi, daha da girecek. Oyunun kurallarını değiştiren bir şey bu.
Mesela, bilgi çöplüğü artık para etmiyor. Yani, “adam sinema konusunda ummandır, yönetmenleri, filmlerini ezbere bilir” artık bir şey ifade etmiyor. Açtım mı IMDB’yi ben de onun kadar bilgiliyim anında. Her yerden de ulaşabiliyorsam…
Ansiklopedi denen kavram da yalan oldu. Wikipedia ile önce dalga geçenler vardı. Ama, önemli miktarda insanın bir konuda derinlemesine bilgisi vardır… Onları bir araya koyunca ansiklopedi oldu. Evdeki Memo Larousse’u, son temizlikte gönderdim… Orada olup da Wikipedia’da olmayan bir şey yok çünkü.
Bu daha da beter hale gelecek. Bilgiye sahip olmak, ya da ulaşmayı bilmek çok bir şey ifade etmeyecek. Herkesin yapabildiği bir şey olacak.
Kıymet nerede olacak peki? Bilgiyi işlemekte, yorumlamakta, ondan sonuçlara varabilmekte olacak. Elbette bir de bilgiyi üretmekte…
Bunun tam devrim olması için, bilgilerin daha yoğun, daha serbest paylaşılması lazım. “Bir sonraki seviye”ye çıkabilmek için…
Bu kadar…
Yarım mı oldu? Bağlayamadık mı bir yere?
Internet de öyle. Henüz bir yere bağlanmadı. Ama ip hazır, kazıklar var… Bağlanacak sıkıca.
Ama nereye?
Source: safkan.org/blog/  

Programlama Dilleri – Hangisi Daha İyi?


Sürüp giden bir tartışmadır bu. Hangi programlama dili daha iyi?
İnsanlara tek tek sorarsanız, genel olarak alacağınız cevap, tek bir dil olacaktır. Her biri de bu seçimini hiddet ve şiddetle şu andan sonsuza kadar savunacaktır. Neden mi? Çünkü her biri kendi problemi için doğru olan programlama dilini seçmiştir. Bunu seçerken bir-iki başka dil de denemiştir, onların işe yaramadığını da görmüştür. Yani, söylediği doğrudur. Kendi problemi için.
Şöyle bir laf var: Eğer elinizdeki tek alet çekiç ise, her şey gözünüze çivi gibi görünmeye başlar…
Ama her şey çivi değildir… Vida vardır, cıvata vardır, perçin vardır…
Peki, hangi dili öğrenmeli, hangisini kullanmalı? C var, C++ var, Java var, C# var, Perl var, Python var, Javascript var…
Şöyle bir üzerinden geçelim durumların, bakalım bir yere varabiliyor muyuz…
C:
Hey baba torikler… C, yaşça benden büyüktür, 1970 doğumlu olarak kırk yaşına yakındır. Seviye olarak, assembly seviyesine çok yakındır. Programcıya maksimum esnekliği sağlar — inanılmaz yanlış şeyler yapmak dahil, her şeye izin verir; genel olarak “programcının ne yaptığını bildiğini” varsayar. Bir CPU’dan olabilecek en yüksek performansı çıkartmak için ideal dildir — ancak çok kısıtlı durumlarda (gerçekten çok kısıtlı) C yerine assembly diline dönme gereği duyulur. Mesela, device driver veya “number crunching” (yani sırf matematiksel hesaplama) işi yapacaksanız, ideal programala dilir, pek eline su dökecek dil de bulamazsınız. Ancak öte yandan, hafıza yönetimi tamamen programcıya bırakılmıştır. Thread desteği kütüphane aracılığıyla vardır. Network desteği de keza. Bol miktarda “boilerplate” kod gerektirir. (Boilerplate kod dediğimiz şey, yani aslında iş yapmayan, ancak o dilin yazım kurallarına uymak için yazılması gereken kod kısımları…) Dolayısyla, web programcılığı, database işleme veya daha genel olarak bilgi sistemleri işleri için pek uygun bir seçim olmayacaktır. Yazmaya yazılır da, uzun zaman alır ve zor olur. Özetle, “RAD” denilen, “rapid development” işi için çok iyi bir seçim değildir. C’yi severiz, saygımız vardır.
C++:
İşte size çıfıt çarşısı misali bir dil. İçinde o kadar çok şeyi barındırır ki, ne idüğü belirsizdir aslında. Yani içinde o kadar çok çeşit programlama şekli içerir ve o kadar hiç birini zorlamaz ki, neredeyse “amorf” bir programlama dilidir. Dili icad eden Stroustroup (adını doğru yazmışızdır umarım) dilin popüler olması için, herkesin her istediğini dile koymuştur. Object-oriented programlamayı destekler, yani “class” meselesi. Template programlama vardır. İsteyen düz C gibi de kullanabilir. Function ve operator overloading’e müsaade eder ki, bunlar beter şeylere dönüşebilir. Çok iyi kod yazmak (iyi = anlaşılır) mümkün olduğu gibi, iğrenç kod yazmak da mümkündür. C’de eksik olan şeyler bunda da eksiktir öte yandan. Hafıza yönetimi yine programcının eline kalır. Rapid development veya web development için çok güzel bir seçim değildir. Performans olarak C’ye yakın performans verse de, bir takım overhead’ler dolayısıyla, performansta C kudretine erişemez. (Vırtual tables vs. gibi. Limit olarak C’ye yaklaşır, ancak prensipte geçemez diyelim. Aman kör nokta bulup gelmeyin bana.) Öte yandan, object-oriented yazılacak, performans gerektiren büyük çaplı uygulama projelerinde, güzel bir seçenektir. Yalnız, dilin afedersiniz her bokunu bir arada kullanmaya kalkışmamak gerekir. Anlaşılır kod yazmak için kaçınılması gereken yerler vardır. (Operator overload etmeyin, exception kullanmayın, dayak istemeyin falan gibi.) Ha, bu arada, söylemeden geçmeyelim, Google’daki üç “resmi” dilden biridir; ortamın ağır topudur.
Java:
Nispeten genç bir dil. 1995′de icad edildi. Sun tarafından. (Sene 1999′da “on yıl tecrübeli Java programcısı” arayan adamlar vardı, onu da söylemeden geçmeyelim.) İlk önce browser’ın içine applet yazmak için bir dil olarak çıktı ortaya. Zaman içinde applet’ler gözden düştü, bunlar doğru dürüst çalışmadı çünkü. Server-side Java başta pek hesapta yokken, sonradan işin “esas” tarafı haline geldi. İcad eden onlar değildir muhtemelen ama, yarı-derlenme olayını ilk popüler yapan dil Java’dır. Yani, derleme, Java’yı “bytecode” denen şeye çevirir. Bu daha sonra çalışma esnasında JVM denen “Java Virtual Machine” tarafından interpret edilerek çalışır. İlk zamanlarda, Java’nın yavaşlığı meşhurdu, pek çok derdi vardı. Ama zaman geçtikçe pişti Java. Başlarda 1:10 olan hız oranı (Java C’ye karşı mesela) tamamen nümerik olan uygulamalar hariç, 1:2 falan civarına geldi. Arada JIT compilation denen şey icad edildi ki, “Just In Time Compilation” demek, çalışma anında Java bytecode’dan makina koduna derlenir oldu. Java’nın avantajları, C++’daki problemli şeylerin çoğunu atması, “garbage collected” hafıza modeliyle birinci seviye hafıza yönetmini programcının elinden alması, “pointer aritmetiği” kullandırmaması, “multiple inheritance”a izin vermemesi, “operator overloading” yaptırmaması oldu. Bunlara ek olarak, Java network ve database programlama için gerekli şeyleri, programlama için gerekli veri yapılarını standart kütüphanelerinde barındıran bir dil olarak, bunlarda daha hızlı development’a imkan tanıdı. Dil, yapısı itibariyle, alabildiğine büyük projeler gelişirmeye uygun bir dildir. Information systems şeklindeki sistemler için de idealdir. Bu şekliyle, server-side web programlamanın kuvvetli silahıdır. Ama, “number crunching” işinde nihai olarak C veya C++ ile yarışamaz. Ha, yine kaçırmayalım, Java Google’daki üç resmi dilden ikincisidir.
Python:
Python. Java’dan yaşlı, ama popüler olması Java’dan sonra bir dil. Script dili. Performans olarak yukarıdakilerin hiç biriyle cirit atamaz. Object oriented programlama destekler. En büyük kuvveti şu: Acayip hızlı kod yazılır. Neredeyse sıfır “boilerplate” kod içerir. Direkt konuya girersiniz. Development time, Python ile yukarıdakilerin hepsinden hızlı olur. Bu da önce bytecode’a derlenir, ama ondan öte geçmez. Perfomansın dert olmadığı durumlarda, ya da hızlı prototip üretmek gerektiğinde, çok şahanedir. Tüm kütüphaneleri Java kadar olgun olmasa da, oldukça geniştir. Standart kütüphanelerini kullanmak çok kolaydır. Pek çok durumda, diğer programları çalıştırmak ve aralarında köprü görevi görmek için de idealdir. Hafif bir silahtır, bıçak gibidir, çok fazla hasar vermek gerekince işe yaramaz, ama kullanması çok hızlıdır. Diğer dillerde daha “çı” diyemeden Python’da kod yazılmış bitmiş olur. Bu da Google’daki resmi dillerin üçüncüsü.
Javascript:
Yine bir script dili. Java’yla isim dışında ve biraz format dışında zerre kadar alakası yoktur. Biraz object-oriented’a benzetilmeye çalışılmışsa da, aslında bir “prototype” dilidir. Browserlar üzerindeki mecburi, de facto programlama dilidir. AJAX onsuz olmaz. Genel olarak büyük projelere soyunmaya kalkışılacak bir dil değildir. Server side Javascript kısa bir müddetten sonra tedavülden kalkmıştır zaten. Gerçekten anlayanı pek azdır, genelde oradan buradan afırma program parçalarıyla kullanır onu herkes. Aslında bir grup “kötü” yönü çıkartılırsa, fena bir dil değildir.
Şimdi diyeceksiniz ki hoca, gerisi ne oldu? Annem bana, bilmediğin konularda fazla atıp tutma dedi, o oldu. C# Java sülalesinden, Perl ve PHP Python sülalesinden (PHP daha garip bir arkadaş ya neyse). Bunların arasında hangisi daha iyi derdi beni aşar.
Şimdi esas mesele şu: Hangisini kullanalım? Hangisini öğrenelim?
Cevap basit değil. Hepsini öğrenin, doğru sırayla. İlgili iş için doğru olanı kullanın. Doğru sıra, size en çok lazım olanı ilk öğrenmektir. Yani alet çantanıza ilk neye ihtiyacınız varsa onu koyun. Ama bir tek çekiçle kalmayın. Tornavida, pense, alyen anahatarı (bunun da İngilizcesi Allen key imiş, Allen icad eden adamın adı iyi mi) hepsi olsun. Yani, performans çıkartacak, bilgi sistemini büyük çaplı programlayacak ve hızlı programlama yapılabilecek dillerden birer tane bilmek, programcının şanındandır. Duruma göre aleti çıkartır kullanırsınız.
Proje yaparken de, maliyetleri iyi hesaplamak gerekir. Mesela, Python başlangıçta düşük performansıyla saçmalık gibi durabilir. Ama kod geliştirme süresini hesaba katarsanız, öyle olmadığı ortaya çıkar, Bir server’ın aylık kirası, bir programcının aylık giderinin üçte veya dörtte biri kadardır. Kodun her yerinin aynı dilde olması da gerekmez. Performans gerektiren yerleri C++ ile, bilgi işleyen yerleri Java ile yazarsınız, araları da Python ile doldurursunuz, şahane hayatınız olur. Örnek mi? Bkz: Google… Keza Facebook’da da ön taraf PHP, ancak arkada Java ve C++ da koşuyor gereken yerde rivayete göre.
Vidalara çekiçle vurmayın yani… Tornavidada çekiç kuvveti yoktur ama, vidanın o incecik oluğuna tam oturur, gerekli olan yerde gerekli olan kuvveti uygular. Programlamada tek bir problem olmadığı gibi, tek bir çözüm de yoktur, aramayın, bulamazsınız.
Source: safkan.org/blog/  

İLETİŞİM