C++ Başlangıç Rehberi: Kaynaklar ve İpuçları
Giriş
Bu yazı, C++ öğrenmek isteyen öğrenciler ve geliştiriciler için bir giriş referansı olması amacıyla hazırlanmıştır. Yazılım veya mühendislik üzerine hiç bir ders almamış, geçmişte yazılım geliştirme ile ilgilenmemiş veya halihazırda yazılım geliştirme ile uğraşmayan yani programlamaya sıfırdan başlayacak kişiler için bu yazı, doğru bir C++‘a giriş seviye referansı olmayabilir.
NOT: Topluluktan gelen geri bildirimler dikkate alınarak bu yazı güncellenmeye devam edecektir.
Öğrenmek Hakkında
C++
öğrenmeye veya herhangi bir konuyu öğrenmeye başlarken en çok yaptığımız hatalardan biri,
en iyi kaynakları ararken onlarca kitap, blog ve öğretici video içerisinde kaybolmak. Dikkatimiz
diğer kaynaklara kayıyor ve bir türlü öğrenmeye başlayıp istikrarlı ve disiplinli şekilde devam
edemiyoruz. Hatta bu durumun bir adı da var: “Premature Optimization” (bkz. Erken Optimizasyon).
Bu erken optimizasyon problemi, sadece bir işe başlarken değil, yazılım geliştirme sürecinde de
başımıza gelmektedir.
Bir konuyu öğrenmeye başlarken en iyi eğitim materyallerini kullanma güdüsünü gayet iyi anlıyorum. Doğru kaynaklardan doğru bilgileri edinmek çok önemli. Fakat emin olun ki araştırırken bulduğunuz güncel kaynakların büyük bir çoğunluğu aslında öğrenmeye başlamak için gayet yeterli. O nedenle daha fazla kaynak araştırması yaparak, bir sürü eğitim materyali indirerek zaman kaybetmeye gerek yok. Bir kaynak seçip bir an önce başlamak en iyisi olacaktır. Bu yazıda da sizler için giriş seviye ve daha ileri seviyelere çıkabileceğiniz kaynakları seçtim.
C++ Dünyasına Giriş
C++ Nedir?
C++, nesne yönelimli, prosedürel, fonksiyonel, jenerik (generic programming) ve şablon metaprogramlamayı
(template metaprogramming) bir araya getiren genel amaçlı, çok paradigmalı ve çok yönlü bir programlama
dilidir. Dünyada en yaygın kullanılan dillerden biridir ve günümüz temel teknolojilerinin neredeyse
hepsi C++ ile geliştirilmektedir. Birkaç örnek: Google Arama Motoru, Unreal Engine, Unity, TensorFlow,
Chrome, Firefox, Safari, MySQL (ve neredeyse tüm ‘DB Engine’ler), Photoshop, MS Office, OpenJDK,
V8 JavaScript Engine, F-35 savaş uçağı… Neredeyse her endüstride C++‘ın ciddi kullanımı bulunmaktadır
ve C++ ile toplamda milyarlarca satırlık proje ve ürün geliştirilmiştir. O nedenle C++‘ın kullanımı
çok uzun yıllar devam edecek ve Modern C++
ile uzun yıllar daha yerine başka bir dilin geçmesi
söz konusu olmayacaktır.
Modern C++ Nedir?
“Modern C++” terimi, C++ programlama dilinin son sürümleri ve özellikleriyle ilişkilendirilir. C++ programlama dilinin daha güncel ve gelişmiş özelliklerini, standartlarını ve kullanım pratiklerini tanımlar. 2011 yılında yayınlanan C++11 ve sonraki versiyonlar Modern C++ olarak adlandırılmaktadır. Modern C++‘ın odak noktası, dilin daha güvenli, daha kolay ve daha verimli bir şekilde kullanılmasını sağlamak üzerinedir. Modern C++‘ın sağladığı önemli yenilikler: Daha iyi tip güvenliği (type safety), akıllı işaretçiler (smart pointers) ile daha kolay ve güvenli hafıza yönetimi, otomatik tip çıkarımı (auto type deduction), lambdalar, range-based for döngüleri, taşıma semantiği ve r-value referansları (move semantics and r-value references), yeni veri türleri, standart kütüphanesindeki yenilikler, paralel programlama ve sıfır yük soyutlama (zero-overhead abstraction) sağlayan daha gelişmiş özellikler.
C++ Öğrenmek İçin Kaynaklar
Kaynakları neye göre seçtim? Kaynakları seçerken 80/20 kuralına göre seçim yapmaya çalıştım (bkz. Pareto ilkesi). Bu ilke, sonuçların %80’inin, nedenlerin %20’sinden kaynaklandığını ifade eder. Bu ilkeyi uygulayarak, C++ öğrenmeye yeni başlayanlar için, dağılmadan odaklı bir şekilde ilerlemelerini sağlayacak ve ihtiyaç duydukları bilgi ve yeteneklerin %80’ini kapsayacak, en önemli %20’lik kaynağı sunmaya çalıştım.
C++ Eğitim Serisi
Ana kaynak olarak The Cherno YouTube kanalının C++
oynatma listesini tercih ettim çünkü direkt olarak
temelden başlayıp proje geliştirme seviyesine kadar anlatıyor ve daha ileri seviyeye çıkmanız için
öneriler sunuyor. Hiçbir videosunu atlamadan takip etmeniz iyi olacaktır. Geri dönüp tekrar tekrar
izleyebileceğiniz kaliteli bir eğitim serisi. C++ serisini bitirdiğinizde, kanaldaki diğer videolara ve
serilere kesinlikle göz atmanızı tavsiye ederim.
Oynatma listesi linki: youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb
Kitaplar - Best Practices
C++ dilinin doğru kullanımını ve dilin en iyi pratiklerini (best practices) bilmek çok önemlidir.
Bu nedenle sizler için birbirini tamamlayan iki kitap seçtim. Ana kaynakta ilerleyip dili daha
rahat kullanmaya başladığınızda bu kitapları okumaya başlayabilirsiniz. Bu kitaplar, C++ dilini
öğrenmek için değil, öğrendiğiniz C++ dilini doğru kullanabilmeniz içindir. İlk olarak Effective C++
kitabından okumaya başlamanızı, ardından Effective Modern C++
ile devam etmenizi tavsiye ederim.
Kitapları baştan sona okumasanız bile, en azından yazdığınız kodla ilgili bölümlere göz atmanız
çok faydalı olacaktır.
- Effective C++
- İçindeki bilgilerin bazıları güncel olmasa da hala günümüz Moden C++‘ı için geçerli olan ve “Effective Modern C++” kitabında bulunmayan çok önemli bilgileri içermektedir.
- Effective Modern C++
Yardımcı Kaynaklar
- C++ dili ve standart (stl) kütüphanesi için referans: cppreference.com
- Dilin sentaksı (syntax) ve standart kütüphanesi hakkında detaylı bilgi alabilmek için bu siteyi kullanabilirsiniz. Örneğin, standart kütüphanedeki
std::list
,std::array
gibi veri yapılarının işlevselliği hakkında detaylı bilgi edinebilir ve bunları nasıl kullanabileceğinizi daha detaylı öğrenebilirsiniz.
- Dilin sentaksı (syntax) ve standart kütüphanesi hakkında detaylı bilgi alabilmek için bu siteyi kullanabilirsiniz. Örneğin, standart kütüphanedeki
- C++ Weekly With Jason Turner YouTube Kanalı: youtube.com/@cppweekly
- C++ dilini öğrenmeye başladıktan ve biraz ilerledikten sonra “Neden? Nasıl?” gibi derin soruların cevaplarını bulabileceğiniz, dili detaylı bir şekilde anlamanıza yardımcı olacak çok değerli bir kaynak.
- Öğrendiğiniz veya merak ettiğiniz konu ile alakalı herhangi bir videoyu açıp izleyebilirsiniz.
Konferans Videoları:
Ana kaynakta ilerledikçe ve dili biraz daha rahat kullanmaya başladığınızda, aşağıdaki konferans
videolarını kesinlikle tavsiye ederim. Oynatma listeleri her zaman güncel olmayabilir. Bu nedenle,
merak ettiğiniz bir konu başlığını ilgili YouTube kanalında aratmanızı öneririm.
- youtube.com/@CppCon
- Temel seviye için “Back to Basics: …” başlıklı videoları tavsiye ederim. Daha ileri seviyeler için de her konuda videolar bulunmakta.
- youtube.com/@MeetingCPP
- youtube.com/@BoostCon
Idiomatic (Deyimsel) C++ Hakkında
Idiomatic C++
, C++ topluluğu tarafından tutarlı, kendini ifade eden (expressive) ve verimli kabul
edilen kod yazma yöntemlerini ifade eder. İyi bilinen ve etkili olduğu kanıtlanmış kuralları ve teknikleri
kullanmakla ilgilidir. Belirli durumlar için “doğru” kabul edilen C++ kodlama yöntemleri olarak düşünebilirsiniz
(insanların kendi dillerinde deyimleri kullanması gibi).
Özellikle Idiomatic C++ konusuna değiniyorum çünkü bugüne kadar karşılaştığım birçok kötü, kritik hatalar içeren, anlaşılması zor ve sürdürülebilir olmayan kodları incelediğimde, geliştiricilerin C++‘ı doğru kullanma konusunda bilgi eksiklikleri olduğunu fark ettim.
C++ dilini öğrenirken başlangıçta önemli olmayan ancak uygulama geliştirmeye başladıkça dikkat etmeniz gereken ve öğrenmenizi tavsiye ettiğim bazı temel Idiomatic C++ konularını sizler için seçtim. Ayrıca, aklınızda kalması için genel tanımlarını da ekledim. Bu konular hakkında daha detaylı bilgi ve anlatımlar için, sizlere yukarıda listelediğim YouTube ve kitap kaynaklarına başvurabilirsiniz.
RAII (Resource Acquisition Is Initialization) Kullanımı
Nesnelerin yaratılmasıyla kaynakların (bellekte dinamik veri yaratımı, dosya işlemleri, ağ bağlantıları vb.) edinilmesi ve nesnenin yok edilmesiyle (destructor) kaynakların serbest bırakılması prensibidir. Programın normal akışı sırasında kaynak üzerindeki işlem bitmeden, kaynak düzgünce kapatılmadan veya silinmeden akıştan çıkıyorsa (bug, exception, vb. kaynaklı), C++ tarafından ilgili nesnenin yok edilmesi (destructor çağrılması) garanti edilir. Bu, kaynak yönetimini otomatikleştirir ve bellek sızıntıları gibi sorunları önler.
Akıllı İşaretçi (Smart Pointers) Kullanımı
Dinamik veri yaratımı için manuel new
ve delete
işlemleri yapmak yerine std::unique_ptr
, std::shared_ptr
ve std::weak_ptr
gibi akıllı işaretçilerin kullanımı, otomatik bellek yönetimi sağlar ve bellek sızıntılarını
önlemeye yardımcı olur. Bir diğer en büyük özelliği ise, kaynak üzerinde kontrol sağlamamıza ve sahipliği
yönetmemize olanak sağlar. Debug sırasındaki vakit kaybını önemli ölçüde azaltır.
Doğru “const” (Const Correctness) Kullanımı
“Doğru const kullanımı”, ya da “const correctness”, C++ programlamada, değişkenlerin, fonksiyon parametrelerinin,
fonksiyon dönüş değerlerinin ve sınıf üyelerinin değiştirilemeyeceğini belirtmek için const
anahtar kelimesinin
kullanılmasını ifade eder. Bu yaklaşım, programın daha güvenilir, anlaşılabilir ve bakımı kolay olmasını sağlar.
Debug sırasındaki vakit kaybını önemli ölçüde azaltır. Genel kabul, const olabilecek her şeyin const
işaretlenmesidir.
STL (Standard Template Library) Kullanımı
Standart kütüphanedeki hazır veri yapılarının ve algoritmaların etkin ve doğru kullanımı, kodunuzun
okunurluluğunu çok artırır ve olası hataların önüne geçer. Örneğin bir liste içerisinde spesifik bir
elemanı arıyorsanız, for döngüsü
kurup if
ile kontrol etmek yerine, std::find_if(...
kullanabilirsiniz.
Aynı şekilde yine bir nesne listesi için, belirttiğiniz koşulu/değeri sağlayan herhangi bir nesne var mı
diye kontrol etmek için for döngüsü
kurup if
ile kontrol etmek yerine, std::any_of(...
kullanabilirsiniz.
Böylece kodunuzu okuyan kişi ne yapmak istediğinizi daha kolay anlar, sizin hata yapma olasılığınız da azaltır.
Genel Tavsiyelerim
C++‘ı sadece nesne yönelimli bir şekilde yazmaya çalışmayın. Çok yönlü bir dil olduğundan, dilde ilerledikçe fonksiyonel ve jenerik programlama gibi özelliklerin uygun yerlerde ne kadar kullanışlı olduğunu, işinizi nasıl kolaylaştırdığını, daha hızlı ve güvenli kod yazmanıza nasıl yardımcı olduğunu fark edeceksiniz.
Yazılım geliştirmede en etkili öğrenme yöntemi, uygulayarak, hata yaparak ve hataları düzelterek öğrenmektir. Bu nedenle, en doğru ve en optimize yöntemi araştırmak için vakit kaybetmek yerine, bir kaynak seçip IDE’yi açarak kod yazmaya başlamak en verimli yoldur. Kod yazarak deneyim kazanacaksınız; tecrübeniz ve bilginiz olgunlaştıkça ufkunuz genişleyecek, bilgi karmaşası içinde işinize yarayan doğru bilgiyi daha kolay ayırt edebilecek ve daha iyi çözümlere ulaşmaya başlayacaksınız.
C++ dili bir araçtır. Programlama dili öğrenmek, alfabeyi ve kelimeleri öğrenmeye benzer. Ancak, roman yazabilmek için daha fazlasına ihtiyaç vardır; yani, sadece C++ geliştirmeyi öğrenmek tek başına yeterli olmaz. Yazılım geliştirmek, bütüncül bir disiplindir. Bu nedenle, algoritma, veri yapıları, Nesne Yönelimli Programlama (OOP), yazılım mühendisliği, Git (sürüm kontrol sistemi), hata ayıklama (debugging), test etme, sürekli entegrasyon (continuous integration) ve takım çalışması gibi konularda da kendinizi geliştirmeye çalışmalısınız. Bu temel becerileri kazandıkça, C++ veya herhangi bir dil çok daha anlamlı hale gelecektir.
Sormak, danışmak istediğiniz şeyler varsa bana ulaşabilirsiniz: iletişim