Programlama Nedir: Programlamanın Tabiatı ve Programcılık Üzerine – I

Hayatta en sevdiğim şeylerden birisi programlama yapmak. Ne zaman bir vesile ile böyle bir imkan bulsam, kendimi makinanın başında sabahlamış buluyorum. Başka hiçbir şey, bu günlükte yazı yazmak dahil, beni makina başında sabahlatmıyor. Bu duruma, 90’lı yılların başından bu yana alışkınım aslında. Benim gibi programcı olan kişilerin en temel tutkusu, programlama. Dolayısıyla programlamanın ve programcılığın en temel özelliği “tutku”. Acaip tutkulu insanlar programcılar, manyaklık derecesinde bir durum bu.

Neden acaba programcılar böylesine tutkulular? (Öyle ya bir kurumda, en anlaşılmaz, diğer çalışanlar, özellikle de İnsan Kaynakları tarafından en uç noktada görülen insanlardır genelde programcılar.) Sanırım yaptığımız iş, zihni melekelerimizi sonuna kadar kullanmamızı sağladığı için. Zaten, zihni açıdan böyle ağır bir iş, tutku olmadan, başka türlü yapılamaz. Zihni melekelerimizi sonuna kadar kullanmamızı sağlayan şey ise bence, programcının, programlama esnasında kendisiyle uğraştığı faktörlerin sayısının yüksek oluşudur. Faktör sayısının yüksekliği, faktörlerin durumlarının sayısı ve aralarındaki ilişkilerin karmaşıklığı, faktörlerin aralarındaki ilişkilerin sayısı ve karmaşıklığı, yapılan işin ne kadar karmaşık olduğunun en temel belirleyicisidir. Bunu şöyle ifade edebiliriz: Genel olarak bir programcının, üzerinde çalıştığı konunun, yani süreç, iş kuralı, algoritma, arayüz, iletişim protokolü, vs. her ne ise, faktör sayısı, yani değişken olsun sabite olsun, konunun matematiksel modelinde var olan soyutlamaların sayısı ile bu soyutlamaların aralarındaki ilişkilerin sayısı ve karmaşıklığı, normal bir insanın günlük hayatının herhangi bir kesitinde baş edebileceğinden çok daha fazla sayıdadır.

Bir örnekle ne demek istediğimi anlatayım: Programcının yaptığı programlama işi, karmaşıklık açısından, açık kalp ameliyatı yapan bir doktorunkinden farklı değil. Açık kalp ameliyatı yapan doktor da, kan basıncı, kanama riski, beyin fonksiyonları vb. tonla faktörü aynı anda yöneterek, bir ameliyat gerçekleştirir. Muhtemelen, böyle bir operasyon sırasında göz önünde bulundurması gereken faktörlerin sayısı, bu faktörlerin durumlarının sayısı ve aralarındaki ilişkiler ile bizzat faktörlerin aralarındaki ilişkilerin sayısı, normal hayatın herhangi kesitinde karşılaşacağınızdan çok daha yukarıdadır ve açık kalp ameliyatında durumun bir de kritikliği söz konusudur. Ben kritiklik tarafını çıkarırsak, bir programcının yaptığı iş olan programlama ile bir kalp cerrahının yaptığı iş olan açık kalp ameliyatını, karmaşıklık açısından benzer buluyorum ve bu konuda değerli doktorlarımızın hoş görüsüne sığınıyorum :). Fakat kalp cerrahımızın bir kaç avantajı var: İlki, bir programcıdan çok daha fazla eğitim ve pratik tecrübe kazandıktan sonra böyle bir işe girişiyor. Bereket ki bu durum böyle, yoksa sanırım açık kalp ameliyatlarının başarı oranı, bizim yazılımlarımınız başarı oranına düşerdi 🙂 Bir programcı, kesinlikle ve kesinlikle, bir kalp cerrahının içinden geçtiği eğitim ve çıraklığa (kadavra üzerinde uygulamadan başlayarak tonla ameliyatı seyretme vb. iş başı eğitimi kastediyorum) sahip olmadan açık kalp ameliyatına girişen bir gariban bence. Dahası, kalp cerrahımız, operasyon sırasında pek çok yardımcıya sahip: Mesela hemşirelerden birinin görevleri arasında doktorumuzun alnından akan teri silmek bile var. Gördünüz mü hiç kıvranan, depresyona girmeğe ramak kalmış bir programcının, değil terini silmeyi, durumunu farkedip, anında onu o ortamdan uzaklaştırıp, ona yardımcı olan bir kişi, görevli, rol vs? 🙂 Ben yöneticilik yaptığım zamanlarda, bunu farkettiğimde kendisine terapi uyguladığım, ortamdan uzaklaştırıp, çay-yemek vesilesi ile gerilmiş psikolojisini rahatlatmaya çalıştığım çok programcı arkadaşım oldu. Üstüne üstlük, cerrahın, faktörlerini kontrol eden pek çok cihazı var ve özenle tasarlanıp geliştirilmiş bu cihazlar, faktörlerin durumlarını görsel olarak sunuyorlar ve herhangi bir ciddi durum değişmesinde ses vb. yollarla, doktoru ve etrafındaki “n” tane yardımcısını uyarıyorlar. Gördünüz mü hiç, programcı program yazarken, “yazdığınız program şu noktada performans problemi verir”, ya da yanıp sönen “deadlock riski”, “deadlock riski”, ya da ne bileyim “unscalable code”, “unscalable code” diye uyarıda bulunan cihazlar etraflarında? Çok komik değil mi? Ama kalp cerrahları işlerini yaparken böyle yardımları devamlı alıyorlar, onlarsız iş yapmıyorlar. Çok tipik durumdur, Java ile geliştirilip, bol ve umarsızca nesne oluşturulup sonrasında, canlı ortamda çok hızla, bellek (memory) problemleri yaşayan dolayısıyla ölçeklenemeyen (unscalable) yazılımlar. Tipik bir programcının, teknik olan 1000 kelimelik bir konuşmasının içinde geçen bir kavram değildir “ölçeklenirlik” ya da “scalability”, ama çok önemlidir. Neden durum böyledir? Ölçeklenirlik bir faktördür ama yeterli eğitim ve tecrübeye sahip olmayan bir programcı, bu faktörü fena halde ıskalar. Çünkü o, program yazarken, en görünen ve fonksiyonel doğruluk ve tamlık açısından en bariz faktörlere odaklanır da ondan. Zaten programcının zihni, bu faktörler ve karmaşıklıklarıyla iğdiş olurken, ölçeklenirlik gibi bir faktörü düşünmesi imkansızdır ve tam da bu yüzden aslında “yazılım geliştirme, bir programcıya bırakılmayacak kadar önemlidir”. Tam da bu yüzden bu faktörler, gerek mimari gerek ise fonksiyonel tasarım çalışmalarıyla öncesinde ele alınmalıdır ki programcıya, kaldıramayacağı kadar, iş düşmesin. Yani, bir açık kalp cerrahının, ameliyat öncesinde “n” tane farklı daldaki doktordan “konsültasyon” alması, “m” tane tahlil vs. yapmasına benzer bu durum. Bunları yapmadan girilen bir ameliyatta, cerrahın faktörleri kontrol etmesi ne kadar zor ya da imkansız ise gariban ve sefil 🙂 programcıdan beklenen şey de bu kadar zor hatta imkansızdır.

Yukarıda örnekle anlattığımı daha sistematik olarak ifade edersek, bu şekilde programlama yapmada iki problem var: İlki, konunun zaten matematiksel modelinin kurulmamış olmasının getirdiği bir zorluk. Normal şartlarda, iyi bir analiz ve tasarımdan geçmiş ve bundan sonra programcının önüne gelmiş programlama işlerinde programcı, konudaki açık ve seçik olarak belirlenmiş yani, soyutlanmış faktörler ve aralarındaki ilişkileri rahatça anlar ve bunları bir programlama diliyle en iyi şekilde ifade etmeye odaklanır. Bir programcının en temelde iş tanımı budur ve bundan ne az ne de fazla bir şey yapar. Fakat, düzgün bir analiz ve tasarımdan geçmemiş programlama işlerinde ki neredeyse her zaman durum budur, programcının, önceden başka zihinlerin üzerinde düşünüp, değişik soyutlamalarla, konu içindeki faktörleri ve aralarındaki ilişkileri ortaya çıkarmış olması gibi lüksü olmadığından, konunun faktörlerini ve aralarındaki ilişkileri de bizzat kendisinin soyutlaması gereklidir. Dolayısıyla karmaşıklık bir kat daha artar. Bütün bu soyutlamaları bir seferde kavramak için bence 200’lerin üzerinde bir IQ seviyesine sahip olmak gerektiğinden ve böyle bir IQ seviyesine sahip olan programcı bulmak zor olduğundan, bulsanız bile bir programcının kazancına razı olmayacağından vs. vs. :), ve programcıların faktörleri soyutlamak için, UML gibi formal olsun ya da bir beyaz kağıt ya da tahta üzerinde, formal olmayan herhangi bir notasyon kullanarak bile çalışmadıklarından, çünkü programcıların formal notasyonu, bizzat programlama dilinin kendisi olduğundan, yazıkları program-kod parçası, hem soyutlama aracı hem de bu soyutlamaların programlandığı, gerçekleştirildiği ortam haline gelir. Karışık oldu değil mi? Demek istediğim şu: Programlama dili ile program yazmak, hem konunun anlaşılması için gerekli bir eskiz ortamı hem de sanki eskizi yapılmış ve anlaşılmış konunun, bir yazılım olarak ifade edildiği ortam haline gelmesidir bu durum. Bu da çok berbat bir haldir: Neden berbat? Bir, böyle bir çalışma şekli, programcının zihnini acaip yorar. Programcının tutkusu olmazsa bunu şu dünyada “hiçbir Allah’ın kulu” yapmaz. İki, programlarımızı yaz boz tahtasına döndürür bu şekilde çalışma. Programlarda bırakın kaliteyi, bir iç bütülük, bir insicam kalmaz, ortaya çıkan programı “şiir gibi oldu be abi” şeklinde ifade etmek kesinlikle mümkün değildir. Böyle durumlarda programcı, sonradan geri bakıp bu kodla yüzyüze gelmek istemez, yaptığı bu işle kesinlikle övünmez, utanır ondan çünkü. Peki bu durum yazılım kullanıcılarına nasıl yansır? Elbette hata, kullanılamayan, çok sık problem çıkaran sistemler olarak yansır, eğer yukarıda anlattığım sürecin bir yerlerinde kaliteyi arttırıcı gözden geçirmeler, sıkı fonksiyonel ya da fonksiyonel olmayan testler yoksa.

Sıkı durun, yukarıdaki anlattıklarıma bir katman zorluk daha geliyor: Ya programcının zihninde kod yazarken yaptığı bu soyutlamalar çok sık bir şekilde, konunun yani işin sahibi olan kişi tarafından değiştiriliyorsa? Yani aslında yukarıda bahsettiğim, iş süreçi, kuralı vs.nin sahibi olan kişinin kafası henüz net değilse ve arada analiz ve tasarım katmanları da olmadığından, iş sahibi ile programcı devamlı karşı karşıya kalıp, konuşuyorlarsa? Bakın işte bu “hiçbir şekilde yapılacak iş” değildir. Böyle bir ortamda, normal şartlarda kimse çalışmak istemez. Benim sık sık, “insan yapmaz bunu” dediğim haldir bu. Bunu ülkemizdeki pek çok programcı yapar ama, neden biliyor musunuz? Bir, hoşuna gider, çünkü zorluk büyüdükçe ve kendisi başardıkça ya da en azından başardığını düşündükçe (problem de bu ya zaten, başardığını düşünmesi 🙂 ), egosu kabarır ve bu durumun çok fena farkındadır programcı. İki, programcının gücü artar, kendisine bağımlılık artar, her şeyi kontrol edebiliyor olmak müthiş bir şeydir çünkü. Üç, belki de en kötüsü, yazılım endüstrisi açısından, programcı, bu sıkıntılı durumun aslında nasıl olması gerektiğini bile bilmez, çünkü okulda ve sonrasında çalıştığı ortamlarda ona “yazılım=program” yanılsaması, gerçek olarak sunulmuştur çoğu zaman. (Komiktir, bir programlama diliyle doğru düzgün bir program bile yazamayacak durumda olan kişiler, kendilerini “Yazılım Mühendisi” olarak tanıtıyorlar mesela 🙂 Halbuki, bir derleyici (compiler) yazacak kadar yetkin bir programcı olmak bile o insanı “Yazılım Mühendisi” yapmaz, çünkü “yazılım” farklı bir şeydir. Farktan ne kastettiğimi anlamak için, “böyle bir derleyiciyi kullanmak ister misiniz” diye kendinize sorun ve neden “hayır” diye cevap verdiğiniz üzerine düşünün mesela.) Aslında durum, “programcısın, programcı kal”dır sadece 🙂 (Neyse, bu konu da bir yazı gerektirir, o yüzden dalmayalım oraya.)

Dolayısıyla, programcının karşılaştığı üç katmanlı zorluklar şunlardır: Soyutlamaların yapılması, soyutlamaların gerçeklenmesi ve bu gerçeklenmenin, soyutlamalardaki değişimi göz önüne alacak şekilde yapılması. Sabahtan akşama değil de değişen iş ihtiyaçlarına göre makul miktarda değişen iş süreçlerini ve muhtemel değişim noktalarını göz önüne alarak program yazmak, zaman verildiğinde bir programcıdan bekleyeceğiniz şeylerdendir. Ama gerek iş süreçlerindeki gerek ise ölçeklenirlik gibi yazılım mimarisindeki soyutlamaların gerek ise bu iki konudaki muhtemel değişim noktalarının belirlenmediği bir süreçte, programcıdan hem bunları hem de bunlar sonucunda ortaya çıkan yapının bir programlama diliyle gerçekleştirilmesini beklemek hayalciliktir, programcıya da eziyettir.

Bütün bunlardan sonra, bir programcının sahip olması gereken en temel karakter özelliklerini sıralayabiliriz:

  1. Yüksek soyutlama gücü. Yani çözümlemeci/analitik düşünebilme yetkinliği. Daha açık bir ifade ile, olguları sistematik bir şekilde bileşenlerine ayırabilme, bu bileşenlerin durumlarını ve aralarındaki ilişkileri ortaya çıkarabilme, bileşenler arasındaki bağımlılıkları ortaya çıkarabilme, bunları sistematik bir şekilde yapabilme ve aktarabilme  yetkinliğidir çözümlemeci olmak. Bu yetkinliklerin ciddi bir kısmı Allah vergisidir ama iyi bir Matematik, Fizik vb. eğitimle güçlendirilmiş olmalıdır.
  2. Odaklanma: Hiç bir zihin, ilk maddedeki noktada ne kadar yetkin olursa olsun, eğer odaklanma sorunu yaşıyorsa, içinde bulunduğu kişiyi iyi bir programcı yapamaz. Odaklanmadan bu kadar karmaşıklık yönetilemez.
  3. Sabır: Programcı, iğneyle kuyu kazar gibi iş yapar, aynı konuya bazen sil baştan yaklaşır bir kaç defa ve en son denemesinde başarır örneğin. Dolayısıyla azim ve sabır son derece önemlidir.
  4. Denemeci yaklaşım: Programcı, doğruyu bulana kadar çok dener, çok test yapar ve çoğu zaman ancak bir kaç denemeden sonra doğruyu bulur. Bir kere yapıp, oraya takılan kişiler, aynı olaya farklı açıdan bakamayanlar hiç bir zaman iyi bir programcı olamazlar. Bir noktaya takılıp ilerleyemeyenler zaten 1. maddeden de geçememişlerdir çoğu zaman.

Bunlar dışında, formal algortima, veri yapıları, programlama dili, gerekli araçlar vs.nin bilgisi de gereklidir ama ben bu yazıda daha çok karakter özelliklerine dikkat çekmek istedim.

“Abbas Güçlü” vari bir bitiriş yapalım, özetin özeti şudur: Ey programcılar ve programcı olmaya talip gençler: Bu yazıda anlatılanlar size çekici geliyorsa ancak, iyi bir programcı olabilirsiniz. Ey yazılım evleri, BT yöneticileri, programcılarınıza acıyın ve insan içine çıkacak yazılımlar geliştirmek istiyorsanız, yazılım geliştirme işinizi, “programcıların programlaması” olarak değil de bir süreç olarak ele alıp,  programcılarınızdan önce ve sonra konumlandırdığınız kişiler ve çalışmalarla, programcılarınızın işini kolaylaştırın, yazılımlarınızın kalitesini arttırın.

Ve siz de bugün bir programcı bulup ona sarılın 🙂

Bu yazı toplam 1275 defa görüntülenmiştir.