Üniversitede, bilgisayar bilimi ders çalışmalarım kapsamında oldukça fazla Python programı yazdım. Bize bir problem veriliyor, bu problemi çözmek için bir program yazıyorduk, beklenen çıktıyı üretip üretmediğini kontrol edip geçiyorduk. Kod çalıştığı sürece, onu tekrar gözden geçirmek ya da sorunu çözmenin daha iyi bir yolu olup olmadığını sorgulamak için nadiren bir sebebim oluyordu. Son zamanlarda, o eski scriptlerden bazılarını bulup bir kodlama ajanına teslim ederek ne yapabileceğini görmeye karar verdim. İki dizili arama, yığın tabanlı ifade dönüştürme ve Newton-Raphson yöntemini kapsayan üç program seçtim. Onun, ilk başta fark etmediğim hataları açıklaması ve düzeltmesini izlerken ne kadar şey öğrendiğime şaşırdım.


İki dizili arama kodumda hiç fark etmediğim problemler vardı
Birkaç test durumunu geçmek yeterli değildi
Kodlama ajanına teslim ettiğim ilk script, Veri Yapıları ve Algoritmalar ders çalışmamdan bir iki dizili uygulamauydu. İki dizili arama hakkında bir fikriniz varsa, fikrin oldukça basit olduğunu bilirsiniz. Sıralı bir listeyle başlarsınız, ortadaki elemanı kontrol edersiniz ve aradığınız şeyi bulana kadar aramayı daraltmaya devam edersiniz. Uygulamam, bildiğim kadarıyla, sıradan low, high ve mid değişkenlerini kullanıyordu ve mükemmel çalışıyordu.
Kodlama ajanı, programı çalıştırarak ve farklı girişlerle test ederek başladı; iş, sınır durumlarını kontrol ettiğinde ilginçleşti. Orijinal kod, özellikle listenin başındaki veya sonundaki elemanları ararken belirli sınır koşullarında problemler yaşıyordu. Ayrıca eksik elemanları ve boş listeleri programın nasıl işlediğinde zayıflıkları ortaya çıkardı.

Bunlar çoğunlukla bir-off-one (bir fazlası/bir eksiği) hataları ve arama sınırlarının nasıl güncellendiğine ilişkin sorunlardı. Ajan, döngü koşulunun neden önemli olduğunu ve low ya da high değerlerinin yanlış güncellenmesinin programın bir elemanı tamamen atlamasına yol açabileceğini açıkladı. Ardından uygulamayı düzeltti ve düzeltmeleri doğrulamak için aynı testleri tekrar çalıştırdı.
Üniversitede bir programı genellikle birkaç girdiyle çalıştırır ve çıktı beklentilerimle eşleştiğinde ödevi tamamlanmış sayardım. Burada ise ajan, programı çökertebilecek girdileri bilinçli olarak arıyordu. Ayrıca, bu ödevleri yazarken uğraşmadığım otomatik testleri de tanıttı.
Yığın (stack) ödevi anlayışımdaki açıkları ortaya çıkardı
Mantığı ezberledim ama anlamadım
Sıradaki script, Veri Yapıları ders ödevlerimden biri olan bir infix-to-postfix (dizgi-den-sıralı) ifade dönüştürücüydü. Amaç, A+BC gibi matematiksel bir ifade alıp onu ABC+ biçimine dönüştürmek; burada operatörler operandlarından sonra gelir. İfade işlenirken operatörleri ve önceliklerini takip etmek için bir yığın kullanırsınız.
Bu ödevden, mantığı aslında anlamaktan çok onu hatırlamaya çalıştığım için vakit harcadığım bir ödev olduğunu hatırlıyorum. Kodum basit ifadeler için çalıştığından, algoritmayı doğru biçimde uyguladığımı varsaydım.
Ancak kodlama ajanı testlere başladığında, iç içe parantezler ve aynı önceliğe sahip operatörler içeren daha karmaşık ifadelerde sorunlar buldu. Üs alma (üs alma işlemi) ayrıca ilginç bir durumdu — örneğin A^B^C ifadesi A^(B^C) olarak yorumlanmalıdır, ancak benim uygulamam bu birleştiriciliği (associativity) doğru şekilde işlemedi.
Aynı şekilde A*(B+(C-D)) gibi bir ifade de verdim ve ona her yığın (stack) işlemini adım adım anlatmasını istedim. Bir operatörün ne zaman yığına itilmesi gerektiğini, ne zaman çıkarılması gerektiğini ve parantezlerin işlem sırasını nasıl değiştirdiğini açıkladı. Bu açıklama, daha önce çoğunlukla algoritmayı ezberleyerek öğrendiğim bir şeyi anlamama yardımcı oldu. Ajan ayrıca uygulamayı temizledi ve geçersiz ifadeler için kontroller ekledi.
Newton-Raphson scripti bana formülün yeterli olmadığını gösterdi
Doğru cevabı bulmak için matematikten daha fazlası gerekir
Son script, Sayısal Yöntemler ödevimin bir parçası olan Newton-Raphson yöntemini kullanan bir karekök hesaplayıcıydı. Bir sayının karekökünü yaklaştırmak için iteratif bir formül kullanır ve belirtilen doğruluk seviyesine ulaşana kadar her iterasyonla cevapya daha yaklaşır.
Uygulamam 25 veya 2 gibi sayılar için yeterince iyi çalışıyordu, ancak ajan çok küçük veya çok büyük sayılarla uğraşırken işlerin tam da doğru gitmediğini buldu. Sorun kısmen durdurma koşulunu nasıl tanımladığımdan kaynaklanıyordu. Girdiye bağlı olarak program, yeterince doğru bir sonuca ulaşmadan önce durabilir ya da gerekenden fazla iterasyon için çalışmaya devam edebilirdi.
Ajan ayrıca scriptimin sıfır ve negatif girdileri düzgün şekilde hesaba katmadığını belirtti. Girdi doğrulama getirdi, durdurma koşulunu iyileştirdi ve programın sonsuza kadar çalışmasını önlemek için maksimum iterasyon sınırı ekledi.
İlginç bulduğum bir şey, sonuçları Python’ın yerleşik math.sqrt() fonksiyonuyla karşılaştırması ve doğruluk farklarını açıklamasıydı. Newton-Raphson yöntemini hep uygulmam gereken matematiksel bir formül olarak görüyordum. Formülün kendisi doğru olsa bile, başlangıç tahmini, kayan nokta hassasiyeti ve durdurma koşullarının sonucu nasıl etkileyebileceği konusunda pek düşünmemiştim.
Keşke bunu üniversitede yapsaymışım
Aracıya yaptığı değişiklikleri sorgulamak ve bunları neden yaptığını anlamak, beklediğimden çok daha fazla şey öğrendim. Üniversitede böyle bir araca erişimim olsa gerçekte büyük bir fark yaratırdı. Ödevleri sadece tamamlayıp geçmek yerine, yazdığım kodu daha iyi anlamaya daha fazla zaman ayırabilirdim.
Bu Gelişmeyi Toplulukta Değerlendirin
Haber hakkındaki düşüncelerinizi, donanım deneyimlerinizi ve teknik sorularınızı topluluk üyeleriyle anlık olarak tartışın.
Bu gelişme hakkında düşüncelerinizi, donanım deneyimlerinizi veya sorularınızı Topluluk Forumumuzda paylaşın.
Foruma Katıl & Yanıtla ➔




Söz sizde.
Deneyiminizi, sorularınızı ve katkılarınızı paylaşın. E-posta adresiniz yayımlanmaz.