C++'ı Öğrenmek (Bjarne Stroustrup)

thecrown

New member
Bir programlama dilinin tümünü birden öğrenip sonra da kullanmaya çalışmak profesyonel programcılar için bile çok zordur. Programlama dilleri, getirdikleri olanaklar küçük örneklerle denenerek parça parça öğrenilir. Onun için, bir dili her zaman için bir dizi altkümesinde ustalaşarak öğreniriz. Doğru soru, "Önce bir altkümesini mi öğrenmeliyim?"den çok, "Önce hangi altkümesini öğrenmeliyim?"dir.

"C++'ın önce hangi altkümesini öğrenmeliyim?" sorusunun geleneksel bir yanıtı, "C++'ın C altkümesini"dir. Benim kanımca, bu iyi bir seçim değil. Önce C'ye yönelmek, beraberinde alt düzey ayrıntılara fazla erkenden odaklanmayı getirir. Ayrıca programlama biçem ve tasarım konularını da öğrenciyi bir sürü teknik güçlükle yüz yüze bıraktığı için bulandırır. İkinci ve üçüncü bölümlerdeki örnekler bu noktayı açıklıyor. C++'ın kitaplık desteğinin, gösteriminin, ve tür denetiminin daha iyi olması, önce C'ye yönelmememiz gerektiği sonucunu doğurur. Ancak, benim önerimin "önce saf nesneye dayalı programlama" olmadığına da dikkat edin. Bence bu da başka bir uç nokta olur.

Bir dili öğrenme şekli, programlamaya yeni başlayanlara etkin programlama tekniklerini de öğretecek şekilde olmalıdır. C++'a yeni başlayan deneyimli programcılar için ise, etkin programlama tekniklerinin C++'ta nasıl kullanıldıklarına ve programcının ilk defa gördüğü tekniklerin anlatılmalarına odaklanmalıdır. Deneyimli programcıların karşılaştıkları en büyük engel, başka bir dilde etkin olarak kullandıklarını C++'ta dile getirmeye çalışmalarıdır. Hem yeni başlayanlar hem de deneyimliler için üzerinde durulacaklar, kavramlar ve teknikler olmalıdır. C++'ın desteklediği programlama tasarım ve tekniklerini anlamada, C++'ın sözdizimi ve anlamsal ayrıntıları ikinci derecede önemlidir.

Öğretmenin en iyi yolu, iyi seçilmiş somut örneklerden başlayıp daha genel ve daha soyut örneklere geçmektir. Bu hem çocukların öğrenme şekli, hem de bizim yeni düşünceleri kavrama şeklimizdir. Dilin olanakları her zaman için kullanıldıkları kapsamda sunulmalıdır. Yoksa programcının ilgisi, sistem üretmek yerine anlaşılması güç teknik ayrıntılara yönelir. Dilin teknik ayrıntılarıyla ilgilenmek eğlencelidir ama etkin bir öğretim biçimi değildir.

Öte yandan, programlamayı salt çözümleme ve tasarıma yardımcı olarak görmek de işe yaramaz. Kod üzerine yapılacak görüşmeleri üst düzey konuların sunulmasından sonraya bırakma hatasının bedeli, defalarca çok pahalıya ödenmiştir. Bu yaklaşım, insanları programlamadan uzaklaştırmaya ve üretim düzeyi niteliklerinde kod yazmanın getirdiği güçlükleri küçümsemeye yöneltmektedir.

"Önce tasarım" yaklaşımının tam karşıtı da, bir C++ gerçeklemesini alıp hemen kodlamaya geçmektir. Bir sorunla karşılaşıldığında tıklayarak yardım ekranlarında neler bulunacağına bakılır. Buradaki yaklaşımdaki sorun, özelliklerin ve olanakların, birbirlerinden ayrı olarak anlaşılmalarına dayalı olmasıdır. Genel kavramlar ve teknikler bu şekilde öğrenilemezler. Bu yaklaşımın getirdiği ek bir sorun, C++ sözdizimi ve kitaplıkları kullansalar bile, deneyimli programcıları daha önceden bildikleri bir dilde düşünmeye yönlendirmesidir. Sonuçta yeni başlayanların kodu, program örneklerinden kopyalanmış satırların bir sürü 'if-else' arasına serpiştirilmesinden oluşmaktadır. Yeni başlayanlar kopyalanan satırlardaki kodun amacını ve nasıl işe yaradığını çoğu zaman anlayamazlar. Kişi ne kadar akıllı olursa olsun durum değişmez. Bu "kurcalama yöntemi" aslında iyi bir öğretim ve iyi bir kitapla birlikte olduğunda çok yararlıdır ama tek başına kullanıldığında felakete davettir.

Ben özetle şöyle bir yöntem öneriyorum

somuttan soyuta yönelmeli

dilin özelliklerini, destekledikleri programlama ve tasarım teknikleri kapsamında sunmalı

kodu, kuruldukları alt düzey ayrıntılara girmeden üst düzey kitaplıklara dayalı olarak sunmalı

gerçek programlara taşınamayacak tekniklerden kaçınmalı

ayrıntılara girmeden önce, benimsenmiş ve kullanışlı teknikler sunmalı; ve

dilin özelliklerinden çok, kavramlara ve tekniklere odaklanmalı.

Hayır, bu yöntemin yeni veya değişik olduğunu düşünmüyorum. Herkesin akla yakın bulacağını düşünüyorum. Ne yazık ki bu akla yakınlık; C'nin C++'tan önce öğrenilmesinin doğru olup olmadığı, nesneye dayalı programlamanın tam olarak anlaşılması için Smalltalk'un gerekip gerekmediği, programlamanın saf nesneye dayalı olarak mı (her ne demekse) öğretilmesinin iyi olduğu, ve kod yazmaya geçmeden önce yazılım geliştirme sürecinin iyice anlaşılmasının ne kadar önemli olduğu gibi tartışmalar arasında yok olup gitmektedir.

Neyse ki benim koyduğum ölçütler doğrultusunda biraz deneyimimiz var. Benim en sevdiğim yöntem; dilin değişkenler, bildiriler, döngüler gibi temel kavramlarını iyi bir kitaplık eşliğinde öğretmektir. Öğrencilerin ilgilerini C dizgileri gibi karmaşıklıklar yerine programlamaya yönlendirmek için kitaplıklar gerekir. Ben standart C++ kitaplıklarını veya bir altkümelerini öneririm. Bu yöntem, Amerikan liselerinde 'bilgisayar bölümlerine hazırlama' derslerinde de kullanılmaktadır [Horwitz, 1999]. O yöntemin deneyimli programcılara yönelen daha geliştirilmiş bir şekli de başarıyla uygulanmıştır [Koenig, 1998].

Bu yöntemlerin bir zayıflığı, görsel programlamaya hemen girmemeleridir. Bunu karşılamanın bir yolu, arabirimi kolay olan görsel bir kitaplığı tanıtmaktır. Bu arabirim, öğrencilere C++ dersinin ikinci gününde verilebilecek kadar kolay olmalıdır. Ne yazık ki bu şartı sağlayan yaygın bir C++ görsel kitaplığı yok.

Baştaki bu kitaplıklara dayalı öğretimden sonra, öğrencilerin ilgileri doğrultusunda çok değişik konulara geçilebilir. Bir noktada, C++'ın düzensiz ve alt düzey bazı özelliklerine de değinmek gerekecektir. İşaretçi, tür dönüşümü, ve bellek ayırma gibi özellikleri anlatmanın bir yolu, temelleri öğretirken kullanılan sınıfların nasıl gerçekleştirildiklerini incelemektir. Örneğin 'string', 'vector', 'list' gibi sınıflar, C++'ın ilk derslerde gözardı edilen C altkümesini anlatmak için çok uygundur.

'vector' ve 'string' gibi değişken sayıda öğe barındıran sınıfları gerçeklerken, bellek yönetimi ve işaretçiler kullanılması gerekir. Sınıf gerçekleme tanıtılırken, önce gerçeklenmelerinde bu kavramların kullanılmalarına gerek olmayan 'Tarih', 'Nokta', ve 'SanalSayi' gibi sınıflar tanıtılabilir.

Ben soyut sınıfları ve sınıf hiyerarşilerini tanıtmayı genelde kapların ve kap gerçeklemenin anlatılmasından sonraya bırakıyorum ama bu konuda başka seçenekler de var. Konuların verildiği sıra, kullanılan kitaplıklara göre değişir. Örneğin sınıf hiyerarşilerine dayalı görsel kitaplıklar kullanan bir kurs, çok şekilliliği ve sınıf türetmeyi daha önce işlemelidir.

Son olarak, lütfen C++ dilini ve onun tasarım ve programlama tekniklerini anlatmanın birden fazla yolu olduğunu unutmayın. Öğrencilerin olduğu kadar öğretmenlerin ve ders kitapları yazarlarının da hedefleri ve çıkış noktaları farklıdır.


C++ ÖĞRENMEYE BAŞLAYAN ARKADAŞLARA YARARLI OLABİLİR.
BUNDAN SONRA C++ DİLİ ÜZERİNE PAYLALAŞIMLARIM DEVAM EDECEK.HER TÜRLÜ SORUNUZ İÇİN PM ATABİLİRSİNİZ.
 

HTML

Üst