Modern C++’ı Öğrenme ve Öğretme

Herkese merhaba arkadaşlar, yeni bir yazı ile tekrar birlikteyiz. Bu yazıda başlıktan da anlaşılacağı üzere Modern C++’ı nasıl öğrenebiliriz ve nasıl öğretebiliriz konularına, bir video’yu temel alarak, göz atacağız. Yazımın kaynağı olan bu video, Bjarne Stroustrup’un 2017 de gerçekleştirmiş olduğu açılış konuşması.

C++ kullanarak yazılım geliştiren, daha da önemlisi, öğrenmeyi planlayan her yazılımcının bu videoyu bir kere olsun izlemesinde fayda var. Eğer çok zamanım yok ya da hızlıca bir özet geçer misin sevgili yazılımperver dostum derseniz, o zaman doğru yerdesiniz. Burada video da geçen önemli gördüğüm hususları aşağıda, kendi görüşlerim ile birlikte tamamen subjektif olarak özetleyeceğim. Her bir sekme bir birinden bağımsız olarak değerlendirilebilir. Genel olarak videodaki akışı takip etmeye çalıştım. Merak ettiğiniz kısımların detaylarını konuşma içerisinde bulabilirsiniz:

George Bernard Shaw

  • Konuşmanın açılışı George Bernard Shaw’ın bir sözü ile başlıyor:
    • The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man.
    • Konuşmanın özü de aslında bu söz ile ilintili: mevcut durumda C++ için ne işe yaramıyor ve bunu nasıl düzeltilebilir?
      • Bunu, özellikle, büyük bir kod içerisinde gezinirken gördüğünüz hatalarda fark ediyorsunuz, birileri bu hususları anlatırken bir yerleri atlamışlar,
      • Bir çok kod içerisinde halen temel hataların yapıldığı ve bunun oldukça fazla olduğu görülüyor,
    • Aynı zamanda benim gibi bu konularda yazan yazarlar için de güzel tavsiyeler barındırıyor. Nelere dikkat etmeliyiz? Nasıl ifade etmeliyiz?
  • Özellikle öğreticiler için bir kaç önemli soru irdeleniyor:
    • Ne öğretiyoruz ve neden? Kime öğretiyoruz ve nasıl?
    • Bu esnada kendimizi nasıl geliştiriyoruz/geliştirmeliyiz?

two men using computer and laptop

  • Anlattığınız konuları nasıl seçtiğiniz ve amacınızın ne olduğu çok önemli. Burada güzel bir analoji yapıyor kendisi: “Eğer öğrettiğiniz şey çoklu seçenekli bir test sorusuna uygun ise bu kötüdür, bunu her türlü öğrenebilir ve bu kişiye çok fazla bir katkıda bulunmayabilir. İlginç ve önemli olan konular genelde ölçülebilir olmayanlardır (hani o eskiden kompozisyon ödevleri ya da benzeri sorular yok muydu onun tadında)”,
  • Özellikle C++ anlatıyor/öğretiyor iseniz, aşağıdaki hususlar önemli:
    • Geçmişleri ne? Ne biliyorlar? Eğitim ve tecrübe seviyeleri nedir?
    • Öğrenci mi? Yoksa endüstri de bir çalışan mı? Profesyonel ya da amatör geliştirici mi?
    • Farklı programlama dili tecrübeleri var mı?
    • Neler onlar için faydalı olacak?
    • Kısacası, hedef kitlenizden haberdar olup, aktaracağınız içeriği buna göre düzenlemeniz gerekiyor. Programlama bilmeyen bir bilgisayar mühendisi ile 5 yıllık Java programcısına vereceğiniz C++ eğitimi aynı olmamalı. Burada konuşmacı tabi özellikle öğreticileri göz önünde bulunduruyor. Ama bu C++ öğrenecekler, için de geçerli. Örneğin, daha önce hiç programlama yaptık mı yapmadık mı? Buna göre bakacağımız kaynakları göz önünde bulundurmamız lazım, C++’ın yeni bir kabiliyetini öğreneceğimiz zaman, amacımız nedir? Nerede kullanacağız? Daha önceki tecrübemiz nedir?
    • Ayrıca, C++’nın sağlayabileceği, özellikle performans anlamında, getirileri ifade etmemiz gerekiyor. Yani, evet, Python kullanarak bir biyolog gerekli olan bir işi yaptırabilir. Ama bu işlem 6 gün sürüyor ve bu C++ gibi bir dil ile dakikalara mertebesine düşebiliyor ise, bundan haberdar olmalı 🙂
  • C++, C’ye yapılan bir eklenti değildir ya da C’yi Java yapma çabası da ya da bir yığın kabiliyetin bir araya getirilmesi de değildir. Sonuçta dilin babası bunu diyor. Dağılın 🙂
  • Öğretici, mentör veya danışman olan için güzel bir öneride bulunuyor ki aslında bu her konu için geçerli, o da:
    • Amaç ve hedeflerinizi somut ve açık bir şekilde ifade edin (Ör. Hedefiniz C++’ın bir kabiliyetini derinlemesine öğretmek mi? Ya da dili öğretmek mi? C++ kullanacak kişiler gömülü sistemler için mi yoksa oyun programlama için mi bunu öğreniyorlar? Buna göre içeriğinizi ve anlatacaklarınızı derlemenizde fayda var),
    • Her şeyi anlatmaya çalışmayın, anlatamazsınız,
    • Amacınızı, anlatmayı planladığını materyali yazın ve bunun ile ilgili geri bildirim almaya çalışın.

Programming Codes Screengrab

  • Nihayetinde C++ öğretilmesinin arkasında ne yatıyor? Burada aşağıdaki gibi bir çok sebep sıralanıyor ve bunlardan özellikle 4 ve 6 hedeflerine Bjarne özellikle odaklandığını ifade ediyor. Nedir bunlar:
    1. Öğrencileri programlama konusunda gaza getirme,
    2. Bilgisayar bilimleri dersine kayıt olana öğrencilerin sayısını arttırma (demek ki rekabet var 🙂
    3. Basit programlar yazmalarını öğretmek,
    4. Yazılım geliştirme kariyerleri için temel bir alt yapı sağlamak (*),
    5. Aslında çok da bilgisayar bilimleri dersi olmaması hasebi ile hızlıca dersi verip çok zaman harcamadan bitirmek,
    6. Yazılım geliştirme içerecek herhangi bir kariyer için temel bir alt yapı sağlamak (*).
  • Anlatırken sadece dil özelliklerine odaklanmayın ve her özelliğini anlatacağım diye uğraşmayın. Özellikle, programlama dilinin, önemli olan kabiliyetlerine odaklanın (yani unsigned int’in int’e dönüştürülmesindense, daha okunabilir, idame ettirilebilir kodlar yazarıma, bu anlamda katkıda bulunabilecek özelliklere).
  • Burada çeşitli kütüphanelerden faydalanılması gerektiğinden bahsediyor, özellikle STL. Konteyner ve benzeri yapılara da değinmek oldukça önemli ve bunları mümkün olduğunca kullanmak lazım,
  • Çok zeki davranmayın ve insanların temelleri anladığından emin olun, basitleştirin ve o kabiliyetin kullanım amacını verin ve muhakkak bunu gerekçelendirip ifade edin (bu sizin için iyidir kullanın yeterli değil),
  • Sadece bir derleyici ve ders kitabına bağımlı kalmayın. IDE’lerden, hata ayıklayıcılardan, konfigürasyon yönetim araçlarından, test araçlarından, çevrim içi derleyicilerden (bunlardan birini siteme ekleyeceğim en kısa sürede;), statik kod analizlerinden de bahsedin,
  • Programlama dersi, uygulama tabanlı bir derstir ve muhakkak ellerinizi kirletmeniz gerekiyor. Daha önceki yazılarımda da ifade ettiğim gibi iyi bir programcı olmak için bir çok kod incelemeniz gerekiyor, benzer şekilde iyi tasarımlar yapmak için de çeşitli tasarımları incelemelisiniz,
  • C++’ın grafiksel kullanıcı arayüzleri, WEB, veri tabanı ve benzeri servislere ilişkin kabiliyetlerine de yer vermelisiniz (galiba ben de vermeliyim). Burada özellikle gerçek hayattan örnekler ile öğrencileri gaza getirmek iyi bir yöntem olabilir (ör. Chrome nasıl çalışır, vs),
  • Ayrıca geliştirilen C++ uygulamaların, donanımlar ile ilişkilerinden de bahsetmekte fayda var. Normalde bunlar göz ardı edilebiliyor ama aslında önemli noktalardan birisi bu konu oluyor,
  • Programlamanın da aslında fotoğrafçılığa benzediğini ifade ediyor. Şöyle ki:
    • Sonuçlar her ikisinde de kullandığınız ekipmana bağlı,
    • Sonuçlar her ikisinde de kullanıcıya bağlı,
    • Bir çok bileşeni var,
    • Kullanıcılar farklı ve her birinin farklı yaklaşım ve kabiliyetleri oluyor,
    • Benzer şekilde ihtiyaçları da farklı.
  •  Modern C++ anlatılırken aşağıdaki konulara değinmekte fayda var:
    • Statik tip emniyeti (kısaca bir değişken tanımladı iseniz muhakkak bunun ile ilintili bir tip olmalı),
      • Arayüzler iyi tanımlanmalı
    • Kaynakların emniyeti
    • Soyutlama
    • Sarmalama (“Encapsulation”), değişmezler (“Invariants”)
      • Sınıflar
    • Jenerik programlama
      • Templates
  • Modern C++’ı aşağıdaki gibi özetliyor:
    • ISO C++ ı kullanan en iyi pratiklerin kullanılması,
    • Tip ve kaynakların emniyetli bir şekilde yönetilmesi.
  • Örnek kodlar çok önemli ve öğretmede anahtar konumunda. Açıklamalar muhakkak kod ile beslenmeli ve gerekçeler ifade edilmeli. Burada açıklama/tanımlamalar ile örnek kodlar birbirlerini tamamlar şekildeler. Biri diğerinden bağımsız ele alınması sıkıntı yaratabilir,
  • Burada dersin içerik ve metnine ilişkin olarak K&R yaklaşımının kullanılabileceğinden bahsediyor. Örneğin şu sayfadaki gibi,
  • Daha sonra yeni C++ standartları ile gelen ve benim de yazılarımda anlattığım “Ranged Loop”, “Literals” gibi yapıların anlaşılabilirliği ve kodun kalitesini arttırdığından bahsediyor. Buna benzer bazı kurallara da değiniyor,
  • Fikirlerinizi olabildiğince kod içerisinde ifade etmeye çalışın. Kod ile anlatılan bir şeyi bir daha yorum olarak yazmayın, onun yerine amacı veya ilk bakışta anlaşılması zor noktaları belirtin ve öz tutun.

a teacher takes a hand opens a mind and touches a heart ile ilgili görsel sonucu

Evet arkadaşlar, konuşmadaki önemli noktaları özetlemeye çalıştım. Bjarne’nin konuşmasını dinledikten sonra,  her ne kadar direkt olarak konuşmada ifade etmese de şöyle bir gerçek var ki “Bilmek ayrı bir şey öğretmek veya anlatmak apayrı bir şey.” Evet, Bjarne’nin sunumları öyle çok can canlı olmayabilir (ki bence canlı :), 4- 5 sene önceki sunumlarına göre yine de oldukça canlı 🙂 ama muhteviyat, anlatım ve yaklaşım gerçekten harika. Bu konuşma da o örneklerden birisi. Sonuçta iletişimin de temel amacı ve başarı kriteri de, sizin anlatmak istediğiniz mesajın, muhatabınız tarafından istediğiniz şekilde alınıp/alınmadığı ile ölçülebilir. Bu açıdan da bu konuşma bence oldukça akıcı ve güzel.

Bir sonraki yazımda görüşmek üzere,

Yazılımperver kaçar 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.