Kod Görselleştirme Araçları Algoritmayı Gerçekten Öğretir mi?
Özyinelemeyi ilk gördüğünde kimse anlamaz. Fonksiyonun kendini çağırması kağıt üzerinde mantıklı görünür ama zihinde bir yere oturmaz. Kod görselleştirme araçları tam bu boşluğu doldurmak için var: çağrı yığınını, değişkenlerin anlık değerlerini, node'lar arasındaki bağlantıları ekranda canlandırıyorlar. Peki bu araçlar algoritmayı gerçekten öğretiyor mu, yoksa sadece anlaşıldığı hissini mi veriyor?
Görselleştirmenin gerçekten iyi olduğu yer
Bu araçların en güçlü tarafı, adres ve durum kavramını somutlaştırmaları. Bağlı listede bir node'u silerken hangi işaretçinin nereye kaydığını, yığında hangi çerçevenin üste bindiğini metinle anlatmak zordur; ekranda ok hareket edince mesele biter. Aynı şey iki boyutlu diziler ve matris gezinmeleri için de geçerli. Satır mı önce, sütun mu, tartışması bir animasyonla kapanır.
Değişken izleme de öyle. Bir döngünün üçüncü turunda i ile j'nin ne olduğunu görmek, o döngünün neden bir eleman eksik taradığını yakalatır. Hata ayıklamayı öğrenmenin en ucuz yolu bu.
Özyineleme: animasyonun asıl işi
Özyinelemede görselleştirmenin katkısı tartışmasız, çünkü sorun mantıkta değil, çağrı ağacını zihinde tutamamakta. Naif Fibonacci bunun en temiz örneği. fib(5) çağrıldığında ağaçta 15 düğüm oluşur, tamamı ekrana sığar, öğrenci aynı alt problemin kaç kez tekrar hesaplandığını gözüyle görür. Bunu gördükten sonra memoizasyonun neden gerektiğini kimseye anlatmanız gerekmez.
Peki aynı animasyonu fib(20) için açsanız ne olur? Çağrı sayısı 21.891'e çıkar. Ekranda izlenebilir bir şey kalmaz. İlginç olan şu: asıl dersi veren de bu ikinci sayı. Görselleştirme size küçük örnekte yapıyı öğretir, büyümenin hızını öğretmez.
Özyinelemeyi anlatırken animasyondan önce çağrı ağacını kağıda çizdirmeyi tercih ederim. Araç önce gelirse öğrenci ağacı kurmayı değil, izlemeyi öğreniyor.
Ölçek sezgisi ekranda oluşmaz
Sıralama animasyonlarının çoğu 8-10 elemanla çalışır, çünkü fazlası akıcı görünmez. Kabarcık sıralamasında 8 eleman için karşılaştırma sayısı n(n-1)/2, yani 28. Hoş bir animasyon, otuz saniyede biter. Bin eleman için aynı formül 499.500 verir. Aradaki fark tam olarak algoritma dersinin konusu, ama animasyonda o farkı gösterecek hiçbir şey yok. Öğrenci kabarcık sıralamasının nasıl çalıştığını öğrenir, neden kullanılmadığını öğrenmez.
Bu yüzden görselleştirmeyi karmaşıklık analizinin yerine değil, öncesine koymak lazım. Önce mekanizma ekranda görülsün, sonra aynı mekanizmanın maliyeti kalemle hesaplansın. Sırayı ters çevirirseniz sezgi yanlış tarafa yerleşir: yavaş algoritmalar animasyonda çoğu zaman daha güzel görünür.
Ağaç, hash tablo, graf
İkili arama ağacında ekleme ve dönme işlemleri görselleştirmeye çok yatkın; dengesizliğin nasıl oluştuğu ve dönmenin onu nasıl düzelttiği başka türlü zor anlatılır. Graf algoritmalarında da benzer durum var, genişlik öncelikli aramanın dalga gibi yayılması ile derinlik öncelikli aramanın bir kola saplanması yan yana oynatıldığında fark tek bakışta oturur.
Hash tablolarda ise animasyon işin yarısını gösteriyor. Anahtarın kovaya düşmesi görünür, ama çarpışmanın ne kadar sık olduğu görünmez. 23 kovaya rastgele 10 anahtar dağıtın, hiç çarpışma yaşamama ihtimaliniz yüzde 10 civarında kalır. Doğum günü probleminin aynısı. Çarpışma istisna değil, normal durum; iyi bir araç bunu birkaç örnekle üst üste çalıştırıp gösterebilmeli.
Araç seçerken neye bakmalı
Geniş dil desteği listelerde hep ilk sırada yazar ama pratikte en az önemli kriter. Öğrencinin kendi dilinde çalışması hoş bir şey, yine de bir bağlı liste her dilde aynı bağlı listedir. Bakılacak şeyler daha sıkıcı: kendi kodunuzu yapıştırıp çalıştırabiliyor musunuz, yoksa sadece hazır demolar mı var? Adımlarda geri gidebiliyor musunuz? Bir noktadan sonra hızlanıp sadece son durumu gösterebiliyor mu?
Geri gitme özelliği özellikle kritik. Yanlış anlaşılan adım genellikle iki adım geride kalır ve baştan çalıştırmak zorunda kalmak öğrenmeyi kesiyor.
Sınıf ortamında kullanacaksanız, öğrencinin ilerlemesini takip eden panolar cazip görünür. Deneyimim bunların çoğunlukla kullanılmadan kaldığı yönünde; asıl fayda öğrencinin aracı ders dışında kendi başına açmasında.
Kaynaklar