Programlama Nedir: Programlama’nın Tabiatı ve Programcılık Üzerine – III Bilim mi, Mühendislik mi Yoksa Sanat mı?
Bu konu ile ilgili yazdığım bir önceki yazı ışığında hem kendi düşüncemi hem de ülkemizdeki anlayış ve pratikleri değerlendirmek isterim.
Evet kategorizasyon anlamamızı kolaylaştırır, bu doğrudur, ama aynı zamanda indirgemeci bir tutumdur, detayları atlar. Bundan dolayı karmaşık şeyleri kategorize etmek zordur. Bu yüzden programlamanın ve yazılımın tabiati ile ilgili tonla farklı kategorizasyon var. Ben ise şöyle düşünüyorum: İşe en çekirdekten başlarsak öne programlamayı ele almamız gerekir. Sonuç itibariyle programlama, algoritmik düşüncenin uygulanmasıdır. Yani programlamada aslolan algoritmik düşüncedir. Dilleri kullanılarak yazılan kodlar, algoritmik düşüncenin hayata geçmiş halidir. Programlama faaliyetinin arkasındaki bu esas noktayı görmemek, programlamayı tamamen yanlış değerlendirmek anlamına gelir.
Bakın, hepimizin malumu, ABD’de başlayan ve dünyaya yayılmakta olan, “herkes kodlama öğrenmeli” (everybody should learn to code) sloganıyla ifade edilen bir yeni heyecan var. ABD başkanı Obama’dan tutun da Facebook kurucusu Zuckerberg’e kadar herkes, “haydi çocuklar kodlamaya” gibisinden çağrılarda bulundular. Code.org gibi konuyu sosyal sorumluluk bağlamında ele alan yerler olduğu gibi, akademik olarak değerendirmeler yapanlar da var. Kimileri ve bazıları modern çağın dinamiklerini öğrenmek için herkes en basitinden Javascript’le biraz uğraşmalı derken, diğer kimileri “hayııııııırrrr” diye haykırarak bu çağrıya karşı çıkıyor. Bunlar işin biraz daha üst tarafını gören yaklaşımlar. Bence bu konudaki en güzel yaklaşımı Grady Booch sergiledi. Booch, IEEE Software dergisinin Eylül-Ekim 2014 sayısında bir yazı yayımladı. Yazının başlığı “To Code or Not To Code: That’s the Question” şeklinde, yani “Kodlamak mı yoksa Kodlamamak mı: İşte soru budur.” Booch’a göre başlatılan bu kampanyanın düşmesi muhtemel yanlışı, insanlara meslek olarak kodlamayı öğretmektir. Evet Booch’a göre bu bir yanlıştır çünkü aslolan onun “computational thinking” dediği ve benim yukarıda “algoritmik düşünce” diye anlattığım düşünce şeklini öğrenmektir. Ona göre, programlamanın temeli, dilimize belki “hesaplamasal düşünce” diye kelime çevirisi yapabileceğimiz ama benim “algoritmik düşünce” demeyi tercih ettiğim, zihnimizin kazanması gereken bir düşünme şeklidir. Bu düşünme şekli, programlamadan önce, bir işi veya süreci algoritmik olarak ifade edebilmek gibi, pek çok zihni yetkinliği ve aracı barındırıyor. Bu zihni araçların gerekliliğinden habersiz bir şekilde Bilgisayar Mühendisliğine girip, beni “lütfen sen kod yazma, mümkünse Eclipse’i de makinandan kaldır” diye yalvartan programcı adaylarına çok sık rastlıyorum. Öte taraftan doğuştan algoritmik düşünceye yatkın olan kişilerin, üzerine herhangi bir mühendislik gibi güzel bir Matematik ağırlıklı eğitimle çok başarılı programcılar olduklarını da görüyorum. Bu anlamda programlama, algoritmik düşüncedir ve nihayetinde Matematik’in bir konusudur ve saf bir bilimdir.
Problem şu ki ülkemizdeki programlama yapanların pek çoğunun, programlamanın üzerine bina edildiği bu algoritmik düşünceden haberi azdır. Bu durum malesef sadece alaylılar için değil, BM okumuş kişiler için de geçerlidir, çünkü sektörümüzde sağlıklı bir bilimsel formasyondan bahsetmek mümkün değildir. Biz okulu bitirirken bir sayfayı kapatırız, işe girince sanki beynimizi sıfırlamışcasına, okuldan gelen her şeyi geride bırakıp, her şeye baştan başlarız. Bitirdiğimiz okul, diploma olarak işe yarar. Bu yüzden BM mühendisi çok kişi kendisini tanımlarken “bize okulda .NET öğrettiler” ya da bitirme projesinde “JSP ile e-kütüphane ya da e-ticaret sitesi yaptım” diyor.
Java eğitimlerinde algoritmalar için big-O notasyonundan bahsettiğimde ya da örneğin float ve double’ı (floating-point) açıklarken sayılabilirlikten (countability) dem vurduğumda en iyi okulları bitirmiş gençlerin nasıl sanki ilk defa duyuyormuş gibi davrandıklarını hayretle izlemişimdir. Memleketimdeki kurumsal projelerin hemen hepsinin bir performans ve ölçeklenirlik problemi yaşamasının bence en temel sebebi, o projelerde bulunan kişilerin, eğitimleri ne olursa olsun, yukarıda bahsettiğim programlama için sahip olmaları gereken sağlıklı bir algoritmik düşünce yetkinliklerini taşımamalarıdır. Çünkü bizim için çoğu zaman aslolan şey, malesef sadece programlama dilini kullanmaktır. Bu tipte olan programcılar örneğin bir “for” döngüsü yazmayı sadece dil bağlamında bilirler, soyut olarak bir döngüyü algılamanın ne anlama geldiğinden uzaktırlar. Ben bir SQL sorgusu yazarken, veri tabanının arkada kaç tane işlem yapacağını anlamaya çalışan bir programcı göremedim örneğin bu ülkede. Ama “Oracle yavaş” diyenini gördüm. Bu yüzden işe alırken programlama yetkinliklerini ölçmek kadar algoritmik düşünce yetkinliklerini ölçmeye önem veren iş yerlerine çok saygı duyuyorum.
Bu anlamda programcılığın bilimsel arka planını ıskaladığımızı düşünüyorum. Bu anlayıştan dolayı, toplumuzda programlamanın harcı alem bir faaliyet ve meslek olarak görüldüğünün farkındayım. Daha önce de yazmıştım sanırım, bu ülkede yakaladığı doktor tanıdığına “doktor olmak istiyorum abi/abla ama tıp okumama gerek var mı” diyen bir genç yoktur herhalde. Ama ben tonla “programcı olmak istiyorum, BM okumama gerek var mı” diye soran genç arkadasımdan öte bir o kadar da “programcı olmak istiyorum, üniversite okumama gerek var mi” diye soran gençlerle karşılaşıyorum. Dahası, BM okurken en temel algoritmalar, işletim sistemi vb. derslere devam etmeyip, Php ile dışarıya ufak tefek site yapmayı amaç ve başarı olarak gören gençlerle de çok sık karşılaşıyorum. Halbuki örneğin algoritmalar ve veri yapıları, algoritmik düşüncenin geliştirildiği, disipline edildiği en temel derslerdir. Programlama dilleri dersi, dillere farklı yaklaşımların ele alındığı, örneğin veri kavramının farklı dillerde nasıl modellendiğinin ya da fonksiyonel algoritmik düşüncenin nasıl olabileceğinin tartışıldığı derslerdendir. Benzer şekilde veri tabanlarını sadece bir araç (tool) olarak görmek, ardındaki ilişkisel veri modeli altyapısını ele almamak, örneğin ilişkisel cebirden habersiz bir şekilde kalmak, nihayetinde veri modeli kavramından uzak bir şekilde, koskoca Oracle’ı, akıllı bir Excel olarak kullanmak gibi alışkanlıklar kazanmamıza sebep oluyor. Aslında tüm bu disiplinler hep kafamızdaki soyut, algoritmik düşünceyi beslemek ve gerçekleştirmek için vardırlar. Bu açıdan bakıldığında evet, programlama bir bilimdir ve biz programlamanın bu yönünü ıskalamaya devam ediyoruz.
Programlama sadece algoritmadan ibaret degil elbette. Programlama dilleri, altyapı sağlayan işletim sistemleri, dillerde geliştirilen bileşenler (components) ve çerceve (framework) yapılar, aslında bilimsel bir alt yapıya sahip programlamayı, hızla ve her şartta tekrar edilebilir ve iyi tanımlanmış bir sürece çevirme çabasından ibaret. İşin burası ise mühendisliktir. Zaten tek kişi anlamında bile bu şekilde uygulanabilir olarak bir mühendislik haline gelen programlama, birden fazla kişinin bulunduğu ortamlarda tamamen bir mühendislik disiplini olmaktadır. Örneğin yazılımın mimarisinden tutun da üretilen bilginin paylaşılmasına, kaynakların etkin kullanılmasına, değişimin yönetilmesine kadar ortaya çıkan farklı alt süreçler, yaptığımız şeyin programlamadan çıkıp yazılım geliştirmeye dönüsmesini sağlıyor. Bu haliyle yazılımı geliştirme, tamamen bir mühendislik disiplini haline gelmektedir.
İşin açıkçası, yazılım geliştirme faaliyetini “programcıların yaptığı iş” olmaktan çıkarıp bir mühendislik projesi olarak ortaya koymada da ciddi sıkıntılarımız var. Pek çoğumuza göre hala yazılım geliştirmek, program yazmanın çok az fazlası anlamına geliyor. Bu durum BT yöneticileri için de böyle malesef. Ya da mesela zaman zaman, yetkinliği ve yaptığı iş sadece programcılık ya da development olan bir kişiyi, kendisini Yazılım Mühendisi olarak tanıtırken de buluyorum. Bu gibi karmaşıklıklardan dolayı da zaten sağlıklı bir Yazılım Mühendisliği mesleğine sahip olamıyoruz.
Pek çokları, yazılımı zanaat olarak da görüyor. İngilizce’de “craftsmanship” olarak ifade edilen bu kavram, bir el mahareti isteyen ve çoğunlukla usta-çırak ilişkisiyle geliştirilen bir melekedir. Yaptığımız iş, programlama, bu tanıma ciddi bir şekilde uyuyor. Hatta işimizi bu şekilde bir zanaat olarak görenlerin bir manifestosu da var. Bu topraklardaki yazılım ve Java kültürüne çok değerli katkılar yapan arkadaşımız Özcan da programcılığın neden bir zanaat olduğunu burada açıklıyor. En ünlü temiz kodcu olan Robert Martin de kitabının alt başlığını “A Handbook of Agile Software Craftmanship” olarak seçmiş. Yazar kitabının önsözünde kaliteli ya da “temiz” kod elde etmenin ancak “craftmanship” ile erişilebileceğini söyleyerek, aslında kaliteli ve temiz kodun ince iş ya da tabiri caizse zanaatkarın “göz nuru” ile ortaya çıkabileceğini vurguluyor. Benzer şekilde “Software Craftsmanship” kitabının sahibi olan Pete McBreen de kitabında bu işin usta-çırak yöntemiyle öğrenilmesini vurguluyor. Usta-çırak ilişkisi, Ingilizce’de “coaching” terimiye kastedilen şeydir ve ben danışmanlık ve eğitim vesilesiyle karşılaştığım pek çok pırlanta ayarında genç arkadaşın, bu ilişkiye sahip olamadığı için bir zanaatkar seviyesine gelemediğine ve ciddi vakit kaybettiğine şahit olmuşumdur.
Ben tüm bu açıklamalara katılıyorum, evet yaptığımız işin ciddi bir zanaat yönü var. Ama bu terim aynı diğer bilim, sanat ve mühendislik, terimleri gibi, işimizi tamamen açıklamıyor, bu anlamda zanaat da tamamlayıcı bir terim. Özellikle usta-çırak ilişkisi ile aktarılabilmesi, kaliteli iş için ciddi bir meleke gerektirmesi, işimizin zanaat tarafını destekleyen yönleri. Bundan dolayı şöyle diyebilirim: programcılığı, bir cam zanatkarının yaptığı gibi, prensipleri tamamen tecrübe ile elde edilmiş, usta-çırak ilişkisiyle yaşatılan bir meslek olarak görmek bence işimizin özellikle bilimsel ve mühendislik yanını ihmal etmek anlamına gelebilir. Ama öte yandan özellikle işimizi iyi yapmak için sabır ve melekelerimizi geliştirmeliyiz ve öğrenme sürecinde, önümüzdeki üstatlardan faydalanmalıyız.
Matematiğin soyut dünyası, kapılarını yaratıcılığa çok geniş bir şekilde açar. Matematik, özellikle de sayılar teorisi, aslen bir sanat eseri güzelliğindedir. Sayılar teorisininin çok güzel bir uygulaması olan algoritmalar ya da algoritmik düşünce de içerdiği aşırı karmaşıklık ve elverdiği yaratıcılıktan dolayı, evet bir sanattır. Biz programcılar ise işimizin sanat tarafını daha çok tasarım (design) olarak ifade ediyoruz. Ve muhtemelen biz programcılar, program yazarken aldığımız hazzı, bu işin sanatsal doğasından çıkarıyoruz. Hatta bu sanatsal haz bizi, yaptığımız işi sanat seviyesinde tutup, mühendisliğe dönüştürmekten de alıkoyuyor.
Sonuç olarak şunu diyebilirim: Birey olarak işimin bilimsel temellerinden haberdar olmalıyım. Bu ise ancak formal bir eğitimle mümkün olabilir. Birey olarak program yazarken, yazılım geliştirirken, bir zanaatkar edasıyla, ürettiğim şeye ve kalitesine önem vermeliyim, biriktirdiğim tecrübemi başkalarıyla, özellikle arkamdan gelenlerle paylaşmalıyım. İşimin yaratıcılık yönünün, zaman zaman kendimi bir sanatçı gibi hissettirmesine izin vermeliyim, bu yüzden yaratıcılığımı daima yaşatmalıyım. Ve tüm bunları, tekrarlanabilir ve değer katacak şekilde, takım arkadaşlarımla birlikte, müşterimin ihtiyaçlarını çözen bir mühendislik disiplini olarak uygulamalıyım.
Bol programlamalı günler dilerim 🙂
Toplam görüntülenme sayısı: 1325