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.