Eğer yazılım ile uğraşan biriyseniz "Programlama öğrenmek için nereden başlamak gerek? Hangi dili öğrenmeliyim?" soruları ile mutlaka karşılaşmışsınızdır. Hatta bazen bu soruyu soran henüz üniversite eğitimi almamış bir lise ya da ortaokul öğrencisi bile olmuş olabilir. Nasıl bir cevap verirdiniz? Sizce üniversite öncesi programlama eğitimi nasıl olmalı?
Bu soruya en iyi cevabı bulabilmek için başta Amerika Birleşik Devletleri olmak üzere bir çok ülkede akademisyenler, özel şirketler ve bazı bağımsız gruplar tarafından önemli araştırmalar yapılıyor. Bunlardan bir tanesi de Bootstrap projesi.
Bootstrap, Emmanuel Schanzer tarafından 6-12 sınıflar için özel olarak geliştirilmiş bir eğitim müfredatıdır. Brown, WPI ve Northeastern üniversiteleri tarafından üniversitelerde programlamaya giriş seviyesi için geliştirilen HtDP (How to Design Programs) müfredatının üniversite öncesi yaş grupları için uygulanmış halidir.
10 haftalık müredat bitiminde ögrenciler basit de olsa kendi oyunlarını yazmış oluyorlar. Oyunu oynayabilmek için tıklayın.
Tasarım Reçetesi
Tipik bir programlama dersi 'çalışıncaya kadar değiştir' (tinker until it works) yaklaşımını öğretir. Çalıştığı zaman öğrenciler 'Çalıştı!' diyerek sevinir ve bir sonraki probleme geçerler. Maalesef bu terim hesaplama alanında söylenmiş en kısa yalandır ve bir çok insanın ömründen nice saatlere mal olmuştur.
HtDP (dolayısı ile Bootstrap) müfredatı bu yönteme alternatif olarak öğrencilere uyguladıkları çözümün her bir adımını daha en başından anlayabilecekleri, sistematik düşünceye dayalı "iyi programlama pratikleri"ne odaklanan bir eğitim müfredatı önerir. Bunun için "tasarım reçetesi" olarak adlandırdıkları, bir programın bütününe ya da yazdığınız her bir fonksiyona uygulayabileceğiniz aşağıdaki adımları sunar (HtDP'nin sunduğu orjinal tasarım reçetesi 6 adımdan oluşurken Bootstrap projesi 3 adımlık daha kısa bir reçete kullanıyor):
Adım 1: Sözleşmeyi Yazın
Fonksiyon tanımlamanın ilk adımı onun Sözleşmesi'nin hazırlanmasıdır. Sözleşme bir fonksiyon hakkında üç esas bilgiyi özetler: Fonksiyon İsmi, Fonksiyonun Girdisi, Fonksiyonun Çıktısı.
Adım 2: Örnekler Verin
Bir önceki adımda yazdığımız bilgileri kullanarak birkaç örnek düşünmek her zaman iyi bir fikirdir. Örnekler, fonksiyonun ne üretemeye çalışacağını gösterirler.
Adım 3: Fonksiyon Tanımlama
Son olarak sözleşmeyi ve yazdığımız örnekleri kullanarak fonksiyonun kendisini tanımlamak oldukça basittir.
Bir Örnek Kullanarak Pekiştirelim
Diyelim ki bizden verilen sayının karesini hesaplayan bir fonksiyon yazmamız istendi.
Öncelikle fonksiyonumuzun adını, alacağı veri ya da verilerin tiplerini ve üreteceği verinin tipini belirleyelim. Fonksiyonumuza 'karesi' ismini verebiliriz. Karesi fonksiyonu bir sayı alacak ve yine bir sayı üretecek. Bunu ';;' işareti ile bir yorum satırı olarak yazalım.
; Sözleşme: karesi : Sayı -> Sayı
İkinci adım olarak örnekler verelim. Bunlar öyle örnekler olsunlar ki karşılaşabileceğimiz tüm farklı durumları mümkün olduğunca kapsasınlar. Önceden bizim için tanımlanmış olan 'EXAMPLE' fonksiyonunu kullanarak örneklerimizi yazabiliriz. Böylece şimdi yazdığımız örnekler sonradan fonsiyonumuzu test etmek için kullanılabilecek.
(EXAMPLE (karesi 0) 0) (EXAMPLE (karesi -3) 9) (EXAMPLE (karesi 4) 16)
Son olarak kodumuzu aşağıdaki şekilde tanımlayabiliriz:
(define (karesi x) (* x x))
Hepsi bu kadar. Sizinde farkettiğiniz üzere dokümantasyonu ve testleri olan bir fonksiyon yazdık :)
Programlama Dili: Racket
HtDP'ye göre programlamaya giriş için günümüzün moda dillerinden birini seçmek mantıklı değildir. Çünkü yazılım dünyasında moda çok hızlı değişir. Tipik bir "X dilinde hızlı programlama öğrenin" kitabı ya da dersi sizi bir sonraki moda dile taşıyacak olan programlama prensiplerini aktarmada başarılı olamaz.
Bir diğer husus da piyasadaki dillerin giriş seviyesindeki bir öğrenciye yardımcı olma konusunda başarısız olmasıdır. Bu seviyedeki bir öğrenci daha dili öğrenmeden bir çok hata yapar, ancak programlama dilleri ürettiği hata mesajlarında kullanıcının dili bildiğini kabul eder. Racket dili öğrencinin seviyesine göre farklı öğrenme dilleri sunar. 'Yeni Başlayan Öğrenci Dili'nde Racket dilinin sadece bazı özellikleri açıktır ve üretilen hata mesajları öğrenci seviyesine uygun olarak yeniden düzenlenmiştir.
Programlama IDE'si: Dr. Racket
Dr. Racket jumbo jet kokpitini andıran diğer IDE'lerin aksine çok basit bir arayüze sahiptir. Yazdığınız kodları anında deneyebileceğiniz 'etkileşim penceresi' ve bu kodları kaydedip saklayabileceğiniz 'tanımlama penceresi'ni bir arada bulundurur. Böylece 'şöyle yazsam nasıl olur' tarzı deneyler yapmak isteyen öğrenciler hemen oracıkta denemelerini yapıp kodlarını hızlıca düzenleyebilirler. Dr. Racker, tasarım reçetesini uygulamak isteyen öğrenciler için de interactive bir ortam sağlar.
Sonuç
Yazarlarının bu kitap hakkında şöyle bir yorumu var: "Bu kitap kimseyi süper bir programcı yapmaz, ancak bir şeye inandığımız için 15 yılımızı bu kitaba harcadık: 'Herkes program tasarlayabilir.'
Müfredatın altında yatan felsefeyi daha iyi anlamak için kitabın önsözünü okumanızı tavsiye ederim.
"Evet, ama, her güzel şey gibi bu da ingilizce!" dediğinizi duyar gibiyim. Değerli akademisyenlerimizden Mehmet Gençer ve çalışma arkadaşları bu sorunu çoktan çözmüş. Müfredatın türkçe çevirisine yakinokul.org adresinden ulaşabilir, vakit buldukça github üzerinden açık kaynak olarak geliştirilen bu projeye destek verebilirsiniz.