Πρώτα, λίγα λόγια για το ίδιο το μάθημα. Πριν καν ξεκινήσει, οι μαθητές μας έλαβαν μια "προ-εργασία" - η οποία περιείχε οδηγίες και ασκήσεις που έπρεπε να ολοκληρωθούν πριν από το μάθημα. Οι εργασίες τους περιλάμβαναν την εγκατάσταση του Linux, την εξοικείωση με ένα τερματικό και κάποια βασικά στοιχεία HTML, CSS και Git.
Οι υπολογισμοί
Κατά τη διάρκεια των επόμενων τεσσάρων μηνών συναντιόμασταν κάθε δύο εβδομάδες και βήμα προς βήμα, ανακαλύπταμε το The Awesome World of Ruby et al. Το μάθημα κάλυπτε τη γλώσσα Ruby, Ruby on Rails, Javascript και μερικά δημοφιλή εργαλεία για εφαρμογές RoR όπως τα Devise, Pundit, Sidekiq ή Carriewave.
Κάθε μαθητής είχε επίσης έναν μέντορα, ο οποίος ήταν υπεύθυνος για την παρακίνηση των μαθητών και τον έλεγχο των εργασιών τους μεταξύ των συναντήσεων.
Το σχέδιο επίθεσης
Ως δάσκαλος, ήρθα προετοιμασμένος με 3 χρόνια εμπειρίας με το Ruby on Rails, 10 χρόνια εμπειρίας με τον προγραμματισμό γενικά και κάποιες παρουσιάσεις με θέματα και ασκήσεις που έπρεπε να γίνουν.
Εκτός από ένα σύντομο μάθημα στη διαχείριση Linux που είχα κάνει στο παρελθόν, δεν είχα καμία εμπειρία στη διδασκαλία. Όσον αφορά τους μαθητές, ήξερα μόνο ότι θα ήταν δέκα και ότι προέρχονταν από πολύ διαφορετικά υπόβαθρα - για κάποιους από αυτούς ήταν η πρώτη τους επαφή με τον προγραμματισμό, ενώ άλλοι προσπάθησαν να μάθουν μόνοι τους C ή Ruby πριν εγγραφούν στο μάθημα.
Αποφάσισα να πάρω δύο αποφάσεις - θα είμαι υπομονετική και θα εξηγώ τα πάντα αν χρειαστεί (όχι "τα έχουμε ήδη καλύψει"). Η πρώτη απόφαση άντεξε στο χρόνο, αλλά η δεύτερη - προφανώς - όχι. Αποφάσισα να μην κάνω ιδιαίτερη προετοιμασία όσον αφορά τα πράγματα που θα διδάξω - δουλεύω με Ruby/Rails κάθε μέρα και νιώθω αρκετά σίγουρος για τις ικανότητές μου σε αυτόν τον τομέα. Το πολύ-πολύ να διαβάσω τις παρουσιάσεις που είχα.

Η πρόκληση
Ένα από τα πρώτα πράγματα που μου έγινε απολύτως σαφές αμέσως μετά την έναρξη των μαθημάτων - δεν μπορείς να εξηγήσεις τα πάντα. Είναι μια πολύ θλιβερή διαπίστωση για κάποιον σαν εμένα, που του αρέσει να εμβαθύνει και να ανακαλύπτει πώς λειτουργούν τα πράγματα, αλλά στον περιορισμένο χρόνο μιας συνάντησης υπάρχουν μόνο τόσα πολλά που μπορείς να διδάξεις και να τα θυμούνται οι μαθητές. Αποδεικνύεται ότι μπορείτε να είστε ένας πολύ αξιοπρεπής προγραμματιστής Ruby χωρίς να γνωρίζετε ακριβώς πώς αναπαρίστανται οι συστοιχίες στη μνήμη ή πώς ακριβώς λειτουργεί το Devise.
Τα μαθήματα γίνονταν τα Σάββατα και τις Κυριακές από τις 9 π.μ. έως τις 5 μ.μ. Είναι σημαντικό να συνειδητοποιήσετε ότι η διδασκαλία είναι αρκετά εξαντλητική δουλειά - εκτός από την εξήγηση της ύλης, πρέπει επίσης να είστε πάντα έτοιμοι να απαντήσετε σε σχετικές (ή όχι και τόσο σχετικές) ερωτήσεις και να λύσετε διάφορα προβλήματα που έχουν οι μαθητές σας.
Ο καφές είναι φίλος σας, αλλά το πιο σημαντικό είναι η προαναφερθείσα υπομονή. Για τους ανθρώπους που δεν έχουν ασχοληθεί με τον προγραμματισμό στο παρελθόν, έννοιες που είναι προφανείς για τους προγραμματιστές - όπως βρόχοι, τύποι ή ακόμη και μεταβλητές - πρέπει να μάθουν και δεν είναι μια άμεση διαδικασία. Αν προγραμματίζετε εδώ και ΧΧ χρόνια, θεωρείτε τα μαθηματικά εύκολα, μπορείτε να απαριθμήσετε όλα τα γνωστά παραδείγματα προγραμματισμού στη μέση της νύχτας, ίσως είναι δύσκολο να τοποθετήσετε τον εαυτό σας στη θέση ενός ατόμου που δεν είναι πραγματικά σίγουρο σε ποια πλευρά του σημείου ισότητας μπαίνει το όνομα της μεταβλητής. Αλλά είναι ζωτικής σημασίας να το κάνετε. Βασικές έννοιες όπως οι μεταβλητές, οι βρόχοι ή οι πίνακες γίνονται τόσο φυσικές που είναι δύσκολο να κατανοήσει κανείς πώς μπορεί κάποιος να μην τις καταλάβει αμέσως, αλλά είναι πιο δύσκολες από ό,τι φαίνονται σε "εμάς τους προγραμματιστές".
Μια πρόσθετη δυσκολία, ειδικά στην αρχή του μαθήματος, ήταν να εξηγήσουμε αυτές τις έννοιες ώστε να γίνουν κατανοητές. Κατά τη γνώμη μου, δεν είναι δυνατόν να μάθει κανείς το Rails χωρίς να μάθει Ruby - αν και ξέρω ότι κάποιοι υποστηρίζουν ότι δεν ισχύει κάτι τέτοιο. Είναι αλήθεια ότι τα Rails έχουν τα δικά τους μοτίβα και πολλά πράγματα μπορεί να τα θυμάται κανείς παρά να τα μαθαίνει στην αρχή. Ωστόσο, νομίζω ότι για να γίνει κάποιος ενσυνείδητος προγραμματιστής RoR, μια μέτρια κατανόηση της Ruby, της OOP ή της SQL είναι απαραίτητη. Το να διδάσκεις τους ανθρώπους να προγραμματίζουν είναι αρκετά διαφορετικό από το να διδάσκεις το Rails - ενώ με το Rails υπάρχουν πολλά που μπορείς να περιμένεις να γίνουν απλά αποδεκτά ή να τα πιστέψεις (κανείς δεν χρειάζεται να ξέρει πώς λειτουργούν τα callbacks στην αρχή - μόνο τι μπορούν να κάνουν), οι έννοιες του προγραμματισμού πρέπει να εξηγούνται με μεγαλύτερη λεπτομέρεια.
Ενεργοποίηση της Δύναμης
Πώς γίνεται αυτό;
Υπομονετικά.
Πιθανόν να φαίνεται σαν να επαναλαμβάνομαι συνεχώς, αλλά δεν μπορώ να τονίσω αρκετά πόσο σημαντική είναι η υπομονή. Ακόμη και οι πιο παρακινημένοι μαθητές μου ήταν γνωστό ότι έκαναν ένα συντακτικό λάθος εδώ και εκεί - είναι μέρος της φυσιολογικής διαδικασίας μάθησης και δεν υπάρχει πραγματικά τίποτα άλλο να κάνει ένας δάσκαλος εκτός από το να δείξει ποιο είναι το λάθος και πώς να το διορθώσει. Με τον καιρό, θα μάθουν να τα διορθώνουν μόνοι τους, αλλά αυτό απαιτεί πολύ περισσότερα από ένα ή δύο λάθη.
Ένα άλλο πράγμα που πρέπει να σημειωθεί είναι ότι το Ruby δεν είναι τόσο εύκολο όσο φαίνεται. Αν ξεκινήσατε να μαθαίνετε Ruby με γνώσεις C/Java/Python, όλα πιθανόν να σας φαίνονταν τόσο καθαρά και ωραία και απλά. Προσπαθήστε όμως να το σκεφτείτε και θα το παρατηρήσετε:
- Τι είναι αυτές οι παρενθέσεις; Πρέπει να τις χρησιμοποιήσω; Δεν θα έπρεπε;
- Τι είναι αυτό;
αυτο
πράγμα; Μερικές φορές πρέπει να το χρησιμοποιήσω (πχ. attr_writer
– self.variable = ...
), μερικές φορές όχι (attr_reader
– μεταβλητή
) και μερικές φορές δεν μπορώ! (private def some_method
– self.some_method
θα πετάξει ένα σφάλμα) - Μπλοκ. Βάζω στοίχημα ότι ακόμη και κάποιοι έμπειροι προγραμματιστές (διαφορετικών γλωσσών) θα χρειαστούν λίγο περισσότερο από το αναμενόμενο για να καταλάβουν
#inject
Εκτός από την απλή διόρθωση των λαθών, υπάρχει και το ζήτημα της πραγματικής μεταφοράς της κατανόησής σας στους μαθητές σας. Για να το κάνετε αυτό, θα χρειαστείτε μεγάλη ευελιξία. Ορισμένοι μαθητές αρκέστηκαν στο να είναι η Array απλώς μια διατεταγμένη λίστα στοιχείων. Άλλοι χρειάζονταν πιο οπτική αναλογία, όπως ένα ράφι με αριθμημένες θέσεις στις οποίες μπορείτε να τοποθετήσετε πράγματα. Βρήκα τον εαυτό μου να εξηγεί τα ίδια πράγματα πολλές φορές με διαφορετικούς τρόπους - κάτι που είναι αρκετά απαιτητική άσκηση!
Αλλά, όπως είπα και πριν, δεν μπορείς να εξηγήσεις τα πάντα. Όταν εξηγούσα τις σχέσεις στο Rails, ήταν περισσότερο ένα "έτσι το κάνεις και σου επιτρέπει να κάνεις αυτό και εκείνο. Αν το θέλεις αυτό, είναι φοβερό". Ευτυχώς κανείς δεν με ρώτησε πώς λειτουργεί αυτό - δεν νομίζω ότι οι νεαροί προγραμματιστές χρειάζεται να γνωρίζουν για τις αντανακλάσεις.
Τοποθέτηση σε κατάσταση
Λόγω της μορφής του μαθήματός μας (συναντήσεις κάθε δεύτερο Σαββατοκύριακο και μεγάλα διαλείμματα) έπρεπε να διασφαλίσουμε ότι οι περίοδοι μεταξύ αυτών των Σαββατοκύριακων είναι παραγωγικές για τους μαθητές μας - χωρίς την εξάσκησή τους σε αυτό το διάστημα το μάθημα δεν θα λειτουργούσε καθόλου.
Μερικοί από τους συναδέλφους μου συμφώνησαν να γίνουν μέντορες για τους μαθητές του μαθήματος. Το έργο των μεντόρων ήταν να επαληθεύουν τις ασκήσεις που είχαν ανατεθεί κατά τη διάρκεια των συναντήσεων του Σαββατοκύριακου και να βοηθούν σε θέματα που προέκυπταν κατά την ολοκλήρωσή τους. Οι φοιτητές επικοινωνούσαν με τους μέντορες μέσω του Slack.
Ήμουν μέντορας για δύο από τους μαθητές μου. Ήταν σημαντικά διαφορετική μορφή διδασκαλίας - και γεμάτη από τις δικές της παγίδες. Ένα πράγμα που συνειδητοποίησα λίγο αργά είναι ότι ένας καλός προγραμματιστής πρέπει να είναι ανεξάρτητος - θα πρέπει τουλάχιστον να προσπαθεί να λύνει προβλήματα μόνος του προτού ζητήσει βοήθεια. Και το να είμαι διαρκώς διαθέσιμος στο Slack όχι μόνο μου έπαιρνε πολύ χρόνο, αλλά και δεν ενέπνεε τέτοια ανεξαρτησία.
Μην με παρεξηγήσετε - πολλές από τις ερωτήσεις που μου τέθηκαν ως μέντορας ήταν έγκυρες και η απάντησή τους ήταν μια επέκταση της γνώσης των μαθητών. Είναι όμως πολύ εύκολο να μπεις σε κατάσταση "δασκάλου" - και να εξηγήσεις ξανά όλα τα θέματα από τις συναντήσεις του Σαββατοκύριακου. Από τη σημερινή οπτική γωνία νομίζω ότι ο ρόλος ενός μέντορα είναι να κάνει επισκόπηση, να παρέχει χρήσιμους συνδέσμους και να κάνει κάποιες ερωτήσεις που μπορεί να βοηθήσουν στην εξεύρεση της λύσης. Περιστασιακές εξηγήσεις μπορεί να συμβαίνουν, αλλά δεν θα πρέπει να αποτελούν την πλειονότητά τους.
Η χρήση της νοημοσύνης
Κάθε μαθητής είναι διαφορετικός. Μία από τις μεγαλύτερες δυσκολίες ήταν να προσαρμόσουμε τον ρυθμό του μαθήματος ώστε να ταιριάζει καλύτερα σε όλους τους μαθητές. Λόγω του διαφορετικού υπόβαθρου και του γενικού επιπέδου ευκολίας στην αποδοχή νέων ιδεών μεταξύ των μαθητών είναι σχεδόν αδύνατο εγχείρημα.
Το χρονοδιάγραμμά μας ήταν 9 συναντήσεις - επί 2 ημέρες επί 8 ώρες μας έδινε 144 ώρες για να πάμε από το 0 στο Ruby-hero. Ήταν υψίστης σημασίας να κάνουμε ολόκληρη τη διδακτέα ύλη σε αυτό το χρονικό διάστημα - το οποίο από μόνο του επέβαλε έναν αρκετά γρήγορο ρυθμό. Οι τρεις πρώτες συναντήσεις αφορούσαν αποκλειστικά τη Ruby - στη συνέχεια μια συνάντηση για την SQL, στη συνέχεια την RoR και μια συνάντηση για το JS στο ενδιάμεσο.
Ως δάσκαλος, έπρεπε πάντα να ξέρω ποιος καταλαβαίνει λίγο ή πολύ μέρος της ύλης που παρουσίαζα. Μερικές φορές αρκούσε να ρωτήσω αν αυτό είναι κατανοητό, μερικές φορές έκανα μικρά τεστ. Για παράδειγμα, ζήτησα από όλους τους μαθητές μου να μου στείλουν τους δικούς τους ορισμούς για τις έννοιες Ruby, όπως κατηγορία
, αυτο
, μέθοδος
, μεταβλητή
κ.λπ., στο Slack. Εάν κάποιο ζήτημα ήταν ιδιαίτερα ασαφές, θα επέστρεφα και θα προσπαθούσα να το εξηγήσω ξανά.
Ψευδαίσθηση και πραγματικότητα
Συνοψίζοντας, η διδασκαλία ήταν μια ακόμη πιο δύσκολη προσπάθεια απ' ό,τι νόμιζα. Μπορεί επίσης να είναι πολύ ικανοποιητική. Παρ' όλα αυτά, είναι σκληρή δουλειά και τα αποτελέσματά της δεν εξαρτώνται μόνο από τον δάσκαλο - η προσπάθεια του ίδιου του μαθητή είναι ακόμη πιο σημαντική για τη μάθησή του. Αυτό κάνει τη διδασκαλία πολύ διαφορετική από τον προγραμματισμό, όπου συνήθως μπορείς να κατέχεις όλες τις επιτυχίες και τις αποτυχίες. Είναι σημαντικό να θυμόμαστε αυτή τη διαφορά.
Σας αναγκάζει επίσης να σκεφτείτε θέματα που συνήθως δεν σκέφτεστε - η εξήγηση των πραγμάτων σας δίνει επίσης τη δυνατότητα να τα κατανοήσετε καλύτερα. Με αυτόν τον τρόπο η διδασκαλία μπορεί επίσης να σας κάνει καλύτερο προγραμματιστή.