Temelleri ile mücadele eden öğrencilere C ++ 'da ders vermek [kapalı]


26

İlk programlama dilinin temellerini öğrenmekte ciddi zorluk çeken birkaç öğrenciye ders veriyorum: C ++. İlk CS dersini bırakan veya bırakan birçok mükemmel ve zeki öğrenciyi tanıdım. Özel ders verdiğim herkes, sınıftaki deneyimine benzer bir ifade veriyor: eğitmen çok hızlı ilerliyor, derslerde hiçbir şey bir anlam ifade etmiyor. Bu CS sınıfından önce, bu mücadele eden öğrencilerin çoğu, bilgisayar işlemcilerinden, kelime işlemcilerden, web tarayıcılarından ya da başka bir eğlence biçiminden başka bir şey olarak ilgi duymadılar. Bilgisayar çalışan bir kara kutu, peki neden onunla karışık?

En iyi tahminim, bilgisayar bilimlerindeki soyutlamaları tanıdık kavramlarla ilişkilendirmekte zorlandıkları. Yani, bu öğrenci matematik, biyoloji veya fizik öğrenmeyi biliyor olabilir, ancak bu teknikler programlama söz konusu olduğunda işe yaramaz.

Bir önerisi veya önerisi olan var mı? Yardım ettiğim öğrenciler bu dersten başarısız olmayı hak etmiyor. Öğretim elemanının bu öğrencilerin öğrenme stilini dikkate almadığı açıktır. Yani, eğitmen öğrencilerini değil, başarısız oluyor.


2
Yorum yapanlar : Eğer bir cevabınız varsa cevap olarak bırakın: Yorum olarak bırakmayın. Cevabınız zaten eklenmişse, oy verin. Bu sorunun konusunu başkalarıyla görüşmek istiyorsanız sohbeti kullanın .

1
Değil mi? Tecrübelerime göre programlayan ve

Yanıtlar:


42

Her aceminin pratik olarak mücadele ettiği birkaç şey var. Öğrencilerin kod yazmayı öğrenebilmeleri için önce kodu nasıl okuyacaklarını bilmeleri gerekir .

  • Zorunlu dillerin sıralı yapısı. İnsanlar, fonksiyonların sıralı bir şekilde, bir tarifte olduğu gibi, her seferinde bir öğe olarak yapıldığını anlamada zorluk çekiyorlar. Bunun üstesinden gelmenin bir yolu, bir hata ayıklayıcı ile çalışan bazı kodları göstermektir.
  • =C tarzı dillerde atama operatörü ( ) son derece yanıltıcıdır. Bunu çok dikkatli açıklamaya gerek a = 5vasıta "değişkenine 5 atama a, değil 'a' 5 eşittir.
  • Yeni başlayanlar için, işlevleri diğer işlevlerin atlayabileceği yapısal kod blokları olarak tanımlamak güvenlidir. Ayrıca, yeni başlayanlar C ++ 'da, fonksiyon argümanlarının ismiyle değil, sırasına göre tanımlandığını anlamakta zorluk çeker.
  • Zorunlu programlama dillerinin çoğu bazı bildirimsel bileşenlere ve bazı prosedürel bileşenlere sahiptir ve C ++ istisna değildir. Öğrencinin, kodun bazı bölümlerinin programın yapısını tanımladığından ve diğer bölümlerin (işlevlerin) programın ne yapması gerektiğini tanımladığından emin olun.
  • Hata ayıklayıcı ile bir programa adım atmak son derece önemli ve sıklıkla ihmal edilen bir öğretim aracıdır .
  • İfadelerin türleri vardır . 3+3bir tamsayıdır, 3.5 + 3bir çifttir, "3" + "3"(C # da) bir dizedir, x == 5 * 3 + 25bir booledir (veya C ++ da bir tamsayıdır). Öğrencinin bu fikirde tamamen rahat olmasını sağlamak için çok zaman harcayın .
  • Değişken kapsam, yeni başlayanların her zaman kafasını karıştıran bir şeydir. Öğrenciye, kapsamın nasıl çalıştığını açıklayın ve xbir kapsamda xtanımlanan bir tanımın başka bir kapsamda tanımlanandan farklı olduğunu bildiklerinden emin olun .
  • Her değişken kullanım ömrü boyunca en az üç kere referans alınır: beyan, atama (çoğunlukla beyan ile aynı satırda yapılır), tüketim. Bunlardan herhangi biri eksikse, o zaman bir yerde kavramsal bir hata var. Aynı nedenle, çalışan bir programı analiz ediyorsanız, bir değişkenin amacını bulmak için kodda bu üç şeyi her zaman arayabilirsiniz.
  • fordöngüler, döngüleri kullanarak uygun yineleme örnekleri verilene kadar öğretilmemelidir while. Shorthand sözdizimi kafa karıştırıcıdır ve öğrencilerin neden sadece whiledöngü kullanamadıklarını merak etmelerini sağlar . Bir fordöngüyü döngü olarak tanımlayan bir kopya kağıdına sahip whileolmak yararlı olabilir.
  • Diziler ve işaretçiler öğretmek oldukça kolaydır, ancak öğrenmek için bir kabus. Başka bir deyişle, tıklanıncaya kadar pratik yapmak önemlidir.
  • Kodun metin olduğu ve derlenmiş bir programın aslında bir dosya olduğu fikri bazı yeni başlayanlar için zor. Onlara kabuktaki .cpp, .h ve binary dosyalarını gösterdiğinizden emin olun.

C ++ 'nın OOP bileşenleri tamamen farklı bir hayvandır ve umarım eğitmen oraya ulaşmaz - çünkü OOP en iyi şekilde OOP olmak üzere tasarlanan dilleri kullanarak öğretilir. Tecrübelerime göre, COP ile C ++ 'ı öğretmek hiçbir zaman iyi olmadı.


2
"İnsanların işlevlerin sırayla yerine getirildiğini anlamada güçlükleri var"? Neredeyse kimsenin problem yaşamadığını düşünüyorum (belki de prosedür başlamadan önce bazı fonksiyonel dilleri öğrenmiş olanlar hariç). Ama söylediğin her şey hakkında hemfikirim.
leftaroundabout

2
+1 hata ayıklayıcısına adım attığından, programın kendisi ile yürütülmesi arasındaki farkın farkına varırlar.
Mike Dunlavey 18:11

4
@leftaroundabout Şaşırdın. Matematik çoğunlukla açıklayıcıdır, bu nedenle zorunlu diller cebir öğrenen herkesi mahvedebilir.
Rei Miyasaka

2
Bu cevap, sadece "kavramların dışına çıkmak" gibi görünüyor. Kavramlar şüphesiz doğrudur ve kesinlikle önemlidir, ancak bu şekilde öğretmek, birilerine yolun kurallarını ortadan kaldırarak nasıl sürüleceğini öğretmeye çalışmak gibidir.
riwalk,

@ Stargazer712 Herkes yol testini denemesine izin verilmeden önce yolun kurallarını öğrenir. "Uygulama anahtarıdır" ya da "yaratıcı olun" ya da "mantıklı düşünün" gibi kabarık geniş vuruş fikirleri sunabilirim, ancak bu şeyler muhtemelen çoğu öğrenci için olduğu gibi herhangi bir eğitmen için oldukça açıktır. Kişi, ayrık matematik veya dil teorisi gibi soyut şeyleri de programlamanın öncüsü olarak öğretebilir, ancak bu yalnızca mekanikler o kadar karmaşık olduğunda sorunların yalnızca sezgi ile çözülemeyeceği durumlarda önemli hale gelir. Er ya da geç insanlar zen olmayı bırakmalı ve içerik öğretmeye başlamalıdır .
Rei Miyasaka

19

Daha önce programlama öğrettin mi?

Dört yıl boyunca CS ve CS dışındaki ana dallara programlama dersi verdim. İlk dönem, birkaç şey öğrenene kadar, deneyimlerim senin gibiydi.

Bana basitçe basit görünen, yeni başlayanlar için hiç de basit değildi.

Dil ne olursa olsun, zihinsel bir çerçeveyi uygulamaya koymak zorundasınız - o kadar açık ki, onları tanıdığınızı bile bilmiyorsunuz:

  • Bilgisayarlar bir seferde sadece bir şey yapar. (Paralelliğe ve boru hattına sahip olduğunu söyleyen herkes uzaklaşın. Öğrenciler bir şey öğrendiğinde geri dönün.) Bilgisayarlar yalnızca az sayıda farklı şeyler yapabilir ve birincisi bitinceye kadar bir adım yapmaya başlayamazlar. Bunu söylüyorum, çünkü bilgisayarlar çok şey yapıyor gibi görünüyor ve anında yapıyorlar, bir acemiye her şeyi bir kerede yapıyor gibi görünüyorlar ve zihninizi de okuyorlar.

  • Değişkenler önemlidir. Bir değişkenin adının ve çalışma zamanındaki içeriğinin tamamen farklı iki şey olduğunu anlamak önemlidir. Yeni başlayanlar bununla mücadele ediyor. "İsminizi girmek için bir program yazıp ardından size merhaba diyin" dersem, adlarını tutmak için bir değişkene ihtiyaçları olduğunu ve değişken için bir isim düşünmeleri gerektiğini düşünmeleri gerekir. kendilerinden sonra isimlendirmek ve "girdi" nin ne anlama geldiğini merak etmek.

  • Programı yazdığınız / düzenlediğiniz zaman ile yürütüldüğü zaman arasında çok büyük bir fark var. İlk alıştırmaları sırasında, bunu oldukça sık hatırlatmaları gerekir.

Kullandığım dil BASIC idi, çünkü yeni başlayanlar için çok basit. Bir dizi temel programlama yeteneği geliştirdikten sonra diğer dillere geçmek zor değildir.

Biz tahtaya sık sık bir program yazıp "bilgisayar oynar" derdik. Diğer bir deyişle, geçerli ifadenin yanına bir X koyun, el ile yapın, sonra X'i sonraki ifadeye taşıyın. Değişkenler tahtada, mevcut içerikleri yazacağımız dikdörtgenlerdi. Bir ödev gerçekleştiğinde, onu silip yeni değeri koyarız.

Geliştirdiğim bir numara, her biri 4 basamaklı bir sayı tutabilen 1000 bellek konumuna sahip, simüle edilmiş bir ondalık bilgisayardı. Akümülatörü yüklemek, eklemek, depolamak, atlamak vb. Gibi küçük bir "opcod" grubu vardı. Bu "makine dilinde" küçük programlar yazmalarını ve çalışmalarını görmek için tek adım atmalarını istiyorum. Sonra, değişkenler, atlama vb. Kavramları açıklamak daha kolaydır.

Umarım yardımcı olur.


Bu benzetilmiş bilgisayar fikrini seviyorum. Bunun için resmi bir diliniz var mı, yoksa sadece fikirleri sözde kod / düz İngilizce olarak mı konuşuyorsunuz?
Rei Miyasaka

@Rei: (BASIC dilinde) Simple adında bir simülatör yazdım. Hepsi klavye arayüzü idi. Kullanıcı değerleri "hafızaya" girebilir; sonra tek adımlarını atabilir ve isterlerse akümülatör ve hafızayı her noktada inceleyebilirler. Bunun gerçekten önemli olduğunu düşünüyorum çünkü bunu yapmalarını sağladılar , sadece konuşmalarını değil.
Mike Dunlavey 18:11

Ahh tamam. Teşekkürler, böyle bir şey denemeliyim.
Rei Miyasaka

Bu bence # 1 cevap olmalı.
riwalk,

12

Bence C ++ ilk dil olarak bir overkill.

Senin yerinde olsaydım ve elimde yeterli zamanım olsaydı, Python'u (ya da benzerini) kullanarak programlama ve CS kavramlarını tanıtmaya giderdim.

Kavramlar net olduğunda, yani, temel veri yapıları, dolaylı işlemler, temel algoritmalar vb. İle rahat olduklarında, yavaşça C ++ 'ı tanıtırdım ve öğrendikleri şeylerle çok hızlı bir şekilde ilişki kurabilirler.


2
Katılıyorum, ancak profesörlerin genellikle hangi dili öğreteceklerini seçme hakları yoktur, çok az TAs.
Rei Miyasaka 17:11

4
Python'a katılmıyorum. İlk CS 101 dersimi C ++ 'dan geçtim ve daha sonra Python'da CS 101 dersi veren bir okula geçtim. Python öğrencileri hepimizin aynı CS 201 dersini aldıklarında temelleri bile karıştı. Ama bütün C ++ öğrencileri mükemmeldi.
OghmaOsiris

@OghmaOsiris, Açıkçası, Python hakkında yeterince bilgim yok, ancak şahit olduğun şey, kendini seçme önyargısının bir tezahürü olabilirdi. Sonuçta, C ++ bazı öğrenciler için korkutucu bir durumdur (özellikle programlamadaki en tecrübesiz öğrenciler için).
Stephan Branczyk

@Oghma 201 sınıfı neydi? Düşük seviyeli bir şeyse, muhtemelen ön koşul olarak C ile kendi şubesi olmalıdır.
Rei Miyasaka 18:11

1
@OghmaOsiris: Hmmm Kabul etmemeliyim, katılmıyorum, benim üniversitedeki farklı bir deneyimi paylaşmak zorundayım çünkü ilk dil python'a geçiyor, çünkü ilk dil, farkında olduğumda çok yardımcı oldu (ilk önce Java yok C ++). Bireysel deneyimlerin birinin diğerinden daha iyi olduğunu, hiç bitmeyen bir alev savaşı olduğunu düşünmüyorum. Python'un başlamak için harika bir programlama dili olabileceğini savunabilirim çünkü yoluna çıkmaz, aslında çoğu öğrenciyi alan çoğu programlama dilinin daha iyi olmasını sağlar ....
Trufa

4

İşte size tavsiyem:

  1. Onlara çözmeleri için gereken tüm ayrıntıları verin
  2. Ayrıntıları anlamaya çalışmak için onları teşvik edin
  3. Ayrıntılara ihtiyaç duyduklarında küçük formda saklandıklarından emin olun

Temelde, gerekli tüm detayları içeren tek bir a4 kağıdı yaratmanızı tavsiye ederim. Tüm detayları içeren bir çeşit referans el kitabı. Bazı kitaplar da yardımcı olabilir, örneğin "C programlama dili" kitabı büyük ölçüde yardımcı oldu çünkü gerekli tüm bilgileri kompakt bir biçimde elde etti. Bilginin sıkıştırılması, tüm detayları içeren a4 kağıdının oluşturulmasında zorunludur.


3

Programlama, bir öğrencinin karşılaştığı diğer genel alanlardan büyük ölçüde farklıdır. Kolejden önce birçok öğrenci, sadece sınıfta dikkat ederek ve belki de kolay problemlerle ve kitabın arkasındaki cevaplarla birkaç ev ödevi vererek başardı. Süreçleri ezberlemek, daha sonra yaratmakla ilgili. Aynı zamanda birçok öğrencinin tekrar tekrar yanlış cevap alması için ilk kez (sözdizimi hataları, mantık hataları, seg hataları, vb.). Bu, programlar üzerinde çalışırken öğrenci motivasyonunu azaltabilir.

Programlama ile neler olup bittiğini gerçekten bilmek için, bir ÇOK UYGULAMALARI gerekecektir. Sıklıkla gözden kaçan bir teknik, ana dilleri ne olursa olsun, psuedo kodunu yazmalarını sağlamaktır. Onlara soruna oldukça ayrıntılı bir çözüm bulunana kadar bunu genişletmeye devam etmelerini isteyin. O zaman bunu gerçek koda çevirme meselesi.


3

Üniversitedeyken, diğer kursların yanı sıra programlama kursuna giriş dersinde öğretmenlik yapıyordum. Tarif ettiğiniz problem nadir değildir. Özel rolünüzün ne olduğuna bağlı olarak, almak istediğiniz farklı yaklaşımlarınız olabilir.

Birincisi, eğer bu sınıftaki öğrencilerin önemli bölümlerini etkileyen yaygın bir sorunsa, buna erişiminiz varsa, öğrencilerin ne kavramlar konusunda kavramadıkları hakkında belirli geri bildirimlerle dersi öğreten profesöre yaklaşacağım. Terimde tekrar ortaya çıktıkça söz konusu materyalin ek incelemesini de içerebilir veya gelecek terimler için müfredatı geliştirebilir.

Laboratuarınıza ek olarak kurs için bir tartışma bölümü öğretirseniz, derste kafa karıştırıcı olan şeyleri açıklamak ve daha somut hale gelmelerine ve temellerin hepsinin anlaşılmasını sağlamak için harika bir zaman olurdu.

Bu öğrencilerle birlikte çalışacağınız tek zaman ders laboratuarındaki zamanınızdaysa, bu zamanı öğrencilere bire bir veya birkaç defa öğretmek için ihtiyaç duydukları kavramsal yapı taşlarını öğretmek için kullanabilirsiniz. ve ev ödevlerini tamamla.

Sınıfta kendilerini kaybettiklerini hissedebilirler, nerede duracaklarını ve soru soracaklarını bile bilmiyorlar. Bu durumda, onlarla temellere geri dönün. Neler olduğunu anladıklarında kursta neredeydiler? Eğer emin değillerse veya "asla" anlamadılarsa, merhaba dünyasını açıklamaya, bir değişkenin ne olduğu gibi şeyler öğretmeye, bilgisayarın "talimatlar" listesini nasıl alıp almaya çalıştığına başlamaya başlayabilirsiniz. bunları sırayla yapın, ancak bilgisayar bizim kadar "akıllı" değildir, bu yüzden çok değişmez olmanız ve bilgisayarın tam olarak anlayabilmesi için doğru şeyler söylemeniz gerekir.

Bu aslında ana dal dışı programlama derslerinde oldukça sık gördüğüm bir mücadele ve hayal kırıklığı noktası. Öğrenciler bazı kodlar yazarlar. Doğru, "hakkında" görünüyor, ama sonra derlemeye gidiyorlar ve çok şifreli bir hata veriyorlar. Ve neyin yanlış olduğu hakkında hiçbir fikirleri yok. Ve saatlerce kodlarına bak. Sonra nihayet, eksik bir yarı-kolon veya yanlış yerde bir destek gibi önemsiz görünen bir şey olduğunu anlayın. Sonra tekrar derlemeye giderler ve hala bir hata vardır, başka bir şey. Değişken adını, ikinci kez kullandıklarında farklı olarak hecelediler. Ve bunun gibi. Bu yüzden bir arkadaştan, öğretmenden veya birinden yardım isterler ve başlarının tepesinden cevap verebilirler "ah, sadece bunu oraya ekleyin ve sonra işe yarayacaktır." Bu yüzden deneyimleri, programlamanın biraz "gizemli" olduğudur.

Bu, bir öğretmen olarak, yardımcı olacak çok yerinizin olduğu bir alandır. Hayal kırıklık seviyelerine bağlı olarak, kodlarının neden çalışmadığını anlamalarına yardımcı olacak farklı yaklaşımlarım olabilir. Eğer bir türlü anlarlarsa, onlara ipuçları verebilir ve kendi başlarına çözmelerine yardımcı olabilirim. Ancak, hayal kırıklığına uğramaktan vazgeçmeye hazır olduklarının ipinin hemen ucundalarsa, sık sık birkaç freebie cevabı veririm ve sonra en azından onlara bu değişikliğin neden programınızı düzelttiğini anlıyor musunuz? ?"

Bazı öğrenciler, özellikle de ana dal öğrencisi olmayanlar için, iyi bir programcı olmak veya programlamadan zevk almak için gereken detaylara metodik dikkat göstermeyebilirler. Ayrıntılara dikkat etmelerine yardımcı olacak stratejilerle bunları ellerinde tutabilir ve sorunları onlar için zor olsa bile çözmek için yeterince sistemli olabilirsiniz.

Ancak, kodlarını "doğru" olarak tanımlayan öğrenciler hakkında anal olarak kalıcı - sık sık, yeni başlayanlar programcıların yuvalama ve kapsam ile ilgili sorunlar yaratırlar çünkü eşleşmeyen parantezler veya benzerleri vardır, çünkü neyin altında bulunanlara dikkat etmedikleri için. Tüm kodları doğru bir şekilde girin ve parantezlerin eşleştiğinden emin olun, tüm satırların noktalı virgülle bitmesini sağlayın, özellikle ilk hatanın gösterdiği satır numarasının etrafında olduğundan emin olun. yukarı, vb

Onlara erken derlemeyi ve sık sık derlemeyi öğret. Asgari iskelet kodunu yaz (merhaba dünya), derle / test et. Birkaç satır ekleyin, tekrar derleyin. Büyük bir kova değil, yalnızca küçük bir değişiklik kovasına bakıyorsanız, hataları bulmak çok daha kolaydır.

Bir problemi daha küçük çözülebilir problemlere nasıl çözeceklerini öğrenmelerine yardımcı olun. Profesyonel programcılar olarak yaptığımız aynı şeydir, daha zor problemleri çözerek nasıl çözeceğimizi bilmiyoruz. Nasıl çözeceğinizi bildiğiniz ya da nasıl çözüleceğini öğrenmek için bir araştırma yapabileceğinize kadar parçalara ayırmaya devam edersiniz. “Çalışmakta olan bir çözüme ulaşmak için hangi adımları atmanız gerekiyor?” İlk önce biraz iskelet koduna ihtiyacınız var (merhaba dünya). Nasıl yapıldığını biliyor musun? Evet, harika, konuşmayı bitirince bunu başlatabilirsin! Sonra bir dosyayı girdi olarak okuması gerekir. 4. bölümde bunun hakkında okuduğunu hatırladın mı? Pek sayılmaz? Neden gidip merhaba dünyayı çalıştırdıktan sonra bir göz atmıyorsun ve bu işe koyulmaya ne kadar yaklaşabileceğini gör ve sonra beni ara ve Buna takıldığın zaman sana daha fazla yardım edeceğim. İlk birkaç kez, sorunu çözmek için gerekli olan adımları öğrenmek için onlar için numaralandırılmış bir liste yapmanız gerekebilir, böylece sorunun nasıl çözüleceğini örnek olarak öğrenebilirler.

Eğer sınıfta materyallerin bir kısmını alıyor ama hepsini almıyorlarsa, sınıfta soru sormalarını teşvik edin, çünkü on kişiden dokuz kez, anlamayan tek öğrenci değiller ve profesör muhtemelen önemli bir şeyden bahsetti.

"Saatleri" tek bir hataya bakarak harcıyorlar ama çözemiyorlarsa, bu zamanlarını boşa harcıyorlarsa, ondan fazla bir şey öğrenmiyorlar. Genellikle hatalar içgörü problemleridir ve bu sorunu çözmek için doğru içgörü ile ortaya çıkma meselesidir ve bu tür problemler için yetersizliği olmayabilir. Takılıp kaldıklarında diğer genel yaklaşımları önerin: sınıftaki başka bir arkadaşınızdan yardım isteyin (eğer gerekliyse bazı sınıf arkadaşları tanıyın), ödevlerini vaktinden önce başlatın; Öğretmen laboratuvarında ve açık saatlerde sorular sorun ya da profesörün çalışma saatlerine gidin. Ezberleme konuları için iyi sonuç veren tıkanmaya alışkınlarsa, huzursuzluk duvarına çarpacaklardır. ezberlemekten daha çok problem çözme ile ilgili olan programlama ile karşı karşıya kalırsınız. Onlara ders kitaplarından, yığın akışından vb. Sözdizimi örneklerine nasıl bakacaklarını gösterin. Varsa, özel sınıf bir soru forumuna soru göndermeleri için onları teşvik edin.

Onlara, kodun çalışmayı bıraktığı yerin nasıl daraltılacağını öğretin. Çalışan bir şeye geri dönene kadar yayınları yorumlayın ve sonra tekrar bu parçayı tekrar alana kadar yavaşça geri ekleyin.

Bu fikirlerin çoğu, çok fazla gelirlerse bildiri haline getirilebilir. Stratejiler genellikle bölüm profesörlerinin üzerinde dururlar - zamanlarını sözdiziminde, döngüler, diziler, g / Ç, vb. Yazma anlamlarının anlamlarını harcıyorlar. kodumu çalıştırmak ve sadece beni derlemek veya çöker değil mi? "

Kavramsal şeyler söz konusu olduğunda, özellikle "değişken nedir" ya da "döngü nedir?" Bunların kursun geri kalanına ayak uyduracaklarını anlamadığını anlamıyorum. Derse dayalı bir kursta, profesörün her soruyu cevaplamak veya her öğrencinin ampulünün sönmesine yardımcı olmak için zamanı olmayabilir. İşte bu, öğretmenlerin programlamayı öğrenmek için bu kadar önemli olmasının bir parçası. Belirli bir konuyu somutlaştırmak için ek analojilerle kişiselleştirilmiş eğitime ihtiyaçları olabilir.

C ++ 'da ders verdiğiniz için, derslerin bazı öğrencilerin "almak" için uğraştığı soyut bir konu olduğunu düşünürdüm. Genellikle sınıfların soyutlanması, bir "ATM makinesi" gibi bazı rastgele gerçek dünya nesnesine karşılık gelen örneklerle öğretilir ve gerçek dünya nesnesine benzerlikler yapılır. İçinde ne kadar paranın bulunduğunu takip etmek için değişkenlere sahip olabilirsiniz, atm makinesine belirli koşullara nasıl cevap vereceğini söyleyen kurallara benzeyen yöntemlere sahip olabilirsiniz. ve diğer öğrenciler farklı birini daha iyi kavradılar.

Mümkün olduğunda, onlar için resim çizin. Yazdıkları kodun ne yaptığının büyük resmini görmelerine yardımcı olmak için zaman içinde ne olduğuna dair bir dizi diyagramı gibi. Kullanıcı bu düğmeyi tıklar. Sonra program x, y ve z yaparak yanıt vermelidir. Postanede her biri yalnızca bir sayı tutabilecek bir grup PO Kutusu gibi bir dizi çizin ve kutunun önündeki "adres" i gösteren oklar gibi işaretçiler çizin. Vb.


2

Buradaki dilleri programlamak için kullanılabilecek harika seçenekler arasında, bu kolejde CS ++ olmayan öğrenciler için intro CS sınıfı olarak C ++ kullanılıyor? Yetenekli eğitmenlerin elinde, uzaktan düşünülebilirdi - ama neden bu kadar zorlaştırıyor?

Üniversitedeki CS dersimde "Pascal" ı öğrendiğimde, ilk 3 haftayı " Karel the the robot " ile çalışarak geçirdik . Bu, Pascal'da yapmadan önce tüm temel kavramların (özyineleme dahil) iyice araştırıldığı logo benzeri bir programlama ortamıydı. "Robot Karel" de, küçük bir basit komut seti kullanarak 2B alanda bir robotu kontrol edersiniz. Bu, öğrencilere daha sonra olacakları için kullanabilecekleri sağlam bir temel sağlar.

Belki şimdi "Karel the Robot" rolünü dolduran daha modern öğretim programlama dilleri var? Ancak şimdi öğrencileriniz için muhtemelen çok geç.


Alice adında benzer bir program yaptık.
OghmaOsiris 18:11


@OghmaOsiris Alice bağlantısı koptu. Sondaki "url'ye eklendi.
Zoot

Evet, o olmadan sonu ')' kesildi.
OghmaOsiris


2

Söylenenlere ek olarak, yeni başlayanlar olarak sadece yüzeyleri çizmeleri gerektiğini, bu nedenle karmaşık şeylerden kaçınmak için müfredatınızı uygun şekilde tasarladıklarını kabul ediyorum.

0-onlara basit bir problem verin (bir ifadeyi değerlendirin).

1-Anlamaları için onlara zaman verin.

2-onlara cevap ver.

Cevap satırında 3 satır satır

4-sizden cevabınızı cevaplarıyla karşılaştırmasını isteyin

5-dersten bu problemden türetmelerini isteyin

6-AYNI problemine bir adım daha ekleyelim, bir IF ifadesi gerektiren bir durum söyleyin

7-Yukarıdaki problemi birkaç problem üzerinde tekrarlayın. O zamana kadar dilin temellerini ve çevrenin nasıl kullanılacağını kavrayacaklardı. Gelecek için hazır olacak.

Ayrıca,

-Her iki evde ya da öylesine evde denemek için bir bonus basit bir sorun var

-Her öğrencinin ilerlemesini engelleyen noktanın ne olduğunu görmesi

Kolay referans materyali sağlamak, karmaşık konuları ve karmaşık kitapları unutmak

geri bildirimlerini sık sık alın ve kullanın

-sınıflara gelmeden önce bir sonraki konuya hazırlanmalarını isteyin


2

CS 101’den geçerken bana yardımcı olan şey, koda bakmadan önce mantığı öğrenmekti. Doğruluk tablolarını ve edat hesaplamaları üzerinden geçtik, böylece “bunun doğru veya yanlış” olduğunu ve “buna eşit” olduğunu düşünmeye başlayacağız.

Her şey benim için tıkladığında vardı. Programlamanın temelde sadece çekirdeğin doğru / yanlış değerlerini değiştirdiğini anladığım zaman, hepsi nispeten basit hale geldi.

Bu da hangi dili kullandığımın bir önemi yoktu, mantık her yerde aynıydı. Sözdizimi kafa karıştırıcı olabilir, ancak şunu söyleyebilirim: "Tamam, Obj'de CI bunun gibi sınıflara mesaj yolluyor ve C ++ mesajları da bu şekilde yollandı. Fakat algoritma hiç değişmedi." vb.


2

Yeni başlayanların (sahada başlayan CS mezunlarının bile) kıdemli bir programcının arkasına oturması ve bir problemi kodlarken izlemelerinin nedeninin bazı ayrıntılarına giren bir ACM veya IEEE makalesi var.

Profesyoneller genellikle zor problemlerle eşleşir. Öğrencilere sık sık söylememesi söylenir. Eşleştirmenin avantajları (klavyede sırayla): 1. Öğrenciye derhal ne yaptığını söyler. Anlık geri bildirim. 2. Öğrenci öğretmeni izlerken, öğrenci öğretmenin asla işaret etmeyeceği şeyleri seçer.

Bir öğrencinin kötü uygulamalar geliştirmesine izin vermek yerine, tomurcuklanmış. (Burada # 2 ile 1 numarayı çeviririm ve öğrencinin Öğretim Görevlisi / TA FIRST izlemesine izin veririm )

CS'ye statik bir powerpoint slayt seti ile öğretmek, program yazma sürecine iyi bir şekilde katkıda bulunmaz. (Büyüyen işlevlerle satır satır yapabileceğiniz püf noktaları vardır, ancak genellikle gariptirler.)

Öğrencilerin nerede yazmaya başlayacağını, nerede duracağını ve derleyeceğini bilmeleri gerekir. Beyinlerimiz çoğunlukla soldan sağa yukarıdan aşağıya okunmak üzere bağlanır, ancak bir program bir bütün gibidir, kendi macera kitabınızı tek bir sayfada doldurun!

Çok sık bir acemi bütün bir programı kopyalar ve derler. Bir profesyonel bile, bu yolla ilk çatlakları verebilir, farkına varmadan önce tüm fonksiyonları boş bırakmaları ve programı derlemeleri ve daha sonra çalışan bir iskelete eklemeleri gerekir.

Ayrıca, CS'nin bilgisayarsız ve sadece kurşun kalem ve kâğıt olmadan öğretilmesi gereken saçma bir fikir. Hangi çalışan programlama uzmanlarının gerçekten bunun en iyi yol olduğunu düşündüklerini veya CS eğitmenlerinin bilgisayarlarla çalışmayı sevmedikleri için yaptıkları bir şey mi? Bir bilgisayarı resimden kaldırma girişimi ortalama bir şeydir. Bunu yapmak programlamayı daha az eğlenceli ve olması gerekenden daha az etkileşimli kılar. Verileri delikli bir karta girme ve sabırla beklemenin uzun zamanını geride bıraktık. Günümüzün profesyonel geliştiricileri anında memnuniyetin hayranları. Neyse ki çoğu öğrenci de öyle.

Açıkçası, geliştirme sürecinden önce ve sırasında güzel tasarımların kalem ve kağıtla çizilmesi hem profesyonel hem de yeni başlayan programcılar için güçlü bir araçtır. Bu "klavyede eller" zamanı gibi eşleştirme de geçirilmelidir! Belki de burada, öğretmeni izlemeden önce öğrencinin ilk raundu denemesine izin vermek mantıklı olabilir, ancak bununla birlikte öğretmenin gerçek düşünce sürecini görmeye değer.

Son olarak, profesyonel geliştiricinin kullandığı kısayol tuşları ve düzenleme püf noktaları öğrencinin öğrenmesi için "gürültü" değildir. En önemlisi, öğrenciyi meşgul eder ve ilgilenirler. İkincisi, ortak kalkınma ihtiyaçlarına yönelik farkındalık yaratırlar. Ayrıca, bu uygulamaların en temelini gerçekleştirmek genellikle kolaydır ancak başlangıçta açık değildir. Genç bir ahşap dükkanı öğrencisi, bir çekiç pençesi ile bir çivinin nasıl çıkarılacağını kolayca öğrenebilir, ancak çoğu durumda pençenin ne için olduğu söylenmelidir. Bazı şeyleri yapmak son derece kolay, öğretilmeden öğrenmek önemsiz değil. Profesyonel geliştiriciler bile bu "püf noktaları" hakkında her zaman unuturlar ve gereksiz ya da ulaşılmamış kodları kaldırmak için yeniden donatıcı gibi yeniden donatıcı araçlardan yararlanırlar.


1
btw, Biri beni bu makalenin başlığına çekebilirse çok sevinirim!
David,

2

Bilgisayar programlama genellikle bilişsel sentez becerisinin geçme notu için gerekli olduğu ilk derslerden biridir . Bu yeteneğin başkasına vermesi çok zordur. Sahip oldukları tüm bileşenleri ve nasıl çalıştıklarını açıklayabilirsiniz. Başkalarının bu bileşenleri daha yararlı bir bütün halinde birleştirmek için nasıl sentez kullandıklarına dair çok sayıda örnek verebilirsin, ancak öğrencinin aklında "tıklamaya" gerek kalmadan yapabileceğiniz çok fazla şey vardır.

Tecrübelerime göre, programlamayı "almayan" insanlardan en çok kaçan sentezleme becerisidir. Değişkenler, fonksiyonlar ve döngüler gibi parçaları mükemmel bir şekilde anlıyorlar, ancak “Neden işe yaradığını anlıyorum ama oraya bir döngü koymanız gerektiğini nasıl bildiniz?” Gibi sorular soruyorlar. Sadece o ana kadar pratik yapmalısın.


2

Aaron Hillegass'ı yanlış yönlendirmek için onlara aptal olmadıklarını hatırlatmak çok zor. Programlama zihninizi eğitmek zordur, bu tamamen başka bir düşünce tarzıdır ve temelleri ile mücadele ederken muhtemelen onların oldukça farkında olduklarını ve onları oldukça ümitsiz hale getireceklerini bilecektir.

Bunu, ilk yıl CS dersinde başarısız olan biri olarak söyledim, daha önce çok programlamıştım ve tüm kavramları (VB, evet bebeğim) aldım, fakat C ++ benim için tıklamazdı. En temel noktalara dönüp oradan çalışarak sona erdi, sonra tıkladı, ama eğer biri "Sen aptal değilsin, bu çok zor" demiş olsaydı hayatımı kolaylaştıracaktı.


0

"Bu öğrenci matematik, biyoloji veya fizik öğrenmeyi biliyor olabilir, ancak programlama söz konusu olduğunda bu teknikler çalışmıyor" demiştiniz.

Bunun bir nedeni var, programlama diğer disiplinin mutlaka gerektirmediği bir şeyi gerektirir: yaratıcılık ve ... fantezi . "İşyerinde hayal etme" yeteneği. Şahsen böyle bir zorunluluğun (elbette, tüm istisnalar dışında) teknik okuldan gelen (özellikle elektronik ve elektromekanik) gelen insanları oluşturduğunu buldum: “elektrik akışını ve birbirlerini nasıl kontrol ettiklerini” düşünmek zorundalar; onları görün!) "saf bilim" den (her şeyin matematiği çevirmek gibi gözüktüğü).

Bu son durumlar için, "görsel biliş" yardım edilmelidir. Yalnızca fikir ve metne odaklanmak değil (tip -> derleme -> hataları gözden geçirmek mümkün değilse, hataları işleyemezsiniz) ya da tasarım zamanında (şeyleri görselleştirmek için bir yol sağlamak) önemlidir. makinede neler olup bittiğini simüle ederek: bir beyaz tahta ve renkli post-it setiyle hazırlanın) ve çalışma zamanında.

Bu son bölümün başarılı olması için, işletim sistemleri ve “programların bir makineye nasıl girdiği” (ve o makinenin gerçekte ne olduğu) temel bir fikir verilmelidir. Ve korkutucu olmayan bir IDE verilmelidir. Ben normalde "dikkat dağınıklığı" için birçok şey kaldırılmış bir "özelleştirilmiş Kod Blokları" dır. Bir dil hakkında konuşmaya başlamadan ÖNCE, kütüphane ile bağlantılı nesneler üretmek için kaynaklardan yapılmış proje kavramı verilmelidir.

C ++ geleneksel merhaba dünyası, bir giriş noktası ve bir çıkış aygıtı gerektirir. Öğrenci zaten buna aşina olmalıdır. Bu tür kursların başarısı ilk günlere bağlıdır. Programlamanın ne olduğunu anlamalarına izin vermek için bir bilgisayarın içinde neler olduğunun görselleştirilmesini teşvik etmeniz gerekir.
Gerisi sözdizimi (bilim) ve soyutlamadır (fantezi).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.