Çarşamba, Mart 22, 2006

Soyutlamalar ve Ogrenme Tembelligi

Programlama yaparken -hatta tüm mühendislik problemlerini çözerken- en önemli becerilerden biri zannediyorum soyutlama becerisi. Yani bir işin detaylarını soyutlayarak, daha üst seviyeden o işi yapabilmeyi sağlamak. Java gibi dillerden, Struts, JSF gibi kütüphanelere veya design patternlardan aspect oriented programminge kadar yöntemler hep daha ileri seviyede soyutlama yapmayı sağlıyor. Hatta kimin söylediğini hatırlayamıyorum, meşhur bir yazılım mühendisi akademisyen -belki Donald Knuth olabilir- şöyle diyordu: "Programlamadaki her problem bir indirection (dolaylandırma) yoluyla çözülebilir."

Soyutlama sadece programlamayı da aşan genel bir mühendislik çözüm yöntemi. Matematikteki faydalı tüm teoremler bir soyutlama ile altta yatan şeylerin detaylarından kullanıcısını kurtarır. Diğer mühendisliklerde de soyutlama ilerlemenin temel aracı. Mesela motor kavramı, altta yatan silindir gibi mekanizmalardan tasarımcısını soyutlar.

Ancak soyutlamanın bu kadar faydalı bir araç olması, ciddi bir soruna da sebep oluyor: Ezbercilik veya düşünce tembelliği. Nasıl bir matematik teoreminin mantığını anlamadan, formülü ezberlemek bazı problemleri çözmekte yeterli olabiliyorsa, programlamadaki soyutlamaları da anlamadan iyi programlar yazmak mümkün, ama bir yere kadar.

Soyutlamaların mantığını anlamamanın, iyi programcılıkla, çok iyi programcılığı ayıran bir şey olduğunu düşünüyorum. Matematikte de böyleydi. Kimisi formülleri ezberler ve sınavı geçer. Ama yepyeni bir problem geldiğinde veya çok sayıda konu içeren bir sınavla karşılaştığında veya hiç bilmediği bir alanda kimse ona yol göstermeden problemlerle karşılaştığında formülleri ezberlemiş olmak bir fayda sağlamaz.

Hiç yorum yok: