Najpierw kilka słów o samym kursie. Przed jego rozpoczęciem nasi studenci otrzymali zadanie "prework", które zawierało instrukcje i ćwiczenia do wykonania przed rozpoczęciem kursu. Ich zadania obejmowały instalację Linuksa, zapoznanie się z terminalem i podstawami HTML, CSS i Git.
Obliczenia
Przez następne cztery miesiące spotykaliśmy się co dwa tygodnie i krok po kroku odkrywaliśmy The Awesome World of Ruby et al. Kurs obejmował język Ruby, Ruby on Rails, Javascript oraz kilka popularnych narzędzi do aplikacji RoR, takich jak Devise, Pundit, Sidekiq czy Carriewave.
Każdy student miał również mentora, który był odpowiedzialny za motywowanie studentów i sprawdzanie ich pracy pomiędzy spotkaniami.
Plan ataku
Jako nauczyciel przyszedłem przygotowany z 3-letnim doświadczeniem z Ruby on Rails, 10-letnim doświadczeniem z programowaniem w ogóle i kilkoma prezentacjami z zagadnieniami i ćwiczeniami do wykonania.
Poza krótkim kursem zarządzania Linuksem, który odbyłem wcześniej, nie miałem żadnego doświadczenia w nauczaniu. Jeśli chodzi o studentów, wiedziałem tylko, że będzie ich dziesięciu i że pochodzą z bardzo różnych środowisk - dla niektórych z nich jest to pierwszy kontakt z programowaniem, podczas gdy inni próbowali nauczyć się C lub Ruby na własną rękę przed zapisaniem się na kurs.
Postanowiłem zrobić dwa postanowienia - będę cierpliwy i wyjaśnię wszystko, jeśli zajdzie taka potrzeba (żadnego "już to omówiliśmy"). Pierwsze postanowienie przetrwało próbę czasu, ale drugie - oczywiście - nie. Postanowiłem, że nie będę się specjalnie przygotowywał do tego, czego będę uczył - pracuję z Ruby/Rails na co dzień i czuję się dość pewny swoich umiejętności w tym zakresie. Co najwyżej przeczytałem prezentacje, które miałem.
Wyzwanie
Jedną z pierwszych rzeczy, która stała się dla mnie absolutnie jasna tuż po rozpoczęciu kursu - nie można wyjaśnić wszystkiego. To bardzo smutna świadomość dla kogoś takiego jak ja, kto lubi zagłębiać się i odkrywać, jak rzeczy działają, ale w ograniczonym czasie jednego spotkania można nauczyć tylko tyle, co może zostać zapamiętane przez uczniów. Okazuje się, że można być bardzo przyzwoitym programistą Ruby, nie wiedząc dokładnie, w jaki sposób tablice są reprezentowane w pamięci lub jak dokładnie działa Devise.
Lekcje odbywały się w soboty i niedziele w godzinach 9-17. Ważne jest, aby zdać sobie sprawę, że nauczanie jest dość wyczerpującą pracą - oprócz wyjaśniania materiału, musisz być zawsze gotowy, aby odpowiedzieć na powiązane (lub nie tak powiązane) pytania i rozwiązać różne problemy, które mają twoi uczniowie.
Kawa jest twoim przyjacielem, ale najważniejsza jest wspomniana wcześniej cierpliwość. Dla osób, które nie miały wcześniej do czynienia z kodowaniem, pojęcia oczywiste dla programistów - takie jak pętle, typy czy nawet zmienne - wymagają nauki i nie jest to proces błyskawiczny. Jeśli programujesz od XX lat, uważasz matematykę za łatwą, potrafisz wymienić wszystkie znane paradygmaty programowania w środku nocy, może być trudno postawić się w sytuacji osoby, która nie jest pewna, po której stronie znaku równości znajduje się nazwa zmiennej. Jest to jednak bardzo ważne. Podstawowe koncepcje, takie jak zmienne, pętle czy tablice, stają się tak naturalne, że trudno zrozumieć, jak ktoś może ich nie rozumieć od razu, ale są trudniejsze, niż się wydaje "nam, programistom".
Dodatkową trudnością, szczególnie na początku kursu, było wyjaśnienie tych pojęć tak, aby były dobrze zrozumiałe. Moim zdaniem nie da się nauczyć Railsów bez nauki Rubiego - choć wiem, że niektórzy twierdzą, że tak nie jest. To prawda, że Railsy mają swoje własne wzorce i wiele rzeczy można zapamiętać, a nie nauczyć się ich na początku. Uważam jednak, że aby zostać świadomym programistą RoR, umiarkowane zrozumienie Rubiego, OOP lub SQL jest koniecznością. Uczenie ludzi programowania jest czymś zupełnie innym niż uczenie Railsów - podczas gdy w przypadku Railsów można oczekiwać, że wiele zostanie po prostu zaakceptowanych lub uwierzonych (nikt nie musi wiedzieć, jak działają callbacki na początku - tylko co mogą zrobić), koncepcje programistyczne powinny być wyjaśnione bardziej szczegółowo.
Angażowanie Mocy
Jak więc to zrobić?
Cierpliwie.
Prawdopodobnie wydaje się, że cały czas się powtarzam, ale nie mogę wystarczająco podkreślić, jak ważna jest cierpliwość. Nawet moi najbardziej zmotywowani uczniowie popełniali tu i ówdzie błędy składniowe - jest to część normalnego procesu uczenia się i nauczyciel nie może zrobić nic poza pokazaniem, na czym polega błąd i jak go naprawić. Z czasem nauczą się naprawiać je samodzielnie, ale zajmie to znacznie więcej czasu niż jeden lub dwa błędy.
Kolejną rzeczą, na którą należy zwrócić uwagę, jest to, że Ruby nie jest tak łatwy, jak się wydaje. Jeśli zacząłeś uczyć się Rubiego ze znajomością C/Javy/Python, wszystko prawdopodobnie wydaje się takie czyste, ładne i proste. Spróbuj jednak o tym pomyśleć, a zauważysz:
- O co chodzi z nawiasami? Czy powinienem ich używać? Czy nie powinienem?
- Co to jest
jaźń
rzecz? Czasami muszę go użyć (np. attr_writer
– self.variable = ...
), czasami nie (attr_reader
– zmienny
) i czasami nie mogę! (private def some_method
– self.some_method
wyrzuci błąd)
- Bloki. Założę się, że nawet niektórzy doświadczeni programiści (różnych języków) potrzebowaliby chwili więcej niż oczekiwano, aby zrozumieć
#inject
Oprócz prostego naprawiania błędów, istnieje kwestia faktycznego przekazywania uczniom swojego zrozumienia rzeczy. Aby to zrobić, będziesz potrzebował dużej elastyczności. Niektórzy uczniowie byli zadowoleni z tego, że Array jest po prostu uporządkowaną listą elementów. Inni potrzebowali bardziej wizualnej analogii, jak półka z ponumerowanymi miejscami, na których można umieszczać rzeczy. Okazało się, że wyjaśniam te same rzeczy wiele razy na różne sposoby - co jest dość wymagającym ćwiczeniem!
Ale, jak powiedziałem wcześniej, nie można wyjaśnić wszystkiego. Kiedy wyjaśniałem relacje w Railsach, było to raczej "tak to się robi i pozwala to robić to i tamto. Chcesz tego, to super". Na szczęście nikt nie zapytał mnie, jak to działa - nie sądzę, by młodsi programiści musieli wiedzieć o odbiciach.
Pozycjonowanie sytuacyjne
Ze względu na format naszego kursu (spotkania w co drugi weekend i długie przerwy) musieliśmy upewnić się, że okresy między tymi weekendami są produktywne dla naszych studentów - bez ich ćwiczeń w tym czasie kurs w ogóle by nie działał.
Niektórzy z moich współpracowników zgodzili się zostać mentorami dla uczestników kursu. Praca mentorów polegała na weryfikowaniu ćwiczeń, które zostały przydzielone podczas weekendowych spotkań i pomaganiu w rozwiązywaniu problemów, które pojawiały się podczas ich wykonywania. Studenci komunikowali się z mentorami za pośrednictwem Slacka.
Byłem mentorem dla dwóch moich studentów. Była to znacznie inna forma nauczania - i pełna własnych pułapek. Jedną z rzeczy, z których zdałem sobie sprawę nieco za późno, jest to, że dobry programista musi być niezależny - powinien przynajmniej próbować rozwiązywać problemy samodzielnie, zanim poprosi o pomoc. A bycie dostępnym na Slacku przez cały czas nie tylko zabierało mi mnóstwo czasu, ale też nie inspirowało do takiej niezależności.
Nie zrozum mnie źle - wiele pytań, które zadawano mi jako mentorowi, było ważnych, a odpowiadanie na nie poszerzało wiedzę uczniów. Bardzo łatwo jest jednak przejść do "trybu nauczyciela" - i ponownie wyjaśnić wszystkie kwestie z weekendowych spotkań. Z dzisiejszej perspektywy myślę, że rolą mentora jest przeglądanie, dostarczanie przydatnych linków i zadawanie pytań, które mogą pomóc w znalezieniu rozwiązania. Okazjonalne wyjaśnianie może się zdarzyć, ale nie powinno stanowić większości.
Wykorzystanie inteligencji
Każdy uczeń jest inny. Jedną z większych trudności było dostosowanie tempa kursu do potrzeb wszystkich studentów. Ze względu na różne pochodzenie i ogólny poziom łatwości w akceptowaniu nowych pomysłów między studentami jest to prawie niemożliwe.
Nasze ramy czasowe wynosiły 9 spotkań - razy 2 dni razy 8 godzin dało nam 144 godziny na przejście od 0 do Ruby-hero. Najważniejsze było zrobienie całego sylabusa w tym czasie - co samo w sobie wymusiło dość szybkie tempo. Pierwsze trzy spotkania dotyczyły Rubiego - potem jedno spotkanie dla SQL, potem RoR i jedno spotkanie dla JS pomiędzy.
Jako nauczyciel zawsze musiałem wiedzieć, kto mniej więcej rozumie część prezentowanego przeze mnie materiału. Czasami wystarczyło zapytać, czy to jest zrozumiałe, czasami robiłem małe testy. Na przykład, poprosiłem wszystkich moich uczniów o przesłanie mi ich własnych definicji pojęć Ruby, takich jak klasa
, jaźń
, metoda
, zmienny
itp. na Slacku. Jeśli jakaś kwestia była szczególnie niejasna, wracałem i próbowałem wyjaśnić ją ponownie.
Iluzja i rzeczywistość
Podsumowując, nauczanie było jeszcze trudniejszym przedsięwzięciem, niż myślałem. Może być również bardzo satysfakcjonujące. Niemniej jednak jest to ciężka praca, a jej efekty nie zależą wyłącznie od nauczyciela - wysiłek samego ucznia jest jeszcze ważniejszy w jego nauce. To sprawia, że nauczanie bardzo różni się od programowania, gdzie zazwyczaj można być właścicielem wszystkich sukcesów i porażek. Ważne jest, aby pamiętać o tej różnicy.
Zmusza również do myślenia o kwestiach, o których zwykle się nie myśli - wyjaśnianie rzeczy pozwala również lepiej je zrozumieć. W ten sposób nauczanie może również uczynić cię lepszym programistą.