Bilgisayar Programcılığı 2 nedir?

Bilgisayar Programcılığı 2: Neler Beklemelisin?

Bilgisayar Programcılığı 1'i geride bıraktıysan, artık işler biraz daha derinleşiyor. Bu ikinci aşama, temel kavramların üzerine inşa edilen, daha karmaşık yapıları ve algoritmaları anlamanı sağlayacak. Temelde, bilgisayarın bir problemi nasıl çözdüğünü ve bunu nasıl daha verimli hale getirebileceğini öğrenmeye başlıyorsun.

Veri Yapıları ve Algoritmalar: Programlamanın İskeleti

Bilgisayar Programcılığı 2'nin en temel taşlarından biri veri yapılarıdır. Veri yapıları, bilgiyi bilgisayar hafızasında düzenleme ve saklama biçimleridir. Doğru veri yapısını seçmek, yazdığın programın performansını inanılmaz derecede etkileyebilir. Deneyimlerime göre, başlangıçta en çok karşına çıkacaklar şunlar:

  • Diziler (Arrays): En temel yapı. Sıralı bir veri koleksiyonu. Örneğin, bir öğrenci listesi tutmak için diziler kullanabilirsin. 100 öğrenci için 100 elemanlı bir dizi tanımlamak gibi.
  • Bağlı Listeler (Linked Lists): Verileri birbirine bağlayan "düğüm"lerden oluşur. Bellekteki yerleri ardışık olmak zorunda değil. Ekleme/çıkarma işlemleri dizilere göre daha esnektir, özellikle bellek yönetimi açısından. Bir müzik çalma listesini düşün, şarkıları ekleyip çıkarırken bağlı listeler işe yarayabilir.
  • Yığınlar (Stacks): Son giren ilk çıkar (LIFO - Last In, First Out) prensibiyle çalışır. Tarayıcının geçmiş düğmesi gibi düşünebilirsin, en son gittiğin sayfa en önce çıkar.
  • Kuyruklar (Queues): İlk giren ilk çıkar (FIFO - First In, First Out) prensibiyle çalışır. Bir süpermarket kasası gibi, sıraya giren ilk kişi ilk hizmet alır.
  • Ağaçlar (Trees): Hiyerarşik veri yapısı. Bir dosya sistemi veya bir şirket organizasyon şeması gibi düşünebilirsin. En yaygın olanı ikili arama ağaçlarıdır (Binary Search Trees), verileri hızlı aramak için kullanılır.
  • Grafikler (Graphs): Düğümler ve bu düğümleri birbirine bağlayan kenarlardan oluşur. Sosyal ağlar, harita rotaları veya ağ bağlantıları gibi karmaşık ilişkileri modellemek için kullanılır. Örneğin, Facebook'ta arkadaşlık ilişkilerini bir grafik olarak temsil edebilirsin.

Algoritmalar ise bu veri yapıları üzerinde işlem yapan adımlar dizisidir. Bir problemi çözmek için izlenen yol haritasıdır. Arama algoritmaları (linear search, binary search) veya sıralama algoritmaları (bubble sort, merge sort, quicksort) bu dersin ana konularından olacaktır. Örneğin, 1000 elemanlı bir dizide belirli bir sayıyı bulmak için binary search, linear search'ten çok daha hızlıdır. Binary search'te eleman sayısı yarı yarıya azalarak aranır, bu da logaritmik (O(log n)) bir zaman karmaşıklığı anlamına gelirken, linear search doğrusal (O(n)) karmaşıklığa sahiptir.

Nesne Tabanlı Programlama (Object-Oriented Programming - OOP): Kodun Yeniden Şekillenmesi

Eğer ilk dönem nesneye giriş yaptıysan, şimdi OOP'nin derinliklerine dalacaksın. OOP, programları gerçek dünya nesneleri gibi modellememizi sağlar. Bu, kodun daha anlaşılır, yönetilebilir ve yeniden kullanılabilir olmasını sağlar. Temel kavramlar şunlardır:

  • Sınıflar (Classes): Nesnelerin şablonlarıdır. Bir "Araba" sınıfı düşünebilirsin. Bu sınıfın "renk", "model", "hız" gibi özellikleri (properties) ve "hızlan", "yavaşla", "korna çal" gibi metotları (methods) olabilir.
  • Nesneler (Objects): Sınıflardan türetilen somut örneklerdir. "Kırmızı bir Ferrari", "mavi bir Ford Focus" gibi. Her biri "Araba" sınıfının birer örneğidir.
  • Kapsülleme (Encapsulation): Veriyi ve o veri üzerinde çalışan metotları bir araya getirmektir. Veriyi doğrudan erişimden koruyarak, sınıf dışından sadece belirli metotlar aracılığıyla erişilmesini sağlar. Bu, verinin güvenliğini artırır.
  • Kalıtım (Inheritance): Bir sınıfın başka bir sınıftan özelliklerini ve metotlarını miras almasıdır. "Araba" sınıfından türeyen "SporAraba" sınıfı, "Araba"nın tüm özelliklerine sahip olurken, kendi özel özelliklerini de ekleyebilir (örneğin, "spoiler ayarı"). Bu, kod tekrarını önler.
  • Çok Biçimlilik (Polymorphism): Aynı metot isminin farklı sınıflarda farklı şekillerde davranabilmesidir. Örneğin, bir "SesÇıkar" metodu hem bir "Kedi" nesnesinde "Miyav" hem de bir "Köpek" nesnesinde "Hav" olarak davranabilir.

Deneyimlerime göre, OOP mantığını oturtmak biraz zaman alabilir ama bir kere kavradığında kod yazma şeklin tamamen değişir. Özellikle büyük projelerde veya ekip çalışmasında OOP prensiplerine sıkı sıkıya bağlı kalmak çok önemlidir.

Bellek Yönetimi ve Performans Optimizasyonu: Hızın Sırları

Bilgisayar Programcılığı 2, sadece kod yazmak değil, aynı zamanda o kodun ne kadar verimli çalıştığını anlamak demektir. Bu noktada bellek yönetimi ve performans optimizasyonu devreye girer. Programlarının belleği nasıl kullandığını, hangi işlemlerin ne kadar zaman aldığını anlamak sana büyük avantaj sağlar.

  • Zaman Karmaşıklığı (Time Complexity): Bir algoritmanın girdi boyutuna bağlı olarak ne kadar sürede çalıştığını gösterir. O(n), O(n^2), O(log n) gibi gösterimlerle ifade edilir. Örneğin, 1000 elemanlı bir listede belirli bir elemanı ararken, O(n) karmaşıklığına sahip bir algoritmada ortalama 500, en kötü durumda 1000 adım gerekebilirken, O(log n) karmaşıklığına sahip bir algoritmada yaklaşık 10 adım yeterli olur.
  • Bellek Karmaşıklığı (Space Complexity): Bir algoritmanın çalışması için ihtiyaç duyduğu ek bellek miktarını gösterir.
  • Hafif Veri Yapıları ve Algoritmalar: Küçük veri tipleri kullanmak, gereksiz bellek tahsisinden kaçınmak, döngüleri optimize etmek gibi küçük ama etkili dokunuşlar programının hızını ciddi şekilde artırabilir.

Unutma, iyi bir programcı sadece çalışan kodu yazan değil, aynı zamanda verimli çalışan kodu yazan kişidir. Bu ders, sana bu beceriyi kazandırmak için var.

Pratik Öneriler

  • Bol Bol Pratik Yap: Öğrendiğin veri yapıları ve algoritmaları kendi küçük projelerinde uygula. HackerRank, LeetCode gibi platformlarda pratik yapmak algoritma düşünme yeteneğini geliştirir.
  • Kodunu Gözden Geçir: Yazdığın kodu tekrar oku, daha iyi bir yolu olup olmadığını sorgula. Hata ayıklama (debugging) en iyi öğrenme yollarından biridir.
  • Farklı Kaynaklardan Yararlan: Sadece ders kitabıyla yetinme. Online kurslar, YouTube videoları ve blog yazıları bu konuları farklı açılardan anlamana yardımcı olacaktır.
  • Gruplar Halinde Çalış: Anlamadığın yerleri arkadaşlarınla tartışmak, farklı bakış açıları kazanmanı sağlar.