o propunere privind predarea programării în școli

duminică, 10 Feb 2013, 18:10

Prezentul articol pornește de la o discuție iscată pe Facebook [i] de către Laura via rosedu. M-am decis să public o însemnare separată în primul rând pentru că mă ajută să îmi pun oareșce gânduri în ordine, departe de zgomotul rețelelor sociale, și în al doilea rând fiindcă am mai scris în trecut pe tema asta, iar acum doar profit de ocazie pentru a dezvolta subiectul.

A se nota că am folosit termenul „programare” și nu pe cel de „informatică”. Numele atribuit disciplinei în școli e o idee nefericit, pentru că se referă inclusiv la domenii precum teoria informației, ori să fim serioși, copiii de liceu n-au nevoie de exemplu de teorema Shannon-Nyquist. Scopul „informaticii” din învățământul preuniversitar e să îi familiarizeze pe elevi cu utilizarea calculatoarelor – unde GNU/Linux s-ar potrivi de minune, pentru că Windows au deja acasă – și cu programarea acestora, și nu în ultimul rând să îi învețe câteva concepte generale din știința calculatoarelor, adică ce-i ăla un arbore, o listă sau o bază de date, plus doi-trei algoritmi.

În ceea ce privește știința calculatoarelor, Dijkstra a exprimat perfect problema în cadrul eseului său „On the Cruelty of Really Teaching Computer Science”. În ceea ce privește utilizarea programelor precum procesorul de text, sistemul de gestiune a bazei de date și așa mai departe, mi se pare că prezenta programă face o treabă relativ bună, cu mențiunea că generației tinere îi va fi atât de util să învețe Word cum îmi e mie util să învăț să merg. Sigur, s-ar putea și aici preda chestii mai avansate, însă nu observ o problemă arzătoare în sensul ăsta [ii].

În fine, în ceea ce privește programarea, care-i de fapt cea mai importantă disciplină, pentru că de exemplu definește cea mai eficientă modalitate de a comunica cu calculatorul, lucrurile nu stau foarte simplu. În prezent, din câte știu, în licee se predă fie o struțocămilă între C și C++, fie Pascal. Nu îmi e clară motivația din spatele deciziei de a preda C/C++, fiindu-mi însă clară cea de a preda Pascal: limbajul a fost conceput din capul locului pentru scopuri didactice, fiind în același timp nu prea departe ca mod de gândire de alte limbaje procedurale. Faptul că are tipuri statice mi se pare un avantaj; de asemenea pointerii sunt utili pentru implementarea anumitor structuri de date, cu toate că introducerea lor mai devreme de clasa a XI-a sau a XII-a mi se pare că ar face mai mult rău decât bine.

De aici se poate înțelege că nu am nimic cu predarea limbajelor cum ar fi Pascal, sau poate chiar C, la nivelul liceului. Constrângerea cea mai mare aici este însă cea de predare cât mai devreme cu putință a unor aplicații care să aibă ceva utilitate practică: un program care criptează/decriptează folosind ceva cifrări simple, un editor de text grafic foarte spartan sau orice alte chițibușuri din astea ar putea să le trezească interesul potențialilor programatori „pe bune”, să îi îndemne să facă ceva util și să contribuie eventual la proiecte deja existente [iii]. Ideea e aceea că elevul de liceu o să se plictisească dacă îi spui cum să bată cuiele; în punctul ăla, el trebuie să aibă deja o idee despre cum se face asta și să afle în primul rând ce ar putea face util cu ciocanul și eventual cum să bată cuiele într-un mod care să îl ajute să rezolve probleme mai bine.

Pentru asta, e musai ca predarea programării să înceapă înaintea liceului, cât mai devreme posibil, de preferat în paralel cu predarea matematicii. Privind lucrurile într-un mod mai abstract, programarea e a doua disciplină ca importanță după aritmetică, dacă nu la fel de importantă. Iar dacă Pascal se potrivește foarte bine cerințelor liceului, el nu prea are ce căuta în mintea elevului de școală generală, dat fiind că se depărtează prea tare de limbajul matematic esențial la nivelul ăla.

Spuneam mai demult că nu sunt de acord deloc cu predarea Python în licee. Cu toate astea, limbajul mi se pare foarte potrivit [iv] pentru școala generală, tocmai pentru că ascunde pe cât posibil lucrurile neesențiale pentru mintea unui copil, iar aici intră toate chestiile mai mult sau mai puțin abstracte, inclusiv conceptul de tip de date. Deși Python e tipat dinamic, fapt care poate da bătăi de cap la capitolul debugging, accentul pe obiecte și definirea lejeră a unor obiecte cum ar fi listele sau dicționarele sunt aspecte care îi pot ajuta să scrie foarte ușor algoritmi simpli și să se joace inclusiv cu elemente de interfață grafică, cel mai relevant fiind aici desenul.

Alegerea mea preferată ar fi și aici însă cel mai probabil Haskell. Înainte să vă apucați să îmi dați în cap și să mă întrebați ce am fumat, să știți că ideea nu-i deloc originală, ea fiind pusă în practică într-o școală de undeva din Statele Unite. Haskell mi se pare limbajul ideal pentru un astfel de demers, în primul rând pentru că e declarativ, iar declarațiile sunt în general ecuații, în mare măsură la fel ca în matematicile predate în școală. În al doilea rând și la fel ca Python, Haskell poate face uz de așa-zisul „duck typing”, ascunzând declarațiile de tip atunci când acestea nu sunt necesare. În al treilea rând și poate cel mai important, introducerea în programare folosind Haskell poate spulbera mitul conform căruia limbajele funcționale sunt „grele” și îi poate da elevului o intuiție mai profundă privind legătura dintre mașinile de calcul și limbajele de programare [v].

Încheind, adaug faptul că ideea în sine a predării programării „as soon as possible” nu e nouă și există implementată în România în cadrul unui set de cursuri numit Digital Kids. Inițiativa e una din care sistemul învățământului de stat ar avea multe de învățat. Cel mai important aspect, în opinia mea de om care nu prea are legături cu știința pedagogiei, e acela al impulsionării copiilor să gândească și să învețe să facă chestii, moment în care toată discuția privitoare la limbaje de programare devine superfluă [vi].

  1. Mă frustrează imens faptul că Facebook e un „walled garden”. Cu toate astea o să-mi calc pe cele mai cele principii și o să las un link la sondajul inițial aici. Postarea inițială a generat multe comentarii, pe care vă invit să le citiți dacă aveți la îndemână un cont de Facebook. []
  2. Ceea ce nu înseamnă că problema nu ar putea exista. []
  3. Nu, nu-i prea devreme. Aaron Swartz a scris specificația RSS la 14 ani. Orice elev de liceu poate face un site web fără prea mare efort și poate depana sau dezvolta o aplicație dacă învață din timp cum să facă asta. Plus că nu trebuie să fii expert în analiză sau matematici discrete pentru a desena un triunghi Sierpinski programatic. []
  4. Ca fapt divers, sintaxa Python este inspirată din cea a unui limbaj pe nume ABC, care a fost la rândul său creat cu scopul de a fi folosit în învățământ. []
  5. Puteți să râdeți de mine cât vreți pentru că am pus „elev” lângă „intuiție profundă”, dar programarea necesită într-o oarecare măsură intuiția asta, la fel cum geometria în spațiu necesită un soi similar de intuiție. Pot să bag mâna în foc că o bună parte din programatorii care citesc acest articol habar nu au că programarea imperativă provine în mare măsură din logica Hoare. Chestia-i de-a dreptul rușinoasă, dar ilustrează câteva fapte, printre care și acela că „intuiția” asta despre care vorbesc eu funcționează, și sunt sigur că poate funcționa la fel de bine și în cazul limbajelor funcționale. []
  6. Ca fapt divers, eu am început programarea cu Basic și apoi aceeași struțocămilă între C și C++, am continuat-o cu PHP, după care cu Pascal, Java, mai apoi cu Python, shell scripting, Scheme, Haskell și nițel Perl. Am experimentat majoritatea limbajelor din pură curiozitate și mă aștept ca orice copil care primește o jucărie din astea abstracte și are vagi înclinații către științele exacte să ajungă în scurt timp să tragă tare cu programarea. Dacă merge cu LEGO, nu văd de ce nu ar merge cu Python, PHP sau Javascript. []

Comments

  • [...] sfârșitul articolului „o propunere privind predarea programării în școli” spuneam că, [...]

  • [...] care sunt destul de neglijate la nivelul liceului. Deci na, noi ne batem capul despre cum și cu ce să predăm programarea, dar oamenii nici măcar nu au în general habar de ce obiceiul jucatului la loterie nu denotă un [...]

  • Comentariile sunt dezactivate.