Programlama Nedir: Programlamanın Tabiatı ve Programcılık Üzerine – II Bilim mi, Mühendislik mi, Sanat mı Yoksa Zanaat mı?

Farklı vesilelerle “programlamanın neliği” hakkında konuşuyoruz, okuyup yazıyoruz. Ben de burada daha önce “Programlamanın Tabiatı ve Programcılık Üzerine – I” başlıklı bir yazı yazmıştım. Bu konu üzerine düşünen ve bizzat çalışan farklı kişiler de yazıp çiziyorlar. Örneğin arkadaşım Özcan Acar burada programcılığın sanat mı yoksa zanaat mı olduğunu tartışırken burada da bu konuda bir başka programcının yazdıklarını eleştirmiş.

Sıklıkla programlama ve programcılık, mühendis olup olmamak, okullu-alaylı vb. bağlamlarda tartışılıyor. Ben “üniversiteli mi alaylı mı” konusunu burada ele almıştım. Orada da açık bir şekilde ifade ettiğim gibi aslolan, “bilerek yapmak”tır. Yapmayı sürdürülebilir halde tutan şey bilmektir. Yapamadıkça zaten o şeyi bilmiyoruz demektir. Dolayısıyla her şart altında yapabilen ve başkalarına aktarabilen kişi, yapabilmeyi sürekli bir davranışa dönüştürmüş ve onu herkesin anlayabileceği yapıda ifade etmiş kişi, gerçekten bilendir.

Öte taraftan, gerek akademide gerek ise pratisyenleri arasında, yazılım mühendisliği olsun, onun çok temel ve belirleyici bileşeni olarak programlama olsun, tüm bunların gerçekte ne oldukları üzerine eskiden bu yana tartışmalar yapılmakta. Yani yaptığımız iş, bir bilim midir, yoksa mühendislik midir yoksa sanat mıdır yoksa zanaat mıdır? Ya da hepsi bir arada mıdır?

ABD’de yazılım sektörüne nitelikli insan yetiştiren bölümler ağırlıklı olarak “Computer Science” olarak adlandırılmalarına rağmen, bu bölümlerin yaptığı seyin ne kadar “bilim” olduğuyla ilgili şüpheler çoktur. Belki de bu isimlendirme bir öykünmedir ya da bu bölümlerin tarihi olarak Matematik’ten çıkmış oldukları düşünülerek isimlerine “science” eklenmiştir. Aslında iki kelimeden oluşan bu ismin problemi sadece “science” kelimesinden kaynaklanmıyor, esas problem”computer” kelimesinde. Dijsktra bir zamanlar “astronomy ne kadar teleskoplarla ilgiliyse, computer science da ancak o kadar bilgisayarlarla ilgilidir” (“computer science is no more about computers than astronomy is about telescopes.”) demişti.

“Computer Science” isimlendirmesi ilk defa 1959’da kullanılmasına rağmen yerine zaman zaman farklı kelimeler teklif edildi. “Datalogy” ya da “computics” bu alternatif isimlerden bir kaçı. Bu anlamda sanırım Avrupalılar daha düzgün bir isimlendirme yapmışlar. Bu alan için Avrupa’da genel olarak “automatic information” anlamlarına gelen “informatics”in türevleri kullanılıyor. Aslen yapılan iş de zaten verinin ve bilginin otomatik olarak işlenmesidir. “Computer” ya da “bilgiayar” sadece bir araç. Biz ise bu durumu dilimizde “bilgi” ve “saymak” kelimeleri ile ifade etmişiz. Başlarda, 70li yıllarda yani, bilgisayar yerine “elektronik beyin” dendiğini de hatırlıyorum ben. (Ülkemizde bu alanın “Bilgisayar Mühendisliği” olarak ifade edilmesi, hele benim üniversitemin, İTÜ, “Kontrol ve Bilgisayar Mühendisliği” gibi dahiyane bir isim 🙂 bulması ise başka bir tartışma konusu.) (Bu konudaki isimler için hızlıca Wikipedia‘ya bakabilrisiniz.)

Tanınmış ve tecrübeli bir bilim adamı olan Peter J. Denning, savunma amacıyla yazdığı “Is Computer Science Science?” başlıklı makalesinde, “Computer Science”ın (CS) ne kadar bilim olduğunu tartışıyor. Yazar makalesine alt başlık olarak şunu koymuş: “CS bilim olmanın tüm şartlarını taşıyor fakat kendinden kaynaklanan bir güvenirlik problemi var.” Yazara göre CS’i oluşturan 3 farklı disiplin vardır: Matematik, bilim ve mühendislik. Denning, CS’in, Fizik ve Kimya gibi bir “exact science” (bu terimi dilimizde nasıl ifade ediyoruz bilmiyorum, “kesin bilim” mi, bir kaç yere çevirisine baktım, “pozitif bilim” olarak karşılık verilmiş ki bu durum doğru bir çeviri değil bence) olduğunu savunuyor. Çünkü CS, adında “computer” kelimesini barındırsa da aslen bilgiyi işlemenin bilimidir. Algoritmalar ve hesaplamalı bilim (computational science) CS’i bilim yapan alanlardandır ve sayısal kesinliğe sahip çalışmalardır. Yazılımı tasarlama ve geliştirme ise temelde mühendislik çalışmasıdır. Yazar CS’in ne kadar bilim olduğu konusundaki itirazlara cevap vermeye çalışırken, “Computer Science”daki “science” yani “bilim” kısmının, diğer iki disiplin olan mühendislik ve matematikten daha geride kaldığını kabul ediyor ve ekliyor: Bu durum yakında düzelecektir.

Ben yaptığımız işin bir bilimsel tarafının olduğunu bir gerçek olarak kabul ediyorum. Programlama ve yazılım geliştirmenin son derece matematiksel dolayısıyla da bilimsel bir “hesaplama” alt yapısı var. Zaten bizim “bilgi” ve “saymak” kelimelerini yanyana getirerek ifade ettiğimiz şey İngilizce’de “computer” yani “”hesaplayıcı”dır. Veriyi ve bilgiyi işlemenin yöntemi olan her türlü algoritmik yapı, doğrudan matematiğin de konusudur. Algoritmaların karmaşıklığı, zaman ve bellek açısından ihtiyaçları, daha etkin şekilde ifade edilmeleri, tipik bir uygulamalı matematik ve sayılar teorisi konusudur. Sonuçta yazılan her program bir şekilde bir algoritmadır dolayısıyla da matematiğin ve bilimin konusudur.

Donald Knuth, programlama dünyasının muhtemelen yaşayan en ünlüsü olup, uzun yıllar Stanford’da hocalık yaptı. 1962 yılında tek cilt olarak yazmayı düşündüğü temel programlama kitabı, şu anda 4 cilt olarak yayınlanmış durumda. Hala yayınlamayı planladığı 3 cilt daha var. Knuth, programlamanın en temel kitabı olarak bilinen bu diziye, “The Art of Computer Programming” ismini vermiştir.  Çünkü Knuth’a göre programlama, bir sanattır.

Knuth gibi programlamanın bir sanat olduğunu iddia edenler, ondaki yaratıcılığa (creativity) ve bu yaratıcılığı ortaya çıkaran ilham (inspiration) kavramına vurgu yaparlar. Evet, yazılım geliştirmek de programlamak da zihinsel dolayısıyla da kavramsal, soyut ve son derece karmaşık uğraşlardır. Yazılım geliştirmenin bir sanat olduğunu iddia edenler, onun deterministic olmayan, yani başından, sonunun öngörülemeyeceği gerçeğini öne çıkarırlar. Bence de programlama, bilim ile sanatın iç içe geçtiği alanlardandır.

Mahiyeti itibariyle program yazmak ile bir film senaryosu yazmak ya da ne bileyim beste yapmak çok farklı şeyler değil. Yola çıkarken tüm detayını kestirmiş olamazsınız çünkü, ancak nereye gitmek istediğinizi bilirsiniz, hedefiniz vardır ama arasını ancak yolda anlarsınız çünkü kavramsal bir sentezlemeden bahsediyoruz. Programlama bir sanattır, çünkü doğru yoktur, aynı şeyi herkes tamamen farklı şekillerde yapabilir.

Sanatta da programlamada da çoğu kez ortaya koyduğunuz şey hiç bir zaman bir seferde mükemmel olmaz, muhtemelen pek çok yazarın, bestecinin eserlerine son halini vermeden, üzerinde senelerce çalıştıkları gibi yazdığımız programların da üzerinden tekrar tekrar geçmemiz gerekir. (Biz buna refactoring diyoruz.) Ve her bir üzerinden tekrar geçiş eserimizi daha mükemmel kılar ve bize muthiş bir haz verir. Hangimiz şöyle bir şey yaşamamıştır: Daha önce defalarca baktığınız, gördüğünüz kodunuzun öyle bir yönünü farkedersiniz ki, çok ufak bir değişiklikle örneğin müthiş bir kısaltma, hızlandırma yaparsınız ya da o ana kadar gözünüze çarpmamış bir hatasını giderirsiniz. İşte bu yaratıcılıktır, öngörülemezliktir ve böyle bir tecrübe sizin egonuzu tavan yaptırır. Belki de bu sanat ruhudur programcıları, diğer insanlar gözünde “farklı” kılan. Belki de bizi bilim adamlarından ayıran, “benimkisi daha güzel” düşüncesinin çok yaygın olmasıdır. Belki de başkalarının “ne anlıyorsun bundan” diye sorduğu durumda, o garip ifadelere bakarak sanki bir Mevlevi ayinindeymişcesine haz almaktır programlama.

Ben bu satırları yazarken Knuth’ın The Art of Computer Programming serisinin ilk cildini indirdim Internet’ten ve önsözünü okumaya başladım. Bakın ne diyor üstad:

“The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it can be an aesthetic experience much like composing poetry or music.”

Yani

“Dijital bir bilgisayar için program hazırlama süreci çok çekicidir, (bu durum) bunun sadece ekonomik ve bilimsel olarak mükafatlandırıcı/faydalı olmasından dolayı değil, aynı zamanda bir şiir yazmak ya da müzik bestelemek gibi estetik bir tecrübe olmasından dolayıdır.”

(Bu arada bu kitabı okuyanların CVlerini Bill Gates’e gönderebilirler, çünkü kendisi bu kitabı okuyabilenlerin nasıl bir tip olabileceğini biliyor 🙂 Kaynak, Wikipedia.)

Yazılım projesi de programlama da bir sanat eseri gibi yolda nelerin gündeme geleceğini ve nihayetinde detayda neyin ortaya çıkacağını çok da bilmeden girişilen bir çalışmadır. Bilimin prensipleri vardır, halbuki sanat daha çok çalışmayla ortaya çıkar, defalarca denersiniz. Bilim sizi sınırlar, sanat ise ancak serbest kılar. Bilim var olanı açıklar, sanat ise sentezler, yeni şeyler ortaya koyar, bu anlamda bilim bulur ama sanat yaratır.

Yaptığımız işin sanatsal tarafı olduğu kesin, tamamen sanat olmadığının kesin olduğu gibi. Bilimsel tarafı olduğu da kesin, tamamen bilim olmadığı gibi. Ama aslolan, nasıl olması gerektiği. Code Complete’in yazarı Steve McConnell da bu konuyu düşünenlerden. Buradan ulaşabileceğiniz yazısında “Yazılım Mühendisliği ne olmalıdır?” sorusunun daha doğru olduğunu ifade eder ve bu soruya “mühendislik” olarak cevap verir. YMnin örneğin iş analizi son derece subjektif dolayısıyla yaratıcılığa el veren, sanatsal öğeler içerebilir, programlama kısmı gibi. Ama belli ki bu tür pek çok farklı çalışmayı bir süreç halinde ve tekrar edilebilir olarak formüle edebilmek, onu mühendislik disiplini haline getirebilmekle mümkün olabilir. Gittikçe daha hızlandırmak, daha verimli hale getirmek örneğin ve çıktı kalitesini arttırmak, böyle bir mühendislik disiplinin amacı olabilir. Böylelikle bilimsel YM süreçleri ve metotları oluşur ve bunları uygulayanlar iyi yazılım ürünleri üretirler.

Aslında McConnell’in Code Complete isimli kitabının 2. bölümünde de belirttiği gibi, yazılımda da diğer pek çok şeyde olduğu gibi metaforlar kullanırız. Bu metaforlar konuyu anlamamızı kolaylaştıran benzetmelerdir. Ve bu metaforların hiç birisi kendi başına doğru değildir. Örneğin, projelerin sonunda, canlıya geçiş sırasında çalışanların kendilerini “itfaiyeci” gibi hissetmeleri, yaptığımız işin tamamını resmetmez.

Söyle diyor McConnell:

“A confusing abundance of metaphors has grown up around software development. David Gries says writing software is a science (1981). Donald Knuth says it’s an art (1998). Watts Humphrey says it’s a process (1989). P. J. Plauger and Kent Beck say it’s like driving a car, although they draw nearly opposite conclusions (Plauger 1993, Beck 2000). Alistair Cockburn says it’s a game (2002). Eric Raymond says it’s like a bazaar (2000). Andy Hunt and Dave Thomas say it’s like gardening. Paul Heckel says it’s like filming Snow White and the Seven Dwarfs (1994). Fred Brooks says that it’s like farming, hunting werewolves, or drowning with dinosaurs in a tar pit (1995). Which are the best metaphors?”

Yani

“Yazılım geliştirme etrafında şaşırtıcı sayıda metafor türemiştir. David Gries’e göre yazılım yazmak bir bilimdir (1981). Donald Knuth ise o bir sanattır der (1998). Watts Humphrey, o bir süreçtir der (1989). P. J. Plauger ve Kent Beck ise onun bir araba sürmek gibi olduğunu söylerler, ama buna rağmen tamamen zıt sonuçlara ulaşırlar (Plauger 1993, Beck 2000). Alistair Cockburn ise o bir oyundur der (2002). Eric Raymond ise onun bir pazar yeri olduğunu söyler (2000). Andy Hunt ve Dave Thomas ise o bir bahçıvanlıktır der. Paul Heckel ise o bir “Pamuk Prenses ve Yedi Cüceler” (Snow White and the Seven Dwarfs) (1994) filmini çekmek gibidir der. Fred Brooks ise o, kurtları avlayan ya da dinazorları bir tuzakta boğan çiftçilik gibidir der (1995). Sizin en iyi metaforunuz hangisi? ”

İşte size bir kaç tartışma daha: SD Times, Jason Gorman, CodeSqueeze, Research Gate’de iki tane, 1 ve 2 ve Jonah Kagan.

Eskiler “barika-i hakikat müsademe-i efkardan çıkar” demişler, neticede kimsenin aksi fikir belirtmediği yerde hiç kimse zaten düşünmüyor demektir. Neticede düşünmek, yazarak paylaşmak ve eleştirilmek hem cesurca hem de güzel bir şey. 

Toplam görüntülenme sayısı: 1887