Dün gece yine kendime yeni bir eziyet buldum. "Şu meşhur Dijkstra algoritmasını ne kadar iyi biliyorum ki?" diye düşündüm ve kendime meydan okudum: "Kağıt kalem, sıfır yardım, sıfır kopyala-yapıştır. Sıfırdan yazacaksın." Sonuç? Kafayı yiyecektim ama meğerse algoritmayı ilk defa o an gerçekten anlamışım.
Terminaldeki İlk Çöküş
Hemen Python'da kodu yazmaya başladım. Grafımı güzelce oluşturdum, min-heap için heapq'yu import ettim. İlk çalıştırmada, sanki her şey yolundaydı. Ta ki, ulaşılamayan düğümlerin mesafesini sonsuz (`float('inf')`) olarak döndürene kadar. Bir baktım, sonuçların yarısı doğru, yarısı saçma sapan. "Burada bir mantık hatası var" dedim içimden. StackOverflow'a baktım, her şey doğru görünüyordu. Meğerse sorun, komşu düğümü güncellerken, heap'ten çıkardığım mesafeyi değil, güncel mesafeyi push ediyormuşum. Şaka gibi ama 45 dakika bu hatayı aradım.
Debug Serüveni ve "Aha!" Anı
PyCharm debugger'ını açtım, adım adım ilerledim. Her döngüde heap'in içini izledim. İşte o an! Heap'in en tepesinden çektiğim düğüm, aslında güncel olmayan, eski bir mesafeye sahipti. Çünkü aynı düğümü farklı mesafelerle heap'e atmışım ve en küçük olanı (doğru olanı) önce gelmiyordu. O "Aha!" anı geldiğinde, olay sadece bir satırı düzeltmekti ama o satıra ulaşmak için algoritmanın gerçekten nasıl çalıştığını, heap'in buradaki kritik rolünü ve mesafe güncellemesinin inceliğini beynimin derinliklerine kazımış oldum. Kitaptan okuyunca "tamam işte" dediğin şey, debug ederken "AAAA, şimdi anladım!"a dönüşüyor.
Sonuç: Debug, En Etkili Öğretmendir
Eğer bir algoritmayı, bir kütüphaneyi (`React`, Pandas, neyse işte) sallana sallana kullanıyorsan, aslında onu tam anlamıyorsun demektir. Onu sıfırdan inşa etmeye çalışıp, çıkan saçma hatalarla boğuştuğun an, o konsept senin oluyor. O yüzden "Ben bunu biliyorum" demeden önce, bir de boş bir IDE açıp deneyin. Emin olun, ilk denemede çalışmayacak ve siz de bana hak vereceksiniz.
Siz de böyle "sıfırdan yazayım" derken kendinizi 3 saatlik bir debug kabusunun içinde bulduğunuz oldu mu? Ya da "vazgeçtim, kütüphane kullanayım" dediğiniz anlar? Yorumlarda yazın, hep beraber dertleşelim!
Hemen Python'da kodu yazmaya başladım. Grafımı güzelce oluşturdum, min-heap için heapq'yu import ettim. İlk çalıştırmada, sanki her şey yolundaydı. Ta ki, ulaşılamayan düğümlerin mesafesini sonsuz (`float('inf')`) olarak döndürene kadar. Bir baktım, sonuçların yarısı doğru, yarısı saçma sapan. "Burada bir mantık hatası var" dedim içimden. StackOverflow'a baktım, her şey doğru görünüyordu. Meğerse sorun, komşu düğümü güncellerken, heap'ten çıkardığım mesafeyi değil, güncel mesafeyi push ediyormuşum. Şaka gibi ama 45 dakika bu hatayı aradım.
Python:
heapq.heappush(heap, (new_distance, neighbor)) # Doğrusu bu
# Ben ne yapmışım? heapq.heappush(heap, (current_distance, neighbor))
PyCharm debugger'ını açtım, adım adım ilerledim. Her döngüde heap'in içini izledim. İşte o an! Heap'in en tepesinden çektiğim düğüm, aslında güncel olmayan, eski bir mesafeye sahipti. Çünkü aynı düğümü farklı mesafelerle heap'e atmışım ve en küçük olanı (doğru olanı) önce gelmiyordu. O "Aha!" anı geldiğinde, olay sadece bir satırı düzeltmekti ama o satıra ulaşmak için algoritmanın gerçekten nasıl çalıştığını, heap'in buradaki kritik rolünü ve mesafe güncellemesinin inceliğini beynimin derinliklerine kazımış oldum. Kitaptan okuyunca "tamam işte" dediğin şey, debug ederken "AAAA, şimdi anladım!"a dönüşüyor.
Eğer bir algoritmayı, bir kütüphaneyi (`React`, Pandas, neyse işte) sallana sallana kullanıyorsan, aslında onu tam anlamıyorsun demektir. Onu sıfırdan inşa etmeye çalışıp, çıkan saçma hatalarla boğuştuğun an, o konsept senin oluyor. O yüzden "Ben bunu biliyorum" demeden önce, bir de boş bir IDE açıp deneyin. Emin olun, ilk denemede çalışmayacak ve siz de bana hak vereceksiniz.
Siz de böyle "sıfırdan yazayım" derken kendinizi 3 saatlik bir debug kabusunun içinde bulduğunuz oldu mu? Ya da "vazgeçtim, kütüphane kullanayım" dediğiniz anlar? Yorumlarda yazın, hep beraber dertleşelim!