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ą?
Odpowiedzi:
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:
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.
źródło
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ć:
źródło
&&
- choć podejrzewam, że może się również udać jako operacja bitowa.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.
źródło
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.
źródło
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.
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ść”),
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,
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),
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.
źródło
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.
źródło
while not at-corner do take-one-step end
rzeczywistego kodu bez „wypełniania” rzeczy takich jak zmienne i typy danych. Przepraszam, moja odpowiedź wydaje się nieco trudna do refleksji.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.
źródło
if
działają oświadczenia i umieć pisać od zera, zanim przejdą dalej. Uruchom część poznawczą, a następnie przejdź do aplikacji.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.
źródło
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ą.
źródło
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
Chodzi o to, że bazujesz na poprzednim zadaniu zamiast przetwarzać stare zadania dla nowego zadania.
źródło
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
źródło
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.
źródło
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.
źródło
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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).
źródło
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?
źródło
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.
źródło
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
not
uniemoż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
źródło
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.
źródło
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.
źródło
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 ...)
źródło
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.
źródło
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ć.
źródło
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.
źródło
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.
źródło
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ą.
źródło