In aceasta postare pe blog, va voi explica modul in care invatarea limbajului de programare Clojure in urma cu trei ani mi-a schimbat viata. A dus la o serie de revelatii despre toate structurile invizibile care sunt necesare pentru a permite dezvoltatorilor sa fie productivi. Aceste concepte apar peste tot in Proiectul Unicorn , dar cel mai proeminent in Primul Ideal al localitatii si al simplitatii si cum poate duce la cel de-al doilea ideal de focalizare, flux si bucurie.

Fara indoiala, Clojure a fost unul dintre cele mai dificile lucruri pe care le-am invatat profesional, dar a fost si unul dintre cele mai pline de satisfactii. Mi-a adus bucuria programarii in viata mea. Pentru prima data in cariera mea, pe masura ce implinesc cincizeci de ani, sunt in sfarsit capabil sa scriu programe care fac ceea ce vreau sa faca si sunt capabil sa le construiesc pe ani de zile fara ca ei sa se prabuseasca ca o casa de carti, asa cum a fost experienta mea normala.

Celebrul filosof francez Claude Levi-Strauss ar spune despre anumite instrumente: „E bine sa te gandesti?” Din motive pe care voi incerca sa le explic in aceasta postare, Clojure imbraca un set de principii de design si sensibilitati care au fost noi pentru mine: programare functionala, imuabilitate, un sentiment uluitor de puternic al minimalismului conservator (de exemplu, cu greu schimbari in zece ani! ), si mult mai mult…

Clojure mi-a prezentat un set mult mai bun de instrumente cu care sa ma gandesc si sa construiesc si eu. De asemenea, s-a dus la un set de momente aha care explica de ce timp de zeci de ani codul meu s-ar destrama, devenind din ce in ce mai dificil de schimbat, ca si cum s-ar prabusi sub propria greutate. Invatarea Clojure m-a invatat cum sa ma impiedic sa-mi auto-sabotez in mod constant codul in acest fel.

De aproape trei ani, am impuscat cine va asculta cat de mare este Clojure. Am fost ametit de uimitoarea postare a blogului lui Bryan Cantrell „Ma indragostesc de Rust” in septembrie 2018 – dupa ce am citit-o, m-am angajat sa scriu scrisoarea mea de dragoste catre Clojure (dar abia dupa ce am scris prima data o scrisoare de dragoste pentru a mea sotie, @notoriousMVK, desigur!).

Organizarea, scrierea si finalizarea acestei postari a fost surprinzator de dificila. Am vrut sa scriu acest articol de ani de zile, in care am scris portiuni din ultimele doisprezece luni, incercand sa imi dau seama cum sa-mi impartasesc experienta si epifaniile fara sa fiu insipid, pretentios sau plictisitor. Insa, dupa trei zile de scriere constanta si a doua ghicire, si acum depasind 8.500 de cuvinte, in interesul de a primi in sfarsit ceva postat, ma angajez sa postez asta astazi. matrimoniale la jumate www.trxtraveldata.eu

Lucrurile care nu se introduc in acestea vor intra in „Scrisoarea mea de dragoste catre Clojure # 2”. ????

Voi discuta despre urmatoarele:

  • Ce inseamna pentru mine cel de-al doilea ideal de focalizare, flux si bucurie
  • Relevaning Coding: Cat de mult a parasit viata mea zilnica in 2008, dar a venit in 2016 (sau daca pot invata clojure, oricine poate)
  • De ce iubesc LISP-urile acum
  • Programare functionala si imuabilitate (si John Carmack)
  • O greseala pe care am facut-o de la Grad School si cum am remediat-o: compozibilitatea
  • Epifania pe care am citit-o „O introducere de reactie in 2019 (pentru persoanele care stiu doar suficient de mult pentru a se apropia)”
  • Ce spune Hickey bogat despre simplitate: de unde vine primul ideal al localitatii si al simplitatii
  • Rezolvarea problemelor de afaceri, nu rezolvarea puzzle-urilor – De ce detest ca fac lucrari de infrastructura in aceste zile
  • In cele din urma, REPL… bucla de feedback finala si rapida!
  • Comunitatea uimitoare Clojure, ganduri despartitoare si ce mi-ar placea sa scriu in viitor



Ceea ce speram sa fie este recunostinta mea fata de Clojure, inventatorul sau Rich Hickey si intreaga comunitate Clojure.

Ce inseamna pentru mine cel de-al doilea ideal de focalizare, flux si bucurie

  • Primul ideal – localitate si simplitate
  • Al doilea ideal – Focus, flux si bucurie
  • Al treilea ideal – imbunatatirea muncii zilnice
  • Al patrulea ideal – siguranta psihologica
  • Al cincilea ideal – Focus pentru client



In Proiectul Unicorn (descarcati extrase), cel de-al doilea ideal de focus, flux si bucurie este destinat sa descrie starea mentala optima a fluxului creativ pe care il cautam cu totii, atat de frumos descris de faimosul psiholog Dr. Mihaly Csikszentmihalyi (obraz pronuntat -trimterea-MEE-hai). El a sustinut una dintre cele mai uimitoare discutii TED (2004) si a scris cartea Flow: The Psychology of Optimal Experience (2008) .1

Pentru multi dintre noi in tehnologie, deseori asociem acele momente uimitoare de productivitate si flux creativ in codificare. Este sentimentul pe care il obtineti atunci cand faceti atata munca productiva: pierdeti evidenta timpului si poate chiar sentimentul de sine, simtind triumful realizarii unor faze uimitoare, rezolvand genial problema pe care v-ati propus sa o rezolvati. Pentru mine, de multe ori am avut senzatia de a cuceri misiunea de nivel 30 atunci cand esti doar un Paladin de nivel 5. (Introduceti aici caracterul D&D ales.)

In cea mai mare parte a celor douazeci de ani din cariera mea profesionala, m-am identificat in primul rand ca o persoana care opereaza. Asta in ciuda obtinerii masteratului in informatica in 1995 – cursurile care mi-au placut cel mai mult au fost compilatoare de mare viteza (lectia principala: nu cititi fisierele mai mult de o data) si retelele de mare viteza (lectia principala: evitati sa faceti copii de memorie in intregime, daca poti).

Dar, atat cat am iubit informatica, am gravitat intotdeauna spre Ops, pentru ca am observat ca acolo a fost emotia si de acolo s-au facut salvarile – daca nu ar fi pentru eroica lucrare a Ops, toate greselile si esecurile. de Dev si Infosec ar afecta clientii nostri.

Dar ceva s-a schimbat. De trei ani, acum ma autoidentific ca dezvoltator! Fara indoiala, este pentru ca am invatat limbajul de programare Clojure. matrimoniale publi 24 timis taurus-media.iloveyoudiamonds.net Am mentionat mai sus ca a fost unul dintre cele mai dificile lucruri pe care le-am invatat profesional – inainte de a scrie prima mea linie de cod de lucru, trebuie sa fi petrecut patruzeci de ore citind carti si postari pe blog, precum si vizionand videoclipuri, inainte de a putea reusi sa scriu primul meu program real non-banal.

Un mare motiv este ca este un limbaj de programare LISP, pe care nu l-am mai folosit niciodata. Un alt motiv este ca Clojure este un limbaj de programare functional, care imbraca si incurajeaza imuabilitatea, ceea ce inseamna ca nu ai voie sa mute variabilele, ceea ce este un alt lucru la care nu am mai fost expus pana acum.

Sunt incredibil de recunoscator pentru ajutorul pe care l-am primit de la Mike Nygard (autorul cartii uimitoare Release It!) Si, intamplator, persoana care mi-a aratat pentru prima data Clojure si baza de date Datomic in 2012, care m-a dezamagit atat de mult, de cele mai multe ori am uitat de ea pana la cinci ani mai tarziu) si atat de multe alte persoane din comunitatea Clojure. (Mai multe despre comunitatea incredibila din jurul Clojure mai tarziu.)

Acum, rezolvarea problemelor cu Clojure a devenit unul dintre lucrurile mele preferate.

Codificarea in Clojure este distractiva, intr-un mod pe care nu l-am mai experimentat pana acum. Ani de zile, in luna mea ideala, imi petrec 50% din timp scriind si 50% din timp alaturi de cei mai buni din joc. In aceste zile, acesta este in continuare cazul, dar vreau sa petrec 20% din timpul meu pentru a rezolva probleme pe care vreau sa le rezolv.

Iata cat de distractiv ma distrez: in ultimii trei ani, am reusit sa rezolv rapid probleme, cum ar fi exportul si transformarea rapida a datelor de la un instrument la altul, construirea de nori de cuvinte, analizarea istoriilor git repo … Insa am construit cateva instrumente pe care le folosesc aproape in fiecare zi, cum ar fi un program pentru a gestiona cardurile de pe panourile mele Trello, preia capturi de ecran de la Google Photos, urmaresc informatii de pe diverse site-uri de comert electronic de carte. M-a aruncat cum pot rezolva problemele cu un nivel de usurinta si bucurie pe care nu am mai experimentat-o ​​niciodata.

My first significant Clojure project revealed something stunning to me. matrimoniale bacau barbati movierumor.com I’m fortunate to have participated in helping write and rewrite an application called TweetScriber three times. It’s a program that a bunch of us wrote in 2012 to allow us to take notes and tweet at the same time on an iPad—it turns out that this is a very useful thing to do when you’re writing a book, as it forces you to take notes, write things succinctly enough so that you can tweet it out (which forces a certain pithy and terse style), and get feedback by observing what tweets get people’s attention. (The tweets that got the most retweets inevitably found their way into a presentation or a book.)

  • In 2012, Flynn si Raechel Little au scris prima versiune ca o aplicatie iPad in Objctive-C – era vorba despre 3.000 de linii de cod. (Au facut o treaba atat de grozava! A functionat splendid pana la iOS 7 sau ceva mai mult, cand ceva s-a rupt grozav si nici nu va mai incepe.)
  • In 2015, am rescris-o ca o aplicatie JavaScript / React si avea aproximativ 1.500 de linii de cod.
  • In 2017, am rescris-o din nou ca aplicatie ClojureScript si a fost doar 500 de linii de cod! Vaca sfanta!!!



In primul rand, am fost de fapt uimit ca am putut chiar sa rescrie aceasta aplicatie in ClojureScript ca novice si cat de surprinzator de simpla a fost. (Clojure ruleaza pe JVM sau pe CLR pentru toti oamenii dvs. .NET, in timp ce ClojureScript este transpilat in JavaScript, astfel incat sa poata rula pe browser, in interiorul node.js, etc. In toate cazurile, acestea pot utiliza functia de biblioteca masiva si instrumentare ecosistemul pe care il ofera aceste universuri.) Dar ceea ce mi-a fost atat de remarcabil a fost cat de superioara a fost implementarea mea ClojureScript, in atatea dimensiuni. matrimoniale fete la produs www.swanislepress.org

Era mai scurt. A fortat o separare a preocuparilor intre starea mutabila, logica fluxului de control, elementele UI etc. despre care am citit de mult timp, dar in cele din urma a fost in masura sa le pun in practica. (Am folosit cadrul de re-cadru, care a evoluat in acelasi timp cu cadrul JavaScript Redux.)

Ceea ce mi-a fost cel mai uimitor este ca am reusit sa continui adaugand functionalitate pe TweetScriber, an de an. Chiar inainte de ultimul Summit Enterprise DevOps, am adaugat o modalitate de a adauga fotografii la tweet-uri fara a parasi aplicatia; Am experimentat cu salvarea ID-urilor de tweet intr-o baza de date in loc de doar text. A fost usor sa experimentati adaugand aceste caracteristici, fara a arunca totul altceva.

Acum sunt aproape 5.000 de linii de cod si inca sunt in stare sa inteleg si sa adaug lucruri pe care mi le doresc, fara ca acesta sa cada ca o casa de carti.

Capacitatea de a face acest lucru este noua pentru mine. Exista ceva foarte diferit in ceea ce priveste modul in care codez acum si il atribuie lui Clojure si a ceea ce m-a invatat. Voi face o afirmatie poate uimitoare ca 90% din erorile pe care le-am facut eu au disparut pur si simplu – ca in toate, o intreaga categorie de erori pe care am facut-o au fost eliminate.

(Intentionez sa deschid aplicatia TweetScriber sursa, impreuna cu alte trei aplicatii pe care le-am scris. De indata ce imi dau seama cum sa scot toate secretele din repertoriul meu GitHub. Daca cineva vrea sa ma ajute, anunta-ma. matrimoniale public 24 slatina xoogler.org Voi lua orice ajutor pe care il pot primi. :).

Puteti rula TweetScriber, desi exista documentatie inexistenta aici. Puteti citi toate notele pe care le-am postat aici. (OMG, sunt incantat ca altcineva foloseste programul!) Puteti citi toate inscriptiile salvate pe care oamenii le-au postat de-a lungul anilor aici (acea portiune a fost scrisa de Jeff Weiss si William Hertling minunat).

Pe scurt, Clojure mi-a readus bucuria programarii in viata mea!

Relearning Coding: Cat de mult a parasit viata zilnica in 2008, dar a venit in 2016

Daca pot invata Clojure, oricine poate.

Inainte de a intra in momentele mele specifice de eliminare, am crezut ca ar merita sa descriu in ce masura codarea a incetat sa mai faca parte din viata mea de zi cu zi. Voi face caz ca eu invatand Clojure seamana cu Omul Encino care invata sa conduca – stii, filmul despre omul de pesteri care era inghetat in gheata si se trezeste in lumea moderna complet schimbata.

Cred ca acest lucru este relevant pentru multi oameni din tehnologie – am observat ca multe persoane din domeniul tehnologiei si-au inceput cariera de codificare, dar apoi pe masura ce cariera lor a evoluat, au inceput sa codifice mai putin – uneori trebuie sa mearga in managementul oamenilor, in managementul de proiect, securitatea informatiilor, gestionarea produsului sau in functiile de afaceri.

Dar cred acum mai mult ca niciodata ca codificarea este o competenta care va fi necesara in fiecare profesie, indiferent de domeniul specific in care va specializati sau ce rol aveti in cadrul unei organizatii. Dupa cum a declarat genialul Mark Schwartz (fost CIO al serviciilor de cetatenie si imigrare din SUA si autor al multor carti uimitoare, inclusiv Seat at the Table: IT Leadership in the Age of Agility), intr-o adresa adresata comunitatii integratoare a sistemului guvernamental, „avem nevoie de tehnica oameni, pentru ca am auzit ultima data, acesta este inca un domeniu tehnic. ”

(Adica, OMG, nu? Raspunsul la orice observatie ca „nu sunt tehnic” mi se pare din ce in ce mai jignitor. Poate ca voi scrie mai multe despre asta la o data ulterioara.)

Iata cateva statistici concrete despre ceea ce mi s-a intamplat, in mare parte pentru a-mi motiva afirmatia ca am devenit „non-tehnic” de aproape un deceniu. Iata un grafic care arata fondul meu de programare, care arata an de an cate linii de cod am scris (este o presupunere salbatica). public 24 matrimoniale tg jiu dsmiv.org

Am creat acest grafic dupa ce dr. Mik Kersten mi-a mentionat ca a scris peste un milion de linii de Java in cariera sa, iar Rod Johnson (inventatorul Spring) a spus ca a scris milioane de linii Java. Pana atunci nu ma gandisem niciodata la cate linii de cod am scris in cariera mea …

Ceea ce am descoperit a fost destul de surprinzator …

  • Perl: mii de LoC
  • C / C ++: sute de mii de LoC
  • Rubin: zeci de mii de LoC
  • Java: sute de LoC



Ce mi-a atras atentia cu adevarat: am scris doar „sute de linii de Java” – de fapt, scrisesem mai multe Perl decat Java! In schimb, cea mai mare parte a generatiei mele a scris probabil 10K, 100K sau chiar milioane de linii de Java! Intr-un fel am ramas blocat in C-C si C ++ cul-de-sac si, din cauza unei fluctualizari de timp, am ratat intreaga revolutie Java, care a fost incontestabil centrul de greutate atat pentru cercetare industriala, cat si pentru cercetarea academica – mai multe generatii de doctorate au fost creat in jurul a aproape toate aspectele Java si JVM.

Poate amuzant, la acea vreme, eram fericit sa stau pe marginea Java, pentru ca … motive stupide … matrimoniale femei belgia hampus.biz Cand am obtinut diploma de licenta in informatica (1990–1993), limba pedagogica predominanta a fost C. In momentul in care am fost la scoala absolvita (1993–1995), C ++ tocmai iesea la iveala si parea laudabil la acea vreme. Unul dintre profesorii mei, celebrul doctor Todd Proebsting, a glumit: „De unde stii daca un program a fost scris in C ++? Programul necesita 10 secunde pentru a iesi ()! ” (Intarzierea cu mult inainte de a renunta la program a fost numita de la toti cei care distrug clasa.)

In jurul anului 1995, Java incepea sa se vorbeasca – si, de cele mai multe ori, ne-am facut de ras si din cauza timpilor de pornire absurd de lungi ai JVM. La acel moment, Perl si Tcl au fost respinsi ca niste simple „limbaje de script”, neadecvate pentru programatorii reali.

Cand revolutia Java era in plina desfasurare la inceputul anilor 2000, codificarea disparuse practic din viata mea de zi cu zi, si abia la sfarsitul anilor 2000 am reintrat in realizarea unor proiecte de codificare pentru hobby-uri substantiale. (Pe atunci m-am distrat foarte mult incercand sa concurez in provocarea de recomandare Netflix cu William Hertling, lucru pe care l-am facut in Ruby.)

In schimb, programarea Java a revolutionat si un ecosistem intreg a inflorit in jurul sau, cum ar fi Maven (Maven este la Java ca npm este la JavaScript, ruby ​​gem-uri este la Ruby, pip este la Python etc.), JVM, Eclipse etc. …

Cumva, nu numai ca am ratat revolutia Java, dar nu m-am expus niciodata la programarea LISP (sau chiar Emacs), ceea ce a facut ca intrarea mea in Clojure sa fie mult mai dificila.

Si totusi, acum iubesc JVM-ul, pe care Clojure ruleaza. Si imi place LISP, din care Clojure este un dialect. anunturi evenimentul iasi matrimoniale muser.frogpress.com

Din nou, daca o pot face, oricine poate!

De ce iubesc LISP-urile acum

Sa vorbim despre faptul ca Clojure este mai intai un LISP. Dupa cum sa mentionat in graficul de mai sus, LISP este o limba foarte antica, care dateaza din 1958. Si este foarte distinctiva. Chiar inainte de a merge la facultate, stiam ca oamenii se distrau de LISP, glumind ca este vorba de „multe paranteze stupide”.

Dar nu ma intorc niciodata. Ca aproape totul despre Clojure, ca LISP, sintaxa sa este uimitor de simpla. Totul se afla in paranteze, verbul este intotdeauna in fata si argumentele sunt alaturi.

Da, aproape toata lumea care nu a folosit un LISP initial o considera straina – prima mea reactie a fost: „vaca sfanta, nici macar nu pare un cod”. Dar este de fapt o sintaxa mult mai uniforma si mai simpla.

Contrasta LISP la ordinea complicata a operatiunilor de precedenta pe care le gasesti in aproape toate celelalte limbaje de programare, precum si uriasele lor gramatici si sintaxa. Asta necesita mult spatiu cerebral.

Vorbeam cu un plumb de programare JavaScript la o bara (da, despre asta imi place sa vorbesc in baruri) si m-a intrebat cum ar arata un program Clojure, care ar analiza un numar intreg intr-un fisier JSON si ar creste acel numar intreg Doua. Iata cum arata – cred ca este destul de frumos:

; intrarea este sirul JSON: „{foo: 2}” (defn xform [s] (-> (js / JSON.parse s) js-> clj (actualizare „foo” + 2) clj-> js js / JSON.stringify ))

Iata o versiune ceva mai adnotata care descrie mai pe deplin ce se intampla:

(defn xform-adnotat [s]; Imi place functia -> numita threading; in principiu, se inlantuieste functiile impreuna – compozitia; functiile, trecand rezultatele functiei anterioare ca prim argument (->; apeleaza la node. matrimoniale 24 oradea www.vandusengardens.org js; retineti ca primul este numele functiei, iar „s” este argument (js / JSON.parse s); convertiti-l de la obiectul JS nativ in harta Clojure (js-> clj); actualizati cheia „foo” aplicand functia (fn ( + 2)); retineti ca nu se intampla nicio mutatie – returneaza o noua harta (actualizare „foo” + 2); convertiti inapoi in obiect JSON nativ (clj-> js); apelati la functia de nod pentru a se transforma in sir ( js / JSON.stringify)))

O minunata (si primavara gratuita) despre sintaxa LISP este aici: https://www.braveclojure.com/do-things/— aceasta este doar o portiune a cartii fantastice a lui Daniel Higgenbottom, Clojure for the Brave and True: Learn the Ultimate Language and Deveniti un programator mai bun. (Mai multe recomandari de carte mai tarziu.)

Pentru a incheia aceasta sectiune, asa cum am spus, nu ma voi intoarce niciodata la un LISP. Viata este prea scurta pentru a invata gramatici limbi stralucitoare cu tone de cazuri speciale. Dar am devenit tanguitor si in alte moduri. (Mai multe despre asta mai tarziu.)

Programare functionala si imuabilitate (si John Carmack)

Un alt lucru care initial m-a flumat despre Clojure a fost notiunea de imuabilitate. La urma urmei, cum trebuie sa scrii un program atunci cand nu mai ai voie sa schimbi valoarea variabilei?

De-a lungul anilor, am citit multe articole despre programul functional care extinde valoarea functiilor pure si imuabilitatea – acestea sunt doua dintre caracteristicile adesea asociate limbajelor de programare functionale, cum ar fi Haskell, OCaml, Erlang, Elm, Elixir, Scala, PureScript , F #, si bineinteles, Clojure.

Unele dintre beneficiile promise includ programe care sunt mai usor de motivat, capacitatea de a le paraliza banal si asa mai departe. Una dintre primele carti pe care le-am citit pentru a invata Clojure a fost Programarea Clojure: LISP practic pentru lumea Java – o carte pe care o recomand cu mare drag, deoarece se adreseaza programatorilor obisnuiti cu Python, Ruby si Java.



  • site matrimoniale botosani
  • matrimoniale codlea
  • matrimoniale teleorman zimnicea
  • matrimoniale america
  • saituri matrimoniale noi
  • irina matura matrimoniale
  • public 24 matrimoniale bv
  • publi 24 matrimoniale alba
  • publi24oradea matrimoniale
  • www matrimoniale romania
  • aliante matrimoniale
  • matrimoniale romania piatra neamt
  • publicitate matrimoniale
  • matrimoniale gay timisoara
  • sitte matrimoniale
  • matrimoniale casatorii bucuresti
  • publi24 buzau matrimoniale
  • matrimoniale femei care fac sex
  • matrimoniale romania cu nr de telefon
  • matrimoniale moldova femei divortate




Inca m-am chinuit sa-mi duc capul in jurul principiilor de baza si a idiomurilor sale. matrimoniale neoprotestante daltonmusic.org Si apoi am citit un esantion de cod, cu urmatorul avertisment: „In rubin, chiar sirurile, adesea imuabile fidel in alte limbi, sunt mutabile. Aceasta poate fi sursa de tot felul de probleme. ”

Cand am citit urmatorul esantion de cod, m-am insurubat in pozitie verticala in pat, panicat de ceea ce tocmai am citit:

# Ruby code s1 = „hello” s2 = „world” s3 = s1 + s2 # s1 este inca „hello” s4 = s1 << s2 # s1 este acum „salut lume” # !!!! Mutatia s1 este efect secundar! >> s = „salut” => „salut” >> s << „*” => „salut *” # valoarea a fost mutata !!!! >> s == „salut” => false ????????????

Cand spun ca m-am „insurubat in picioare”, ma refer destul de literal. De fapt, m-am panicat de teroarea pe care am simtit-o, intrebandu-ma de cate ori poate am scris din greseala un cod care a schimbat o variabila pe care nu am vrut sa o schimb. De fapt, puteti vedea acest tweet pe care l-am scris a doua zi dimineata in acea stare de groaza existentiala. Atunci am realizat ca mutatia este mai periculoasa decat credeam.

Il iubesc pe Ruby. Noaptea trecuta, in timp ce citeam, am aflat ca nu inteleg ceva foarte fundamental in legatura cu sirurile de Ruby: rusine pentru mine! pic.twitter.com/Mk26jH1z35

– Gene Kim (@RealGeneKim) 18 octombrie 2016

(Intamplator, oamenii au raportat sentimente similare de pura teroare, dupa ce au citit cartea lui Brian Goetz Java Concurrency In Practice, realizand toate lucrurile care pot merge gresit in programarea concomitenta in codul scris de ei, ducand adesea unul la imbratisarea de limbi precum Clojure. Mai multe despre Brian Goetz mai tarziu.)

Pe parcursul anului urmator, mi-a rasarit cu adevarat ca interzicerea mutatiei variabile a facut ca programele sa fie mai simple si mai usor de motivat, chiar si pentru programele cu un singur fir. M-a facut sa-mi dau seama ca „trecerea variabilelor prin referinta”, ceva ce credeam ca este un astfel de economisitor de timp, a fost de fapt unul dintre lucrurile care mi-au provocat probleme imense, deoarece a provocat schimbarea variabilelor prin parti indepartate ale codului.

Iata un scurt videoclip pe care l-am facut, care a descris momentul meu aha despre cat de periculos este trecerea variabilelor prin referinta la nesuferit.

Ororile! Dupa programarea in Clojure, mi s-a parut atat de periculos (si vulgar!) Incat ai putea apela o functie si ar putea schimba obiectul pe care l-ai trecut! Cum poti sa te gandesti la un program care a permis mutatia necontrolata ca asta?

(Apropo, acea discutie de la Scott Havens este uimitoare: Pana de curand, a fost director de software Engineering, Jet. 2doi matrimoniale thevegandepot.com com/Walmart Labs, unde a fost responsabil pentru reconstruirea intregului sistem de management al stocurilor care sprijina Walmart, cea mai mare companie din lume. , scris in F # – un alt limbaj de programare functional uimitor. A vorbit despre modul in care a folosit principii de programare functionala pentru a simplifica masiv arhitectura vasta care a sustinut sistemele de gestionare a stocurilor, facand-o mai simpla, mai fiabila, mai usor de intretinut si mai ieftina de rulat. este o programare functionala nu in cel mic, ci intr-unul dintre cele mai mari si mai complexe procese de afaceri din lume – si la asta se inspira ultimele 20% din Proiectul Unicorn (descarcati extrase).)

La fel cum Clojure mi-a aratat cum o sintaxa LISP mai simpla iti elibereaza creierul pentru a te gandi mai mult la problema pe care vrei sa o rezolvi, lumea fara mutatii m-a facut sa-mi dau seama cat de dificil este sa urmaresti cum se intampla mutatiile din programele tale.

Dar nu o lua de la mine – ia-o de la John Carmack, care ne-a influentat pe multi dintre noi, ca unul dintre fondatorii software id (DOOM, Quake etc.), acum CTO al Oculus VR. A scris un articol uimitor in 2013 in revista Gamasutra despre puterea de a utiliza concepte functionale de programare in C ++.

Rezumatul meu pragmatic: O mare parte din defectele dezvoltarii de software se datoreaza programatorilor care nu inteleg pe deplin toate starile posibile pe care le poate executa codul lor. Intr-un mediu multitrat, lipsa de intelegere si problemele rezultate sunt amplificate mult, aproape pana la punct de panica daca esti atent. Programarea intr-un stil functional face ca starea prezentata codului dvs. sa fie explicita, ceea ce face mult mai usor sa se rezoneze si, intr-un sistem complet pur, face imposibila conditiile de cursa.

Indiferent de limbajul in care lucrati, programarea intr-un stil functional ofera avantaje. Ar trebui sa o faceti ori de cate ori este convenabil si ar trebui sa va ganditi la decizie atunci cand nu este convenabil. Puteti afla mai multe despre lambdas, monade, currying, compunerea functiilor evaluate lenes pe seturi infinite si toate celelalte aspecte ale limbajelor explicit orientate functional mai tarziu, daca alegeti. matrimoniale baia sprie www.shopforbeauty.com

C ++ nu incurajeaza programarea functionala, dar nu te impiedica sa o faci …

Functiile pure sunt banale de testat; testele arata ca ceva chiar dintr-un manual, unde construiti cateva intrari si priviti la iesire. De fiecare data cand intalnesc un pic de cod care arata acum, il impartesc intr-o functie pura separata si scriu teste pentru asta. Infricosator, deseori gasesc ceva gresit in aceste cazuri, ceea ce inseamna ca probabil nu arunc o plasa suficient de larga.

Imi amintesc ca am citit acest articol in 2013, dar abia in momentul in care l-am citit in 2016 am realizat cat de universal este aceasta problema – nu este doar pentru jocurile scrise in C ++ care trebuie sa ruleze la 60 de cadre pe secunda, ci este orice programator.

In nota sa principala QuakeCon din 2013, el descrie experimentele sale care au rescris Castle Wolfenstein 3D folosind tehnici de programare functionale in Haskell, pentru a explora in ce masura se poate folosi un limbaj de programare care a interzis mutatia, ceea ce a fost absolut fascinant.

(In aceasta discutie, Carmack vorbeste si despre explorarile sale despre LISP, facand exercitiile din faimoasa carte MIC SICP, de ce creste din ce in ce mai convins de valoarea unor limbi puternice, tipizate static pentru mari coduri de cod care trebuie mentinute mult timp timpul, si multe alte observatii fascinante din una dintre legendele programatorului … Voi scrie mai multe despre acest lucru in partea 2.)

O greseala pe care am facut-o de la scoala Grad: compozibilitate

Dupa ce a castigat mai multa competenta in Clojure, multe alte lucruri devin evidente. Un lucru pe care l-am invatat este avantajele apasarii efectelor secundare (adica a oricaror functii impure, cum ar fi orice lucru care implica intrare sau iesire) pe marginile programului si sa ma asigur ca orice altceva este o functie pura.

Pentru recapitulare, functiile pure sunt cele pe care iesirea este strict o functie a intrarilor. matrimoniale ungaria www.go.pornfetishforum.com Unul dintre avantajele functiilor pure este ca functia poate fi testata complet in mod izolat, dupa cum a notat John Carmack mai sus.

Cand am inceput sa fac un punct in acest sens, beneficiile au inceput sa devina destul de evidente. De fapt, am inceput sa am banuiala ca neexercitarea acestui lucru a fost unul dintre principalele motive pentru care codul pe care l-am scris va deveni din ce in ce mai incest si dificil de schimbat – ceea ce a dus la sentimentul ca codul meu se prabusea sub propria greutate.

Aceasta este o problema pe care o am de foarte mult timp … De fapt, am inca o amintire foarte vie de cand aceasta problema a ucis un proiect la care lucram. A fost in timpul clasei mele de compilare de mare viteza la scoala absolvita in 1994, unde am construit un compilator Modula-2 in C ++ care a generat codul de asamblare SPARC, care a fost apoi compilat intr-un executabil Solaris.

Mai intai ai scris un analizator lexical pentru a tokeniza intrarea (folosind lex ), apoi compilatorul care ar transforma jetoanele intr-un arbore de sintaxa abstracta (folosind yacc ), transformandu-l intr-un format intermediar si apoi emite cod de asamblare. Si apoi folositi ca sa compilati.

A inceput excelent, mai ales ca mai inainte am scris lexere si parsere. Dar, la fiecare etapa ulterioara, imi amintesc senzatia de a trece faza anterioara de compilare in urmatoarea faza, gandindu-ma: „Bine, aici nu merge nimic…. Imi pun codul undeva unde nu il mai pot accesa direct si se simte ca arunc intr-un put adanc si intunecat … oferte matrimoniale pascani rscottakin.com Sper ca functioneaza. ”

Cu alte cuvinte, am scris fazele compilatorului intr-un mod in care fiecare faza nu mai era rulata in mod independent, cu atat mai putin testabila. Am fost destul de bun acolo unde nu a fost chiar o problema pana in ultima faza, in care am executat programul nostru executabil SPARC.

Imi amintesc compilatorul meu care lucra pentru toate cazurile de test, pana cand a trebuit sa implementam recursiv. Apoi a inceput sa explodeze dupa un anumit numar de apeluri recursive – dupa mai multi nopti atotcuprinsi, in sfarsit mi-am dat seama ca calculez in mod incorect locatiile de memorie ale variabilelor din stiva, crescand probabil indicatorul stivei in mod gresit. Dupa un anumit numar de apeluri functionale recursive, programul generat s-ar fi separat si ar muri.

Chiar am crezut ca mi-am dat seama conceptual de ceea ce nu merge bine, am ramas fara timp si nu am putut remedia mizeria pe care mi-am creat-o inainte de a-mi trimite compilatorul cu defecte fatale. Probabil am primit una dintre cele mai mici note din clasa.

Ceea ce invatasem a fost ca ingroparea codului meu, astfel incat sa poata fi executat doar in alte functii, incalca principiul compozitiei – capacitatea de a-l rula si testa, independent si izolat de celelalte module. .

Iata cateva pseudo-cod al modului bun vs. al modului prost …

; ; mod bun: pasii sunt compusi impreuna, care fiecare faza de compilare; indecendent executabil si testabil; (-> (tokenize-sursa-fisiere!) (gene-abstract-syntax-tree) (generare-intermediere-reprezentare) (generare-asamblare-instructiuni) (scriere-asamblare-iesire-fisiere!)); ; cale gresita ; toate treptele intermediare ingropate in alte functii, care nu mai sunt accesibile sau inspectabile; tokenize-source-files-and-genera-ir-si genera-montaj ();

In Clojure, m-am indragostit de conventia de a marca functii impure cu a!, Pentru a face evident cand se pot produce reactii adverse. matrimoniale oradea cu poza desibelsound.com Aceasta include orice functie care citeste de pe disc sau o baza de date, cu atat mai putin scrie la una – pana la urma, chiar si intrarile externe fac iesirea impura. Aceste functii eficiente ar trebui sa fie impinse pana la inceputul sau sfarsitul programului dvs., ceea ce face ca totul la mijloc sa fie redus si testabil in mod independent.

Este jenant ca au trecut treizeci de ani dupa ce am inceput codificarea profesionala pentru a descoperi in sfarsit aceasta greseala, care a afectat aproape fiecare program mare pe care am lucrat.

Si, desigur, multi oameni au invatat acest lucru in urma cu douazeci de ani, fie prin intuitie, experienta, fie citind carti grozave, cum ar fi Refactoring: Imbunatatirea proiectarii codului existent de Martin Fowler. Insa m-am invartit cu capul, doar dupa ce am fost obligat sa ma confrunt cu asta in Clojure, ceea ce pare sa aduca aceste probleme in fata si in centru.

(De asemenea, ceea ce este interesant pentru mine este ca, prin impingerea efectelor secundare catre margini, aproape totul poate fi rescris ca functii pure si testat cu teste unitare. Anterior, majoritatea testelor mele mi-au testat adesea codul si I / O, apelurile API , etc … In mod ideal, doriti doar sa testati codul pe care l-ati scris. Nu trebuie sa testati daca sistemul de fisiere functioneaza in fiecare test, sau daca functioneaza API Trello, etc … Apasand I / O catre margini. anunturi matrimoniale curtea de arges gloobot.com , nevoia de ciocuri si cioturi fragile aproape ca dispare complet.)

Epifania pe care am citit-o „Reactioneaza pentru ca programatorii jQuery sa ajunga”

Altceva s-a intamplat in timpul primei mele rescrieri de TweetScriber care m-a amorsat pentru un alt moment aha Clojure. Stiind aproape nimic despre scrierea unei aplicatii JavaScript, initial faceam niste cercetari si m-am impiedicat de acest articol uimitor, o introducere pentru a reactiona in 2019 (pentru oamenii care stiu doar suficient de mult jQuery To Get By), care a fost scris initial de Shu Uesugi (@chibicode ) in 2015 si revizuit de Julien Benchetrit (@julienbenc).

Practic nu am avut experienta cu lucrul in browser-ul DOM, nu folosisem niciodata jQuery (dar auzisem despre cat de revolutionar era cu ani in urma) si cu siguranta nu am folosit niciodata unul dintre aceste cadre mai moderne precum React.

Articolul mi s-a parut deosebit de oportun, deoarece la prima vedere, exercitiile pareau sa acopere 50% din functionalitatea TweetScriber de care aveam nevoie! Dar citind exercitiile, parea sa discute ceva foarte important, cu cateva lectii profunde despre modul in care starea programului duce la o complexitate incredibila – mai multe lucruri care au determinat programele mele sa se prabuseasca in sine.

  • Pasul 1. Scrieti o caseta Tweet, care va permite sa tastati intr-o fereastra de textarea, cu un buton Tweet.

    Rece. Abia stiam suficient HTML pentru a scrie acest lucru, asa ca copierea acestui cod ar fi minunat. Destul de usor.

  • Pasul 2. Schimba Tweetbox-ul astfel incat daca continutul depaseste 140 de caractere (articolul original a fost scris in 2015), atunci dezactiveaza butonul Tweet.

    Grozav. Avem acum o anumita stare asociata cu programul, dar nu este prea rau, pentru ca doar urmareste numarul de caractere din text si ajusteaza daca butonul este dezactivat sau nu.

  • Pasul 7. matrimoniale.3x forum webhannetgc.com Modificati caseta de Tweet pentru a afisa caractere ramase si un mesaj de afisare care indica prin cate caractere ati depasit limita.

    Bine, acest lucru se complica putin, deoarece acum aceste componente diferite trebuie actualizate diferit in functie de starea …

  • Pasul 9. Adaugati un buton Adauga fotografie, care afiseaza „fotografie adaugata” daca o fotografie a fost deja adaugata si, de asemenea, scade 23 de caractere din numarul de caractere ramase (deoarece linkurile catre fotografii consuma caractere).

    Bine, ideea acestor exercitii devenea foarte evidenta, pentru ca acum managementul de stat devine o problema reala, iar utilizarea stilului jQuery de apeluri a devenit o adevarata mizerie – chiar sa urmareasca componentele care trebuie sa se cunoasca intre ele si ce responsabilitatile lor sunt unul fata de celalalt, pareau imposibil de retinut.

    Si asta este pentru o mica aplicatie pentru jucarii !!! Intr-o aplicatie reala, complexitatea este ca ordinele de marime sa fie mai grave!

Cu alte cuvinte, in implementarea jQuery, fluxul de informatii de la o componenta la alta devine incurcat. Diagrama de mai jos o arata magnific.

SIMPLU! Sursa: Shu Uesugi si Julien Benchetrit

In schimb, luati in considerare aceeasi functionalitate implementata cu ceva de genul React, intr-un stil mai functional, unde starea este mutata intr-un singur loc si toate elementele UI sunt redate de la stat. Statul este schimbat intr-un mod foarte uniform si UI este redat ca functii pure, niciodata stare de mutare.

Diagrama de mai jos arata cat de simplu este fluxul de date …

COMPLECTED! Sursa: Shu Uesugi si Julien Benchetrit

Am considerat ca acesta este un argument socant de convingator despre modul in care trebuie scris codul. modele de paturi matrimoniale fearproof.net Si am fost destul de fericit de prima mea versiune pe care am scris-o in TypeScript si React.

(In rescrierea mea ClojureScript folosind re-cadru, s-a adresat una dintre problemele pe care le-am gasit in utilizarea React, care a fost starea este imprastiata pe toate componentele. Re-frame si Redux adopta o abordare diferita, care consta in punerea tuturor starii mutabile un loc, pe care l-am gasit functioneaza magnific. Acest lucru a fost atat de reusit pentru mine, incat nu voi scrie niciodata o aplicatie web client in alt tip de cadru.)

Cred ca acest moment aha m-a pregatit pentru descoperirea Rich Hickey si Clojure …

Ce spune Hickey bogat despre simplitate: de unde vine primul ideal al localitatii si al simplitatii

Rich Hickey este inventatorul lui Clojure, iar discutiile sale si Clojure au afectat atat de mult modul in care ma gandesc la software – de fapt, toata aceasta postare pe blog incearca sa incadreze unele dintre aceste momente aha.

A existat o singura discutie Rich Hickey care m-a lovit ca o tona de caramizi, care a fost faimoasa sa discutie „Simple Made Easy” pe care a sustinut-o la Strange Loop 2011 – daca epifania jQuery / React a fost un moment aha, aceasta discutie a fost un cor de momente aha. 2

Discutia este aici pe site-ul InfoQ (care prezinta diapozitivele asociate cu coloana sonora) si puteti gasi o transcriere minunata a discutiei aici. De asemenea, puteti gasi o versiune a discutiei pe care a facut-o pentru comunitatea Ruby and Ruby on Rails pe YouTube aici.

Aceasta discutie este atat de impactanta pentru mine incat sunt aproape tentat sa spun: „Duceti-va si luati o ora pentru a asculta discutia. O sa astept aici.”

Printre multe alte lucruri, el vorbeste despre cat de limitat este creierul uman in capacitatea sa de a rationa despre lucruri, de a tine evidenta lucrurilor, de a intelege cu complexitate (cum ar fi exemplul jQuery de mai sus). El a afirmat ca diferenta de capacitate cognitiva dintre programatorul dvs. matrimoniale sex cluj www.fssmaterials.com mediu si programatorul dvs. mediu nu este diferenta de 10 ori evitata. El a spus (accentul meu):

Atunci avem si aceasta alta parte, care este partea de capacitate mentala. Si asta este partea despre care este intotdeauna greu de vorbit, partea de capacitate mentala, deoarece, de fapt, putem invata mai multe lucruri. De fapt, nu putem deveni mult mai destepti. Nu o sa ne miscam; nu ne vom apropia creierul de complexitate. Trebuie sa facem lucrurile aproape simplificandu-le.

Dar adevarul nu este ca sunt acesti oameni super, stralucitori, care pot face aceste lucruri uimitoare si ca toti ceilalti sunt blocati, deoarece analogia jonglerilor este destul de aproape. Dreapta? Jucarul mediu poate face trei bile. Cel mai uimitor jongler din lume poate face, cum ar fi, 9 bile sau 12 sau ceva de genul. Nu pot face 20 sau 100. Suntem cu totii foarte limitati.



  • glasul maramuresului matrimoniale
  • matrimoniale bucuresi
  • matrimoniale tg ju
  • matrimoniale calarasi.ro
  • matrimoniale israel
  • anuntul.ro matrimoniale bucuresti
  • matrimoniale galati femei
  • pub 24 matrimoniale oradea
  • prima love matrimoniale
  • matrimoniale definitie
  • matrimoniale-romantic.ro
  • saituri cu matrimoniale
  • public 24 brasov matrimoniale
  • raid ploiesti matrimoniale femei
  • matrimoniale dating romania
  • con stanta matrimoniale
  • site de matrimoniale gratuit
  • publi 24 braila matrimoniale
  • evenimentul de iasi anunturi matrimoniale
  • matrimoniale online romania





Fata de complexitatea pe care o putem crea, toti suntem statistic in acelasi punct in capacitatea noastra de a o intelege, ceea ce nu este foarte bun. Deci va trebui sa aducem lucrurile catre noi.

El vorbeste despre nevoia de simplitate in software-ul pe care il scriem si despre lucrurile in care scriem software-ul nostru. matrimoniale jibou video-bookends.com Conditiile pentru simplitate includ existenta unor componente care sunt complet decuplate unele de altele, fara cunostinte reciproce. La fel ca in exemplul jQuery, lucrurile devin rapid o mizerie completa atunci cand toate controalele diferite trebuie sa stie unele despre altele – este dificil sa o faci sa functioneze corect, sa motiveze ce se intampla cand se schimba starea si este dificil sa scrii functionalitati suplimentare la ea.

Hickey parcurge cateva dintre conceptele de baza din limbajele de programare si descrie extremele care reprezinta idealul de simplitate si care reprezinta complexitatea care duce in cele din urma la incapacitatea de a intelege si de a schimba in siguranta codul nostru, precum si mizeria si catastrofa.

Sursa: Rich Hickey, Simple Made Easy (2011)
Sursa: Rich Hickey, Simple Made Easy (2011)

Asa cum am mentionat la inceputul acestui articol, Proiectul Unicorn (descarcati extrase) este despre structurile invizibile care permit dezvoltatorilor sa fie productivi. O mare parte din aceasta provine de la conceptele pe care Rich Hickey le-a sustinut de-a lungul anilor si care au devenit infuzate in Clojure si in comunitatea Clojure:

Iata un extras din Proiectul Unicorn in care Erik rezuma conceptele lui Rich Hickey in jurul simplitatii si „complectedness”.



Raspuns Erik, „Complect” este un cuvant arhaic, inviat de Sensei Rich Hickey. Este un verb care inseamna sa transformi ceva simplu in ceva complex.

„In sisteme strans cuplate si complectate, este aproape imposibil sa schimbi nimic, pentru ca nu poti schimba doar o zona a codului, trebuie sa schimbi o suta sau chiar o mie de zone ale codului. Si chiar si cele mai mici schimbari pot provoca efecte salbatic imprevizibile in parti indepartate ale sistemului, poate in ceva despre care nici macar nu ati auzit.

„Sensei Hickey ar spune, ganditi-va la patru fire de fire care atarna independent – acesta este un sistem simplu. Acum luati aceleasi patru fire de fire si impletiti-le impreuna. Acum i-ai cuprins. Ambele configuratii ale firelor ar putea indeplini acelasi obiectiv de inginerie, dar una este dramatic mai usor de schimbat decat cealalta. In sistemul simplu, puteti modifica un sir independent, fara a fi nevoie sa atingeti celelalte. Ceea ce este foarte bun. publi24 resita matrimoniale alloysurfcaesinc.info

Erik rade: „Cu toate acestea, in sistemul constrans, atunci cand vrei sa faci o schimbare la un fir de fire, esti obligat sa schimbi si celelalte trei fire. De fapt, pentru multe lucruri pe care poate doriti sa le faceti, pur si simplu nu puteti, pentru ca totul este atat de innodat impreuna!

„Si atunci cand se va intampla asta”, continua el, „te-ai prins intr-un sistem de munca in care nu mai poti rezolva cu usurinta problemele reale de afaceri – in schimb, esti obligat sa rezolvi pur si simplu puzzle-uri toata ziua, incercand sa-ti dai seama. cum sa iti faci mica schimbare, obstructionata de sistemul tau complect la fiecare pas al drumului. Trebuie sa planificati intalniri cu alte echipe, sa incercati sa-i convinga sa schimbe ceva pentru dvs., sa-l escaladati catre managerii lor, poate pana la capat.

„Tot ceea ce faci devine din ce in ce mai indepartat de problema reala de afaceri pe care incerci sa o rezolvi”, spune el. „Si asta, Dwayne, este ceea ce toata lumea a descoperit cand au oprit rutele din acele fabrici. Inainte aveai trei siruri independente, cu o echipa capabila sa functioneze independent, dar cu pretul de a trebui sa intretina trei comutatoare de retea.

„Cand le-ati pus pe toate pe un comutator, le-ati complectat fluxurile de valori, toate acum au dependente unul de celalalt care nu existau inainte! Acestia trebuie sa comunice in permanenta, sa coordoneze, sa programeze, sa vada mare, secventa si sa deconflicteze munca lor. Acum au un cost extrem de mare de coordonare, care a prelungit timpii de plumb, a scazut calitatea si, in povestea ta, a dus la o catastrofa de o saptamana care a afectat semnificativ afacerea, mergand pana la Steve! ” Spune Erik cu glee.

Puteti gasi multe colectii de „Rich Hickey’s Greatest Hits” pe internet. Aici sunt cateva:

  • https://github.com/tallesl/Rich-Hickey-fanclub
  • https://www.youtube.com/playlist?list=PLXsqD83He-e5oUh_DFrHbO3MoNj3tG8Vh



(In Proiectul Unicorn (descarcati extrase), gluma despre „cati oameni aveti nevoie pentru a lua la pranz pentru a face o functie” a fost preluata din discutia sa pe care a facut-o la conferinta Java One 2015: https: //www. retele de socializare matrimoniale obabygear.com youtube.com/watch?v=VSdnJDO-xdg. De fapt, in unele privinte, cuplarea ca una dintre temele cheie ale cartii a venit din vizionarea acestei discutii, unde a comparat interfetele REST moderne cu vremurile proaste. de CORBA si Sun RPC, unde schimbarea a fost nevoie de toata lumea pentru a coopera.)

Ceea ce mi se pare atat de interesant este ca programarea functionala elimina, de asemenea, iterarea si bucla, care este atat de predispusa la erori de la unul la altul. In Proiectul Unicorn , atunci cand Maxine se imperecheaza cu unii scolari din Python, ea isi gaseste eroarea „off by one” cand se itereaza printr-un tablou. Acest lucru a fost inspirat de Cornelia Davis, care a descris cand a lucrat cu fiul ei de varsta universitara la un program de secventiere genomica in Python, aratand contrastul in stilul de programare imperativ vs. functional: https://youtu.be/R1RDhUf1Go4?t=492

Apropo, iata o discutie cu totul stralucitoare despre a arata cum sa convertiti un program imperativ intr-un stil mai functional in JavaScript: „Rezolvarea problemelor The Clojure Way”, de Rafal Dittwald.

Rezolvarea problemelor de afaceri, nu rezolvarea puzzle-urilor – De ce detest infrastructura in aceste zile …

Asadar, simt ca trebuie sa explic o alta consecinta a recunoasterii acum si a dorintei de a evita complexitatea. Am mentionat ca acum ma auto-identific ca dezvoltator .. matrimoniale casatorii arad mathcourse.net . Ceea ce nu v-am spus a fost ca acum ma auto-identific ca unul dintre acesti dezvoltatori parohiali foarte infocati, pe care oamenii Ops ii urasc.

In idealul meu, vreau doar sa lucrez la rezolvarea problemei pe care mi-am propus sa o rezolv, lucrand in cadrul bulei mele aplicatii functionale. Si nu vreau sa ma descurc cu nimic in afara bulei respective.

Iata toate lucrurile pe care le-a placut sa le fac, dar acum detest sa fac …

  • ma ocup de orice in afara aplicatiei mele
  • conectarea la orice la orice (inclusiv baze de date)
  • Baze de date SQL si de a afla de ce intrebarile mele sunt atat de lente
  • actualizarea dependentelor (pentru ca, atat de greu …)
  • secret management (ditto)
  • bash
  • YAML
  • patching (atat de incomod …)
  • construirea fisierelor de implementare kubernetes (in mare parte de Googling)
  • incercand sa inteleg de ce costurile mele de cloud sunt atat de mari



Asta nu inseamna ca aceste lucruri nu sunt importante. Dimpotriva, sunt absolut critici. saituri matrimoniale online gratuite www.pancakewithsyruppockets.com De aceea cred ca zilele cele mai stralucitoare ale Infrastructurii si Operatiunilor si ale Infosec sunt inca in fata noastra, nu in spatele nostru. Cred ca meseria oamenilor de infrastructura si securitate este de a crea platformele pe care dezvoltatorii le pot folosi pentru a avea grija de toate aceste cerinte nefunctionale, fara a fi nevoie de Google si Stack Overflow toata ziua.

In sfarsit, REPL… buclele de feedback final cu feedback rapid!

Bine, este timpul sa inchei acest prim articol, care impinge cu 8K cuvinte si despre atatea alte lucruri vreau sa scriu pentru ca sunt atat de entuziasmat de ei, dar este timpul sa postez ceva … altfel, voi niciodata sa nu postezi nimic.

Dar despre un lucru despre care trebuie sa scriu, este ceva care pare destul de unic pentru Clojure sau LISP-uri, care este natura uimitor de interactiva a dezvoltarii. Un motiv pentru care cred ca voi folosi Clojure pentru anii (sau decenii) care vor veni este din cauza REPL.

REPL inseamna Read-Eval-Print-Loop, pe care multe limbi il au. Dar nu stiu niciun alt limbaj modern care sa poata fi integrat intr-un editor, unde puteti modifica programul rulant, inspecta variabilele, rula functiile … din interiorul programului!

In spiritul Focus, Flow si Joy, cred ca experienta REPL este absolut uimitoare si sublima. Se pare ca iti construiesti programul din interior, scrii si testezi expresii, economisind I / O in variabile si transformand iesirea folosind functii pure. Am facut acest lucru cu programele Clojure care ruleaza pe JVM sau cu programele ClojureScript care ruleaza intr-un browser . anunturi matrimoniale gratuite fara inregistrare www.rivieratoscana.com .. Am facut-o pentru a analiza si vizualiza seturi mari de date, pentru a salva si a interoga bazele de date …

Revenind la programarea in care trebuie sa salvati si sa reincarcati programul, apoi poate chiar sa navigati pentru a reveni la o anumita stare a programului, acum pare intolerabil.

Acesta este cu siguranta unul dintre acele lucruri pe care trebuie sa le vezi pe un maestru la locul de munca pe care sa-l apreciezi pe deplin. Iata Bruce Hauman vorbind in 2015 despre acum celebrul figwheel, un instrument de construire ClojureScript care permite reincarcarea codurilor live (si multe altele). Urmariti cum arata ceva ce a scris in calatoria cu avionul la conferinta, in timp ce schimba simulatorul de sistem solar si aplicatia JavaScript se reincarca la cald in timp real.

(Da, puteti face acest lucru in JavaScript, dar aveti incredere in mine, datorita cat de mare este mutatia starii de zar, este foarte slaba. Pe de alta parte, modul in care Clojure impune mutatia care trebuie facuta intr-un mod foarte specific il face aproape perfect pentru asta stilul de codificare.)

Iata un videoclip din 2019 cu Sean Corfield (renumit pentru munca sa la bibliotecile Clojure JDBC cele mai utilizate pe scara larga) care arata modul in care foloseste REPL pentru a depana o problema raportata in functia core.memoize, folosind editorul Atom si plug-inul Cllorure Clojure . Parcurge pasii necesari pentru reproducerea problemei, formular dupa forma, iar iesirea fiecarui formular pe masura ce este evaluata este afisata in editor. In cazul esecului, urmarim cum inspecteaza starea interna a functiei, ipoteza ce nu merge bine, o confirma si o rezolva. (Apoi urmarim cum creeaza un test suplimentar pentru suita de teste Clojure si ruleaza in 10 ani de versiuni Clojure.)

Cred ca Sean face ca depanarea sa arate aproape distractiva si arata cat de puternic poate fi lucrul in cadrul unui REPL.

(Folosesc plug-inul cursiv pentru IntelliJ de Colin Fleming si echipa, care mi se pare absolut grozava. Folosesc Visual Studio Code pentru aproape toate fisierele non-Clojure, asa ca am mari sperante pentru plug-in-ul Calva…. Dar iubesc atat de mult caracteristicile Cursive, incat nu-mi pot imagina comutarea oricand in viitorul apropiat.)

Iata un videoclip excelent cu Mark Seeman care implementeaza programul „fizzbuzz” in trei limbi: C #, Haskell si apoi Clojure. Retineti ca foloseste un REPL pentru a face implementarea Clojure si, cu siguranta, se pare ca se distreaza mai mult decat o face in celelalte limbi! (Foloseste un editor mai ales abandonat, numit LightTable, care a fost inovator cand a fost lansat.)

Si iata un videoclip al mentionatului si uimitorului Mike Nygard care arata cum se face TDD folosind Clojure si baza de date Datomic, din interiorul Emacs. (Multi oameni echivaleaza Clojure cu Emacs – dar cred ca doar 50% dintre oamenii din comunitatea Clojure folosesc Emacs. Am pus ultimul videoclip pentru a demonstra cate optiuni viabile ale editorului Clojure exista!)

Comunitatea uimitoare Clojure, ganduri despartitoare si ce mi-ar placea sa scriu despre viitor

Am considerat ca comunitatea Clojure este incredibil de uimitoare si de sustinere. Exista un Clojurian Slack Channel care este incredibil. Clojure / conj si alte conferinte tind sa atraga dezvoltatori foarte experimentati care impartasesc sensibilitati similare. Toate aceste conferinte au tendinta de a invita unii dintre cei mai performanti cercetatori si contribuitori in domeniul programarii.

Un exemplu: unul dintre cele mai uimitoare discutii pe care le-am vazut a fost din Clojure / conj din 2016 in care Brian Goetz, arhitect pentru limbajul Java, a vorbit despre administrarea sa asupra ecosistemului Java. Ceea ce este inconfundabil si atat de admirabil este sentimentul sau de responsabilitate de a nu sparge codul pe care l-au scris noua milioane de dezvoltatori.

Iata o discutie a lui Tiago Luchini despre scrierea modelelor de domeniu declarativ – dupa ce urmariti acest lucru, nu veti mai dori sa faceti din nou o baza de date SQL sau noSQL … si de aceea am trecut la utilizarea bazei de date Datomic, de la aceeasi organizatie care aduce noi Clojure.

Cateva ajutoare de invatare excelente pentru Clojure:

  • Eric Normand are un set uimitor de tutoriale pe TV functional: https://purelyfunctional.tv/browse/?taxonomy=language – daca nu aveti multa experienta cu Java (ca mine), as recomanda mai ales module pe Java, JVM etc.
  • Arne Brasseur are un alt set de tutoriale uimitoare pe Insula Lambda: https://lambdaisland.com/
  • https://feierabendprojekte.wordpress.com/2018/10/27/high-level-vs-low-level/amp/
  • Faimosul Bob Martin de la Clean Code pe „De ce Clojure?”: Https://blog.cleancoder.com/uncle-bob/2019/08/22/WhyClojure.html



Recomand urmatoarele carti pentru a creste viteza pe Clojure:

  • Parerea mea ca cea mai buna carte pentru a invata Clojure este Obtinerea clojurii lui Russ Olsen: Construiti-va abilitatile functionale O singura idee odata (2018) – aceasta nu a fost publicata cand am aflat Clojure. Ciudat, l-am invatat pe Ruby citind si una dintre cartile sale!
  • In continuare, as citi: Programare Clojure: LISP practic pentru lumea Java de Chas Emerick, Brian Carper si Christophe Grand. Are exemple foarte bune despre solutionarea problemelor comune, cum ar fi conectarea la o baza de date, construirea unui server web etc.
  • De asemenea, mi-a placut Living Clojure: un plan de introducere si instruire pentru dezvoltatori de Carin Meier, deoarece are un stil fantastic de invatare „kata de codare”.



(Am cumparat aproape toate cartile de pe Clojure pe care le-am putut gasi – imi plac fiecare dintre ele.)

  • In spiritul invatarii de la oameni mai experimentati decat tine, as recomanda acest podcast uimitor: Design functional in Clojure de Christoph Neumann si Nate Jones: https://overcast.fm/itunes1443852833/functional-design-in-clojure



  • Videoclipurile lui David Nolen:
    • ClojuTRE 2016: „Urmatorii cinci ani de ClojureScript”: povestea uimitoare a modului in care David Nolen s-a implicat cu Clojure si ClojureScript in timp ce lucra la NYTimes, cum a devenit unul dintre cei mai importanti contribuitori la ClojureScript, opinia sa asupra importantei sale, si ce ar putea veni probabil: https://www.youtube.com/watch?v=mty0RwkPmE8
    • CraftConf 2019: „Regandirea identitatii cu Clojure”: o discutie grozava despre conceptele de baza pe care Clojure le regandeste si despre lucruri mai stralucitoare: https://www.youtube.com/watch?v=77b47P8EpfA&t=1s



(De asemenea, vreau sa-i multumesc lui Mike Fikes pentru tot ajutorul lui. Nu voi uita niciodata cum, intr-o clipa de impuls, acum cativa ani, am intrebat daca va fi disponibil sa discute, sa ma invete despre diferenta dintre diferite runtime ClojureScript si cum sa le conectati la IntelliJ. Sunteti uimitor si continuati munca excelenta! Ne pare rau si multumesc !!!)

Munca din cadrul comunitatii Clojure este atat de interesanta, ma abonez la fluxul RSS Planet Clojure, care agrega articole despre Clojure si programare functionala din mai multe surse: http://planet.clojure.in/.

Am foarte mult entuziasm sa scriu in viitor despre urmatoarele, pentru ca lumineaza Primul Ideal al Simplitatii si Localitatii, iar al doilea Ideal al Focusului, Fluxului si Bucuriei.

  • Programele Clojure pe care le-am scris pentru a analiza tiparele de scriere pe tot parcursul dezvoltarii Proiectului Unicorn (descarcati extrase).
  • Primele douazeci de videoclipuri ale mele din comunitatea Clojure care mi-au zguduit mintea.
  • Aventurile mele in incercarea de a invata limbaje de programare functionale statice, cum ar fi Haskell, si de a invata teoria categoriilor – asta a fost satisfacator neasteptat. Aceasta este lumea monoidelor, a functorilor, a functionarilor si a monadei.
  • Efectuarea unui screencast cu analiza datelor Sondajului Stack Overflow 2019 pentru a intelege mai bine demografia dezvoltatorilor Clojure si de ce acestia se situeaza ca fiind cea mai platita populatie.

Note de subsol

  1. Va multumesc Parker Matthew de la Pivotal pentru ca ati consolidat aceasta conexiune pentru mine intr-una dintre numeroasele noastre conversatii uimitoare. Este interesant de remarcat tensiunea uimitoare si natura de sustinere reciproca dintre lucrarile Dr. Csikszentmilhali si activitatea doctorului Anders Ericsson despre practica deliberata, descrisa in „Varful: Secretele din Noua Stiinta a Expertizei”.



    Dinamica duelului „practica ca experienta transcendentala” vs. „practica ca munca grea si perseverenta” este magnific descrisa in cartea „Grit: puterea pasiunii si perseverentei” a Dr. Sally Ducksworth ↩
  2. Persoana care a creat conferinta Strange Loop este Alex Miller, care este, de asemenea, o figura foarte proeminenta in comunitatea Clojure. Intr-o alta poveste ciudata a istoriei, Adrian Cockcroft (@adrianco) mi-a spus ca aceasta a fost conferinta lui preferata in 2014. Am depus-o la vremea respectiva.



    Ani mai tarziu, in 2017, m-am trezit sa devorez videoclipuri dupa video de la aceasta conferinta – este un program magnific, o confluenta de Papers We Love, typers-uri statice si teoreticieni de categorii, hackeri care lucreaza la proiecte uimitoare si chiar lucruri DevOpsy. Imi doresc sa particip in ultimii trei ani, dar a trebuit sa anulez in ultimul moment de fiecare data.



    2020 va fi anul, sunt sigur !!! ↩