Neden Arc Özellikle Nesne Yönelimli Değil?

0
FZ
Paul Graham'ın Why Arc Isn't Especially Object-Oriented makalesi yazılım dünyasında bazı çok tekrarlanan ve düşünmeden kabul edegeldiğimiz kalıpları sorgulamamız için kısa ve etkili makalelerden biri.

Daha önce Common Lisp ile Internet Programlamaya Giriş Kılavuzu makalesi ile tanıdığımız İstanbul Bilgi Üniversitesi, Bilgisayar Bilimleri bölümü öğrencilerinden Haldun Bayhantopçu'nun çevirisi ile bu makaleyi FM'de de yayınlıyoruz. Çevirinin daha güzel bir hale gelmesinde emeği geçen Türkiye Lisp Çalışma Grubu üyelerine teşekkürler.

Neden Arc Özellikle Nesne Yönelimli Değil?

Şimdilerde bir çeşit nesne yönelimli programlama çılgınlığı yaşanıyor ama tanıdığım bazı çok zeki programcılar, bu çılgınlıktan en az heyecan duyanlar.

Nesne yönelimli programlamanın bazı durumlarda yararlı olduğunu düşünüyorum. Ancak yazdığınız her programda da kullanmanıza gerek yok. Bir dilde yeni veri tipleri yaratabilmelisiniz ancak yazdığınız her programı yeni veri tipleri tanımlarıyla ifade etmek zorunda da kalmamalısınız.

Bence insanların nesne yönelimli programlamayı sevmelerinin beş nedeni var, ve bunlardan üç buçuk tanesi kötü:
  1. Nesne yönelimli programlama, metinsel kuşatmalara [1] veya makrolara sahip olmayan statik tipli bir dil kullanıyorsanız, heyecan vericidir. Bir dereceye kadar bu gibi kısıtlamaları aşmanıza yarar. (Bakınız: Greenspun'un Onuncu Kuralı.)
  2. Nesne yönelimli programlama büyük firmalarda yaygındır, çünkü onların program yazma yöntemine uyar. Büyük firmalarda, yazılım orta seviye programcılardan oluşan büyük (ve genellikle sıkça eleman değiştiren) ekipler tarafından yazılır. Nesne yönelimli programlama bu programcıların herhangi birisinin çok fazla zararlı bir iş yapmasını engelleyen bir disiplin sağlar. Bunun bedeli yazılan kodun protokoller ve tekrarlamalarla dolu olmasıdır. Bu bedel büyük firmalar için çok ağır değildir, çünkü yazdıkları yazılım da muhtemelen ağzına kadar protokollerle ve tekrarlamalarla dolu olacaktır.
  3. Nesne yönelimli programlama çok fazla iş yapılmış gibi gösterir. Eski günlerde, yazdığı 5-10 satır koddan önce 20 satır düzgünce şekillendirilmiş yorum yazan bir programcı tipi vardı. Nesne yönelimli programlama bu tipte programcılar için bulunmaz nimettir: bütün bu yapıyı doğrudan kaynak kodun içine koymalarını sağlar. Bir Lisp hackerının listeye bir sembol koyarak hallettiği iş, bir dolu sınıf ve metod dosyası halini alır. Bu yüzden, kendinizi ya da bir başkasını, çok çalıştığınıza ikna etmek için güzel bir yoldur.
  4. Eğer bir dilin kendisi nesne yönelimli bir programsa, kullanıcılar tarafından genişletilebilir. Yani, belki. Ya da belki nesne yönelimli programlamanın alt kavramlarını sunarsanız daha iyi olur. Örneğin fonksiyon yüklemesi (overloading) esasında sınıflara bağlı bir kavram değildir. İleride göreceğiz.
  5. Nesne yönelimli soyutlamalar, belirli tipteki programlardaki kavramlarla çok güzel eşleşir. Örnek olarak simülasyon ve CAD sistemlerini verebiliriz.
Kişisel olarak nesne yönelimli soyutlamalara hiç ihtiyaç duymadım. Common Lisp inanılmaz derecede güçlü bir nesne sistemine sahip ve ben onu bir kez bile kullanmadım. Diğer güçsüz dillerde nesne yönelimli teknikleri kullanmamı gerektirecek bir sürü iş yaptım (ör: tamamen kuşatmalardan oluşan harman tabloları [2]), ancak hiç bir zaman CLOS [3] kullanmak zorunda kalmadım.

Belki ben aptalım, ya da sadece sınırlı bir alanda çalıştım. Bir dili birisinin kişisel deneyimlerine dayanarak tasarlamak tehlikelidir. Ancak hiçbir zaman gereksinim duymayacağınız şeyleri sadece iyi fikirler olduğu düşünüldüğü için bir dile koymak, bence daha tehlikelidir.

Paul Graham.

[1] ÇN: Lexical closure. (Bkz. The Idiot's Guide to Special Variables and Lexical Closures
[2] ÇN: Hashtable.
[3] ÇN: Common Lisp Object System.

Görüşler

0
tongucyumruk
Bu güzel çeviri için, fakat özellikle de The idiot's guide linki için çok teşekkürler... Ben yine de Lafzi Muhasara'yı kullanmayı öneriyorum...
0
hb
Bu linki ben degil FZ eklemis yaziya. Bu vesileyle ben de tesekkurlerimi sunarim.
0
innaw
Okudugum en kotu P.Graham yazisi bu olsa gerek. Yazdigi $eylere katilmadigimdan degil, yalnizca savini iyi destekleyemedigini du$undugum icin.
0
FZ
Graham yine az ve öz yazmış. Dedikleri tartışılabilir öte yandan son 5-6 yıldır mesela J2EE ile damardan uğraşan insanların, proje yöneticilerinin de söylediği şeyler benzer değil mi, hani şu "ortalama programcı alırız, kolayca bir başkası ile değiştirebiliriz ve bazı şeylerin yapılması evet uzun sürer ama zaten kurumsal ölçekte bunu baştan kabul ederiz" şeklinde bahsedilmiyor mu? Ortalama programcı alıyor ve onu bir Lego parçası gibi bir işe monte ediyorsunuz, yerine kolayca başka biri geçebilir.

Neden ortalama programcı sayısı fazla?

Normal dağılım böyle bir şey değil mi zaten? Öte yandan Erik Naggum'un dediği gibi, elinizdeki teknoloji zırt pırt yani 3-4 yılda bir değişecekse zaten çok iyi öğrenip çok çok uzman olmakla niye uğraşasınız mevcut ekonomik/IT düzeninde. Bu bakış açısını pek çok insan benimsemiyor mu?

Yine Naggum'un dediği gibi mevcut IT ortamı "acemiyi ödüllendirirken uzmanı cezalandırıyor" değil mi yukarıdaki ve başka benzer sebeplerden ötürü? (Lütfen uzman adam her yerde süper iş bulur şeklinde cevap vermeyin buna, kast edilen biraz daha faklı bir şey).
0
innaw
Konu OOP'den uzaklaşmıyor mu acaba?

İş hayatındaki abuklukların suçlusu OOP mi? Bence değil.

Makaleye dönecek olursak, mesela Graham OOP'deki kod tekrarlarından bahsetmiş. Bu tamamen programcının hatasıdır, "OOP'in ne demek olduğunu iyi bilmiyor demek ki" diye düşünürüm. Ya da platform örneğin J2EE ise "projenin başındakiler OOD üzerinde çok iyi iş çıkaramamışlar, belki de doğru teknolojileri seçmemişlerdir" derim. OOP/OOD "her şey bir nesne"dirin ötesinde bir olay. Tıpkı J2EE gibi; insanı vezir de eder, rezil de.

Makalede belirtilen nedenlerden 3.'sü gerçekten çok komik. Lütfen bir daha okuyun. Burada da tamamen bireysel bir olaydan bahsedilmiş, "Nesne yönelimli programlama çok fazla iş yapılmış gibi gösterir. [..] ...kendinizi ya da bir başkasını, çok çalıştığınıza ikna etmek için güzel bir yoldur." Şahsen ben hiç bir zaman böyle hissetmedim. Bu şekilde düşünen OO programcıları olabilir. Bu onların sorunu, OOP'in değil. OO paradigması ile bunun ne ilgisi var?

Erik Naggum'dan verdiğiniz örnekleri biraz daha açmanızı rica ederim.
0
FZ
Konu aslında hep aynı konu. Ortada bir "şey" var ve bunun "her şeye" uygulanmasının gerekmediğini söyleyen, karmaşık yazılımlar geliştirmiş bir adam var. O şey bazı bakımlardan faydalı. Her zaman, her şey için faydalı gibi gösterilmeye çalışılması tabii bu tür alerjik tepkilere yol açıyor. Öte yandan tek bir OOP sistemi de yok mesela Graham CLOS'tan bahsederken Java, C++, vb. dillerin Smalltalk tarzı "message passing" tarzı OO'sundan değil "generic function"lara dayanan OO ve görülen o ki bu güçlü sistem de kullanılmadan pek çok şeyi acı çekmeden yapmak mümkün oluyor Graham'a göre. Benzer bir şey mesela UML ile ilgili Boeing'de çalışan kıdemli bir yazılım projeji yöneticisi tarafından söylenmişti ACM'nin bir yayınında ( burada da tartışmıştık). Yani Graham köyün delisi değil. Bazı bakımlardan şikayetçi olan başka deneyimli uzmanlar da var.

Naggum'a göndermede bulunmam ise daha ziyade "kolayca öğrenilen... ve unutulan sistemler" ile alakalı idi. OO bağlamına oturtmak gerekirse, hiçbir şey OO'nun suçu değil. Kavramların suçu olmaz zaten, insanların sorumluluğu olur. Pek çok genç insan da genellikle piyasadaki "guru"ların ve "şirket"lerin yönlendirmesi ile hareket ediyor, "büyük"lerinden nasıl görüyorlarsa öyle yapıyorlar. Naggum'un derdini anlamayı gerçekten isterseniz buyrun kendi sözlerinden okuyun.
0
yilmaz
"ortalama programcı alırız, kolayca bir başkası ile değiştirebiliriz ve bazı şeylerin yapılması evet uzun sürer ama zaten kurumsal ölçekte bunu baştan kabul ederiz"
bahsedilen söz kendi yazılımını kendi geliştiren yani yazılımın birincil kullanıcısı kendileri olan kurumlar için doğrudur. Ama bu diğer diller içinde aynıdır. Kurum C de kullanıyorsa bu söz yine doğrudur. Ama başka bir kurumun ihtiyacını gidermeye çalışıyorsanız o zaman, zaman problem olur. o zaman da daha sağlam bilgi birikimine sahip insanlara ihtiyacımız olur. Nesneye yönelik programlamada amaç parcaları tek tek yazmak sonra tekrar birleştirmek. Bu aşamada problem doğarsa problem olan nesne değiştirilir uygulamanın bütünlüğü bozulmaz. Buda bir ihtiyaçtan dolayı doğmuştur.
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Common Lisp Geliştirme Ortamı Kurulumu

FZ

Güncelleme (31 Temmuz 2005): SLIME ile ilgili güzel video adresleri belgenin sonuna eklendi

Şimdiye dek fazlamesai.net sitesinde Lisp ile ilgili bazı belgeler, çeviriler, röportajlar yayınladık*. Yaklaşık 50 yıldır geliştirilen ve hala pek çok yeni dile ilham kaynağı olan Common Lisp ile ilgili çalışmalara başlamak isteyenlerin ilk ihtiyacı olan şey güçlü bir geliştirme ortamı ve sıra bunu anlatmaya geldi!

Bu belgede GNU/Linux sisteminiz üzerine tam teşekküllü, güçlü bir Common Lisp geliştirme ortamı kurmanız ve ilk Common Lisp denemenizi yapıp test etmeniz için gerekenler anlatılacaktır.

Common Lisp'e en iyi destek veren GNU/Linux dağıtımlarından biri olan Debian GNU/Linux esas alınmıştır ancak burada yazılanların hepsini herhangi bir GNU/Linux ya da UNIX uyumlu bir sisteme kurmak mümkündür.

Common Lisp ve Bir Optimizasyon Tekniği: Memoization

FZ

"Memoization" tabiri bilgisayar bilimlerinde ilk kez Donald Michie'nin 1968 yılında Nature dergisinde yayımlanan Memo functions and machine learning (Memo fonksiyonları ve makina öğrenimi) makalesi ile gündeme gelmiştir.

Memoization tekniği bir fonksiyonu hesaplarken önceden hesaplanmış değerleri hesaplamadan kullanmak, dolayısı ile işlemi hızlandırmak olarak tarif edilebilir. Sözcük olarak "memorization"ı yani "ezberleme" eylemini çağrıştırmakla birlikte daha genel bir anlamı kapsamaktadır.

Programlama dilinden bağımsız olmakla birlikte, bu yazıda "memoization" tekniğinin Common Lisp'te nasıl kullanılacağına bakacağız. Bunun için Peter Norvig'in PAIP kitabı ana eksenimizi oluşturacak.

GNU CLISP 2.34 sürümü çıktı

FZ

ANSI Common Lisp yüksek seviyeli, genel amaçlı bir programlama dilidir. GNU CLISP, Karlsruhe Üniversitesi'nden Bruno Haible ve Münih Üniversitesi'nden Michael Stoll'un ürünüdür. CLISP, ANSI Common Lisp standardında tanımlanmış Lisp dilinin büyük kısmını desteklemektedir. Hemen her türlü UNIX platformunda (Linux, FreeBSD, NetBSD, OpenBSD, Solaris, Tru64, HP-UX, BeOS, NeXTstep, IRIX, AIX ve diğerleri) ve diğer sistemlerde (Windows NT/2000/XP, Windows 95/98/ME) çalışmakta ve bunun için sadece 4 MB RAM bellek yeterli olmaktadır.

Common Lisp ile Oyun Programlama

FZ

Frank Buss, Common Lisp kullanarak Aqueaduct isimli bir mantık bulmaca oyunu (puzzle) geliştirmiş.

Bir grafik kullanıcı arayüzü de olan oyun MS Windows, GNU/Linux ve Mac OS X ortamlarında (kodda bir değişiklik gerektirmeden) çalışabiliyor. Kaynak kodu meraklısı için öğretici olabilir.

ECLM '08 ve ELS '08'in Ardından

FZ

ECLM 2008 (European Common Lisp Meeting) ve ELS 2008 (European Lisp Symposium) tamamlandı. ECLM 2008'deki konuşmalardan birkaç örnek vermek gerekirse:
  • Marc Battyani, Lisp-based supercomputing
  • Juan José García-Ripoll, ECL - more than an Embeddable Common Lisp
  • Jeremy Jones, InspireData - how it was written in Lisp
  • Kristoffer Kvello, House Designer - using Knowledge Based Engineering and Lisp to automatically design buildings
  • Nicolas Neuss, Femlisp - solving partial differential equations with Common Lisp
  • Stefan Richter, Using Common Lisp for large Internet systems
  • Kilian Sprotte, PWGL - an environment for sound synthesis and computer aided composition