Jak poradzić sobie z podejściem do programowania kultowego?


257

Mam niektórych studentów informatyki na obowiązkowym kursie programowania wstępnego, którzy widzą język programowania jako zestaw magicznych zaklęć, które należy rzucić, aby osiągnąć jakiś efekt (zamiast postrzegać go jako elastyczny środek do wyrażania swojej idei rozwiązania) .

Mają tendencję do kopiowania i wklejania kodu z poprzednich, podobnie wyglądających zadań, bez uwzględnienia istoty problemu.

Czy są jakieś ćwiczenia lub analogie, które zwiększą pewność, że uczniowie mogą i powinni zrozumieć strukturę i znaczenie każdego fragmentu kodu, który piszą?


8
Komentatorzy: Nie zostawiaj odpowiedzi tutaj w komentarzach. Napisz własną odpowiedź. Komentarze nie są miejscem dyskusji na temat różnych możliwych odpowiedzi na pytanie: albo przedstaw sugestię jako odpowiedź, albo poproś ją o pogawędkę, aby ją najpierw opracować.

50
Ilekroć akademia się tu pojawia - martwię się o swoją przyszłość ... Wyobrażam sobie, że jestem na Boeingu 7-28-7 i Turbiny wirują z prędkością 200 000 obr / min, pracując na oprogramowaniu sterującym napisanym w C przez jednego z twoich ledwo zdających studentów. W każdym razie dygresję.
Ben DeMott,

67
Czy zastanawiałeś się kilka razy o NIEUDZIAŁANIU , nie wszyscy są przygotowani na tworzenie oprogramowania! Nie wszystkie są specjalnymi płatkami śniegu!

6
Czy SICP nie słynie z faktu, że programowanie jest analogiczne do rzucania czarów? Wątpię, czy twoi uczniowie cytują SICP, a nawet porównują to, co próbowali przedstawić Abelson i Sussman, ale nie rozumiem, jak błędem jest, że ktoś porównuje pisanie programów do rzucania czarów, gdy jest to jeden z najbardziej znanych książki o programowaniu komputerowym robią dokładnie to samo na pierwszych kilku stronach.
Robbie

9
Eric Lippert ma wiele do powiedzenia na ten temat. I w znacznie bardziej elegancki i zwięzły sposób, niż to możliwe: blogs.msdn.com/b/ericlippert/archive/2004/03/01/82168.aspx
P.Brian.Mackey

Odpowiedzi:


120

Możesz przedstawić im serię ćwiczeń, z których każde opiera się na poprzednim, dodając dodatkowy element lub zakręcając problem, lub badając problem z innej perspektywy, która ujawnia słabość poprzedniego rozwiązania, wymagającą nowego, innego podejścia . Zmusza to ich do myślenia, analizowania, modyfikowania i eksperymentowania z każdym rozwiązaniem, zamiast po prostu kopiowania i wklejania gotowego fragmentu kodu.

Inną możliwością - choć nie jest to wyłącznie zadanie programistyczne - jest poproszenie ich o oszacowanie różnych rzeczy. Np. Ile wody przepływa przez deltę Missisipi na sekundę? Na takie pytania nie ma ustalonej odpowiedzi, szczególnie dlatego, że należy przyjąć pewne założenia, aby uzyskać przekonującą (zakres) wartości. I - chociaż odpowiedzi na wiele z tych „klasycznych” można rzeczywiście znaleźć w Google, możesz łatwo wymyślić nowe, których (jeszcze) nie ma nigdzie w sieci.

Przykłady obu tych rodzajów ćwiczeń można znaleźć np. W Programming Pearls Jona Bentleya. Również Pragmatic Programmer ma pewne dobre wyzwania.

Trzecim rodzajem zadania byłoby przedstawienie im kawałka kodu z (jednym lub kilkoma) błędami, które muszą znaleźć i naprawić. To ponownie zmusza ich do wykorzystania swoich umiejętności analitycznych i uzasadnienia tego, jak program faktycznie działa.

Aktualizacja

Informacje zwrotne z komentarza Billy ONeal:

Problem z „serią ćwiczeń” polega na tym, że studenci, którzy mają problem z wcześniejszym ćwiczeniem, są kompletnie przekręceni na pozostałe ćwiczenia.

Masz rację, chociaż wydaje mi się, że jest to bardziej ogólny problem ustawiania trudności kursu na odpowiednim poziomie / grupowania uczniów o podobnym poziomie umiejętności. Co więcej, można podzielić uczniów na mniejsze grupy, w których są oni zobowiązani do dyskusji i dyskusji na temat problemów i rozwiązań oraz wspólnego rozwiązywania problemów. Jeśli ktoś tego nie dostanie, inni mogą pomóc (ta konfiguracja poprawiłaby również umiejętności pracy zespołowej). A jeśli ktoś próbuje być leniwy i pozwala innym wykonywać całą pracę, z pewnością zauważa to nauczyciel (który powinien chodzić, nadzorować i mentorować uczniów, nie grać w WoW na swoim laptopie w kącie ;-)

Można także dostosować ćwiczenia, aby dostosować uczniów do różnych poziomów umiejętności. Początkujący mogą iść wolniej, doświadczeni szybciej.


Do tej ładnej odpowiedzi dodam link do prostej strony internetowej, która powinna być ustawiona jako uzupełnienie kursów: http://projecteuler.net/ jest to strona internetowa, która ma zwiększyć ich apetyt na kod. Ma coraz większe problemy, które należy rozwiązać w języku, który chcą. Po pierwsze, uzależnia, a także stymuluje konkurencję: możesz śledzić ich postępy na ich kontach, oni też mogą to robić.
Nicolas C.,

142

Walczysz z uczniem ucznia o potrzebie dbania o twój przedmiot i potrzeby uzyskania pozytywnych ocen . Wielu studentów uważa, że:

(Get it Wrong || Experiment) == (Niepomyślna ocena i & Marnowanie czasu)

Gdy tylko uczeń poczuje, że jego czas lub ocena są zagrożone, nawet w przypadku interesującego przedmiotu, przestają się uczyć i przechodzą od razu do „Nie obchodzi mnie to, po prostu daj nauczycielowi właściwą odpowiedź”. Twoi uczniowie starają się skracać rogi (a przynajmniej tak im się wydaje) , myśląc jak najmniej o problemie i po prostu hackując go, kopiując i wklejając.

Oto moje sugestie, jak sobie z tym poradzić:

  1. Użyj metody Boba Rossa: Udowodnij im , że można i szybciej zacząć od nowa, a nie kopiować i wklejać. Twórz nowe programy na ich oczach podczas zajęć - naprawdę pokaż im, że programowanie może być jak malowanie obrazu.
  2. Zapewnij zadania wymagające kreatywności . Na przykład poproś każdego ucznia, aby utworzył własne struktury danych (jakie są obiekty wymagane do utworzenia zoo, sklepu zoologicznego, miasta, uczelni itp.) Na papierze do użycia w trakcie kursu. Zadanie nr 2 może polegać na przekształceniu tych struktur w klasy lub obiekty itp. Zasadniczo zachęć ich do abstrakcyjnego myślenia - nagradzaj je za kreatywność, a następnie nagradzaj za przekształcenie ich kreatywności w program komputerowy.
  3. Użyj najmniejszej możliwej ilości składni. Boilerplate, takie jak tworzenie klas i składnia języka, jest tak powszechny we wprowadzaniu programowania, że ​​często wprowadza uczniów w błąd, myśląc, że całe programowanie to po prostu wiedza, gdzie umieścić nawiasy klamrowe - nie zdają sobie sprawy, że to , co jest w środku kędzierzawego nawiasy klamrowe to miejsce, gdzie płynie kreatywność . Wybierz prosty język i podaj przykładowe pliki (takie jak pusty plik zajęć) dla uczniów, którzy nadal chcą coś skopiować i wkleić. W miarę postępu kursu możesz stopniowo bardziej rygorystycznie podchodzić do składni i kompilacji zadań.

Tak powinno być &&- choć podejrzewam, że może się również udać jako operacja bitowa.
tvanfosson

Naprawdę nie wiem, jak wyglądają dane, ale tak, tak jak zamierzałem, to operacja bitowa. Dobry połów :-)
Kevin McCormick

3
„w środku nawiasów klamrowych płynie kreatywność” ==> oops, nie nauczy ich wtedy Pythona ...
Olivier Pons

3
Innym problemem związanym z próbą udzielenia nauczycielowi „właściwej” odpowiedzi zamiast uczenia się jest to, że ludzie często myślą, że się uczy. Np. Lesswrong.com/lw/iq/guessing_the_teachers_password
Wilka

6
A potem dodam tutaj kilka szczęśliwych średników ...
VirtuosiMedia,

44

Kilka rzeczy, które przychodzą mi do głowy:

  • Daj im zadania, w których muszą wyjaśnić kod, który napisał ktoś inny (ty). Zrozumienie poprzedniego kodu, a ściślej jego brak, jest zarówno największą przyczyną, jak i niebezpieczeństwem programowania kultu ładunku. Poproś ich, aby użyli komentarzy, w razie potrzeby wiersz po wierszu, aby wyjaśnić twój program zwykłym angielskim (lub jakimkolwiek ludzkim językiem, którego używasz).

  • Dopiero po wyjaśnieniu kodu poproś go o zmodyfikowanie go, aby wprowadzić określoną zmianę. Na przykład, jeśli dałeś im funkcję sortowania malejącą, poproś, aby sortowała rosnąco. Lub coś bardziej wymagającego. Ale upewnij się, że jest to coś, co wymaga zrozumienia danego kodu.

  • Możesz, jeśli chcesz, umieścić kilka pisanek w kodzie. Linia lub dwie, które w ogóle nie przydają się, a nawet nie są związane z problemem. Daj im wskazówkę, że takie linie istnieją i przyznaj dodatkowe punkty tym, którzy je usuwają.

  • Wtedy i tylko wtedy możesz przypisać im zadanie samodzielnego napisania fragmentu kodu. W tym momencie powinni lepiej zrozumieć, czym naprawdę jest kod. Może nawet uznają, że trochę łatwiej to zrobić sami.

Podstawową ideą jest to, że programowanie to nie tylko pisanie kodu, ale także czytanie go. Należy również nauczyć się czytać kod.


4
Pomysł na pisanki wydaje się być dobrym sposobem na nauczenie testowania / weryfikacji. Wzdłuż linii „wat można usunąć bez zerwania jakiejkolwiek umowy?”
Neil N

3
+1 do odczytu kodu. Widzę wielu facetów, którzy naprawiają błędy, intuicyjnie zgadując, a następnie szukając tego, aby to udowodnić. Uważam, że czytanie kodu dostarcza wskazówek, które zabiorą cię do właściwego rozwiązania. Brzmi oczywisto, ale widzę, że jest to bardzo zaniedbywane.
Chris

38

Spójrz na to z innej strony. To zjawisko kultu ładunku jest nowicjuszem modelu nabywania umiejętności Dreyfusa . Tak się uczymy. Kiedy po raz pierwszy nauczyłem się programować, wszystko, co robiłem, to pisanie stron kodu z tyłu Compute! magazyn. Powtarzanie jest kluczowe. Dzieci uczą się rozmawiać, kopiując dźwięki, które słyszą ich rodzice. Wszystko, czego się uczymy, odbywa się poprzez naśladowanie. Musimy tylko nauczyć się, jak przejść od naśladowania do opanowania.

Problem w tym, że twoi uczniowie niczego nie powtarzają, kopiują je z Internetu. Ma to pewne zalety, ale korzyści są minimalne. Faktyczne wpisanie kodu doprowadziło mnie do zrozumienia. Zacząłem dostrzegać wzorce podczas pisania i zrozumiałem, co robię.

Jedną z opcji jest uporządkowanie laboratorium jako dojo kodu. Poproś uczniów, aby po kolei sparowali ze sobą ten sam problem. Wybierz problem, którego rozwiązanie zajmuje około 10–15 minut. Powtórz ten problem w kilku laboratoriach i wprowadzaj nowy zwrot problemu wraz ze wzrostem biegłości klasy. Być może zacznij laboratorium od poproszenia uczniów, aby obserwowali, jak programujesz rozwiązanie, i poproś go, aby powtórzył. Przełączanie par przy każdej iteracji.

Do swoich testów przygotuj kod kata, w którym każdy uczeń pracuje przez problemy z semestru przed resztą klasy. Skup się nie tylko na poprawności, ale na formie i kreatywności. Myślę, że zapewniłoby to głębsze zrozumienie tego, jak programować, niż dawanie zadań w domu.


„Kiedy po raz pierwszy nauczyłem się programować, pisałem tylko strony kodu z tyłu magazynu Compute!”.: To był mój bardzo wczesny etap, kiedy korzystałem z Commodore Vic20 do uruchamiania małych programów zabawkowych i wkrótce stał się bardzo nudny. Wkrótce opracowałem odwrotną postawę: napisz sobie nawet kod, który możesz skopiować gdzie indziej, w przeciwnym razie nigdy nie będziesz pewien, co tak naprawdę dzieje się w kodzie.
Giorgio

Jeden z naszych nauczycieli zlecił nam zadanie skopiowania programu asemblera, który nam dał, i wymagał, aby kopia została wykonana własnym pismem odręcznym. Chciał również, abyśmy napisali nasze nazwiska na pierwszej stronie przed nim, aby mógł sprawdzić, czy pismo odręczne jest nasze. To zadanie zajęło mi około 3 godzin.
sashoalm,

1
Środowisko wolne od rozproszenia, takie jak Cyberdojo Jona Jaggera, może być do tego doskonałe, a skonfigurowanie własnego serwera jest tak proste, jak pobranie maszyny wirtualnej lub źródła z github .
Mark Booth,

@giorgio Miałem wtedy 8 lat. Mój poziom umiejętności brzmiał: „wpisz to w darmową grę”
Michael Brown

25

W przeszłości prowadziłem zajęcia wprowadzające i, jak pamiętam, patrząc wstecz:

Niektórzy uczniowie uważają, że programowanie jest podobne z różnych powodów. Pamiętam kiedyś dobre dziecko, które dużo kultywowało to, co zrobiłem:

Wierząc, że to nie była odosobniona kwestia, ale inni uczniowie z tej samej klasy mogą mieć podobne zachowanie lub podejście do problemu i nie wyrazić go, zawsze zwracałem się do klasy.

  1. Poświęcono trochę czasu na wyjaśnienie niektórych rzeczy, takich jak determinizm, co oznaczało dla nich, że w tym samym środowisku z tymi samymi danymi i kodem będą miały te same wyniki (rozproszyć „losowość”),

  2. Ponieważ rozwiązywanie problemów zależy od działań ucznia, a nie od wszystkiego innego, uwaga powinna skupiać się na rozwiązaniu problemu i znalezieniu odpowiedniego zaklęcia,

  3. Są w środowisku edukacyjnym, więc problemy są opracowywane w celu zaoferowania uczenia się, w wyniku czego należy nauczyć się programować (lub w niektórych przypadkach jak zajęcia dla administratorów systemu, jak działają programy, co jest inne), a nie daj mi rozwiązanie. („Świat nie potrzebuje innego kalkulatora, to ćwiczenie”), więc ich problemy można rozwiązać za pomocą dostępnych materiałów (przykład: dostarczone notatki),

  4. Myślę, że jest w Code Complete: „Nawet jeśli skopiujesz i wkleisz, kod jest twój”. Jeśli ktoś to zrobił, nie powinien to być styl ładunkowy. Każda linia musiała zostać wyjaśniona mi (indywidualnie) lub innemu uczniowi (samemu) lub klasie.


23

Czy twoi uczniowie rozpoczęli naukę na prawidłowym poziomie abstrakcji na początku kursu? Np. Zadanie domowe, które wprowadza je do głównych struktur programowania, takich jak pętle i warunki warunkowe, bez pisania ani jednego wiersza kodu?

Kiedy przystąpiłem do programowania, nasze pierwsze zadanie nazywało się „ Rick the Robot ”. Mieliśmy kawałek papieru z powietrzną mapą miasta z interesującymi punktami, takimi jak banki, sklepy spożywcze itp. Mieliśmy gościa o imieniu „Rick” i mieliśmy działania takie jak „zrób krok”, „spójrz w lewo”, „spójrz w prawo”, „przejdź przez ulicę” i moglibyśmy użyć takich rzeczy jak „powtórz” i „jeśli coś, to zrób coś”. (To nie jest 100%, ponieważ nie mogłem znaleźć tego zadania) Pomysł polegał na tym, że Rick mógł korzystać tylko z tego, co mu dano, i musiał dotrzeć do różnych miejsc na mapie.

To było zabawne ćwiczenie i coś, co zapoznało cię z podstawami (które czasami są najtrudniejsze do zrozumienia dla początkujących). Nie ma jednej dobrej odpowiedzi na ten problem (jest to gra) i nie ma rozwiązań do skopiowania i wklejenia. Coś takiego może również pozwolić ci nieco bardziej bawić się kreatywnością bez zastraszania ich kodem.

Wreszcie pomysł polega na tym, aby zacząć od abstraktu i przejść do betonu . Nie mogą skopiować streszczenia wklejania. Muszą to zrozumieć, aby rozwiązać problem.


3
Pętle i warunki? Zacznę od zmiennych, przypisań i wyrażeń. Poproś, aby odczytali dwie liczby z linii poleceń i dodały je, a następnie wydrukowały wynik. Często robienie czegoś niemal boleśnie oczywistego daje uczniom pewność, że mogą zrozumieć, co się dzieje, i zachęca ich do eksperymentowania.
TMN

2
@c_maker: Twoje zadanie wygląda jak gra dla przedszkolaków. Nadanie uczniom zbyt łatwych zadań może jedynie zmniejszyć ich zainteresowanie tematem.
Goran Jovic

2
@c_maker: Myślę, że twoja odpowiedź ma sens, po prostu nie widziałam, jak przejść od while not at-corner do take-one-step endrzeczywistego kodu bez „wypełniania” rzeczy takich jak zmienne i typy danych. Przepraszam, moja odpowiedź wydaje się nieco trudna do refleksji.
TMN

7
Myślę, że główną wartością Rick the Robot nie jest pomoc w zrozumieniu pętli, instrukcji if itp. Główną wartością jest pomoc w zrozumieniu ogólnego procesu pisania programu. Pomaga im dostrzec problemy w określony, krok po kroku, algorytmiczny sposób. Gdy zrozumieją proces programowania w języku angielskim na takim przykładzie, możesz wypełnić szczegóły, ucząc ich, jak wygląda kod. To genialny pomysł. +1
Phil

1
Przypomina mi mój kurs wprowadzający (30 lat temu!) Oparty na [Karel the Robot] ( en.wikipedia.org/wiki/Karel_(programming_language) . (Uwaga: link nie działa, ponieważ rzeczywisty adres URL zawiera w nim pareny Kliknij pierwszą opcję na stronie, która się pojawi.) W każdym razie Karel użył składni podobnej do Pascala, ale nie za dużo
JeffK

20

To, o co ich prosisz, to zademonstrowanie analizy i syntezy w dziedzinie kognitywnej taksonomii Blooma , gdzie obecnie demonstrują jedynie zastosowanie.

Niestety jest to sytuacja typu „poprowadź konia do wody”. Analiza i synteza są również bardzo trudne, gdy wciąż masz problemy ze zrozumieniem. Bez zrozumienia, działania związane z analizą i syntezą będą działały bardziej jak odchwaszczanie niż uczenie się.

Osobiście uważam, że nie można oczekiwać niczego więcej niż aplikacji we wstępie do zajęć z programowania. Po raz pierwszy uczniowie mieli kontakt z tymi pojęciami, więc to tak, jakby uczyć dzieci czytać przed poproszeniem ich o napisanie eseju. Te umiejętności wyższego rzędu pojawią się w późniejszych klasach.


2
Bardzo interesujący kawałek o taksonomii Blooma. Moim zdaniem ważniejsze jest, aby uczeń zrozumiał kod, niż skopiować / wkleić go na lekcji wprowadzającej. Muszą wiedzieć, jak ifdziałają oświadczenia i umieć pisać od zera, zanim przejdą dalej. Uruchom część poznawczą, a następnie przejdź do aplikacji.
Phil

Niedawno uczestniczyłem w świetnym kursie związanym z nauczaniem autorstwa Richarda Feldera. Jego zdaniem było to, że nie trzeba „opanowywać” niższych poziomów taksonomii Blooma przed przyspieszeniem. Jako przykład podał, w jaki sposób przedszkolaki ćwiczą analizę, kiedy proszone są o porównanie, który program telewizyjny jest lepszy - Ulica Sezamkowa lub [...?] I dlaczego.
Aivar

11

Czy zastanawiałeś się nad dostarczeniem im kodu na początek? Jakiekolwiek proste rusztowanie potrzebuje zadanie, jak pusta główna funkcja (nie wiem, jakiego języka używasz). Coś, co się kompiluje, działa i nic nie robi. Następnie mogą zacząć dodawać swój kod z pewnym stopniem pewności, że przynajmniej część z niego działa.

Jest to w rzeczywistości dość powszechne w „prawdziwym świecie”; wiele IDE i innych narzędzi tworzy puste projekty z już istniejącymi typowymi bibliotekami / szablonami / plikami konfiguracyjnymi.


Innym sposobem dostarczenia kodu jest wymaganie od nich interakcji z klasą, którą napisałeś (która nie działa z poprzednim kodem) i ustanowienie wymogu przypisania, że ​​twój kod nie może zostać zmieniony, a oni muszą zmodyfikować własny kod, aby zadanie działało.
Zoot

Lub nawet podaj kod, aby działał w jedną stronę, i przydziel zadanie zmiany / dodania zachowania. W ten sposób skupiają się na konkretnym zachowaniu, a nie na podstawowym wprowadzeniu go w życie.
JohnMcG,

dla pierwszego języka, spróbuj użyć języka, który nie wymaga żadnych szablonów na początku. Pod tym względem Python jest dobry, na przykład C / C ++ / Java.
Lie Ryan,

Ewentualnie IDE, uzupełnianie kodu i szablony promują mentalność kultu ładunków. Jeśli uczniowie poświęcą czas na zrozumienie, dlaczego ten kod szablonu jest potrzebny, i nauczą się więcej niż ślepo postępują zgodnie z przepisem.
Mark Booth,

8

Jakakolwiek mentalność związana z kultem ładunku (w tym same kulty ładunku ) wynika z braku gruntownego zrozumienia technologii.

Programowania kultu ładunków nie należy traktować jako problematycznego nawyku, ale raczej jako objaw leżącego u podstaw zamieszania, przed którym stoi programista.

Co ważniejsze, założenie, że niezrozumienie przez ucznia jest po prostu rezultatem braku pewności siebie, jest zasadniczo błędne i nie rozwiązuje problemu leżącego u podstaw.

Zamiast tego styl programowania ucznia kopiuj-wklej powinien być czerwoną flagą informującą, że uczeń jest przytłoczony złożonością tego, co powinien zrobić.

Instynktownie wykorzystuje przeszłe prace jako rusztowania, na których buduje swój obecny projekt, próbując skomponować rozwiązanie, wykorzystując wcześniej rozwiązane problemy jako elementy składowe. Wszyscy robimy to w pewnym stopniu, ale większość z nas robi to, wykorzystując wiedzę zdobytą w przeszłości jako nasze podstawowe elementy. Ten uczeń zamiast tego korzysta z samej pracy, co oznacza, że ​​tak naprawdę nie rozumie bloków, z którymi pracuje. Rozłożył dzieło na tyle, na ile pozwala na to jego zrozumienie, i traktuje duże bloki kodu jako jednostki atomowe, ponieważ nie rozumie, jak one działają . On wie tylko, co robią.


Dzięki! Dałeś mi dużo do myślenia. Początkowo myślałem, że może nie mogą sobie wyobrazić, że struktura i znaczenie kompozycyjne są wewnątrz fragmentu kodu. Teraz myślę, że być może rzeczywiście mieli problem z jego zrozumieniem, ale zawiedli i użyli opcji kopiuj-wklej w ostateczności.
Aivar,

7

Zmień swój pomysł na projekty!

W świecie programowania rzadko tworzymy nowe projekty dla każdego pojawiającego się rozwiązania. W większości przypadków modyfikujemy stare.

Zmień swój pomysł na projekt z jednego rozwiązania dla każdego zadania na jedno rozwiązanie na cały semestr. Każde zadanie opiera się na poprzednim zadaniu.

Przykład

Projekt: Zbuduj system wind

  • Zadanie 1: Wydrukuj bieżącą podłogę
  • Zadanie 2: Utwórz struktury danych dla klasy windy i wydrukuj podłogę na podstawie windy
  • Zadanie 3: Utwórz kod, który „porusza windą”, drukując podłogę. Akceptuj wprowadzanie z klawiatury (> wpisz piętro:)
  • Zadanie 4: Obsługa wielu wind

Chodzi o to, że bazujesz na poprzednim zadaniu zamiast przetwarzać stare zadania dla nowego zadania.


2
Cóż, kopiowanie-wklejanie nie jest problemem, problem polega na tym, że nie rozumieją, co kopiują.
Aivar

1
Jednym z problemów związanych z przydziałami przyrostowymi jest to, że jeśli uczeń zorientuje się w zadaniu wczesnym, utknie w niedziałającym kodzie dla pozostałych. Wielu instruktorów z przyjemnością dostarczy działający kod, który posłuży jako podstawa do kolejnych zadań, ale potem wracają do pierwotnego problemu: modyfikowania cudzego kodu, którego nie rozumieją.
Barry Brown,

Naprawdę? Jeśli instruktor nie jest wystarczająco pomocny, aby pomóc uczniowi w uruchomieniu kodu, to czy naprawdę wykonuje swoją pracę?
Richard

Nie wszyscy otrzymają zlecenie w terminie.
Barry Brown,

@Barry, czy nie jest tak w przypadku każdego przedmiotu, który rozwija się logicznie w trakcie kursu? Na przykład, jeśli nigdy nie uczysz się zestawów złączy i przecięć, jesteś przykuty do reszty swojego kursu matematyki dyskretnej. Lub jeśli nigdy nie nauczysz się układu okresowego, jesteś solowy na pozostałym kursie chemii. Chodzi o to, aby zmusić uczniów do opanowania pojęć w odpowiedniej kolejności i wypracowywania ocen aż do ich opanowania. Jeśli nie mogą spędzić całej nocy przez tydzień, aby przygotować program na następny dzień zajęć, nie muszą robić kariery programistycznej.
Jonathan Henson,

7

Zastanów się nad użyciem języka bardzo wysokiego poziomu, który wymaga minimum kodu z podstawowymi informacjami.

Dla mnie często jest to prosty kod w dużych ramkach lub pełnych językach, który czuje się jak magiczne zaklęcia i utrudnia zrozumienie.

Osobiście uczyłem ML na moim kursie programowania CS. Przez wiele lat Lisp był nauczany jako wprowadzenie do programowania na MIT. Oba są doskonałymi wyborami. Niektóre z ich korzyści

  • Interaktywny tłumacz ustny. Bardzo ważne, ponieważ pozwala to na eksplorację.
  • Bardzo zwięzłe. W ogóle nie ma płyty kotłowej. Pozwala uczniom skoncentrować się na pomysłach, które starają się wyrazić.
  • Względnie niejasne i obce (przynajmniej w porównaniu z Javą, C lub innymi popularnymi językami, z którymi studenci mogą już mieć pewne doświadczenie). Tak, wymienię to jako profesjonalistę. Wyrównuje szanse studentów, ponieważ prawdopodobnie nikt nie będzie miał wcześniejszego doświadczenia. I to sprawia, że ​​jest mniej prawdopodobne, że będą mogli po prostu skopiować i wkleić rozwiązania do pracy domowej z Internetu.

ML byłby całkiem dobrym wyborem! Ale Python pasuje również do twoich pierwszych dwóch punktów i jest łatwy w użyciu (co oznacza, że ​​nie ma dużych problemów technicznych).
Aivar

Bardzo poleciłbym również Python, szczególnie w połączeniu z dobrym IDE, takim jak Wing IDE.
Ken

6

W latach 80. przeprowadziłem badania dotyczące problemów początkujących programistów. W oparciu o moje dzisiejsze doświadczenie z początkującymi programistami niewiele się zmieniło. Nowicjusze nie mają użytecznego modelu mentalnego tego, co faktycznie robią komputery. Uciekają się do magicznych zaklęć, ponieważ sama maszyna jest magiczna.

Programowanie wymaga dzielenia naturalnie prostych zadań na nienaturalnie małe kroki. Ponieważ nowicjusze nie radzą sobie z tak drobną ziarnistością w codziennym życiu, trudno jest im zrozumieć, jakie powinny być małe kroki, szczególnie gdy nie jest jasne, jakie małe kroki udostępnia maszyna. Ale nawet jeśli uda im się to rozgryźć, wówczas stają w obliczu stilowanej składni i ograniczonej semantyki języka programowania (nienaturalnego języka udającego quasi-naturalny), który steruje tajemniczą maszyną za pomocą zdalnego sterowania.

Ponieważ nie mogą nawiązać połączenia między logicznym rozwiązaniem problemu a funkcjonalnością maszyny, koncentrują się na zaspokojeniu wymagań języka. Pierwszym celem jest napisanie czegoś - wszystkiego - co się kompiluje. Drugim jest poprawienie tego programu - cokolwiek on faktycznie robi - aby zapobiec awariom. Następnie, jeśli mają czas, energię i zainteresowanie, starają się, aby program przyniósł wyniki podobne do tego, czego wymaga problem. Po drodze mogą przypadkowo wygenerować dobrze napisany kod.

Najprawdopodobniej nowicjusze, którzy uczą się programować, odnoszą sukcesy, ponieważ wywnioskowali przydatny model umysłowy komputera, a nie dlatego, że celowo mu dany został i zinternalizowali go.


5

Możesz zadawać im pytania dotyczące fragmentów kodu, które wymagają pisemnych odpowiedzi? Jak „Co robi ten kod?” „Dlaczego programista tak to rozwiązał?” „Czy istnieje lepszy sposób?” Itp.?

To sprawi, że będą myśleć o problemie, co mogą zrobić bez dotykania kodu.


5
  • Rzuć im wyzwanie, aby stworzyli możliwie najkrótsze rozwiązania problemu.
  • Nagradzaj bardziej zwięzłe rozwiązania z zachętą.
  • Twórz ćwiczenia, które dotyczą wyłącznie kodu refaktoryzującego
  • Poproś uczniów, aby wymieniali się zadaniami i kpili z nich pod kątem wydajności i czystości kodu, i wykorzystali niektóre z najmniej wydajnych jako przykłady na rzutniku.

2
Refaktoryzacja jest naprawdę bardzo ważna, aby praktykować. Należy jednak pamiętać, że najkrótsze rozwiązanie niekoniecznie musi być najczystsze, ani najefektywniejsze (w zależności również od definicji tych terminów).
Péter Török

W szkole próbowałem pisać rozwiązania, które miały krótszy charakter niż rozwiązania przyjaciela. Oznaczało to używanie krótkich nazw zmiennych i ogólnie pisanie kodu, który nie czyta się dobrze.
Chrześcijan

@Christian Krótko mówiąc, tak naprawdę nie miałem na myśli krótkiej długości znaków, ponieważ kompilator tak naprawdę nie dba o nazwy zmiennych. Mówię o złożoności kodu ... czyli KISS .
Lynn Crumbling

4

Podobne do pomysłu JoelFans polega na tym, że wykonują początkowe zadania na papierze za pomocą pseudokodu (języka), który tworzysz. Możesz dodawać struktury według własnego uznania i nie martw się magicznym pudełkiem.


4

Zakładam, że przez „kult ładunku” masz na myśli to, że wstawiają rzeczy, które uważają za konieczne, ale w rzeczywistości nie mają absolutnie nic wspólnego z rozwiązaniem problemu.

W takim przypadku zawsze możesz dodać czynnik do oceny, który jest oparty na zwięzłości - pozostawienie niepotrzebnego lub zbędnego kodu w twoim programie prosi o problemy w przyszłości, ponieważ może się zepsuć lub po prostu utrudni utrzymanie.

Zostaliby podobnie oceniani podczas ćwiczenia pisania na lekcji angielskiego - nikt nie chce rzeczy, które wypadają przypadkowo, lub po prostu wędrują, nie przechodząc do sedna.

Gdy brałem udział w zajęciach montażowych, nauczyciel opowiadałby nam o każdym ćwiczeniu, gdyby chciał, abyśmy napisali kod dotyczący prędkości, rozmiaru lub wykorzystania pamięci, a także zaznaczałby, jeśli nie zbliżysz się do optymalizacji tego, o co prosił dla.

...

Jeśli kopiują i wklejają kod z poprzednich podobnych zadań, a tak naprawdę jest to rozwiązanie nowego problemu ... no cóż, to tylko ponowne użycie kodu i chyba, że ​​źle przyjęli założenia dotyczące przydatności kodu do ponownego użycia , Myślę, że jest to całkowicie rozsądne. (np. czytanie z pliku, proponowanie danych wejściowych ... wszystkie części modułowe, które można ponownie wykorzystać. Jeśli nie chcesz, aby to robili, musisz uczynić ćwiczenia odmiennymi.


Problem polega na tym, że kopiują i nie kopiują struktury kodu - po prostu myślą, że ten rodzaj wzoru był przydatny ostatnim razem, więc mam nadzieję, że również tutaj pasuje. Mają nadzieję i próbują zamiast być pewnym siebie.
Aivar

4

Niestety tak działa mózg wielu ludzi. Więc zrozumcie, że są ludzie, których nie można „wyleczyć” z tego. Jest wielu ludzi, którzy nie są w stanie pracować na poziomie mentalnej precyzji niezbędnej do programowania. Niektóre osoby po prostu nie są do tego przystosowane. Nie mówię, że poddawaj się studentom - mówię, nie zakładaj, że upadasz, jeśli nie wszyscy to podnoszą.

Nie wiedząc więcej na temat kontekstu zajęć, powiedziałbym bardziej skupiając się na tych problematycznych uczniach na bardzo podstawowych strukturach - prostych instrukcjach „jeśli / to”, pętlach itp. Proste procedury drukowania liczb nieparzystych, co dziesiąta liczba itp. Nic więcej niż 10 linii kodu każda. Jeśli są „myśleniem magicznym”, najwyraźniej jeszcze nie opanowali tych podstaw. Niech wykonają wiele różnych prostych czynności, dopóki nie zrozumieją, co się dzieje. Ktoś inny wspomniał o napisaniu kodu na papierze - myślę, że byłby to również świetny sposób na wykonanie tych prostych procedur.

Możesz także rozważyć nauczenie się schematów blokowych. Niektóre osoby mogą zobaczyć przepływ algorytmu, a następnie sposób, w jaki łączy się on z kodem, może być pomocny w łączeniu kodu z przepływem.


3

Idealnie na pierwszym wykładzie zacznij od czegoś całkowicie abstrakcyjnego: poproś ich (jako grupę, z tobą jako liderem), aby napisali instrukcje, jak iść na zakupy spożywcze z listy, i stopniowo rozkładaj instrukcje na wysokim poziomie aż osiągną oświecenie.

Pomaga im powiedzieć, że instrukcje te będą dosłownie przestrzegane przez robota, który nie wie, jak wnioskować. Musi to być jednak bardzo praktyczne zajęcie, w którym kierujesz nimi.


Słuszna uwaga! Zrobiłem to i wierzę, że doprowadziło to wielu uczniów na właściwą ścieżkę. Ale nie wszystko.
Aivar

3

Alistair Cockburn mówi o koncepcji Shu-Ha-Ri i jej zastosowaniu do programowania, http://alistair.cockburn.us/Shu+Ha+Ri . Myślę, że może być ważne, aby pamiętać, gdzie są twoi uczniowie w tym kontinuum. Po pierwsze, pomoże to złagodzić frustrację. Kopiowanie / naśladowanie to bardzo naturalna reakcja i akceptowany tryb, gdy zaczynasz się czegoś uczyć. Po drugie, może pomóc ci uzyskać pewne pomysły, jak iść naprzód. Na przykład, możesz rozważyć wybór problemu, który można rozwiązać na wiele sposobów (pętle vs. rekurencja, konsola vs. sieć / GUI), a następnie wyraźnie poproś, aby najpierw rozwiązali go w jeden, a potem w inny sposób - bonus, którego mogą się nauczyć na temat legalnego ponownego wykorzystania kodu, komponowania, tworzenia bibliotek wielokrotnego użytku itp.

Innym udanym sposobem, jaki widziałem, jest szereg projektów, które budują się na sobie nawzajem, udostępniając domyślną, działającą wersję na każdym kroku po przekazaniu zadań, aby zapobiec zaległościom. Każdy etap procesu powinien wprowadzać coś nowego. Przyznaję, że może to być łatwiejsze w klasie projektowej niż w klasie programistycznej, ale nadal powinno być wykonalne. Jedną fajną rzeczą jest to, że wyraźnie dajesz im dobrą (miejmy nadzieję) implementację do porównania z ich na każdym etapie. Ujawnij to porównanie jako zadanie, tj. Dokonaj przeglądu mini-kodu własnego kodu w stosunku do ich wysiłku. Być może zechcesz zrobić jedną z kilku dodatkowych opcji kredytowych.

Chociaż zazwyczaj nie jestem zbyt dobry w „komentarzach”, możesz chcieć uczynić dokumentację kodu jednym z elementów oceny. Poproś, aby opracowali dokument „Teoria działania” dla każdego projektu, który opisuje ich podejście, sposób, w jaki każdy komponent pasuje i jak wspólnie rozwiązują problem. Normalnie chciałbym, żeby kod sam to zrobił, ale nakłoniłoby ich to do nałożenia myślenia i na papier.

Na koniec możesz chcieć wykazać się kreatywnością i poprosić uczniów o wzajemne sprawdzenie kodu i ocenę go. Wywieraj presję ze strony otoczenia. Pozwól temu stać się częścią oceny lub dodatkowego zaliczenia za najwyżej oceniany kod (i dokumenty).


3

Szybka sugestia. Ilekroć mam problem z programowaniem, który wymaga rozwiązania lub debugowania, lubię patrzeć na mój kod i „grać na komputerze”, gdzie w mojej głowie śledzę zmienne i ich wartości oraz to, czego się spodziewam po uruchomieniu każdej linii . Jeśli więc gdzieś skopiowałem jakiś kod, chyba że jest on kompletny i potrzebuję tylko odwoływać się do niego, lubię czytać wiersz po wierszu, aby dokładnie zrozumieć, co się dzieje. Zasadniczo granie na komputerze. Debuger VBA zasadniczo ułatwia to zadanie, ale zmuszenie uczniów do zrobienia tego na papierze może dać im takie podstawy. Co tak naprawdę robi ta linia?


Poleciłem im to zrobić, ale wydaje mi się, że dla niektórych jest to proces zbyt wolny i podatny na błędy, dlatego postanowili go pominąć.
Aivar,

Czy próbowałeś to zrobić przed nimi na projektorze przy użyciu markerów? Jeśli pamiętam moją lekcję programowania w liceum, nasz nauczyciel to zrobił i chociaż większość innych uczniów nie dbała o to, pomyślałem, że to przydatna umiejętność. (Ostrzeżenie o zbliżającym się uogólnieniu) Trudno jest motywować uczniów mojego pokolenia i młodszych, nauczyliśmy się nie zadawać pytań.
Mallow

3

Uczyłem programowania wstępnego na poziomie uczelni. To był chleb powszedni, wszyscy wykładowcy to zrobili i myślę, że zrobiliśmy to całkiem dobrze. Przestrzegaliśmy wspólnego tekstu i mieliśmy wspólne egzaminy, ale każdy z nas miał własną metodę klasy, która działała. Od tego czasu minęło dużo czasu, ale czasami uczę jakiegoś dzieciaka programowania i cały obraz jest mniej więcej taki sam.

Sposób, w jaki to robię, to zaczynać od dołu, tak konkretnie, jak to możliwe. To, co uczniowie wiedzą, to struktura. Mają już wiele pojęć. Oprócz nich buduję kolejne koncepcje i odcinam od koncepcji, które mogą tworzyć, i które przynoszą efekt przeciwny do zamierzonego. Jednocześnie zmuszam ich do uczenia się poprzez działanie .

Zbudowałem mały komputer z układem Intel 8008, trochę EPROM i kilka obwodów. Zaprogramowałem go do grania w duet, kiedy układ I / O był podłączony do kilku głośników. Wyjaśniłbym, jak działał ten mały program, z wewnętrzną pętlą odliczającą licznik. To działałoby jak opóźnienie. Następnie przełącza bit wyjściowy i robi to ponownie. Robiłby to przez chwilę, a następnie przełączałby się na inne opóźnienie, dając inny dźwięk i tak dalej. Układ pamięci miał mały zegar, a gdybym wsunął przewód kondensatora pod jedno z wejść zegara, program działałby bardzo wolno . Klasa słyszała, jak głośniki klikają, klikają, klikają ... Chciałem, aby klasa zrozumiała, że ​​komputer robi bardzo proste rzeczy krok po kroku. Następnie odczepiłem przewód kondensatora i „muzyka” wybuchłaby. (oklaski)

Potem zbudowałem symulator dla bardzo prostego komputera dziesiętnego, mającego 1000 lokalizacji pamięci, z których każda zawiera 4-cyfrową liczbę dziesiętną ze znakiem. Miał bardzo proste kody, takie jak „dodaj do akumulatora”, „skacz, jeśli ujemny” i tak dalej. Chciałbym, żeby napisali małe programy w tym „języku maszynowym”, takie jak dodanie dwóch liczb lub dodanie listy liczb. Następnie mogliby obserwować, jak działa pojedynczo lub przytrzymując klawisz Enter, aby zobaczyć, jak działa „szybko”.

Chodziło o to, aby wprowadzić koncepcję, że komputery mogą wykonywać bardzo niewielką liczbę różnych podstawowych operacji i wykonują je pojedynczo. Ma to na celu przeciwdziałanie wrażeniu, że komputery są skomplikowane, i że robią wszystko jednocześnie i czytają w myślach.

Stamtąd przeszliśmy do programowania w „prawdziwym” języku (BASIC :), zaczynając od bardzo prostych, ale interesujących programów, pracując nad warunkami, pętlami, tablicami, plikami, scalaniem i tak dalej. Celem było wprowadzenie wystarczającego zestawu umiejętności, aby mogli podjąć wybrany przez siebie projekt, ponieważ to jedyna rzecz, która sprawia, że ​​programowanie jest interesujące - zastosowanie, do którego można go zastosować. Rzuciłem kilka pomysłów na projekty, a potem wzięli je stamtąd. Poprosiłbym o pisemne pomysły, a następnie raporty z postępów, aby powstrzymać ich od przełożenia na ostatnią chwilę, a potem panikować. Myślę, że projekty były najlepsze, ponieważ uczyły się we własnym zakresie.

To początkowe ugruntowanie w bardzo konkretnym zrozumieniu tego, co robią komputery, znacznie ułatwiło później nauczanie pojęć, które w przeciwnym razie byłyby prawdziwymi ograniczeniami prędkości, takimi jak tablice lub (w późniejszym czasie) wskaźniki. Mamy tendencję do gloryfikowania koncepcji „abstrakcji” jako tej cudownej rzeczy, ale musi ona być zbudowana na konkretnym fundamencie, a nie na powietrzu.


3

Saself - nauczył programista wierzę animację być największym wyzwaniem w zakresie wiedząc, co kod robi. Gdy program zawiera algorytmy i transformacje matematyczne wykonujące abstrakcyjne manipulacje, jedyny sposób, aby zrozumieć, co matematyka robi w danym momencie (chyba że jesteś geniuszem), wymaga zrozumienia wykonania samego kodu.

Popraw mnie, jeśli mój naiwny pomysł jest błędny. Co chcesz zrobić, to notuniemożliwić uczniom stosowanie „wzorców projektowych”, ale znaleźć sposób, aby upewnić się, że rozumieją, czym są CnP? Następnie poproś uczniów, aby manipulowali animacją. Aby ulepszyć wyjście w animacji, należy zrozumieć, co dzieje się na każdym kroku. W trosce o twoje obawy wyobrażam sobie dobrze przemyślany projekt animacji, który przejawi się w oczywisty sposób, gdy uczeń go „dostanie” - gdy zrealizuje transformację, której się nie spodziewałeś, lub poprawił niektóre powiązane, współzależne zmienne.

Nie znając ograniczeń i celów pedagogicznych, nad którymi pracujesz, nie mogę powiedzieć, że animacja jest kompletną odpowiedzią. Cały program animacji poza zawodami animacyjnymi jest, zaryzykuję zgadnięcie, nie wchodzi w rachubę. Kilka projektów może jednak skutkować czymś pomysłowym i cudownym, co nie jest złe.

Na innej notatce przeczytałem artykuł w gazecie (tak, papier!) Na temat licealnej Olimpiady Kodowania - wot-wot - konkursu dla programistów z college'u. Opis wyzwań był najostrzejszym wyrażeniem czystego kodowania , które pamiętam po przeczytaniu. Zawodnicy są oceniani względem siebie i według standardów dobrej praktyki. W tych konkursach uczniowie muszą zarówno zaplanować swoje rozwiązanie, jak i ręcznie kodować elementarny „wzorzec projektowy”, którego rozwiązanie wymaga ukończenia w terminie. Tak więc rozwiązaniem twojego problemu dotyczącego programowania CnP jest sprawdzenie, czy uczniowie mogą napisać te same „fragmenty kodu”, którymi są CnP'n!

Jestem pewien, że to było w NY Times. Szybkie wyszukiwanie nie znalazło go. Podobnym przykładem jest Międzynarodowy Program Programowania Uczelnianego ACM. Ten konkurs kładzie nacisk na szybkie programowanie: „Błyskawiczne programowanie w zawodach drużynowych jest zdecydowanie dziwaczną umiejętnością, nie do końca jedną z wielu osób poszukujących pracy na szczycie CV”. Dlatego poleciłbym abstrakcję od rzeczywistych problemów .

Również,

HP Code Wars


2

Naucz klasę za pomocą języka programowania, który jest technicznie dobry, ale jest tak niejasny, że nie będzie w stanie znaleźć żadnego istniejącego kodu do skopiowania.


1
Nie martwię się o to, że kopiują czyjeś dzieło, ale własne dzieło lub jakieś fragmenty, które nie są przydatne w danej sytuacji.
Aivar

2

Możesz także traktować ich na własnej skórze.

Znajdź sposób, aby szkodliwe dla nich było kopiowanie i wklejanie. Nie mam dokładnego przykładu, ale jeśli wykonasz pierwsze ćwiczenie, którego rozwiązanie, jeśli wkleisz w podobnie wyglądającym drugim ćwiczeniu, sprowokuj kultowych uczniów w bardzo długim i bolesnym błędzie „niestabilnej niestabilności” lub „cichego uszkodzenia danych”. Tymczasem 2-minutowe myślenie „bez kultu”, przyniosłoby oczywiste rozwiązanie nawet najgorszemu uczniowi (gdyby nie widział pierwszego rozwiązania do ćwiczeń). Może być może uda im się nauczyć lekcji i przemyśleć dwa razy, zanim skopiuje wklejanie kodu do trzeciego ćwiczenia.


1

Wątpię, aby takie zachowanie wynikało z przekonania, że ​​programy to magiczne zaklęcia - bardziej prawdopodobne jest to lenistwo i brak motywacji.

Myślę więc, że Twoim zadaniem jako nauczyciela jest motywowanie uczniów - żaden uczeń, który jest naprawdę zmotywowany, nie wycina i wkleja rozwiązania (dotyczy to tylko programistów pracujących z terminami i ostatecznymi wynikami do spełnienia ...)


Dla niektórych z tych studentów lenistwo i / lub terminy są z pewnością przyczyną. Ale niektórzy pracują naprawdę ciężko ...
Aivar

@Aivar - Jako instruktor masz prawdopodobnie większą wiedzę na temat mocnych i słabych stron uczniów. Z ciekawości, jakie są według ciebie przeszkody dla tych studentów, którzy „ciężko pracują”?
Leigh

@Leigh - Myślę, że nie wytrenowali wystarczająco analitycznej części mózgu i podchodzą do zadań z brutalną siłą - ich metoda pracy nie jest daleka od wyczerpujących poszukiwań. Wyjaśnienie alternatywnego podejścia do nich jest trudne.
Aivar,

@Aivar - Być może na wczesnym etapie może być większy nacisk na analizę. Na przykład projektowanie dwuczęściowych ćwiczeń. Pierwszy segment koncentruje się na elementach składowych kodu. Podczas gdy drugi dekonstruuje, debuguje i analizuje ten sam przykład. tj. zadaje pytania „dlaczego” i omawia sposoby ulepszenia kodu za pomocą korelacji w rzeczywistym świecie z różnymi podejściami (brutalna siła itp.). Zrobione wcześnie i często pomogłoby to utrwalić ich wiedzę i zachęciło ich do postrzegania programowania jako czegoś więcej niż tylko budowy właściwej składni w danym języku.
Leigh

1

Naucz podprogramy. Poproś, aby wzięli kod, który pobierają z poprzednich zadań i zamienili go w podprogram. Naucz ich na temat dokumentacji funkcji, aby pomóc im zrozumieć, co właściwie robi podprogram.


To tak naprawdę nie rozwiązuje problemu.
Pubby

Myślę, że tak. Kult ładunku to włączenie kodu, który nie służy żadnemu celowi. Jeśli dzielą swój kod na podprogramy i dokumentują, co te podprogramy robią, powinno to pomóc. Analiza jest dużą częścią uczenia się, a analiza wymaga dzielenia rzeczy na części.
Tony Topper,

1

Niech wykonają zadanie przed sobą w klasie bez dostępu do Internetu (niech szkoła je odetnie, nie zezwala również na korzystanie z telefonu podczas zajęć). Przynajmniej zrób to dla testów. Nie ma żadnego powodu, że powinni używać Internetu do podstawowych eksperymentów programistycznych. Książka powinna być wystarczającym źródłem do ćwiczeń wprowadzających. Zezwalaj na korzystanie z Internetu, gdy jesteś w zaawansowanej klasie, a oni już nauczyli się myśleć.


1

Nigdy nie przydzielaj im podobnie brzmiących zadań.

Lub, bardziej szalony, naucz się ich TDD od samego początku. Naciska na pisanie (a nie kopiowanie, pisanie) dużej ilości kodu (a mianowicie testów), które faktycznie pomagają sformułować rozwiązywany problem.


Pisanie testów jest często trudniejsze niż pisanie kodu. Sugerowałbym, żeby nauczyciel napisał testy, a następnie dał je uczniom, aby przystąpili do swoich zadań.
TMN

@TMN: To może się nie udać. Studenci byliby domyślnie zachęcani do losowej zmiany kodu do momentu zdania testów.
Goran Jovic

@GoranJovic: Nie jestem pewien, czy zgadzam się z „domyślnie zachęcanym”, ale zdaję sobie sprawę, że nie ma łatwego sposobu na odróżnienie kodu napisanego z zamiarem od hakowania razem kodu, aby przejść testy. Oczywiście ten problem nie ogranicza się również do środowiska akademickiego ...;)
TMN

@TMN: I stopniowo narastałby „jeden krok (tak łatwy, jak potrzebuje programista) krok po kroku”.
herby

Rozwiązanie: zapewnij minimalny zestaw testów, z których studenci mogą korzystać podczas pisania swoich programów, ale ostrzegaj ich, że ich programy będą oceniane na podstawie o wiele bardziej kompleksowego zestawu testów ORAZ zostaną uruchomione na podstawie testów, które piszą studenci.
Barry Brown,

1

Coś, co uważam za bardzo pomocne dla osób w mojej klasie, pisze na ich temat mały projekt na temat, który mogą wybrać sami.

Kiedy zacząłem programować, było mi również ciężko i dużo kopiowałem w klasie. Potem w domu zacząłem tworzyć małe gry, ponieważ chcę zostać programistą gier i odkryłem, że łatwiej je tworzyć. Mimo że były znacznie trudniejsze niż rzeczy, które widzieliśmy w klasie. Tylko dlatego, że mnie to zainteresowało.

Kilka innych osób w mojej klasie poszło z 40-50% na egzaminach do 90-100%, ponieważ zrobili dokładnie to samo.


1

Kiedy byłem na kursie programowania wstępnego, instruktor wymagał od wszystkich, aby napisali algorytm po angielsku, wydrukowali go i oddali, zanim zaczęliśmy pisać kod. Następnie musielibyśmy umieścić wiele komentarzy, takich jak Utwórz zmienne, Uzyskaj dane wejściowe od użytkownika, Wykonaj obliczenia, Wydrukuj wydruk itp. Byłem zadokowany kilka razy za brak wystarczającej liczby komentarzy, gdy myślałem, że jest ich dużo, więc zacząłem dodawać więcej. Zmusiło mnie to do zastanowienia się nad tym, co robię, do napisania rozwiązań i ciągłego tłumaczenia między angielskim a Javą.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.