Korepetycje dla uczniów, którzy borykają się z podstawami w C ++ [zamknięte]

26

Uczę kilku uczniów, którzy mają poważne trudności w nauce podstaw swojego pierwszego języka programowania: C ++. Znałem wielu znakomitych i błyskotliwych studentów, którzy nie zdali lub porzucili swój pierwszy kurs CS. Wszyscy, których prowadzę korepetycje, opowiadają podobnie o swoich doświadczeniach na zajęciach: instruktor porusza się zbyt szybko, nic na wykładach nie ma sensu, et al. Przed tą klasą CS większość tych uczniów, którzy mieli problemy, nie wyrażała zainteresowania komputerami jako czymś więcej niż edytorami tekstu, przeglądarkami internetowymi lub inną formą rozrywki. Komputer to czarna skrzynka, która działa, więc po co z nią zadzierać?

Domyślam się, że mają problem z połączeniem abstrakcji informatyki ze znanymi pojęciami. Innymi słowy, uczniowie ci mogą nauczyć się matematyki, biologii lub fizyki, ale techniki te nie działają, jeśli chodzi o programowanie.

Czy ktoś ma jakieś sugestie lub porady? Uczniowie, którym pomagam, nie zasługują na zaliczenie tej klasy. Oczywiste jest, że instruktor nie bierze pod uwagę stylu uczenia się tych uczniów. Innymi słowy, instruktor nie zawodzi swoich uczniów.

AdmCrunch
źródło
2
Komentatorzy: jeśli masz odpowiedź, zostaw ją jako odpowiedź: nie zostawiaj jej jako komentarza. Jeśli Twoja odpowiedź została już dodana, zagłosuj. Jeśli chcesz omówić temat tego pytania z innymi, skorzystaj z czatu .
1
Nie? Z mojego doświadczenia

Odpowiedzi:

42

Jest kilka rzeczy, z którymi praktycznie każdy początkujący ma problemy. Uczniowie muszą wiedzieć, jak czytać kod, zanim będą mogli nauczyć się pisać kod.

  • Sekwencyjny charakter języków imperatywnych. Ludzie mają problemy ze zrozumieniem, że funkcje są wykonywane sekwencyjnie, jeden element na raz, jak przepis. Jednym ze sposobów rozwiązania tego problemu jest pokazanie kodu działającego przez debugger.
  • Operator przypisania ( =) w językach w stylu C jest bardzo mylący. Musisz bardzo dokładnie wyjaśnić, co a = 5oznacza „przypisz 5 do zmiennej a, a nie ” a jest równe 5 ”.
  • Dla początkujących można bezpiecznie opisywać funkcje jako ustrukturyzowane bloki kodu, do których inne funkcje mogą przeskakiwać. Ponadto początkujący mają problemy ze zrozumieniem, że w C ++ argumenty funkcji są identyfikowane według kolejności, a nie nazwy.
  • Większość imperatywnych języków programowania ma niektóre deklaratywne komponenty i niektóre proceduralne komponenty, a C ++ nie jest wyjątkiem. Upewnij się, że uczeń rozumie, że niektóre części kodu opisują strukturę programu, a inne części (funkcje) opisują, co program powinien zrobić.
  • Przejście przez program za pomocą debugera jest niezwykle ważnym i często zaniedbywanym narzędziem nauczania .
  • Wyrażenia mają typy . 3+3jest liczbą całkowitą, 3.5 + 3jest podwójną, "3" + "3"(w C #) jest łańcuchem, x == 5 * 3 + 25jest wartością logiczną (lub liczbą całkowitą w C ++). Poświęć dużo czasu, aby upewnić się, że uczeń jest w pełni swobodny z tym pojęciem.
  • Zmienny zakres jest czymś, co początkującym ciągle się myli. Wyjaśnij uczniowi, jak działa zakres i upewnij się, że wie, że xzdefiniowany w jednym zakresie różni się od xzdefiniowanego w innym zakresie.
  • Do każdej zmiennej odwołuje się co najmniej trzy razy w swoim okresie życia: deklaracja, przypisanie (często wykonywane w tym samym wierszu co deklaracja), zużycie. Jeśli któregoś z nich brakuje, to gdzieś jest błąd koncepcyjny. Z tego samego powodu, jeśli analizujesz działający program, zawsze możesz poszukać tych trzech rzeczy w kodzie, aby ustalić przeznaczenie zmiennej.
  • forpętli nie należy uczyć, dopóki nie zostaną podane odpowiednie przykłady iteracji przy użyciu whilepętli. Skrócona składnia jest myląca i pozostawia uczniów zastanawiających się, dlaczego nie mogą po prostu używać whilepętli. Pomocna może być ściągawka, która opisuje forpętlę w kategoriach whilepętli.
  • Tablice i wskaźniki są dość łatwe do nauczenia, ale koszmar do nauki. Innymi słowy, dopóki nie kliknie, ważna jest praktyka.
  • Idea, że ​​kod jest tekstem i że skompilowany program jest w rzeczywistości plikiem jest nieuchwytny dla niektórych początkujących. Pamiętaj, aby pokazać im pliki .cpp, .h i pliki binarne w powłoce.

Komponenty OOP w C ++ są zupełnie inną bestią i mam nadzieję, że instruktor się tam nie dostanie - ponieważ OOP najlepiej jest uczyć, używając języków, które zostały zaprojektowane od podstaw jako OOP. Z mojego doświadczenia, nauczanie OOP przez C ++ nigdy nie poszło dobrze.

Rei Miyasaka
źródło
2
„Ludzie mają problem ze zrozumieniem, że funkcje są wykonywane sekwencyjnie”? Myślę, że to jest właściwie rzecz, z którą nikt nie ma problemów (może z wyjątkiem osób, które nauczyły się jakiegoś funkcjonalnego języka przed rozpoczęciem procedury). Ale zgadzam się co do wszystkiego, co mówisz.
leftaroundabout
3
+1 za przejście z debuggerem, aby dostrzegli różnicę między samym programem a jego wykonaniem.
Mike Dunlavey
4
@leftaroundabout Byłbyś zaskoczony. Matematyka jest w większości deklaratywna, więc imperatywne języki mogą zrzucić każdego, kto nauczył się algebry.
Rei Miyasaka,
2
Ta odpowiedź wydaje się po prostu „grzechotaniem pojęć”. Koncepcje są niewątpliwie poprawne i są z pewnością ważne, ale nauczanie w ten sposób przypomina trochę nauczenie kogoś, jak prowadzić, grzechotając przepisy drogowe.
riwalk
@ Stargazer712 Każdy uczy się zasad ruchu drogowego, zanim będzie mógł spróbować testu drogowego. Mógłbym przedstawić puszyste pomysły o szerokim skoku, takie jak „ćwiczenie jest kluczowe” lub „być kreatywnym” lub „myśleć logicznie”, ale te rzeczy są prawdopodobnie oczywiste dla każdego instruktora, a także dla większości uczniów. Można również uczyć abstrakcyjnych rzeczy, takich jak dyskretna matematyka lub teoria języka jako prekursor programowania, ale staje się to ważne tylko wtedy, gdy mechanika jest tak złożona, że ​​problemów nie da się rozwiązać za pomocą samej intuicji. Wcześniej czy później ludzie muszą przestać być zenem i zacząć uczyć treści .
Rei Miyasaka,
19

Czy uczyłeś już programowania?

Przez cztery lata uczyłem programowania na kierunkach CS i non-CS. W pierwszym semestrze moje doświadczenie było podobne do twojego, dopóki nie nauczyłem się kilku rzeczy.

To, co wydawało mi się wyjątkowo proste, wcale nie było proste dla początkujących.

Niezależnie od języka, musisz wprowadzić ramy mentalne - rzeczy tak oczywiste, że nawet nie zdajesz sobie sprawy, że je znasz, takie jak:

  • Komputery robią tylko jedną rzecz na raz. (Każdy, kto mówi, że ma równoległość i potokowanie, odejdź. Wróć, gdy uczniowie coś wiedzą.) Komputery mogą robić tylko kilka różnych rzeczy i nie mogą zacząć robić jednego kroku, dopóki poprzedni nie zostanie ukończony. Mówię to tylko dlatego, że komputery wydają się robić tak wiele rzeczy i robią je natychmiast, że dla początkującego wygląda na to, że robią wszystko naraz, i czytają również w twoich myślach.

  • Zmienne są ważne. Konieczne jest zrozumienie, że nazwa zmiennej i jej zawartość w czasie wykonywania to dwie zupełnie różne rzeczy. Początkujący zmagają się z tym. Jeśli powiem „Napisz program, który wprowadzi twoje imię, a następnie przywitaj się”, muszą dowiedzieć się, że potrzebują zmiennej, aby zachować swoje imię, i muszą wymyślić nazwę dla zmiennej, i są kuszeni nazwać to po sobie i zastanawiać się, co znaczy „wkład”.

  • Istnieje ogromna różnica między czasem, w którym piszesz / edytujesz program, a czasem, w którym się uruchamia. Podczas pierwszych ćwiczeń należy o tym dość często przypominać.

Językiem, którego użyłem był BASIC, ponieważ jest bardzo prosty dla początkujących. Nie jest trudno przejść do innych języków po zbudowaniu zestawu podstawowych umiejętności programistycznych.

Często pisaliśmy na tablicy program, a następnie „graliśmy na komputerze”. To znaczy, umieść X obok bieżącej instrukcji, zrób to ręcznie, a następnie przenieś X do następnej instrukcji. Zmienne były prostokątami na planszy, w których zapisywalibyśmy bieżącą zawartość. Gdy miało miejsce przypisanie, usuwaliśmy je i wprowadzaliśmy nową wartość.

Jedną sztuczką, którą opracowałem, był symulowany komputer dziesiętny z 1000 miejscami pamięci, z których każda może pomieścić 4-cyfrową liczbę. Był mały zestaw „kodów”, takich jak ładowanie akumulatora, dodawanie, przechowywanie, przeskakiwanie itp. Chciałbym, żeby pisały małe programy w tym „języku maszynowym”, a następnie wykonywały je w jednym kroku, aby działały. Później pojęcia takie jak zmienne, skoki itd. Są znacznie łatwiejsze do wyjaśnienia.

Mam nadzieję, że to pomaga.

Mike Dunlavey
źródło
Podoba mi się ten symulowany pomysł komputerowy. Czy masz do tego formalny język, czy po prostu omawiasz pomysły w pseudokodzie / zwykłym angielskim?
Rei Miyasaka,
@Rei: Napisałem (w języku BASIC) symulator o nazwie Simple. To był cały interfejs klawiatury. Użytkownik może wprowadzić wartości do „pamięci”; mogliby to zrobić krok po kroku i zbadać akumulator i pamięć w każdym punkcie, jeśli chcą. Myślę, że to było naprawdę ważne, ponieważ sprawiło, że zrobili to, a nie tylko o tym rozmawiali.
Mike Dunlavey,
Ahh dobrze. Dzięki, powinienem spróbować czegoś takiego.
Rei Miyasaka,
Moim zdaniem powinna to być odpowiedź nr 1.
riwalk
12

Moim zdaniem C ++ to przesada jako pierwszy język.

Gdybym był tobą i miał wystarczająco dużo czasu pod ręką, zająłbym się wprowadzaniem koncepcji programowania i CS przy użyciu Pythona (lub podobnego).

Kiedy pojęcia są jasne, tj. Kiedy są wygodne w podstawowych strukturach danych, pośredniości, podstawowych algorytmach itp., Powoli wprowadzę C ++ i bardzo szybko będą mogli odnieść się do tego, czego już się nauczyli.

yati sagade
źródło
2
Zgadzam się, ale profesorowie zwykle nie mają prawa wybierać, jakiego języka uczyć, a tym bardziej TA.
Rei Miyasaka,
4
Nie zgadzam się w sprawie Pythona. Przeszedłem moją pierwszą klasę CS 101 na C ++, a następnie przeniosłem się do szkoły, która uczyła CS 101 w Pythonie. Studenci Pythona byli tak zdezorientowani nawet podstawami, kiedy wszyscy chodziliśmy na tę samą klasę CS 201 ... Ale wszyscy studenci C ++ byli znakomici.
OghmaOsiris,
@OghmaOsiris, Szczerze mówiąc, nie wiem wystarczająco dużo o Pythonie, ale być może to, czego byłeś świadkiem, mogło być po prostu przejawem uprzedzeń związanych z samoselekcją. W końcu C ++ jest piekłem przerażającym dla niektórych studentów (szczególnie dla najbardziej niedoświadczonych studentów w programowaniu).
Stephan Branczyk
@Oghma Czym była klasa 201? Jeśli jest to coś niskiego, prawdopodobnie powinna to być jego własna gałąź z C jako warunek wstępny.
Rei Miyasaka,
1
@OghmaOsiris: Hmmm muszę się nie zgadzać, no nie, nie mogę się nie zgodzić, podzielić się innym doświadczeniem w mojej uniwersytecie przejście na python, ponieważ pierwszy język okazał się bardzo pomocny, o ile wiem (pierwszy to Java bez C ++). Nie sądzę, by indywidualne doświadczenia liczyły się jako kupa, że ​​jedno jest lepsze od drugiego, to jest niekończąca się wojna z płomieniem. Mogę jednak argumentować, że Python może być świetnym językiem programowania na początek, ponieważ nie wchodzi w grę, faktycznie robi to lepiej niż większość języków programowania, które przyciągają wielu studentów ...
Trufa
4

Oto, co radziłbym:

  1. Podaj im wszystkie szczegóły, których potrzebują, aby to rozgryźć
  2. Zachęć ich, aby spróbowali zrozumieć szczegóły
  3. Upewnij się, że przechowują dane w zwartej formie, gdy tylko są potrzebne

Zasadniczo radziłbym ci stworzyć pojedynczy papier A4, który zawiera wszystkie niezbędne szczegóły. Coś w rodzaju podręcznika, który zawiera wszystkie szczegóły. Niektóre książki mogą również pomóc, na przykład książka „Język programowania C” bardzo pomogła, ponieważ miała wszystkie niezbędne szczegóły dostępne w zwartej formie. Kompresja informacji jest niezbędna w tworzeniu dokumentu A4, który zawiera wszystkie szczegóły.

tp1
źródło
3

Programowanie zasadniczo różni się od innych typowych domen, z którymi spotyka się student. Wielu studentom przed studiami udało się po prostu zwrócić uwagę na lekcje i być może wykonać kilka zadań domowych z łatwymi problemami i odpowiedziami na końcu książki. Chodzi bardziej o zapamiętywanie procesów, a następnie ich tworzenie. Jest to także pierwszy raz, kiedy wielu uczniów otrzymuje błędne odpowiedzi (błędy składniowe, błędy logiczne, błędy seg itp.). Może to osłabić motywację uczniów podczas pracy nad programami.

Aby naprawdę wiedzieć, co się dzieje z programowaniem, będą musieli DUŻO PRAKTYKOWAĆ. Często pomijaną techniką jest pisanie kodu psuedo w jakimkolwiek języku ojczystym. Poproś ich, aby kontynuowali rozwijanie tego, dopóki nie znajdą dość szczegółowego rozwiązania problemu. To kwestia przetłumaczenia tego na prawdziwy kod.

Peter Smith
źródło
3

Kiedy byłem na studiach, byłem nauczycielem wstępu do kursu programowania wśród innych kursów. Opisany problem nie jest rzadki. W zależności od konkretnej roli możesz mieć różne podejścia, które chcesz zastosować.

Po pierwsze, jeśli jest to szeroko rozpowszechniony problem mający wpływ na znaczną część uczniów w klasie, jeśli masz do tego dostęp, zwróciłbym się do profesora prowadzącego kurs z konkretną opinią na temat tego, jakie pojęcia studenci nie rozumieją, tak aby on lub on może albo dołączyć dodatkową recenzję tego materiału, gdy pojawi się on ponownie w tym terminie, albo ulepszyć program nauczania na przyszłe warunki.

Jeśli oprócz zajęć laboratoryjnych uczysz sekcji dyskusji na kursie, byłby to wspaniały czas na wyjaśnienie rzeczy, które były mylące podczas wykładu i pomogły uczynić je bardziej konkretnymi i upewnić się, że wszystkie podstawy zostały zrozumiane.

Jeśli jedyny czas, w którym pracujesz z tymi uczniami, spędzasz w laboratorium, możesz nadal wykorzystać ten czas, aby nauczyć uczniów jednego na jednego lub kilku na raz, pojęciowych elementów potrzebnych do zrozumienia i dokończ zadanie domowe.

Mogą czuć się tak zagubieni w klasie, że nawet nie wiedzą, gdzie się zatrzymać i zadawać pytania. W takim przypadku wróć z nimi do podstaw. Gdzie oni byli na kursie, kiedy ostatni raz rozumieli, co się dzieje? Jeśli nie są pewni lub „nigdy” nie zrozumiani, być może trzeba będzie cofnąć się do początku, aby wyjaśnić cześć światu, ucząc ich takich rzeczy, jak zmienna, jak komputer bierze listę „instrukcji” i próbuje rób to w porządku, ale komputer nie jest tak „inteligentny” jak my, więc musisz być bardzo dosłowny i mówić rzeczy dokładnie tak, aby komputer je zrozumiał itp.

To właściwie jest problem walki i frustracji, którą dość często widziałem na kursach programowania innych niż główne. Studenci piszą kod. Wydaje się, że jest „w porządku”, ale potem przystępują do jego kompilacji, co daje błąd, bardzo tajemniczy błąd. I nie mają pojęcia, co jest z tym nie tak. I godzinami wpatruj się w ich kod. Potem wreszcie zorientuj się, że to coś, co wydaje się trywialne, jak brakujący średnik lub orteza w niewłaściwym miejscu. Potem kompilują go ponownie i nadal występuje błąd, to coś innego. Przy drugim użyciu użyli innej nazwy. I tak dalej. Dlatego proszą przyjaciela, korepetytora lub kogoś o pomoc i mogą odpowiedzieć z góry „och, po prostu dodaj to, a wtedy zadziała”. Ich doświadczenie polega na tym, że programowanie jest nieco „tajemnicze”

Jest to obszar dla nauczyciela, w którym masz dużo miejsca do pomocy. W zależności od poziomu frustracji, mogę mieć różne podejścia, aby pomóc im dowiedzieć się, dlaczego ich kod nie działa. Jeśli w jakiś sposób to rozumieją, mogę dać im wskazówki i spróbować pomóc im samemu to zrozumieć. Ale jeśli są już na skraju gotowości do rezygnacji ze sfrustrowania, często dam im kilka darmowych odpowiedzi, a następnie spróbuję przynajmniej zadać im pytania typu „czy rozumiesz, dlaczego ta zmiana naprawiła twój program? ?

W przypadku niektórych studentów, zwłaszcza osób niebędących specjalnościami, mogą nie zwracać uwagi na szczegóły niezbędne do bycia dobrym programistą lub programowania. Możesz trzymać je w ręku za pomocą strategii, aby pomóc im zwrócić uwagę na szczegóły, i być wystarczająco metodycznym, aby rozwiązać problemy, nawet jeśli jest to dla nich wyzwanie.

Ale nie zapominają o tym, że uczniowie „prawidłowo” wciskają swój kod - tak często początkujący programiści mają problemy z zagnieżdżaniem i zakresem, ponieważ mają niepasujące nawiasy klamrowe itp., Ponieważ nie zwracają uwagi na to, co jest zagnieżdżone. Daj im listę kontrolną „rzeczy do sprawdzenia, kiedy twój program się nie skompiluje”, takich jak wcięcie całego kodu i upewnienie się, że nawiasy klamrowe pasują do siebie, upewnij się, że wszystkie linie kończą się średnikami, szczególnie wokół numeru linii, w której pojawia się pierwszy błąd w górę itp.

Naucz je kompilować wcześnie i często kompiluj. Napisz minimalny kod szkieletu (powiedzmy hello world), skompiluj / przetestuj. Dodaj kilka wierszy, skompiluj ponownie. O wiele łatwiej jest znaleźć błędy, jeśli patrzysz tylko na małe wiadro zmian, a nie duże.

Pomóż im nauczyć się rozkładać problem na mniejsze możliwe do rozwiązania problemy. To samo robimy jako profesjonalni programiści rozwiązujący znacznie trudniejsze problemy, których nie umiemy rozwiązać. Rozbijasz go na części, aż dojdziesz do czegoś, co albo umiesz rozwiązać, albo możesz przeprowadzić badania, aby dowiedzieć się, jak rozwiązać. „Jakie kroki należy podjąć, aby znaleźć działające rozwiązanie?” Najpierw potrzebujesz trochę kodu szkieletowego (witaj świecie). Czy wiesz jak to zrobić? Tak, świetnie, więc kiedy skończymy rozmawiać, możesz zacząć od zrobienia tego! Następnie musi odczytać plik jako dane wejściowe. Czy pamiętasz o tym w rozdziale 4? Nie całkiem? Dlaczego nie pójdziesz, rzuć okiem na to, kiedy zaczniesz czuć świat, i zobacz, jak daleko możesz się zbliżyć do tego, że działa, a potem oddzwoń do mnie, a ja Pomogę ci trochę, kiedy utkniesz w tym. Kilka pierwszych razy może być konieczne zrobienie dla nich numerowanej listy kroków niezbędnych do rozwiązania problemu, aby mogli nauczyć się na przykładach, jak rozłożyć problem.

Jeśli zdobywają część, ale nie wszystkie materiały w klasie, zachęć ich do zadawania pytań w klasie, ponieważ dziewięć razy na dziesięć nie są jedynymi uczniami, którzy nie rozumieją, a profesor prawdopodobnie po prostu pochylił się nad czymś ważnym.

Jeśli spędzają „godziny”, wpatrując się w jednego robaka, ale go nie rozgryzają, to strata czasu, niewiele się od niego uczą. Często błędy są problemami wglądu i jest to kwestia znalezienia właściwego wglądu, aby je rozwiązać, i mogą nie mieć talentu do tego rodzaju problemów. Zasugeruj inne ogólne podejścia, które należy zastosować, gdy utkną: poproś innego przyjaciela w klasie o pomoc (poznaj niektórych kolegów z klasy, jeśli to konieczne), rozpocznij zadanie domowe z wyprzedzeniem, aby mieli czas się zatrzymać, a później przyjdź laboratorium nauczyciela i zadawaj pytania w godzinach otwartych lub chodź do godzin pracy profesora. Jeśli są przyzwyczajeni do wkuwania, co dobrze sprawdza się w przypadku zapamiętywania, uderzą w ścianę frustracji, gdy „ w obliczu programowania, które bardziej dotyczy rozwiązywania problemów niż zapamiętywania. Pokaż, jak wyszukać przykłady składni ze swojego podręcznika, przepływu stosu itp. Zachęć ich do opublikowania pytania na forum pytań klasy prywatnej, jeśli takie istnieje.

Naucz ich, jak zawęzić obszar, w którym kod przestaje działać. Komentuj rzeczy, dopóki nie wrócisz do czegoś, co działa, a następnie powoli dodawaj rzeczy z powrotem, aż znowu pojawi się ten błąd.

Wiele z tych pomysłów można przekształcić w ulotki, jeśli się pojawią. Strategie są zwykle częścią, o której profesorowie się zastanawiają - spędzają czas na składni, semantyce pisania pętli, tablic, we / wy itd. Ale za mało czasu poświęconego na „co robię, kiedy próbuję uruchomić mój kod, a on po prostu się nie kompiluje lub nie powoduje awarii? ”

Jeśli chodzi o rzeczy koncepcyjne, zwłaszcza podstawy, takie jak „czym jest zmienna” lub „czym jest pętla?” niezrozumienie tego uniemożliwi im nadążenie za resztą kursu. Na kursie wykładowym profesor może nie mieć czasu, aby odpowiedzieć na każde pytanie lub pomóc żarówce zgasnąć dla każdego ucznia. I właśnie dlatego nauczyciele są tak ważni podczas nauki programowania. Mogą potrzebować zindywidualizowanych instrukcji z dodatkowymi analogiami, aby konkretny temat był konkretny.

Ponieważ uczysz w C ++, wyobrażam sobie, że zajęcia są abstrakcyjnym tematem, który niektórzy studenci mają trudności z „zdobyciem”. Często naucza się abstrakcji klas z przykładami odpowiadającymi jakimś losowym obiektom z prawdziwego świata, takim jak „bankomat”, i analogie do obiektu z prawdziwego świata. Możesz mieć zmienne, aby śledzić, ile pieniędzy jest w środku, masz metody, które są jak reguły, które mówią bankomatowi, jak reagować na określone warunki itp. Czasami jedną analogią jest ta, która „trzyma się” konkretnej osoby , a inni uczniowie lepiej rozumieją innego.

Jeśli to możliwe, narysuj dla nich zdjęcia. Jak schemat sekwencji tego, co dzieje się w czasie, aby pomóc im zobaczyć duży obraz tego, co robi kod, który piszą. Użytkownik klika ten przycisk. Następnie program powinien odpowiedzieć, wykonując x, yiz. Narysuj tablicę przypominającą paczkę skrytek pocztowych na poczcie, która może zawierać tylko jeden numer, oraz wskaźniki, takie jak strzałki wskazujące „adres” z przodu skrzynki. Itp.

Jessica Brown
źródło
2

Ze wszystkich wspaniałych możliwości wyboru języków programowania, ta uczelnia używa C ++ jako klasy wprowadzającej CS dla kierunków innych niż CS? W rękach utalentowanego instruktora można to sobie wyobrazić zdalnie - ale dlaczego to takie trudne?

Kiedy nauczyłem się „Pascala” na mojej uczelnianej lekcji intro-CS, pierwsze 3 tygodnie spędziliśmy pracując z „ Karelem robotem ”. Było to bardzo proste środowisko programistyczne przypominające logo piaskownicy, w którym wszystkie podstawowe koncepcje (w tym rekurencyjne) zostały dokładnie zbadane przed wykonaniem tego w Pascal. W „Karel the robot” sterujesz robotem w przestrzeni 2D za pomocą małego zestawu prostych poleceń. Daje to uczniom użyteczne, konkretne podstawy, na których mogą czerpać z tego, co będzie dalej.

Być może istnieją teraz bardziej nowoczesne instruktażowe języki programowania, które pełnią rolę „Karela Robota”? Prawdopodobnie jednak jest już za późno dla twoich uczniów.

Angelo
źródło
Mieliśmy podobny program o nazwie Alice.
OghmaOsiris,
To jest Alice: „ en.wikipedia.org/wiki/Alice_(software)
OghmaOsiris
@OghmaOsiris Link Alice jest zepsuty. Końcowy „został dodany do adresu URL.
Zoot
Tak, bez tego końcówka „)” została odcięta.
OghmaOsiris,
2

Oprócz tego, co powiedziano, zakładam, że jako początkujący muszą jedynie zarysować powierzchnię, więc odpowiednio dostosuj swój program nauczania, aby uniknąć skomplikowanych rzeczy.

0-daj im prosty problem (powiedz, oceń wyrażenie).

1-daj im czas, aby się zorientowali.

2-daj im odpowiedź.

3-przejdź przez linię odpowiedzi po linii

4-poproś ich, aby porównali twoją odpowiedź z ich przykładem

5-poproś ich o wyciągnięcie lekcji z tego problemu

6-dodaj kolejny krok do SAMEGO problemu, powiedz warunek wymagający instrukcji JEŻELI

7-powtórz powyższe zadanie dla kilku problemów. Do tego czasu zrozumieliby podstawy języka i posługiwania się środowiskiem. Byłby gotowy na to, co będzie dalej.

Również,

-mają dla nich dodatkowy prosty problem, aby spróbować w domu co 2 klasy lub mniej więcej

-podziel się z każdym uczniem, aby przekonać się, jaki jest sens powstrzymywania go przed pójściem dalej

-dostarcz łatwy materiał odniesienia, zapomnij o skomplikowanych tematach i skomplikowanych książkach

- często otrzymuj ich opinie i korzystaj z nich

-zaproś ich, aby przygotowali się do następnego tematu, zanim przyjdą na zajęcia

Bez szans
źródło
2

Pomogłem mi, kiedy przejrzałem CS 101, nauczyłem się logiki, zanim nawet spojrzałem na kod. Przejrzeliśmy tabele prawdy i rachunek przyimkowy tylko po to, aby zacząć myśleć „to prawda lub fałsz”, a nie „to równa się temu czy tamtemu”.

Właśnie w tym momencie wszystko mnie kliknęło. Kiedy zorientowałem się, że programowanie to po prostu manipulowanie wartościami prawda / fałsz w rdzeniu, wszystko stało się stosunkowo proste.

I to sprawiło, że nie miało znaczenia, jakiego języka używałem, logika jest wszędzie taka sama. Składnia może być myląca, ale mogę powiedzieć coś takiego: „Ok, w Obj CI wysyłaj wiadomości do klas takich jak ta, aw C ++ wiadomości wysyłane są w ten sam sposób. Ale algorytm wcale się nie zmienił”. itp.

OghmaOsiris
źródło
2

Gdzieś jest artykuł ACM lub IEEE, który opisuje niektóre szczegóły, dlaczego początkujący (nawet absolwenci CS zaczynający w terenie) muszą siedzieć za starszym programistą i patrzeć, jak kodują problem.

Specjaliści często łączą się z trudnymi problemami. Zbyt często mówi się uczniom, żeby tego nie robili. Zalety parowania (zmiana na klawiaturze): 1. Uczeń natychmiast dowiaduje się, co robi źle. Natychmiastowa odpowiedz. 2. Kiedy uczeń patrzy na nauczyciela, uczy się rzeczy, o których nauczyciel nigdy by nie pomyślał.

Zamiast pozwalać uczniowi na rozwijanie złych praktyk, są one przygryzane w zarodku. (Odwróciłbym tutaj nr 1 z nr 2 i pozwoliłbym uczniowi oglądać instruktora / TA FIRST )

Nauczanie CS za pomocą statycznego zestawu slajdów Powerpoint nie nadaje się dobrze do czasowego procesu pisania programu. (Oczywiście istnieje kilka sztuczek, które można wykonać z rosnącymi funkcjami linia po linii, ale zwykle są one niewygodne).

Uczniowie muszą wiedzieć, od czego zacząć pisać, a gdzie zatrzymać i skompilować. Nasze mózgi są w większości podłączone do czytania od lewej do prawej od góry do dołu, ale program jest jak wybór całej własnej przygodówki wciśniętej w jedną stronę!

Zbyt często początkujący skopiuje cały program, a następnie skompiluje. Nawet profesjonalista może dać temu pierwszy krok, zanim zda sobie sprawę, że powinien pozostawić wszystkie funkcje puste i skompilować program, a następnie iteracyjnie dodać go do działającego szkieletu.

Powiązany jest także absurdalny pomysł, że CS należy uczyć bez komputera i tylko ołówka i papieru. Zastanawiam się, ilu zatrudnionych programistów naprawdę uważa, że ​​jest to najlepszy sposób, czy tylko to robią instruktorzy CS, ponieważ sami nie lubią pracować z komputerami? Każda próba usunięcia komputera ze zdjęcia jest wredna. Takie postępowanie sprawia, że ​​programowanie jest mniej zabawne i mniej interaktywne, niż powinno być. Już dawno minęły czasy, kiedy wprowadzaliśmy dane do karty dziurkacza i cierpliwie czekaliśmy. Dzisiejsi profesjonalni programiści są fanami natychmiastowej satysfakcji. Na szczęście większość uczniów też.

Oczywiście rysowanie ładnych wzorów ołówkiem i papierem przed i podczas procesu programowania jest potężnym narzędziem zarówno dla profesjonalnych, jak i początkujących programistów. Podobnie jak czas spędzony na klawiaturze, należy również sparować! Być może w tym przypadku sensowne byłoby pozwolenie uczniowi na podjęcie pierwszej rundy przed obserwacją nauczyciela, chociaż nawet przy tym prawdopodobnie warto zobaczyć prawdziwy proces myślowy nauczyciela.

Wreszcie, klawisze skrótów i sztuczki edycyjne stosowane przez profesjonalnego programistę nie są „hałasem” dla nauki ucznia. Co najważniejsze, angażują i interesują studenta. Po drugie, zwiększają świadomość na temat wspólnych potrzeb rozwojowych. Ponadto najbardziej podstawowe z tych praktyk są często łatwe do wykonania, ale początkowo nie są oczywiste. Młody uczeń sklepu z drewnem może łatwo nauczyć się usuwać gwóźdź pazurem młota, ale w większości przypadków najpierw trzeba powiedzieć, że po to jest pazur. Niektóre niezwykle łatwe do zrobienia rzeczy nie są po prostu trywialne do nauki bez nauki. Nawet profesjonalni programiści cały czas zapominają o tych „sztuczkach” i korzystają z narzędzi refaktoryzujących, takich jak resharper, aby usunąć zbędny lub nieosiągalny kod itp.

David
źródło
1
btw, jeśli ktoś mógłby wskazać mi tytuł tego artykułu, byłbym wdzięczny!
David
2

Programowanie komputerowe jest często jednym z pierwszych kursów, w których poznawcza umiejętność syntezy wymagana jest do zaliczenia. Umiejętności tej bardzo trudno jest przekazać komuś innemu. Możesz wyjaśnić wszystkie dostępne im komponenty i sposób ich działania. Możesz podać wiele przykładów tego, jak inne osoby wykorzystały syntezę do połączenia tych składników w bardziej użyteczną całość, ale jest tylko tyle, co możesz zrobić bez czegoś „klikającego” w umyśle ucznia.

Z mojego doświadczenia wynika, że ​​umiejętność syntezy najczęściej umyka ludziom, którzy nie „dostają” programowania. Doskonale rozumieją części, takie jak zmienne, funkcje i pętle, ale zadają pytania typu: „Rozumiem, dlaczego to działa, ale skąd wiesz, że musisz tam zapętlić?” Po prostu musisz ćwiczyć, dopóki go nie dostaniesz.

Karl Bielefeldt
źródło
2

Błędne cytowanie Aarona Hillegassa, przypomnienie im, że nie są głupie, to po prostu trudne. Programowanie jest trudne do wytrenowania twojego umysłu, jest to zupełnie inny sposób myślenia, i chociaż mogą mieć problemy z podstawami, prawdopodobnie są świadomi, że są i sprawi, że będą dość przygnębieni.

Mówię to jako ktoś, kto również nie zdał pierwszego roku kursu CS, dużo wcześniej programowałem i znałem wszystkie koncepcje (VB, tak kochanie), ale C ++ po prostu by mnie nie kliknął. Skończyło się na tym, że wróciłem do podstaw i pracowałem nad tym, potem kliknęło, ale gdyby ktoś powiedział: „Nie jesteś idiotą, to jest po prostu trudne”, to ułatwiłoby mi życie.

Nicholas Smith
źródło
0

Powiedziałeś „ci uczniowie mogą wiedzieć, jak uczyć się matematyki, biologii lub fizyki, ale te techniki nie działają, jeśli chodzi o programowanie”.

Jest po temu powód, programowanie wymaga czegoś, czego te inne dyscypliny niekoniecznie wymagają: kreatywności i ... fantazji . Zdolność do „wyobrażania sobie rzeczy w pracy”. Osobiście uznałem, że taki wymóg jest bardziej obecny (oczywiście z wszystkimi wymaganymi wyjątkami) od osób pochodzących ze szkół technicznych (w szczególności elektroniki i elektromechaniki: muszą „wyobrazić sobie przepływy elektryczne i sposób, w jaki się kontrolują”, ponieważ nie mogą zobacz je!) niż z „czystej nauki” (gdzie wszystko wygląda jak odwrócenie matematyki).

W tych ostatnich przypadkach należy pomóc „poznaniu wizualnemu”. Ważne jest nie tylko skupienie się na pojęciach i tekście (typ -> kompilacja -> wygląd, błędy nie mogą działać, jeśli nie jesteś w stanie „odczytać” błędów), ale także zapewnienie sposobu na wizualizację rzeczy, zarówno w czasie projektowania ( poprzez symulację tego, co dzieje się na maszynie: bądź przygotowany z białą tablicą i zestawem kolorowych kartek pocztowych) i w czasie wykonywania.

Aby ta ostatnia część zakończyła się sukcesem, należy podać podstawowe pojęcie o systemach operacyjnych i „jak programy działają na maszynie” (i czym tak naprawdę jest ta maszyna). I należy podać nie zastraszające IDE. Zwykle „niestandardowe bloki kodu” z wieloma rzeczami usuniętymi, aby „nie rozpraszać”. Pojęcie projektu ze źródeł do generowania obiektów, które mają być połączone z biblioteką, musi zostać podane PRZED rozpoczęciem rozmowy o języku.

Tradycyjny świat powitalny C ++ wymaga punktu wejścia i urządzenia wyjściowego. Student musi się już z tym zapoznać. Sukces tego rodzaju kursów zależy od pierwszych dni. Musisz stymulować wizualizację tego, co dzieje się w komputerze, aby mogli zrozumieć, czym jest programowanie.
Reszta to składnia (nauka) i abstrakcja (fantasy)

Emilio Garavaglia
źródło