vineri, 3 ianuarie 2014

Programare funcțională: războiul paradigmelor

Programatorii sunt oameni, iar oamenii sunt religioși. Prin religioși nu mă refer aici la „cele sfinte”, ci la tendința de a socoti că jucăria proprie este numaidecât mai bună și mai frumoasă decât jucăria altora.

Dacă sunt pe Gnu-Linux mă împinge religiozitatea să calc în picioare Windows-ul, ba dacă se poate să dărâm din temelii întreg Microsoft-ul. Se găsesc și azi ignoranți care să-și dea cu părerea despre Linux subliniind faptul depășit că ești condamnat la shell și nu ai o interfață grafică sănătoasă. La fel cum se găsesc ignoranți care să spurce Windows-ul (articulat) pentru ecranele albastre din Windows XP sau alte porcării produse de Microsoft. Pentru asta trebuie, bine-nțeles, să ignore un Windows sănătos precum Windows 7 (despre Windows 8 nu-mi permit să vorbesc din experiență proprie).

Acest soi de religiozitate care-și datorează existența ignoranței este prezentă și în lumea programatorilor. Am întâlnit (virtual și în lumea reală) programatori care nu pot fi convinși de meritele programării funcționale. Au învățat ei prin facultate vreo 3 linii de Haskell și e de ajuns să arunce la gunoi întreaga paradigmă.

Există aici și o parte ilară în respingerea programării funcționale: respingerea are loc tocmai în timp ce limbajele aparținând paradigmei OOP și imperative sunt „pătate” cu bucăți tot mai mari din paradigma funcțională. Versiunile tot mai elaborate ale Java, C#, C++ se bucură de first class functions (C#, C++), anonymous functions (C++, delegates și lambda expressions în C#), closures (Java 8, C#, C++ - deși în C++ mai anapoda) - toate elemente ale paradigmei funcționale.

La fel există și unii orbiți de estetica și simplitatea paradigmei funcționale care nu mai sunt în stare să vadă valoare în programarea orientată pe obiect (sunt mai puțin aceștia nu pentru că ar fi mai puțin religioși, ci pentru că în general sunt mai puțini cei care programează în limbaje de programare funcționale).

Găsesc că dificultatea se regăsește în frica de devalorizare - dacă stăpânești bine un limbaj ca C++ (și eventual îl stăpânești doar pe acesta) atunci a recunoaște că există o valoare enormă într-un limbaj ca Scala sau F# (și că valoarea lor este dată cu predominanță de elemente care nu se regăsesc defel în C++) este la nivel psihologic o recunoaștere a faptului că tu ca programator ești mai puțin valoros sau că jucăriei tale îi lipsesc niște piese importante.

Este mult mai lesne să respingi cu totul paradigma funcțională (deși se impregnează în limbajul pe care-l folosești, fie el și unul OOP) neînțelegându-i conceptele și nestăpânind niciun limbaj funcțional.

Deși programarea funcțională se întrepătrunde tot mai mult cu limbajele consacrate (din familia C, dar nu numai) nu putem vorbi de un progres real - concepte vechi de zeci de ani pur și simplu devin actuale datorită presiunii pe care industria hardware (multi-core) o pune asupra industriei software (așa stăteau lucrurile în 2011 și nu există semne că s-ar fi îmbunătățit semnificativ de atunci).

Cât încă ne mișcam în termenii legii lui Moore paradigmei funcționale i-a șezut bine în sfera academică. Însă începând să trăim în era multi-core se pare că inginerii s-au apucat să cârpească limbajele de programare mainstream cu petice rupte din pantalonii Lisp. Ceea ce este bine.

Și mai bine ar fi să acceptăm realitatea în care trăim. Și ideal ar fi să ne permitem să scoatem limba doar limbajelor de programare pe care le stăpânim.

Mai jos un discurs al lui Martin Odersky (creatorul Scala, Generic Java și javac) tangențial pe tema de față:



Niciun comentariu:

Trimiteți un comentariu