(Bu yazı 25 Ocak 2019 tarihli SenVeriBükücü blog yazısından uyarlanmıştır)

“Hangi programlama dili en geçerlisi?” sorusu kodlama ile ilgilenen veya işi düşen herkesin biz hocalara yönelttiği bir soru. Cevabı yok, ve bunu anlatmak pek kolay olmuyor. Bu soru aynı “en iyi kıyafet hangisi?” sorusu gibi, cevabı nereye gideceğinize, ne yapmaya çalıştığınıza bağlı.

Programlama dili neden önemsizdir?

Programlamaya başlayanlar bir programlama dilini gözüne kestirmek ihtiyacı hissederler ve bunu çok önemserler. Çünkü göz korkutucu görünen bir iştir. Olsa olsa bir programlama dili öğrenebileceklerini düşünür ve haklı olarak en doğrusunu seçmek isterler.

İşin doğrusu şu ki asıl öğrenilmesi gereken algoritmik düşüncedir. Şöyle düşünün bir dili bilmek sizin o dilde güzel öyküler yazabileceğiniz anlamına gelmiyor. Güzel bir öykü yazmak kompozisyon ve anlatım tekniklerini bilmeyi gerektirir. Bu şekilde tasarladığınız bir öyküyü bildiğiniz herhangi bir dilde yazabilirsiniz. gerçekten de güzel öyküler farklı dillere çevrildiğinde gücünden hiçbirşey yitirmiyor. Buna benzer şekilde algoritmik düşünce bir hesaplama hikayesini doğru şekilde ifade etmeniz için temel bilgidir.

Zaman zaman ortaokul-lise düzeyinde öğrencilerle çalışıyorum. Bu eğitimlerde amacımız onlara problemlere sistematik yaklaşma ve çözümleri doğru ve güzel ifade etme becerilerini kazandırmak. Bu yüzden dünyanın en basit programlama dillerinden biri olan ve kökeni 1950’lere kadar giden Scheme’i kullanıyoruz. Çok basit ve öğrenmesi çok kolay bir dil. Bu basitliğine rağmen algoritma kurma ve hesaplama problemlerini sistematik olarak çözmek için gerekli tüm temel sözdizimlerini sağlıyor. Böylece bir hikaye oluşturmak için aşmak gereken önemli bir zorluğu, yani dilin grameri ve sözdizimi sorununu, neredeyse ortadan kaldırmış oluyoruz. Bu sayede öğrenenler daha temel olan algoritmalara odaklanabiliyorlar.

Programlama dili neden önemlidir?

Programlama öğrenmeye yeni başlayacak herkes içi Scheme iyi bir öneri. Ne var ki daha ileri yaşta üniversite öğrencileri veya profesyonellerin soruları genellikle “Programlama için Java mı, C++ mi, Python mu?” veya “En geçerli veri analitiği dili R mı Python mu?” şeklinde geliyor. Ben de bu soruya doğrudan yaklaşacağım. İlk bölümde söylediklerimize rağmen bu sorunun şöyle bir anlamı var: her programlama dilnin tasarımı ve tarihsel gelişimi onu bazı konularda daha yetkin yapıyor. Programlama dili bizim algoritmalarımızı ifade etmemiz için bir araç. Aynı hikayeler gibi algoritmaları da dil sayesinde yazmıyoruz (ilk bölümün anlattığı bu) ama onları dil ile yazıyoruz. Eğer seçtiğiniz dil o hikayenin ihtiyaç duyduğu sözcükleri sağlamıyorsa çok zorlanırsınız. Bu yüzden dil seçiminin hala bir anlamı vardır.

Ancak dil seçimi anlatmak istediğiniz hikayenin konusuna, yani algoritmanızın çözeceği progleme bağlı. Burada iş analitiği problemlerinden bahsettiğimizi hatırlayalım. Öncelikle C/C++ seçeneğini masadan kaldıralım. Bilgisayarın derinliklerine (işlemciye ve donanımın diğer parçalarına, programcıların deyişiyle ‘çıplak metal’e) ulaşabilen bu diller bir bilgisayar sisteminin alt katmanlarında (metal’in hemen üstünde) yer alan bilgisayar programları için uygun. Günümüzde bunları yazan az sayıda programcı var. İşletim sistemi veya donanım sürücüsü yazmıyorsanız bu dile ihtiyacınız yok demektir.

Şimdi Java ve Python’u karşılaştırabiliriz. Bunlar neredeyse birbirinin tam tersidir. Java yazılım endüstrisi tarafından geliştirilmiş bir dildir. İki temel tasarım ilkesi vardır: (1) Bir kere yazılan kodun farklı müşterilerin sistemlerinde çalışabilmesi (platform bağımsızlık), ve (2) “Yazılımı yazılımcıdan korumak” olarak tarif edebileceğim “kati tipleme” (programlama dili jargonunda ‘strict typing’). Birinci ilke Java’nın ‘metal’den olabildiğince uzak durması anlamına geliyor. Gerçekten de bir C/C++ programı ne kadar ‘metal’e yakın bir yerde çalışıyorsa bir Java programı da o kadar metal’in üstünde ve uzaktır. Böylece sistemden sisteme olan donanım farklılıklarından etkilenmez. Java programı ‘Java Virtual Machine’ denilen bir tür farazi bilgisayar üzerinde çalışırlar. Java sisteminin üreticileri farklı bilgisayar sistemleri için bu farazi bilgisayarın uyarlamalarını yapıyorla. Böylece java yazılımı üretenler bu farklılıklardan etkilenmiyor, ürünleri platform bağımsız oluyor. Bu yüzden de en yaygın dillerden biri. İkinci tasarım ilkesi ise programcılar için bir cehennem. Java dili yazılımcının istediği algoritmeyı ifade etmesini ön plana çıkartarat tasarlanmamıştır. Onun yerine yazılım imalatının kalabalık şirketlerde yapıldığı, ürünü tasarlayanlar, kodu yazanlar, grafik arayüzü üretenler gibi farklı yazılım departmanlarının bir endüstriyel plana göre çalışacağı, ve aralarındaki en küçük uyumsuzluğun tespit edilebileceği, sıkı kontroller gözetilerek tasarlanmıştır. Bir programcı için java programlamak bir avuç çivi yutuyormuş hissi verir. Gençlere ilk dil olarak Java öğretmeye kalkışmak onların programcılıktan soğumasını garantiler; bunun ne kadar yaygın olduğunu düşünmek tüylerimi ürpertiyor.

Bununla karşılaştırıldığında Python kodu yazmak ise Mango meyvası yemek gibidir diyebilirim. Python’un temel tasarım ilkesi programcının zihnindeki algoritmaları ifade etmesini kolaylaştırmaktır. Bu yüzden programcının zihnindeki algoritma hatalı ise hata -Java’da olduğu gibi- hiçbir engelle karşılaşmadan koda yansır. Dolayısıyla müşteriye doğrudan satışı yapılacak bir yazılım için en uygun seçenek olmayabilir. Ama örneğin Google’da en yaygın kullanılan dildir. Çünkü Google kodlarını değil bu kodların çalışmasıyla ortaya çıkan servisleri müşteriye satıyor. Ve evet hataları da oluyor. Ancak hızlı inovasyon yapmak istiyorsanız, problemlerinize düşündüğünüz çözümleri hızla koda dökmek istiyorssanız Python idealdir. Python da C/C++’ın aksine ve Java’ya benzer olarak (onun kadar olmasa da) ‘metal’e uzaktır. Python kodu farklı sistemlerde hemen hiç değişiklik gerektirmeden çalışır.

Python’un bir başka temel özelliği de muazzam miktarda farklı amaçlar için yazılmış kitaplık olması. Ticari satışa pek elverişli olmaması, ama programcılar tarafından pek çok farklı iş için kullanılıyor olması biraraya gelince bu programcılar kodlarını da açık kaynak olarak paylaşıyorlar (Python paket endeksi’nde an itibarıyle 166,075 farklı proje bulunuyor). Ayrıca Internet forumlarında da çok büyük miktarda örnek ve yardım bulmak mümkün, java’da olmayan ölçüde. Hepsi iyi kalitede olmasa de muazzam bir bolluk bu.

Veri analitiği için bazılarınca Python’un cazip bulunmasının bir nedeni bu paket bolluğu. Ancak şunu söylemek gerek ki Python çok amaçlı ve kod yazımı kolay bir dil olarak tasarlanmış. Bu tasarım ilkesi onun kendi kulvarlarında Java veya C++ ile yarışamayacağı anlamına geliyor. C/C++’ın hızına yaklaşması veya metal’e erişmesi mümkün değil. Java kadar hata tespitinde yetenekli ve platform bağımsız da değil. Ancak yeni bir algoritmik problemin çözümünü hızlıca üretmek konusunda kimse eline su dökemez.Dolayısıyla programın çalışma hızı değil ama programcının çalışma hızı konusunda iddialı bir dildir.

Neden R?

Yine de Python veri analitiği konusunda ihtisaslaşmış bir dil değil, aksine ihtisaslaşmaya karşı bir dil. R ise bir istatistiksel programlama platformu. Dolayısıyla veri analitiği ve istatistik konuları sözkonusu olduğunda R ile Python’u karşılaştırmak İsviçre çakısı ile motorlu testereyi karşılaştırmak gibi olurdu. Ağaç kesmek için çakı kullanmadığınız gibi kampa giderken de ağaç testeresi götürmenin alemi yoktur. Eğer veri analitiği ile uğraşacaksanız tercihiniz kesinlikle R olmalı!

R kullanarak veri analitiği yapacak profesyonellerin fazla algoritma becerisine ihtiyacı yoktur. Onun yerine hangi analiz yönteminin (örn. karar ağaçları, regresyon, sepet analizi, kümeleme, vb.) hangi iş problemini çözeceği konusuna odaklanırlar. İş analitiğinin aşamalarını yerine getirmek için birkaç satırdan oluşan R komutları yazıp çalıştırmaları yeterli olacaktır.

Öte yandan standart olmayan bir analiz algoritması geliştiriyorsanız bunu yapan bir R (veya başka bir dilde) paketi bulamazsınız. bu durumda yapılacak doğru şey Python veya R ile bu algoritmayı kodlamak olmalıdır. Böyle bir durumda hangisinin doğru olduğunu sözlemek zor. Algoritmanın alt parçaları için ihtiyaç duyduğunuz kitaplıkları hangi platformda bulabiliyorsanız onu kullanın diyebilirim.

Bitirirken şunu da söyleyelim: bir programlama dilinde edindiğiniz beceriler diğer programlama dillerinde de ‘hikaye yazma’nızı kolaylaştıracaktır. İhtiyaçlarınıza uygun dili öğrenip kullanmadıkça hikayeyi doğru anlatamazsınız. Çakıyla ağaç kesmeye çalışır duruma düşmekten kaçının.

Nasıl/Hangi R?

Nasıl veya hangi R gibi bir soruyu ticari yazılımlarla ilgili olarak sormazsınız. Ama yazılım açık kaynak olunca sınırları da belirsizleşir. Açık kaynak yazılımlar başka yazılımlarla etkileşir, birleşir, büyür. Bu da kafa karıştırıcı olabilir. R istastistik platformunun temel bileşeni diyebileceğimiz istatistik motoru (R-engine) hala çekirdek bir ekip tarafından koordine ediliyor, birçok büyük açık kaynak yazılımda olduğu gibi. Ancak R’ı farklı kullanıcı türlerine ve kullanım senaryıolarına uygun hale getirmek için farklı şirket veya birey/gruplarca üretilmiş yazılım bileşenleri var. Bunlara baktığınızda açık kaynak ve kapalı kaynak sınırları belirsizleşiyor. Bu konuda dikkatli ama pragmatik olmanızı öneririm. Burada genel bir bakışın yanında somut (ama kişisel) önriler de vermeye çalışacağım.

R ekosistemi temel R motoru’nun yanısıra sayıları 20.000’e yaklaşan R paketinden oluşuyor. Bunlar CRAN (Comprehensive R Archive Network-Kapsamlı R Arşivleri Ağı) web servisi üzerinden tarama, arama, kurulum ve dökümantasyonuna ulaşabileceğiniz kitaplıklar. Biotistatistik, finansal analiz gibi birçok alanda kullanabileceğiniz paketler mevcut. Çoğu zaman benzer işlevler sunan birden fazla paket var. Aynı bir pazaryeri gibi, seçenek bol ama biraz da kafa karıştırıcı. Bazı kitaplıklar istatistik işlevleri değil de kullanım kolaylığı sunuyor. Örneğin Rattle kitaplığı makine öğrenmesi kitaplıklarını bir grafik arayğzden yönetmek amaçlı üretilmiş. Makine öğrenmesi odaklı bir eğitimde katılımcılara bir satır bile R kodu yazdırmadan kullanabileceğiniz türden bir arayüz sağlıyor. RCommander dahil buna benzer R grafik arayüzleri bulunuyor (bkz https://www.linuxlinks.com/guisforr/).

Ben eğitimlerin başlangıcında katılımcıların sade R motoru ile çalışmalarını tercih ediyorum. Bu şekilde R’ın tadına varmak ve motoru tanımak mümkün oluyor. R motoru sadece bir terminal ekranından kontrol ediliyor. Tam anlamıyla programlama diline yoğunlaşmayı sağlıyor. Bu aşamada R programlama dili ile veri yapılarını öğrenmek, temel betimsel istatistik işlemleri yapmak oldukça da rahat.

Ancak biraz ilerleyince RStudio kullanmaya geçiyorum. RStudio “iyi huylu” bir ticari R sistemi. RStudio R motoru’nun üzerinde çalışan iyi tasarlanmış bir grafik arayüzü ve bazı R kitaplıklarından oluşuyor. Şirket grafik arayüz dahil kişisel kullanıma yönelik temel bazı bileşenlerini açık kaynak olarak paylaşıyor. Ancak kurumsal ortak çalışmaya yönelik bileşenler (RServer ismini vermişler) ücretli. RStudio’ya geçmemin birinci nedeni iyi tasarlanmış grafik arayüzü. Bu arayüz bir iş analitiği süreci için güzel bir kumanda paneli ve araç kutusu sağlıyor. Güzel de bir editörü var.

RStudio tercihimin ikinci nedeni ise sistemin bir kitaplığı. RMarkdown kitaplığı iş analitiği için gerekli çok önemli bir ihtiyacı karşılıyor: raporlama. Normalde R veya başka bir programalama dili ile yaptığınız işin sonuçlarını, mesela görselleri ve metrikleri kopyalayıp bir dökümana yapıştırarak, çıktıralı nasıl yorumladığınızı da ekleyerek raporlaştırmanız gerekir. Ancak bu şekilde iş analisti bir iş organizasyonunun diğer bileşenleriyle iletişim kurabilir. Dolayısıyla yeni verilerle analizler yaptığınızda veya analizinizde geliştirmeler yaptığınızda tekrar tekrar kesip yapıştırmanız gerekir. Bu zahmetli, zaman alan, ama katma değeri olmayan bir işlemdir. RStudio tarafından sağlanan RMarkdown paketi tam da bu işi yapıyor. RStudio ile sıkı entegre çalışan bu paket sayesinde R programı ile analiz raporunu tek bir döküman olarak çalışabiliyorsunuz. Bir işletme işlevi olarak iş analitiği sürecinin bu ve diğer unsurları, ayrıca RMarkdown kullanımı ayrı bir yazıyı hakediyor.

Burada anlattığım reçete kendi saha deneyimimden yola çıkarak yaptığım bir tercih. Ancak başta söylediğim gibi seçeceğiniz R araç kiti amacınızın ve kullandığınız bağlamın ne olduğuna bağlı. Büyük bir şirketteki 20 kişilik iş analitiği ekibi ile bağımsız bir iş analistinin ihtiyaçları farklı. Hem programlama dillerini hem de araçları seçerken esnek olmak en doğrusu. Kendinizi trendlerle değil sadece kendi hedefiniz ve ihtiyacınızla sınırlayın.