Microsoft’ta C# geliştirmesinin lideri olan Anders Hejlsberg, C#’ın geliştirilmesi, gelecekteki programlama eğilimleri hakkındaki düşünceleri ve krizlerle başa çıkma deneyimleri hakkında Computerworld ile konuşmak için zaman ayırdı. Hejlsberg aynı zamanda Turbo Pascal sistemini yazmakla da tanınıyor ve Delphi’yi geliştiren ekibin baş mimarıydı.
Common Language Runtime (CLR) ve dolayısıyla C#’ın geliştirilmesini yönlendirdiğine inandığınız diğer dillerdeki temel kusurlar nelerdi?
CLR için birincil motivasyonumuzun diğer dillerdeki temel kusurlar olduğunu söylemezdim. Ancak elbette aklımızda bazı temel hedefler vardı.
Öncelikle, birden fazla programlama dili ve uygulama modeli için birleşik ve modern bir geliştirme platformu oluşturmak istiyorduk. Bu amacı bağlama oturtmak için .NET’in ortaya çıkışına, yani doksanların sonu ya da 2000’lerin başına bakmak gerekir. O dönemde Microsoft’un ana geliştirici teklifleri oldukça parçalıydı. Yerel kod için MFC ve ATL gibi yapılarla C++ vardı. Hızlı uygulama geliştirme için Visual Basic, Web geliştirme için ise IIS ve ASP bulunuyordu.
Her dil, farklı programlama problemlerine farklı çözümler sunan kendi küçük silosuydu. Becerilerinizi diller arasında aktaramıyordunuz ve uygulama modeliniz dolaylı olarak programlama dili seçiminiz hâline geliyordu. Bu ayrı yapıları birleştirerek çabalarımızdan daha iyi yararlanmak istedik.
Ayrıca nesne yönelimi, tür güvenliği, çöp toplama ve yapılandırılmış istisna yönetimi gibi modern kavramları doğrudan platforma dâhil etmek istedik. O dönemde üzerinde çalıştığımız altyapı COM’du; bu, kayıt defteriyle, referans sayımıyla, HRESULT’larla ve benzeri ayrıntılarla uğraşmanızı gerektiren çok düşük seviyeli bir programlama modelidir.
Bu faktörler o dönemde .NET için itici güçlerdi. Sun ve Java gibi rakiplerle ilgili rekabetçi bir boyut da vardı.
C#’a gelecek olursak, özetle amacımız bu platform üzerinde, süslü parantez kullanan kitleye – o dönemdeki C++ programcılarına ve rekabet açısından Java programcılarına – hitap edecek birinci sınıf, modern bir dil geliştirmekti.
Birkaç unsuru temel tasarım hedefleri olarak görüyorduk: nesne yönelimli programlamanın bir üst seviyesine, yani özelliklerin ve meta veri özniteliklerinin dilde birinci sınıf olduğu bileşen tabanlı programlamaya destek; değer türleri ve boxing gibi konuları kapsayan birleşik ve genişletilebilir bir tür sistemi. Sürümleme çok önemliydi; dile yeni özellikler eklediğimizde eski uygulamalardaki kodu bozmamak için dili buna uygun şekilde tasarlamak istiyorduk. Bunların hepsi bizim için önemli değerlerdi.
Elbette günün sonunda, verimlilik benim üzerinde çalıştığım tüm projelerde her zaman itici bir güç oldu. Mesele, programcıları daha üretken hâle getirmektir.
Dil başlangıçta neden Cool olarak adlandırıldı ve C# adına geçişi ne teşvik etti?
Kod adı Cool’du; bu, “C-like Object Oriented Language” anlamına geliyordu. Bu adı oldukça seviyorduk: tüm dosyalarımız .cool olarak adlandırılıyordu ve bu gerçekten de hoştu! Son ürün için bu adı korumayı ciddi şekilde düşündük, ancak ticari marka açısından uygulanabilir değildi; ortalıkta çok fazla “cool” şey vardı.
Bu yüzden adlandırma komitesinin işe koyulması gerekti ve adın içinde C’ye doğal bir gönderme bulunması fikrini sevdik; ayrıca C++ üzerine küçük bir kelime oyunu da vardı, çünkü diyez işaretini dört artı olarak düşünebilirsiniz, yani C++++. Müzikal yönü de ilginçti. Böylece C# oldu ve bu isimden gerçekten çok memnun kaldım. Bize iyi hizmet etti.
Visual J++, Borland Delphi ve Turbo Pascal tasarlama deneyiminiz C#’ı nasıl etkiledi?
Turbo Pascal günlerine dönersek, Turbo Pascal’ın ortaya koyduğu gerçekten yeni unsur, entegre geliştirme ortamını geniş anlamda ticarileştiren ilk ürün olmasıydı – derleme, düzenleme ya da düzenleme, derleme, hata ayıklama arasındaki hızlı geri dönüş döngüsü. Bugün herhangi bir geliştirme aracı da aynı şekilde çalışıyor ve bu elbette her zaman temel bir unsur oldu.
[Ayrıca] dilin araçlarla iyi çalışacak şekilde tasarlanmasını öğrendim. Bu, dili ince şekillerde etkiler – arka planda çalışan bir derleyici ve deyim tamamlama için sözdiziminin iyi işlemesini sağlamanız gerekir. Aslında SQL gibi bazı diller vardır ki anlamlı deyim tamamlama yapmak çok zordur, çünkü şeyler bir bakıma yanlış sırayla gelir. SELECT tümcenizi yazarken, FROM tümcesini yazana kadar insanların neyi seçtiğini ya da neyi seçebileceğini bilemezsiniz. Bunlar akılda tutulması gereken noktalardır.
Üzerinde çalıştığım her ürünün, neyin işe yaradığı ve neyin yaramadığı konusunda bana değerli dersler verdiğini söyleyebilirim; elbette bu bilgiyi daha sonra üzerinde çalıştığınız ürünlere uygularsınız. Örneğin Delphi, özellikleri yerel olarak destekleyen ilk üründü ve bu özellik daha sonra C#’a taşındı. Orada da benzer bir özellik ekledik.
C#’ın geliştirilmesi sırasında büyük sorunlarla karşılaştınız mı? Herhangi bir felaket yaşandı mı?
Hayır, herhangi bir felaket yaşandığını söylemezdim! Ama hayat, yol boyunca yapılan küçük yanlış adımlar ve düzeltmelerden ibarettir; bu yüzden her zaman söndürdüğünüz küçük yangınlar olur, fakat hiçbir zaman tam anlamıyla bir çöküş yaşadığımızı söyleyemem. Üzerinde çalışması çok eğlenceliydi ve şimdi 10 yılı aşkın bir süredir devam ediyor.
Söndürmek zorunda kaldığınız küçük bir yangına örnek verebilir misiniz?
Her proje, içine ne koyduğunuzdan çok, koymaya vaktiniz olmayan şeylerle ilgilidir! Dolayısıyla her zaman neyi keseceğimizle ilgilidir … yani her proje böyledir. Sürekli yangın söndürdüğümüz için belirli bir şeyi ayırıp söylemek çok zor. Yeni insanlar ekipten ayrılır ve yenileri gelir; sanki her gün işe geldiğinizde ele alınması gereken yeni bir şey vardır.
Şansınız olsaydı C#’ı geliştirirken farklı yapacağınız bir şey olur muydu?
Birkaç şey var. Öncelikle, C# 1.0’ı yayımladığımızda dilde generics yoktu – bu özellik C# 2.0 ile geldi ve generics’i yayımladığımız anda, gereksiz olan ve generics kadar güçlü tipli olmayan pek çok eski kodu emekliye ayırabildik. Dolayısıyla C# 2.0’da pek çok şey daha ilk günden kullanım dışı bırakıldı.
Generics’in geleceğini biliyorduk ama bu zor kararlardan biriydi: platformu daha uzun süre tutmak mı, yoksa şimdi yayımlayıp bunun üzerinde çalışarak birkaç yıl sonra mı yayımlamak? En başından generics’in olmasını çok isterdim; çünkü bugün çerçevede daha az eskiyen şeyle kalmış olurduk.
Dil tasarımında ya da platform tasarımında, 1.0 her zaman temel değerlerinizi ve temel tasarımlarınızı ortaya koymak için benzersiz bir fırsattır; bundan sonraki her sürümde ise yapının doğasını kökten değiştirmek çok daha zorlaşır. Bu yüzden genellikle sonradan pişman olunan şeyler, temelde tam olarak doğru yapılamayan unsurlardır. Çünkü bunları değiştiremezsiniz – her zaman yeni kütüphaneler yayımlayabilirsiniz vb., ama platformun temel bütünsel yapısını değiştiremezsiniz.
Örneğin, tür sisteminde değer türleri ile referans türleri ve türlerin null olabilmesi arasında bir ayrımımız yok. Bu biraz tuhaf ya da biraz teknik gelebilir, ama C#’ta string gibi referans türleri null olabilirken, değer türleri null olamaz. Null olamayan referans türlerine sahip olmak gerçekten çok iyi olurdu; böylece “bu string asla null olamaz ve derleyicimin burada hiçbir zaman bir null pointer’a denk gelmediğimi kontrol etmesini istiyorum” diyebilirdiniz.
Bugün insanların C# ile bizim platformumuzda kod yazarken karşılaştıkları hataların %50’si – ve aynı durum Java için de geçerli – muhtemelen null reference exception’lardır. Eğer “bu parametre asla null olamaz ve derleyici lütfen bunu her çağrıda, kodun statik analizini yaparak kontrol et” diyebilmenizi sağlayan daha güçlü bir tür sistemimiz olsaydı, belirli hata sınıflarını ortadan kaldırabilirdik.
Ama bu özellik, baştan buna göre inşa edilmemiş koca bir platformdan sonra sonradan serpiştirilmeye çalışıldığında … bunu sonradan eklemek çok zordur. Çünkü API’lerinizi güçlendirmeye ve “buraya null geçemezsiniz, şuraya null geçemezsiniz” demeye başlarsanız, bir anda bir sürü kodu bozarsınız. Derleyicinin hepsini düzgün şekilde takip etmesi mümkün olmayabilir.
Her neyse, bunlar sonradan zor olan şeyler. İnsan bir noktada şunu der gibi oluyor: tamam, eğer yıllar sonra yeni bir platform yapma şansımız olursa, bunu kesinlikle doğru yapacağız. Tabii ki o zaman da başka hatalar yapacağız! Ama bunu yapmayacağız.
Sizce C++ ve C# gibi birçok dilin üzerine inşa edildiği C neden bu kadar popüler bir dil temeli?
Bence burada önce tarihsel bakış açısını almak gerekiyor. C’nin kendisine geri dönersek, C kendi zamanı için son derece uygun bir dildi. İşletim sistemi geliştiricilerini assembly kodundan çıkarıp veri türleri gibi daha üst seviye soyutlamalarla tanıştıran bir dildi; ama aynı zamanda makineye yeterince yakındı, böylece verimli kod yazabiliyordunuz.
Ayrıca çok özlüydü: son derece kısa ve öz bir dildi, çok kompakt kod yazmanıza olanak tanıyordu ki bu programcıların çok tercih ettiği bir şeydir. Bir C programını bir COBOL programıyla karşılaştırırsanız, daha fazla karakteri nerede göreceğinizi söyleyebilirim.
Dolayısıyla C kendi zamanı için inanılmaz derecede uygun bir dildi ve C++ da C’nin son derece uygun bir evrimiydi. Bir dil çok yaygın kullanıma sahip olduğunda, mevcut bir tabanı yanınıza alarak evrim geçirmek, sıfırdan tamamen yeni bir şey yapmaya çalışmaktan çok daha kolaydır.
Yeni dillerin mekaniklerine baktığınızda, bir dili tasarlarken ya mevcut bir dili evrimleştirmeyi ya da sıfırdan başlamayı seçebilirsiniz. Mevcut bir dili evrimleştirmek, anında büyük bir kullanıcı tabanı anlamına gelir ve dile eklediğiniz her şey fazladan kazançtır … gerçekten bir dezavantaj yoktur, çünkü tüm eski kodlar çalışmaya devam eder.
Tamamen yeni bir dille başlarsanız, esasen eksi 1.000 puanla başlarsınız. Ve şimdi, daha konuşmaya başlamadan önce o 1.000 puanı geri kazanmanız gerekir. Pek çok dil eksi 500’ün üzerine bile çıkamaz. Evet, değer katarlar ama önceden var olanın üzerine yeterince değer katmazlar.
Bu yüzden C++’ın, mevcut bir dilin son derece uygun bir evrimine harika bir örnek olduğunu düşünüyorum. Nesne yönelimli programlamanın doğuşunda ortaya çıktı ve bunu ana programlama topluluğunun tam merkezine, çok iyi bir şekilde taşıdı.
Elbette C#’i yeni bir dil olarak ele almaya başladığımızda, dışarıda süslü parantezlerle programlamaya çok alışkın, C, C++, Java vb. kullanan çok ama çok büyük bir programcı kitlesi vardı. Bu yüzden bizim için bu çok doğal bir başlangıç noktasıydı: C++ programcılarına ve Java programcılarına hitap edecek bir dil yapmak. Bu da C geleneğinde bir dil geliştirmek anlamına geliyordu. Ve bence bu bize son derece iyi hizmet etti.
Fonksiyonel bir dil ile C#’ın birleşimi olarak tanıtılan yaklaşan F# dili hakkında ne düşünüyorsunuz?
F# ve Microsoft Research Cambridge’den Don Syme’ın bu dil üzerinde yaptığı çalışmalar konusunda çok heyecanlıyım. Bunu ML ile C#’ın bir birleşimi olarak tanımlamazdım. Elbette kökleri ML tabanlı fonksiyonel programlama dillerine dayanıyor ve Caml ile yakından ilişkili. Ben bunu Caml ile .NET’in bir birleşimi ve güçlü bir araç deneyiminin büyük bir etkisi olarak görüyorum.
Sizce C#’a büyük bir rakip haline gelmesi mümkün mü?
Bence ikisi de harika ve birbirini çok iyi tamamlıyor. Rakip mi? Evet, VB’nin rakip olması anlamında. Ama onları gerçekten rakip olarak mı görüyorsunuz? Yoksa birleşik bir platform üzerindeki diller olarak mı?
Ben şahsen öyle görmüyorum: benim için önemli olan, .NET’in üzerinde neyin inşa edildiğidir. Her dil başka dillerden ödünç alır, ama sektörde ilerleme bu şekilde olur ve ben ilerlemeyle ilgileniyorum.
Genel olarak fonksiyonel programlama hakkında ne düşünüyorsunuz?
Fonksiyonel programlamanın bizim için bakılması son derece ilginç bir paradigma olduğunu düşünüyorum ve özellikle C# 3.0’a baktığınızda, LINQ ile yaptığımız her şeyde ve bunun dayandığı tüm temel dil özelliklerinde fonksiyonel programlama ana ilham kaynaklarından biri olmuştur.
Fonksiyonel programlamanın nihayet ana akıma girme zamanının geldiğini düşünüyorum. Ama ana akım olmak, dünyayı ele geçirmekten farklıdır.
Bugün fonksiyonel programlama için kesinlikle bir alan olduğunu düşünüyorum ve F#, arkasında endüstriyel düzeyde bir araç dili ve altında endüstriyel düzeyde bir platform bulunan, ilk endüstriyel güçte fonksiyonel programlama dili olma özelliğini taşıyor.
F#’ı diğer tüm fonksiyonel programlama dillerinden gerçekten ayıran şey, nesne yönelimli programlama için de birinci sınıf destek sunması ve .NET framework ile birinci sınıf birlikte çalışabilirlik sağlamasıdır. .NET framework’te sahip olduğumuz her şey, F#’tan C#’tan ya da VB’den olduğu kadar kolay kullanılır – zoraki hissettirmez.
Pek çok fonksiyonel programlama dili kendi küçük dünyasında yaşadı; saf ve matematiksel oldular vb., ama dışarıdaki büyük kütüphaneye erişemiyordunuz. Bugün dillere baktığınızda, iyi framework desteğine sahip olup olmamalarına göre yaşayıp öldüklerini görürsünüz; çünkü framework’ler o kadar büyük, o kadar kapsamlı ve o kadar zengindir ki, artık onları görmezden gelme lüksünüz yoktur. Bu yüzden bu kadar çok dilin kendi küçük dünyalarında inşa edilmek yerine .NET veya Java üzerine inşa edildiğini görüyorsunuz.
C#’ın standartlaştırılması ve Microsoft tarafından benimsenmesi hakkında ne hissediyorsunuz?
Kişisel açıdan soruyorsanız, bunun harika olduğunu düşünüyorum. Microsoft’un bana bir programlama dilinin baş mimarı olma fırsatını vermesi ve ardından şirketin tüm gücünü bunun arkasına koyması konusunda kendimi son derece şanslı hissediyorum. Bu her gün elde edebileceğiniz bir fırsat değil ve gerçekten harika oldu.
Standartlaştırma konusunda ise, dili standartlaştırmanın her zaman güçlü bir savunucusu oldum ve bir dilin hem özel mülk olmasını bekleyip hem de topluluğun dile yatırım yapmasını istemenin mümkün olmadığını her zaman düşündüm.
Özel mülk yapabilirsiniz, ama o zaman insanların bunun üzerine bir şeyler inşa etmesini beklemeyin. Ya da açarsınız ve insanlar yatırım yapma konusunda kendilerini daha rahat hisseder.
Elbette açık kaynak olmadığımızı söyleyebilirsiniz, ama dil standartlaştırılmış durumda ve tüm spesifikasyon, isteyen herkesin gidip yeniden uygulayabilmesi için erişilebilir. Mono bunu yaptı ve bence Mono harika bir şey.
Mono’yu biliyor musunuz bilmiyorum ama bu, Linux üzerinde çalışan, açık kaynak bir proje olarak geliştirilen C# standardının ve CLI standardının (ki bu fiilen .NET standardıdır) bir uygulamasıdır. Çok iyi işler yapıyorlar, onlarla sık sık konuşuyoruz ve bunun son derece olumlu bir şey olduğunu düşünüyorum.
Yani spesifikasyonları yayımlamamış olsaydınız bunu yapamazlardı, öyle mi?
Yapabilirlerdi ama çok daha zor olurdu ve muhtemelen ortaya çıkan ürün bu kadar iyi olmazdı. Tersine mühendislik yapabilirsiniz… .NET platformunun büyük bir kısmında bunu yaptılar… ama dilin tüm temel anlamsal özellikleri standartlaştırma sürecinin bir parçasıydı.
Biliyorsunuz, yakın zamanda Silverlight’ı geliştirdik; bu, tarayıcıda barındırılan .NET çalışma zamanı ortamımız. Mono ekibi de Moonlight adında, Microsoft tarafından resmen onaylanmış ve Linux ile diğer tarayıcılarda çalışan bir Silverlight uygulaması geliştirdi. Bu iyi bir şey.
O halde C#’a daha spesifik olarak odaklanırsak, neden dile boxing ve unboxing’i eklemeye karar verdiniz?
Buna biraz daha önce değinmiş olabilirim. Temelde mesele şu: boxing, tür sistemini birleştirmenizi sağlar. Birleştirmekten kastım şu: C#’ı öğrenirken ya da dile ilk kez yaklaşırken, “bu dilde her şey bir nesnedir” şeklinde basit bir ifade kullanabilirsiniz. Sahip olduğunuz her veri parçasını bir nesne gibi ele alabilir ve object türünde bir değişkene atayabilirsiniz. Bunu mümkün kılan mekanizma boxing ve unboxing’dir.
Java gibi benzer bir dile baktığınızda, bölünmüş bir tür sistemi vardır; int’ler, bool’lar, karakterler vb. dışında her şey nesnedir, ama bunlar nesne değildir. Dolayısıyla bu sınıflar ve türler arasındaki ince ayrımları hemen anlatmaya başlamanız gerekir.
Birleştirilmiş bir tür sistemine sahip olduğunuzda ise, onları sadece nesne olarak ele alabilirsiniz ve sonra, eğer önemsiyorsanız, değer türleri ile referans türleri arasındaki farklar ve bunun mekanikleri gibi daha derin ayrıntılara girebilirsiniz.
Bunu birçok kez gördük; dili öğreten kişiler geri gelip bunun harika olduğunu, çünkü çok basit bir başlangıç noktası sağladığını söylediler. Dolayısıyla pedagojik açıdan, önce her şeyin bir nesne olduğunu söylemek ve daha sonra sistemdeki farklı nesne türlerini öğretmek çok daha akıcı oluyor.
Öğretmeyi kolaylaştırmayı mı amaçladınız, yoksa bu sadece dilin tasarlanma biçiminin bir yan etkisi miydi?
Öğretilebilirliği aklımızda tuttuk diyebilirim. Birleştirilmiş bir tür sisteminin avantajı sadece öğretilebilirlik değil; aynı zamanda programlarınızın daha az özel duruma sahip olmasını da sağlar. Buradaki itici gücün daha çok kavramsal sadelik olduğunu söyleyebilirim. Ama kavramsal sadelik, öğretilebilirlik söz konusu olduğunda genellikle çok iyi bir şeydir; dolayısıyla ikisi el ele gider.
C# 3.0 hakkında ne hissediyorsunuz? Sürümden memnun muydunuz? Bir sonraki sürüm ne zaman çıkacak?
Evet, çok memnunum. Bazı açılardan C# 3.0, dilde gerçekten yenilik yapma ve tamamen yeni bir şey ortaya koyma şansımızın ilk olduğu sürümdü. C# 1.0, düşündüğünüzde, “sıfırdan bir yere gidelim, o halde bir programlama dilinin sahip olması gereken tüm temel şeyleri yapalım” gibiydi. Yani bir anlamda, “dünyada zaten bilinen %90’ı yapalım” demekti.
C# 2.0, C# 1.0’da yapmak isteyip zamanımız olmadığını bildiğimiz her şeyi yapmaya odaklıydı. Dolayısıyla C# 3.0 ilk gerçek boş alan fırsatıydı: tamam, burada hangi büyük probleme saldıracağız?
Seçtiğimiz problem, veritabanları ile genel amaçlı programlama dilleri arasındaki uyumsuzluk ve genel amaçlı dillerde sorguların ve daha bildirimsel programlama tarzlarının eksikliğiydi. Harika bir yolculuktu ve üzerinde çalışması inanılmaz eğlenceliydi. Ortaya çıkan sonuç gerçekten oldukça benzersiz ve oldukça iyi oldu. LINQ yeni bir şeydir.
Önceki sürümler gibi C# 3.0’ın da ECMA ve ISO standardı olmasını bekliyor musunuz?
Buna kesinlikle açığız. Şu anda standartlar komitesinde devam eden bir çalışma yok, ama bu daha çok sektördeki iş ortakları topluluğunun bu süreci sürdürmek isteyip istemediğiyle ilgili bir mesele.
Ayrıca şunu da söylemeliyim ki, C# standartları uygulayıcıların dile uzantılar eklemesine açıkça izin verir; dolayısıyla C# 3.0 standartlaştırılmamış olsa da, C# 2.0 standardının eksiksiz bir uygulamasıdır. Tüm sürümlerde olduğu gibi %100 geriye dönük uyumludur.
Gelecek sürümlerde C#’a hangi işlevleri eklemeyi umuyorsunuz?
Birçok şey var. Yıllar içinde insanların talep ettiği özelliklerden oluşan çok büyük bir listemiz – ya da ekibimizin – var. Sektörde şu anda devam eden ve bizim ilgi duyduğumuz, ilham aldığımız üç büyük eğilimi saymam gerekirse, birincisinin daha bildirimsel programlama tarzlarına doğru bir yönelim olduğunu söylerdim; LINQ’ı da bunun bir örneği olarak görebilirsiniz.
Alan-özel diller hakkında yaptığımız tüm konuşmalar, bildirimsel programlamanın bir biçimidir; fonksiyonel programlama da bildirimsel programlamanın başka bir tarzıdır. Bunların ileriye dönük olarak oldukça önemli olacağını düşünüyorum ve C#’ta kesinlikle yatırım yapacağımız alanlardır.
Dinamik programlama bu günlerde büyük bir yeniden canlanma yaşıyor. Ruby ve Ruby on Rails gibi olgulara bakarsanız, bunların bir anda çok popüler hale geldiğini görürsünüz ve dinamik programlama dilleriyle yapabildiğiniz, daha klasik C# gibi dillerde de bulunmasının harika olacağı bazı şeyler var. Dolayısıyla bu da üzerinde durduğumuz konulardan biri.
Son olarak şunu söyleyebilirim ki, eşzamanlılık günümüzde görmezden gelemeyeceğiniz büyük mesele. Bunun nedeni Moore yasasının mekaniklerinin artık daha güçlü işlemciler üretmeyi mümkün kılmamasıdır. Onları artık daha hızlı yapamıyoruz çünkü ısıyı ortadan kaldıramıyoruz; bu yüzden çipler üzerindeki tüm alan daha fazla işlemci yapmak için kullanılıyor ve bir anda birden fazla CPU’ya sahip olmayan bir makine bulmak neredeyse imkânsız hale geliyor.
Şu anda iki çekirdeğiniz olabilir ama standart bir masaüstü makinede bile dört ya da sekiz ya da daha fazlasına sahip olmanız sadece birkaç yıl meselesi. Bundan yararlanabilmemiz için eşzamanlılık için çok daha iyi programlama modellerine ihtiyacımız var. Bu zor bir problem. Sadece bizim karşılaştığımız bir problem değil, tüm endüstrinin karşı karşıya olduğu bir problem ve pek çok insan bunun üzerinde düşünüyor; biz de kesinlikle bunların arasındayız.
Çözülecek problem sıkıntısı yok!
Sorunlardan söz etmişken, .NET platformunun dilin yalnızca Windows’ta çalışmasına izin verdiği, ayrıca lisanslama ve performans endişeleri gibi C#’a yöneltilen eleştirilere nasıl yanıt veriyorsunuz?
Alternatif uygulamalar geliştirmek mümkündür. Biz Linux için .NET geliştirmiyoruz; çünkü müşterilerimize sunabildiğimiz değer önerisi, işletim sistemi çatısından veritabanlarına ve Web sunucularına kadar eksiksiz, birleşik ve kapsamlı biçimde test edilmiş bir pakettir. Dolayısıyla .NET daha büyük bir ekosistemin parçasıdır ve tüm bu unsurlar birlikte çalışır.
Aslında Linux üzerinde Mono gibi bazı diğer platformlarda ve başka üçüncü taraf uygulamalarda çalışıyoruz. Silverlight artık .NET uygulamalarını yalnızca kendi tarayıcımızda değil, örneğin Mac’lerde Safari içinde de çalıştırmanıza olanak tanıyor.
Performans endişelerine gelince, rekabetçi platformlarla karşılaştırıldığında .NET performansı konusunda kendimi çok rahat hissediyorum. Hatta gerçekten çok iyi hissediyorum. Her şeyde olduğu gibi burada da yer yer performans sorunları var, ancak performansı daha iyi hale getirmek için sürekli tetikte olduğumuzu düşünüyorum ve performans oldukça iyi.
Performans, insanların .NET’i seçmesinin temel nedenlerinden biridir; en azından gördüğüm vaka çalışmalarında ve konuştuğum müşterilerde durum kesinlikle böyle (diğer neden de üretkenliktir).
C# ile yazılmış gördüğünüz en sıra dışı ya da en ilginç program hangisi?
Microsoft Research’ün Worldwide Telescope adlı gerçekten çok etkileyici bir uygulaması var ve C# ile yazılmış. Temelde, astronomik görüntülerden (ya da astronomiye ait görüntülerden) oluşan bir katalog üzerinde, bir gezegene sonsuz yakınlaştırma yapmanıza ve giderek daha fazla ayrıntı görmenize olanak tanıyan çok güzel bir arayüzdür.
Eğer Dünya gezegenini seçerseniz, galaktik ölçekte başlayıp kelimenin tam anlamıyla evinize kadar yakınlaştırabilirsiniz; bu gerçekten harika. Çocuklarımla birlikte bununla oynuyorum, diğer gezegenlere bakıyoruz ve onlar da bunu eğlenceli buluyor. Geleneksel olarak heyecan duyması zor olan bir şeyi popülerleştiriyor.
Her zaman Visual C# derleyicisini mi kullanıyorsunuz, yoksa Mono ya da DotGNU projeleri tarafından geliştirilen sürümleri de kullanıyor musunuz?
Günlük olarak Visual Studio ve Visual C# kullanıyorum; çünkü yaşadığım ortam bu. Zaman zaman Mono projesine ya da diğer bazı projelere göz atıyorum, ancak bu daha çok entelektüel merak nedeniyle, günlük kullandığım bir araç olarak değil.
Sizce C#, bilgisayar geliştirme alanına nasıl bir kalıcı miras bıraktı?
Hepimiz burada devlerin omuzları üzerinde duruyoruz ve her dil kendisinden önce gelenlerin üzerine inşa ediliyor; dolayısıyla C, C++, Java, Delphi ve bizden önce gelen tüm bu diğer şeylere çok şey borçluyuz... şimdi de kendi artımsal değerimizi sunmayı umuyoruz.
C#’ın Windows platformundaki geliştiricilere kesinlikle büyük bir üretkenlik artışı sağladığını görmekten çok mutluyum ve bunu görmeye devam ediyoruz.
C#’ın, yaygın biçimde benimsenmiş ilk çok paradigmali programlama dillerinden biri haline geldiğini düşünüyorum. C# ile nesne yönelimli programlama yapabilirsiniz, prosedürel programlama yapabilirsiniz, artık C# 3.0’da eklediğimiz bir dizi uzantıyla fonksiyonel programlama da yapabilirsiniz. C# 4.0’ın dinamik programlamayı desteklemesine bakıyoruz ve böylece daha önce birbirinden ayrı olan tüm bu dil kategorilerinin en iyilerini alıp tek bir dilde sunmayı hedefliyoruz.
Belirli katkılar açısından bakarsak, C# 3.0’da dil bütünleşik sorgular (language integrated queries) üzerinde yaptığımız çalışmaların, diğer pek çok dili de etkiliyor gibi göründüğünü düşünüyorum. Bundan çok memnunum ve on yıl içinde sorgunun otomatik bir özellik olmadığı tek bir dil bile kalmamasını içtenlikle umuyorum: mutlaka sahip olmanız gereken bir özellik olacak. Bu alanda kesinlikle tekniğin geldiği noktayı ileriye taşıdığımızı düşünüyorum.
Dilin popülerliği sizi hiç şaşırttı mı?
“Bugün .NET’i başlatıyoruz ve sekiz yıl içinde dünyanın geliştirme pazarının yarısına sahip olacağız” ya da benzeri bir şey söylemek benden haddini aşmak olurdu. İnsan umut edebilir, ama hoş bir şekilde şaşırdım.
Kesinlikle kaliteli bir ürün oluşturmak için çok çalıştık, bu yüzden yoğun bir kullanım ile ödüllendirildiğimizi görmek güzel. Günün sonunda bizi ayakta tutan şey de bu: yüz binlerce, hatta milyonlarca programcının her gün üzerinde çalıştığınız şeyleri kullanması ve onların hayatını daha iyi hale getirdiğinizi bilmek (umarım!).
Şu anda ne üzerinde çalışıyorsunuz?
Her zaman bir sonraki sürüm üzerinde çalışıyorum; dolayısıyla bir ekleyip çıkarırsanız C# 4.0 üzerinde çalıştığımız sonucuna varabilirsiniz!
Bu sürümün ne zaman çıkacağına dair bir fikriniz var mı?
Şu anda resmi olarak bir şey söylediğimizi sanmıyorum, ancak yaklaşık her iki yılda bir sürüm çıkarma temposundayız ya da en azından bunu umuyoruz. Dolayısıyla umarız 2010’un bir zamanında... Orada üzerinde çalıştığımız bir dizi özellik var ve bunları Ekim ayının sonunda yapılacak PDC’de (Professional Developers Conference) gerçekten konuşacağız. Yaptıklarımızla ilgili ilk sunumlardan bazılarını veriyoruz.
Sizce programlama dilleri gelecekte, özellikle önümüzdeki beş ila yirmi yıl içinde hangi yöne gidecek?
Bunu şimdi 25 ya da neredeyse 30 yıldır yapıyorum ve Turbo Pascal çok popüler hale geldikten sonra verdiğim bazı erken röportajları hatırlıyorum. İnsanlar bana her zaman programlamanın 20 yıl kadar sonra nerede olacağını sorardı (1983’e geri giderseniz).
Elbette o zamanlar, insanın ağzından çıkan ilk şey şuydu: “Belki de artık hiç programlama yapmıyor olacağız ve belki de bilgisayarlara ne yapacaklarını sadece söylüyor olacağız. Eğer programlama yapıyorsak bile muhtemelen görsel olacak ve yazılım tümleşik devrelerini etrafa sürükleyip çizgiler ve kutular çizeceğiz.”
Aradan 25 yıl geçti ve işte buradayız. Hâlâ metinle programlama yapıyoruz ve programlar neredeyse 25 yıl önceki halleriyle aynı görünüyor. Evet, biraz ilerleme kaydettik ama herkesin beklediğinden çok daha yavaş oldu.
Çok temkinli olacağım ve bilgisayarlara ne yapacaklarını söylediğimizi öngörmeyeceğim; bunun yerine bugün nasıl görünüyorsa ona çok benzeyeceğini, ancak daha üretken olacağımızı söyleyeceğim. Umarım daha özlü olacak, daha az kodla daha fazlasını söyleyebileceğiz ve daha bildirime dayalı olacağız.
Umarım eşzamanlılık için iyi programlama modelleri bulmuş olacağız; çünkü bu kaçınılmaz bir eğilim gibi görünüyor. Açıkçası önümüzdeki 20 yılda nasıl görüneceğini kimse kesin olarak bilemez, ancak önümüzdeki beş yıl içinde bizi meşgul edecek şeylerin bunlar olacağı kesin.
Peki, yükselmekte olan programcılar için herhangi bir tavsiyeniz var mı?
Bence mevcut farklı programlama paradigmalarında ustalaşmaya çalışmak önemlidir. Bariz olan nesne yönelimli programlama, umarım okulda öğretilen bir şeydir. Umarım okul size fonksiyonel programlamayı da öğretir; eğer öğretmiyorsa, bu mutlaka gidip bakmanız gereken iyi bir konudur.
Dinamik dillere ve meta-programlamaya bakın: bunlar gerçekten ilginç kavramlar. Bu farklı programlama türlerini ve bunların altında yatan felsefeleri anladığınızda, neler olup bittiğine dair çok daha tutarlı bir resim elde edebilir ve şu anda yaptığınız iş için hangi programlama stillerinin size daha uygun olabileceğini görebilirsiniz.
Bugün programlama yapan herkes fonksiyonel programlama ve meta-programlamaya göz atmalıdır; çünkü bunlar geleceğe dönük çok önemli eğilimlerdir.