programarea la nivelul liceului: o critică

vineri, 21 oct. 2011, 23:15

O bună parte din programatori – bună parte în care, recunosc, m-am aflat o bună vreme – consideră Pascal și C [i] ca fiind limbaje nepotrivite pentru educația la nivel preuniversitar. Primul e considerat caduc, în sensul că nu e folosit nicăieri, iar al doilea e privit drept prea complicat; două extreme, una a inutilității, iar cealaltă a așa-zisei dificultăți, în ciuda faptului că C-ul e unul din cele mai căutate limbaje din industria calculatoarelor în ultimii douăzeci de ani pe puțin.

Sunt în mare parte de acord cu argumentul că C-ul e un limbaj un pic complicat pentru liceanul mediu, deși nu aș atribui această problemă limbajului în sine. De asemenea, sunt de acord cu faptul că a ieși cu Pascal sau Fox Pro din liceu nu îți dă absolut nici o experiență practică – deși consider că în primul rând nu ăsta este scopul, iar în al doilea rând o bună parte din elevi oricum o să uite limbajul la scurt timp după terminarea liceului.

Aș spune că deși în liceu nu se predă tocmai știința calculatoarelor, ci doar informatică, spusele unei figuri importante din Computer Science rămân valide: e greu să explici calculatoarele la nivel teoretic, deoarece se leagă de o întreagă serie de concepte non-triviale, cum ar fi calculabilitatea, terminarea și așa mai departe; concepte pe care un elev inteligent ar cam trebui să le înțeleagă la un nivel pur intuitiv. Reușim astfel să punem degetul pe o primă problemă: nu limbajul e dificil/inutil, ci conceptul din spate (care sunt mai multe) e cel problematic.

De aici rezultă că o abordare corectă, zic eu, asupra programării presupune folosirea în primul rând a pseudocodului. La fel cum formarea unui raționament matematic crud necesită exerciții peste exerciții de limite, derivate și integrale (pentru a zgârma puțin la suprafața matematicii), așa și formarea simțului informatic începe în primul rând cu trasarea și rularea algoritmilor de mână. Asta presupune implicit acomodarea cu o serie de convenții/notații simple, care mai apoi să fie folosite la implementarea programelor folosind pixul și hârtia. Sigur că este plictisitor, dar la fel și muzicantul trebuie să își exerseze instrumentul și așa mai departe, cel puțin pentru o vreme.

Revenind însă la dezbaterea asupra limbajelor de programare potrivite pentru educația preuniversitară, nu putem spune cu tărie decât că nu există un limbaj care să poată fi înțeles perfect de oricine. Limbajele de programare sunt de obicei făcute cu un scop în minte [ii], iar singurele limbaje concepute având în vedere educația și care îmi sunt cunoscute sunt Pascal și Basic.

Multă lume consideră Python a fi un exemplu bun de limbaj potrivit pentru algoritmică. Avantajul său e că are o sintaxă simplă și ușor de asimilat și în plus poate exprima destul de succint structuri precum liste sau dicționare. Toate astea sunt bune până ajungem la semantica limbajului, pe care programatorii în Python uită complet să o menționeze. Semantica Python e cât se poate de ambiguă, în primul rând datorită tipurilor care nu-s exprimate explicit. Cu alte cuvinte, am o variabilă a, însă eu nu știu dacă a e listă, întreg, vacă, bou sau copac. Chestia asta nu mi se pare deloc rea pentru un programator care știe ce face, însă poate fi crucială pentru cineva care abia încearcă să se acomodeze cu programarea.

Sar peste ambiguitatea operatorului de atribuire pentru că e o temă discutată și răsdiscutată și trec direct la un alt subiect interesant (luat doar ca exemplu), și anume pasarea parametrilor. În Python, la fel ca în Java, la apelul unei funcții tipurile primitive sunt pasate prin valoare, iar tipurile compuse (cum sunt și listele) sunt pasate prin referință. Să luăm interpretorul de Python și să îi livrăm următoarea secvență de cod:

>>> def succ(x):
...     x = x + 1
...     return x
... 
>>> a = 2
>>> succ(a)
3
>>> a
2

Observăm clar că valoarea variabilei a va rămâne 2, deoarece la apelul funcției succ se va copia doar valoarea acesteia, valoare care va fi apoi incrementată. Dacă însă punem a într-o listă, putem face următoarea măgărie:

>>> def succ2(x):
...     x[0] = x[0] + 1
...     return x[0]
... 
>>> a = [2]
>>> succ2(a)
3
>>> a
[3]

care va duce evident la actualizarea variabilei la top-level. Din fericire, Pascal are suport explicit pentru pasare prin referință, folosind cuvântul cheie var înaintea definiției variabilei din antetul funcției. Este foarte important de luat în seamă faptul că ascunderea conceptului de modalitate de pasare a parametrilor către o funcție/procedură nu aduce cu sine o scutire de la nevoia de a-l explica. Ba dimpotrivă, face această problemă una mai dificilă.

Exemplele pot continua, la fel cum pot exista și există exemple împotriva Pascal/C și în favoarea Python, și nici nu e intenția mea de a demonstra superioritatea unui limbaj de programare asupra altuia. Țin să subliniez doar cu linii îngroșate că un limbaj de programare care încearcă să rezolve anumite probleme poate adăuga în mod inerent alte dificultăți, cele din urmă fiind posibil mai păcătoase decât cele inițiale. Și chiar dacă programarea e în fapt laterală conceptelor din informatică, se va ajunge întotdeauna la discuții despre referințe/pointeri, stive de apel, tipuri de date și așa mai departe, fiindcă toate astea alcătuiesc un limbaj de programare, fie că le vedem fie că nu.

De aceea, rolul profesorului de informatică e unul destul de tâmpit: dascălul trebuie să atingă toate aceste subiecte, însă într-un mod care să nu îi sperie complet pe elevi. Astfel că problema nu stă în faptul că Pascal e prea vechi, ci în incapacitatea majorității profesorilor de a-și face bine treaba – iar aici intrăm în varii motive pe care e inutil să le discutăm – și în materialele didactice, care variază în calitate de la „revizuite prea puțin de-a lungul anilor” la de-a dreptul mizerabile.

Notă: Articolul de față a pornit pe marginea declarațiilor unui director oarecare de firmă. Cu toate astea, depășește clar problemele atinse de acestea, oferind o idee mai clară – sau cel puțin așa sper – despre ce nu merge bine azi în latura asta a învățământului preuniversitar.

  1. De fapt în liceu se predă un C îmbogățit cu câteva elemente din C++, dar care rămâne la bază tot C. []
  2. De exemplu C-ul a fost folosit la conceperea Unix-ului, Lisp pentru probleme teoretice de știința calculatoarelor, COBOL pentru aplicații bancare și de contabilitate, SQL pentru baze de date și așa mai departe. []

Comments

  • dAImon spune:

    Sistemul de învăţământ încă îi învaţă pe studenţi programarea limbaje ca Pascal sau Borland

    Asta-i si agramat pe langa ca-i dobitoc? Ce limbaj e Borland?

  • Cristian spune:

    Dacă ăla a declarat cu adevărat așa ceva și nu e vreo greșeală de-a ziarului, atunci e un habarnist. Putea cel mult să spună Turbo Pascal și Borland Pascal, deși am dubii că se mai folosește undeva Turbo Pascal. Slabe șanse să mai existe astăzi calculator pe care BP să nu poată fi utilizat.

    Revenind la subiect, eu cel puțin sunt pentru Pascal ca prim limbaj de programare, e ideal pentru așa ceva. Mereu l-am recomandat cu foarte mare căldură. Python ar merge pentru secretare sau oameni prea ancorați în meandrele concretului care vor să facă una, alta. Eu știu oameni care utilizează AutoIt (cu al său Basic) pentru a-și face treaba, când ar putea la fel de bine să utilizeze Python împreună cu biblioteca oferită de AutoIt sub forma unui COM. Mai complicat ar fi însă cu partea de GUI. Aici Visual Basic era tare, dar VB.Net nu cred că mai surâde la fel de mult unui începător.

  • Cristian spune:

    P.S. Legat de static typing, vezi că în Egomania Itself e o imagine tare interesantă.

  • spyked spune:

    @dAImon: Într-un post pe facebook am înțeles că omul s-ar fi referit de fapt la Pascal și COBOL, deci e posibil să fi fost misquoted de zf. Chiar și așa, îmi e greu să cred că individul înțelege bine la nivel tehnic care-i situația în industria software actuală, cu atât mai puțin cum stă treaba în educație. COBOL de exemplu e folosit foarte puțin, dar din câte știu programatorii care lucrează pe cod legacy în așa ceva primesc salarii uriașe, fiindcă puțină lume chiar știe COBOL astăzi.

    @Cristian: În plus există și FreePascal, care probabil are ceva IDE-uri sau poate fi folosit cu Notepad++ în cel mai rău caz.

    Și eu sunt de acord într-o anumită măsură cu Pascal în licee. Adevărul e că Python e genul de limbaj pe care după aia îl poți folosi la ceva util, eventual pentru a contribui la un proiect open source. De dialectele mai noi de Basic nu știu ce să spun, având în vedere că Basic-ul în care am programat când eram mic parcă nu avea decât goto pentru implementarea buclelor.

    Cu articolul lui Steve Yegge am o problemă, și anume că dă Java ca exemplu când vorbește de tipare statică. Și mi se pare un exemplu foarte prost, fiindcă sistemul de tipuri din Java nu e tocmai cel mai clar și cel mai fericit. Spun asta pentru că cei care au proiectat Java sar între evaluare statică și evaluare dinamică a tipurilor cam când li se pare lor ok, fără o explicație clară de ce fac asta, asta fără să luăm în calcul polimorfismul, care-i ok pentru un limbaj OOP.

    Un limbaj cu tipare puternică și statică care e corect formalizat ar fi Haskell, acesta venind cu un sistem de inferență a tipurilor foarte puternic. Nu se poate preda așa ceva la nivel de liceu însă, pentru că crearea de efecte laterale are în spate concepte de matematici destul de avansate, pe care nici măcar unii programatori avansați în Haskell nu le înțeleg prea bine. Fără să mai vorbim de faptul că lumea are o oarecare aversiune față de limbajele funcționale.

    Pe de altă parte, sunt de acord cu faptul că poți face treabă bună atât într-un limbaj cu tipare latentă cât și în unul cu tipare statică. Ba chiar pentru liceeni ar fi o idee bună ținerea unui curs introductiv unde să se prezinte pe scurt cam ce înseamnă programarea și ce limbaje există. În felul ăsta potențialii pasionați ar putea să-și aleagă un limbaj care cred ei că li se potrivește și să încerce să programeze – probabil, există o mare posibilitate să nu funcționeze asta la nivelul liceului. Vorba aia, destui pasionați de web au luat-o pe calea PHP-ului de capul lor și au reușit să și facă ceva.

  • Vlad spune:

    Si totusi, tipul se plange de faptul ca studentii ies nepregatiti din scoala, nu elevii. Iar in acest caz, are oarecare dreptate. Cine face Pascal in facultate, e un om mort.

    Altfel, toata discutia asta mi-a amintit de articolul lui Seth Godin despre sistemul public de invatamant:
    http://sethgodin.typepad.com/seths_blog/2011/09/back-to-the-wrong-school.html

  • Cristian spune:

    @Vlad: care e facultatea pentru viitori programatori unde se mai face Pascal sau doar Pascal?

    @spyked: am impresia că Haskell scârțâie la partea de I/O. De altfel mă și miră că s-a putut scrie un manager de ferestre în el el, xmonad.

    Probabil că dialectul de Basic cu care ai avut tu de-a face era cel de pe HC sau altul foarte, foarte vechi. Toate astea cât de cât moderne, inclusiv QBasic din MS-DOS, au funcții, proceduri, for, while, until.

  • spyked spune:

    @Vlad: În citatul inițial de pe Facebook (la care nu am dat link aici fiindcă-i pe Facebook), se făcea referire atât la liceu cât și la facultate. Eu m-am referit strict la liceu, însă dacă ar fi să ducem lucrurile mai departe, faptul că studentul la ASE face Pascal nu mi se pare deloc surprinzător, având în vedere că ASE-ul scoate economiști, nu calculatoriști sau informaticieni, cum fac Poli, respectiv Universitatea (a se extrapola la Cluj, Iași, Timișoara).

    Iar argumentul elevilor/studenților care ies din școală fără pregătire pentru industrie știm foarte bine că e lipsit complet de sens. Nici o companie serioasă n-o să se aștepte să găsească într-un individ de 20-26 de ani o persoană cu experiență, asta-i o porcărie imensă. Analog, nimeni n-o să angajeze un individ de 40 de ani pentru a-i face training în tehnologii noi. Astea sunt extremele, despre asta este vorba.

    Mi se pare foarte interesant articolul lui Godin, da’ îmi pare că se aplică mai mult la sistemul de educație de peste ocean și mai puțin la ăsta european. Pot măcar să sper că la noi încă se mai predau și chestii care te pun să gândești, cel puțin acolo unde profii-s faini.

    @Cristian: După cum ziceam mai sus, la Cibernetica ASE-ului din București se face Pascal, din câte îmi amintesc. Și ceva Prolog cred, dar în mare that’s how they roll.

    În ceea ce privește Haskell-ul, da și nu. Scârțâie, în sensul că are adăugate câteva construcții destul de hack-ish (funcția fail, mai exact). Nu scârțâie pentru că în mare parte formalismul matematic al monadelor e respectat. Și asta poate suna a vorbă goală, dar nu e, în senul că aia chiar spune ceva despre puritate sau lipsa ei și despre cât de fiabil/robust poate fi programul respectiv.

    Mie mi se pare că Haskell-ul are alte probleme, legate mai mult de scalabilitatea proiectelor dezvoltate în limbaj (unde puține limbaje depășesc ceva orientat obiect cum sunt Java sau C++), dependency hell and so on. Plus că uneori nu vrei să ai tipare așa de rigidă, pentru că te cam obligă să faci unele lucruri neortodoxe, sau care pot fi rezolvate pe cale ortodoxă într-un mod ori prea complicat, ori despre care nu ai aflat încă. De-aia Haskell rămâne mai degrabă un limbaj pentru matematicieni și pasionați de computer science, însă l-am văzut folosit la câteva proiecte de system programming.

  • andrei badea spune:

    Eu până într-a 11-a am făcut C++, nu C, nu Pascal. Într-a 12-a am făcut FoxPro asortat cu SQL. Ce-i cu adevărat interesant e că, în clasa a 3-a, ca membru al clubului de informatică de la Clubul Copiilor sector 6 am învățat Turbo Pascal. 🙂

  • spyked spune:

    Păi asta ziceam, în liceu se predă C, nu C++, deși pe cartea lui Tudor Sorin scrie mare C++. Nu stă nimeni să predea serios la nivelul liceului despre clase, polimorfism, moștenire, încapsulare, metode statice, virtuale și așa mai departe, să nu mai zic de template-uri. Cam asta înseamnă C++ de fapt, iar cin și cout în loc de scanf și printf sunt un zăhărel destul de fericit, care-i ajută pur întâmplător pe elevi să se descurce mai ușor. Restul e C curat.

    Pe de altă parte am văzut alte dume în manualul de informatică de liceu. De exemplu listele înlănțuite erau implementate folosind referințele (pointerii de fapt) sub forma unor întregi, ceea ce e foarte ambiguu. Dar repet, nu condamn pe nimeni, lucrurile astea sunt al naibii de greu spre imposibil de integrat într-o curriculă de liceu și necesită un tact și o răbdare de fier din partea profesorului.

    O posibilă soluție pe care nu am menționat-o aici e începerea studiului încă din școala generală. Există din câte știu limbaje/medii de programare dedicate copiilor (o listă se află aici) care ar putea fi folosite pentru introducerea în concepte de bază de programare/informatică. Să nu uităm că copiii din ziua de astăzi pun mâna pe calculator de la vârste fragede, deci o astfel de abordare ar putea fi destul de potrivită.

  • Popescu Ion spune:

    ‘În Python, la fel ca în Java, la apelul unei funcții tipurile primitive sunt pasate prin valoare, iar tipurile compuse (cum sunt și listele) sunt pasate prin referință.’ <– De unde ai scos aberatia asta? Te-ai lamurit, intre timp? Nu ti-e rusine cu ea? 🙂

  • spyked spune:

    Ioane tată, dacă ai ceva util și constructiv de spus, spune, că nu te oprește nimeni. Dacă nu, du-te și fă ceva util pentru societate (un curs de logică, de exemplu), nu mai comenta aiurea pe blog-uri. Iete colo-i ușa.

  • Cristian spune:

    Popescu Ion are pe undeva dreptate. Și în Python și în Java valoarea unei variabile de tip listă este fix referința la ea. În C++ sau C# s-ar vedea distincția asta cel mai bine întrucât le poți pasa și ca valori și ca referințe. În TCL în schimb sunt pasate ca valori (conținutul e transmis); am scris și un mic progrămel în care se poate observa asta.

    P.S. Lipsește ultima linie din output:

    after calling g: L = 1 2 3 4 30
  • Popescu Ion spune:

    http://pastebin.com/96sXUCgd pt ca aici imi formateaza prost raspunsul.

  • Popescu Ion spune:

    acu’ vad ce-a scris si Cristian(care iar compara merele cu perele, no offense)… fratilor, de unde dracu va formati ideile astea ??? srsly, e ingrijorator.

  • spyked spune:

    @Cristian: Da’ io n-am zis că n-are dreptate. L-am trimis pe ușă pentru că a făcut afirmații fără a le argumenta.

    @Popescu Ion: Hai că ești funny. Citez:

    Si logica nu-i utila pentru societate, mai ales daca e prost inteleasa/utilizata: tu esti cazul concret. Ma mir cum poti aborda logica combinationala, daca esti inca blocat in retorica ieftina(ad hominem et al).

    Deci bun, întâi aduci un argument ad hominem, după care mă acuzi pe mine că fac același lucru. Cum vine asta? Să nu mai vorbim de faptul că eu nu am făcut nici o afirmație la adresa ta personal (pentru că nu te cunosc, la fel cum nu mă cunoști), ci la cele spuse de tine, care denotă fix aroganța cu care ți-am răspuns. Are sens ce zic?

    Doi la mână, eu n-am contestat nici un moment că ai dreptate. Ba chiar e foarte utilă informația pentru noi ăștia care foarte probabil nu suntem experți în Python. Dar chiar și așa, toată discuția despre mutabilitate, metaclase and such nu-și are deloc rostul în contextul ăsta, pentru că e clar că nu o să predea nimeni așa ceva la nivelul liceului, deci toate chichițele de design ale limbajului sunt oareșcum irelevante.

    Trei la mână, io am înțeles din ce ai comentat că știi Python-ul în intimitatea lui, dar într-un final abstractizarea asta de tipul „totul e un obiect” nu face mare diferență. Din nou, nu știu cât sens are ce zic, da’ faptul că de fapt valoarea 1 nu e valoare ci obiect nu-i deloc nouă, pentru că și Java are Integer, Float etc. Și comparația între limbaje nu-i nicidecum una între mere și pere cum zici, ci e perfect validă, pentru că vrei să vezi ce îți oferă în esența lui un limbaj față de celălalt, dincolo de alegerea de proiectare a celor care au conceput limbajele. Mai relevant pentru noi e, aș zice, scopul inițial pentru care au fost concepute acestea, pentru că asta îți dă o idee legată de ceea ce fac mai bine și ce nu.

    În fine, am putea să ne certăm la nesfârșit pe problema asta (pentru că în final fiecare înțelege diferit conceptele din spatele unei construcții, în cazul ăsta al limbajului), dar după părerea mea numerele, caracterele etc. sunt tot valori primitive în orice limbaj care rulează pe o mașină reală, pentru că în final ajungi să le ții într-un registru și aia e. Că ai un wrapper peste un număr e foarte frumos, dar wrapper-ul ăla nu-i cu nimic diferit de o bibliotecă de utilitare pentru tipul respectiv.

    De exemplu poți spune că în Haskell tipul Int e unul ca oricare altul sau că IO e o monadă, ambele afirmații fiind în esență false, pentru că Int face parte din limbaj, nu e independent de el, iar IO e monadă doar pentru că poți specifica foarte ușor acțiuni cu ajutorul mecanismului respectiv (deci e un hack). IO nu e monadă în sensul matematic al termenului, dar din nou, ăsta-i un detaliu perfect neglijabil. La fel, (+) nu-i o funcție în sensul cel mai pur al cuvântului, iar programarea aia pur funcțională nu-i de fapt pur funcțională, pentru că dacă ar fi n-ai putea face nimic practic cu ea, că valoarea o iei tot printr-un efect lateral.

    Deci mna, bun, nici Java nu are tocmai pass-by-reference, că până la urmă transmiți valoarea referinței, care nu poate fi modificată. Și nici în C++ nu poți modifica referința la variabilă, ci doar variabila în sine, iar referința e eventual o valoare pe stivă care e distrusă la ieșirea din funcție. Da’ aparent poți programa destul de bine într-un limbaj și fără să cunoști toate detaliile.

  • spyked spune:

    Also, merge să bagi cod în comentarii cu <pre lang=”python”> … <pre>. De exemplu:

    print "inline code here"
  • Popescu Ion spune:

    Omule, nu vrei sa o dam in chestiuni de retorica ieftina. Da, am fost ad hominem si eu si tu si exact asta am scris. Diferenta e ca eu macar recunosc asta din prima si nu imi schimb comportamentul cand vad ca interlocutorul meu nu-i tocmai ceea ce credeam eu ca e. Si aroganta e o caracteristica necesara(si buna, zic io) la oameni, dupa cum vezi nici mie nu-mi lipseste, dar eu nu improsc noroi aiurea. Anyways, ce-nseamna a ne ‘cunoaste’? N-am mai discutat cu tine de N ani (> 4). Cand am discutat ultima oara, am impresia ca tocmai dadusei la AC. Ne ‘stim’ de pe RGC inca de dinainte, avem prieteni/cunostinte comune atat din real life cat si de pe net si intotdeauna am ascultat muzica mai jmekera decat tine 😛 (j/k. not. can’t stand your progressive metal. RIO FTW :)).

    Eu voiam doar sa stiu sincer daca inca mai ramasesei la convingerile astea pt ca nu ma asteptam sa fii atat de sigur pe tine in a da astfel de judecati de valoare despre limbaje de programare.. Da stiu am aruncat o servita cu formularea intrebarii mele si-am fost putin rautacios 😛

    Si nu nu ne-am certa deloc dac-am continua discutia asta(comparatul merelor cu perelor), din contra, mie-mi surade pt ca nu prea am cu cine sa discut in grai romanesc despre ‘cacaturile astea’, si probabil fiecare ar avea niste ‘aha!’-uri si d-alde de-astea … dar repet eu sunt sigur ca dac-ar fi sa intram in detalii pana in panzele albe probabil ca am ajunge sa ne aprobam reciproc si sa zicem ca 1. e vorba despre semantica pulii 2. nu stim suficiente despre implementarea X si Y. De ex eu iar nu-s de-acord cu inca vreo 10 lucruri pe care le-ai zis, dar asta pt ca m-as putea lega de cum le-ai formulat :P. eh..

  • Popescu Ion spune:

    ps: nu-mi place cpython. 🙂

  • spyked spune:

    Diferenta e ca eu macar recunosc asta din prima si nu imi schimb comportamentul cand vad ca interlocutorul meu nu-i tocmai ceea ce credeam eu ca e.

    Păi vezi tu, tocmai asta-i chestia, că eu nu „cred” că interlocutorul meu (în cazul ăsta tu) e într-un fel anume. Nu mă așteptam să știi lucrurile alea despre Python la fel de bine cum nu mă așteptam să nu le știi. Singurul lucru la care mă aștept de la un interlocutor e să pună degetul pe problemă, altfel discuția s-a încheiat, cu sau fără retorica ieftină. De-aia, apropo de utilitatea logicii în societate, nu cred că să mergi cu presupunerea că „celălalt e într-un fel” e în vreun fel sănătos când faci afirmații pe probleme obiective.

    Și pentru că tot o luăm pe plaiurile meta, io nu-s de părere că în știință în general convingerile de orice fel sunt bune. Eu am făcut o afirmație bazată strict pe ceea ce am verificat eu în limbaj, am luat-o de bună și am mers cu ea până la proba contrarie. Adică ea nu era invalidă în contextul propus de mine deși e invalidă în contextul larg (al limbajului), după cum ai demonstrat. And again, nu am emis absolut nici o judecată de valoare referitoare la limbaj. Limbajele nu-s bune sau proaste la modul absolut, ci-s mai potrivite sau nu aplicației fixate, pentru că nici un limbaj nu-i silver bullet pentru toate problemele. Iar asta are alte implicații, și e foarte posibil să fie la rândul lor greșite.

    În fine, tu probabil mă cunoști pe mine (eu pe tine tot nu, da’ dacă oi vrea să-ți dezvălui identitatea, mna), da’ io unul m-aș simți mult mai bine dacă informațiile transmise aici ar fi (în general) luate așa cum sunt, fără bagaj emoțional și/sau foarte personal (într-o anumită măsură tot o să fie, fiindcă na, blog-ul e unul personal). În caz contrar, o să presupun că participantul la discuție caută să troleze și/sau să cauzeze scandal, caz în care eu o să fac tot posibilul ca blog-ul ăsta să fie populat în continuare cu discuții civilizate, fie ele în contradictoriu au ba. E responsabilitatea mea să fac atâta lucru cât încă mai țin site-ul online. Sau aș putea face o pagină specială pentru asta, da’ nu știu cât de mult ar ajuta.

  • spyked spune:

    Also, cu toate astea CPython pare a fi cam cea mai populară implementare. Io de exemplu folosesc ce vine cu Ubuntu, n-am avut niciodată răbdare să încerc alte implementări.

  • […] că cei artificiali folosesc de obicei protocoale mai rigide) pe Internet. Cetățeanul Popescu Ion mi-a atras atenția că spun prostii când m-am apucat să compar Python cu Java, explicând apoi pe îndelete cum stă […]

  • Comentariile sunt dezactivate.