Grande intervista cù Cliff Click, u babbu di a compilazione JIT in Java

Grande intervista cù Cliff Click, u babbu di a compilazione JIT in JavaCliff Cliccà - CTO di Cratus (sensori IoT per a migliione di u prucessu), fundatore è cofundatore di parechje startups (cumprese Rocket Realtime School, Neurensic è H2O.ai) cù parechje exits successi. Cliff hà scrittu u so primu compilatore à 15 anni (Pascal per u TRS Z-80)! Hè più cunnisciutu per u so travagliu nantu à C2 in Java (u Mare di Nodi IR). Stu compilatore hà dimustratu à u mondu chì JIT puderia pruduce codice d'alta qualità, chì era unu di i fatturi in l'emergenza di Java cum'è una di e principali plataforme di software mudernu. Allora Cliff hà aiutatu Azul Systems à custruisce un mainframe di 864 core cù un software Java puru chì supportava e pause GC nantu à una pila di 500 gigabyte in 10 millisecondi. In generale, Cliff hà sappiutu travaglià in tutti l'aspettu di a JVM.

 
Questu habrapost hè una grande entrevista cù Cliff. Parleremu nantu à i seguenti temi:

  • Transizione à ottimisazioni di livellu bassu
  • Cumu fà un grande refactoring
  • Modellu di costu
  • Formazione di ottimisazione di livellu bassu
  • Esempi pratichi di migliuramentu di u rendiment
  • Perchè creà a vostra propria lingua di prugrammazione
  • Carriera di ingegnere di performance
  • Sfide tecniche
  • Un pocu nantu à l'allocazione di registru è multi-core
  • U più grande sfida in a vita

L'intervista hè fatta da:

  • Andrey Satarin da Amazon Web Services. In a so carriera, hà sappiutu di travaglià in prughjetti cumplettamente diffirenti: hà pruvatu a basa di dati distribuita NewSQL in Yandex, un sistema di rilevazione di nuvola in Kaspersky Lab, un ghjocu multiplayer in Mail.ru è un serviziu per u calculu di i prezzi di u scambiu in Deutsche Bank. Interessatu à pruvà sistemi backend è distribuiti à grande scala.
  • Vladimir Sitnikov da Netcracker. Dece anni di travagliu nantu à u rendiment è a scalabilità di NetCracker OS, software utilizatu da l'operatori di telecomunicazioni per automatizà i prucessi di gestione di l'equipaggiu di rete è di rete. Interessatu in i prublemi di rendiment di Java è Oracle Database. Autore di più di una decina di migliuramentu di rendiment in u driver ufficiale PostgreSQL JDBC.

Transizione à ottimisazioni di livellu bassu

Андрей: Sò un grande nome in u mondu di a compilazione JIT, Java, è u travagliu di rendiment in generale, nò? 

Cliff: Hè cusì !

Андрей: Cuminciamu cù qualchi dumande generale nantu à u travagliu di rendiment. Chì pensate di l'scelta trà ottimisazioni d'altu livellu è di livellu bassu cum'è travaglià à u nivellu di CPU?

Cliff: Iè, tuttu hè simplice quì. U codice più veloce hè quellu chì ùn corre mai. Dunque, avete sempre bisognu di principià da un altu livellu, travaglià nantu à l'algoritmi. Una notazione O megliu batterà una notazione O peghju, salvu chì alcune constanti abbastanza grandi intervenenu. E cose di livellu bassu sò l'ultimi. Di genere, se avete ottimisatu u restu di a vostra pila abbastanza bè è ci hè sempre qualcosa interessante, questu hè un livellu bassu. Ma cumu principià da un altu livellu? Cumu sapete chì un travagliu di altu livellu hè statu fattu? Ebbè... nè manera. Ùn ci sò micca ricetti pronti. Avete bisognu di capisce u prublema, decide ciò chì avete da fà (per ùn piglià passi inutili in u futuru) è poi pudete scopre u prufilu, chì pò dì qualcosa d'utile. À un certu puntu, voi stessu capite chì avete sbarazzatu di e cose innecessarii è hè u tempu di fà una fine tuning di pocu livellu. Questu hè certamente un tipu d'arti speciale. Ci hè parechje persone chì facenu cose innecessarii, ma si move cusì veloce chì ùn anu micca tempu per preoccupassi di a produtividade. Ma questu hè finu à chì a quistione si stende senza dubbiu. Di solitu 99% di u tempu nimu ùn importa ciò chì facciu, finu à u mumentu chì una cosa impurtante vene nantu à a strada critica chì nimu ùn importa. È quì tutti cumincianu à chjappà per "perchè ùn hà micca travagliatu perfettamente da u principiu". In generale, ci hè sempre qualcosa per migliurà in u rendiment. Ma u 99% di u tempu ùn avete micca guida! Solu circate di fà qualcosa di travaglià è in u prucessu capite ciò chì hè impurtante. Ùn pudete mai sapè in anticipu chì questu pezzu deve esse perfettu, cusì, in fattu, duvete esse perfettu in tuttu. Ma questu hè impussibile è ùn fate micca. Ci sò sempre assai cose da riparà - è questu hè cumplettamente normale.

Cumu fà un grande refactoring

Андрей: Cumu travaglià nantu à una performance ? Questu hè un prublema trasversale. Per esempiu, avete mai avutu à travaglià nantu à i prublemi chì nascenu da l'intersezzione di assai funziunalità esistenti?

Cliff: Procu à evitari. Se so chì u rendiment serà un prublema, pensu prima di cumincià à codificà, in particulare cù strutture di dati. Ma spessu scopre tuttu questu assai più tardi. E poi avete da andà à e misure estremi è fà ciò chì chjamu "riscrivite è cunquistà": avete bisognu à piglià un pezzu abbastanza grande. Qualchidunu di u codice duverà esse riscritto per via di prublemi di rendiment o qualcos'altro. Qualunque sia u mutivu di u codice di riscrittura, hè quasi sempre megliu per riscrivà un pezzu più grande cà un pezzu più chjucu. À questu mumentu, tutti cumincianu à tremà di paura: "Oh, Diu, ùn pudete micca tuccà tantu codice!" Ma in fatti, stu approcciu quasi sempre travaglia assai megliu. Avete bisognu à piglià subitu un prublema maiò, disegnà un grande cercolu intornu à ellu è dicenu: Riscrittu tuttu in u cerculu. U cunfini hè assai più chjucu cà u cuntenutu in ellu chì deve esse rimpiazzatu. È se tali delineazione di e fruntiere vi permette di fà u travagliu in perfettamenti, e vostre mani sò libere, fate ciò chì vulete. Quandu avete capitu u prublema, u prucessu di riscrittura hè assai più faciule, cusì pigliate un grande muzzicu!
À u listessu tempu, quandu fate una grande riscrittura è capite chì u rendiment serà un prublema, pudete immediatamente cumincià à preoccupassi. Questu di solitu si trasforma in cose simplici cum'è "ùn cupià micca e dati, gestisce e dati cum'è simpliciamente pussibule, fate micca chjucu". In grande riscrittura, ci sò modi standard per migliurà u rendiment. È quasi sempre giranu intornu à i dati.

Modellu di costu

Андрей: In unu di i podcasts avete parlatu di mudelli di costu in u cuntestu di a produtividade. Pudete spiegà ciò chì vulia dì da questu?

Cliff: Di sicuru. Sò natu in una era quandu u rendiment di u processatore era estremamente impurtante. E sta era torna torna - u destinu ùn hè micca senza ironia. Aghju cuminciatu à campà in i tempi di e macchine di ottu bit; u mo primu urdinatore hà travagliatu cù 256 bytes. Esattamente byte. Tuttu era assai chjucu. L'istruzzioni anu da esse cuntatu, è cum'è avemu cuminciatu à muvimenti in a pila di lingua di prugrammazione, e lingue anu pigliatu più è più. Ci era Assembler, poi Basic, poi C, è C hà curatu assai di i dettagli, cum'è l'allocazione di u registru è a selezzione di istruzzioni. Ma tuttu era abbastanza chjaru quì, è se aghju fattu un punteru à una istanza di una variabile, allora aghju avutu a carica, è u costu di sta struzzione hè cunnisciutu. L'hardware produce un certu nùmeru di ciculi di a macchina, cusì a velocità di esecutivu di e cose diverse pò esse calculata solu aghjunghjendu tutte l'istruzzioni chì andate à eseguisce. Ogni paragunà / prova / ramu / chjama / carica / magazzinu puderia esse aghjuntu è dettu: questu hè u tempu d'esekzione per voi. Quandu u travagliu nantu à migliurà u funziunamentu, certamenti fate attenzione à ciò chì numeri currispondenu à picculi cicli caldi. 
Ma appena passate à Java, Python è cose simili, vi alluntanate assai rapidamente da u hardware di livellu bassu. Chì ghjè u costu di chjamà un getter in Java? Se JIT in HotSpot hè currettu inlineed, Caricà, ma s'ellu ùn hà micca fattu questu, serà una chjama di funzione. Siccomu a chjama hè in un ciclu caldu, annullà tutte l'altri ottimisazioni in quellu ciclu. Dunque, u costu reale serà assai più altu. È subitu perde a capacità di guardà un pezzu di codice è capisce chì duvemu eseguisce in quantu à a velocità di u clock di u processatore, a memoria è a cache utilizata. Tuttu chistu diventa interessante solu s'ellu si mette veramente in u spettaculu.
Avà ci truvemu in una situazione induve a velocità di u processatore ùn hè micca aumentatu per una dicada. I vechji tempi sò tornati ! Ùn pudete più cuntà nantu à una bona prestazione di filu unicu. Ma s'ellu si mette subitu in l'informatica parallela, hè incredibilmente difficiule, tutti ti guardanu cum'è James Bond. L'accelerazioni dece volte quì sò generalmente in i posti induve qualchissia hà sbagliatu qualcosa. A cuncurrenza richiede assai travagliu. Per uttene quella accelerazione XNUMXx, avete bisognu di capiscenu u mudellu di costu. Cosa è quantu costa? È per fà questu, avete bisognu di capiscenu cumu a lingua si mette nantu à u hardware sottu.
Martin Thompson hà sceltu una grande parolla per u so blog Simpatia meccanica! Avete bisognu di capisce ciò chì u hardware hà da fà, cumu esattamente u farà, è perchè face ciò chì face in u primu locu. Aduprendu questu, hè abbastanza faciule per cumincià à cuntà l'istruzzioni è capisce induve u tempu d'esekzione va. Se ùn avete micca a furmazione adatta, cercate solu un gattu neru in una stanza scura. Vecu e persone chì ottimisanu u rendiment tuttu u tempu chì ùn anu micca idea di ciò ch'elli facenu. Soffrenu assai è ùn facenu assai prugressu. È quandu pigliu u listessu pezzu di codice, slip in un coppiu di picculi pirate è uttene una accelerazione di cinque o deci volte, sò cum'è: bè, ùn hè micca ghjustu, avemu digià cunnisciutu chì erate megliu. Amazing. Ciò chì parlu ... u mudellu di costu hè di quale tipu di codice scrive è quantu veloce corre in media in u big picture.

Андрей: E cumu si pò tene un tali voluminu in a testa ? Questu hè ottenutu cù più sperienza, o? Da induve vene una tale sperienza?

Cliff: Ebbè, ùn aghju micca avutu a mo sperienza in u modu più faciule. Aghju programatu in Assembly in i tempi quandu puderete capisce ogni struzzione. Sembra stupidu, ma da tandu u settore d'istruzzioni Z80 hè sempre statu in u mo capu, in a mo memoria. Ùn mi ricordu micca i nomi di e persone in un minutu di parlà, ma mi ricordu di codice scrittu 40 anni fà. Hè divertente, pare un sindromu "scientist idiotu».

Formazione di ottimisazione di livellu bassu

Андрей: Ci hè un modu più faciule per entre ?

Cliff: Iè è nò. U hardware chì tutti usemu ùn hà micca cambiatu tantu in u tempu. Tutti usanu x86, cù l'eccezzioni di i smartphones Arm. Se ùn fate micca qualchì tipu di incrustazione hardcore, fate a stessa cosa. Va bè, dopu. L'istruzzioni ùn anu micca cambiatu ancu per seculi. Avete bisognu à andà à scrive qualcosa in Assemblea. Micca assai, ma abbastanza per cumincià à capisce. Sorridi, ma parlu completamente seriamente. Avete bisognu di capiscenu a currispundenza trà lingua è hardware. Dopu à quessa, vi tocca à andà à scrive un pocu è fà un pocu compilatore di ghjoculi per un pocu linguaghju di ghjoculi. Toy-like significa chì deve esse fattu in un tempu raghjone. Pò esse super simplice, ma deve generà struzzioni. L'attu di generà una struzzione vi aiuterà à capisce u mudellu di costu per u ponte trà u codice d'altu livellu chì tutti scrivenu è u codice di a macchina chì corre nantu à u hardware. Sta currispundenza serà brusgiata in u cervellu à u mumentu chì u compilatore hè scrittu. Ancu u compilatore più simplice. Dopu quì, pudete principià à circà à Java è u fattu chì u so abbu semanticu hè assai più profundo, è hè assai più difficiuli di custruisce ponti nantu à questu. In Java, hè assai più difficiuli di capisce s'ellu u nostru ponte hè statu bonu o cattivu, ciò chì a causa di fallu è ciò chì ùn serà micca. Ma avete bisognu di un tipu di puntu di partenza induve guardate u codice è capisce: "iè, questu getter deve esse inlineatu ogni volta". E poi si trova chì qualchì volta questu succede, fora di a situazione quandu u metudu diventa troppu grande, è u JIT principia à inlineà tuttu. U funziunamentu di tali lochi pò esse previstu istantaneamente. Di solitu, i getters funzionanu bè, ma poi fighjate à grandi loops caldi è capisce chì ci sò alcune chjama di funzione chì fluttuanu quì chì ùn sanu micca ciò chì facenu. Questu hè u prublema cù l'usu generalizatu di getters, u mutivu perchè ùn sò micca inlineati hè chì ùn hè micca chjaru s'ellu sò un getter. Se tenete una basa di codice super piccula, pudete simpricimenti ricurdà è poi dì: questu hè un getter, è questu hè un setter. In una grande basa di codice, ogni funzione vive a so propria storia, chì, in generale, ùn hè micca cunnisciuta da nimu. U profiler dice chì avemu persu u 24% di u tempu in qualchì loop è per capisce ciò chì face stu loop, avemu bisognu di guardà ogni funzione in l'internu. Hè impussibile di capisce questu senza studià a funzione, è questu rallenta seriamente u prucessu di capiscenu. Hè per quessa chì ùn aghju micca aduprà getters è setters, aghju ghjuntu à un novu livellu !
Induve uttene u mudellu di costu? Ebbè, pudete leghje qualcosa, sicuru... Ma pensu chì u megliu modu hè di agisce. Fà un picculu compilatore serà u megliu modu per capiscenu u mudellu di costu è mette in u vostru propiu capu. Un picculu compilatore chì seria adattatu per programà un microondas hè un compitu per un principiante. Ebbè, vogliu dì, se avete digià cumpetenze di prugrammazione, allora duverebbe esse abbastanza. Tutte queste cose cum'è l'analisi di una stringa chì avete cum'è un tipu d'espressione algebrica, estrazione di struzzioni per operazioni matematiche da quì in l'ordine currettu, piglià i valori curretti da i registri - tuttu questu hè fattu in una volta. È mentre fate, serà impressu in u vostru cervellu. Pensu chì ognunu sapi ciò chì un compilatore faci. È questu darà una cunniscenza di u mudellu di costu.

Esempi pratichi di migliuramentu di u rendiment

Андрей: Chì altru deve esse attentu à quandu u travagliu nantu à a produtividade?

Cliff: Strutture di dati. A propositu, iè, ùn aghju micca insignatu sti classi da tantu tempu... Scola Rocket. Era divertente, ma ci vole assai sforzu, è aghju ancu una vita! OK. Allora, in una di e classi grandi è interessanti, "Induve va u vostru rendimentu", aghju datu un esempiu di i studienti: dui gigabyte è mezzo di dati fintech sò stati letti da un schedariu CSV è dopu avè avutu à calculà u numeru di prudutti venduti. . Dati di u mercatu regulare di tick. Pacchetti UDP cunvertiti in furmatu di testu dapoi l'anni 70. Chicago Mercantile Exchange - ogni tipu di cose cum'è burro, granu, soia, cose cusì. Hè necessariu di cuntà questi prudutti, u numeru di transacciones, u voluminu mediu di u muvimentu di fondi è di merchenzie, etc. Hè abbastanza simplice di matematica di cummerciu: truvate u codice di u produttu (chì hè 1-2 caratteri in a tavola hash), uttene a quantità, aghjunghje à unu di i setti di cummerciu, aghjunghje u voluminu, aghjunghje valore è un paru di altre cose. Matematica assai simplice. L'implementazione di i ghjoculi era assai simplice: tuttu hè in un schedariu, aghju lettu u schedariu è si move à traversu, dividendu i registri individuali in strings Java, cercandu e cose necessarie in elli è aghjunghjendu secondu a matematica descritta sopra. È travaglia à qualchì bassa velocità.

Cù questu approcciu, hè evidenti ciò chì succede, è l'informatica parallela ùn aiutarà micca, nò? Risulta chì un aumentu di cinque volte in u rendiment pò esse ottenutu solu scegliendu e strutture di dati ghjusti. E questu sorprende ancu i programatori sperimentati! In u mo casu particulare, u truccu era chì ùn deve micca fà assignazioni di memoria in un loop caldu. Ebbè, questu hè micca tutta a verità, ma in generale - ùn deve micca mette in risaltu "una volta in X" quandu X hè abbastanza grande. Quandu X hè dui gigabyte è mezzo, ùn deve micca assignà nunda "una volta per lettera", o "una volta per linea", o "una volta per campu", qualcosa cusì. Questu hè induve u tempu hè passatu. Cumu funziona ancu questu? Immaginate di fà una chjama String.split() o BufferedReader.readLine(). Readline face una stringa da un inseme di bytes chì venenu nantu à a reta, una volta per ogni linea, per ognunu di i cintunari di milioni di linii. Pigliu sta linea, parse è scaccià. Perchè l'aghju cacciatu - bè, l'aghju digià processatu, hè tuttu. Allora, per ogni byte lettu da questi 2.7G, dui caratteri seranu scritti in a linea, vale à dì, digià 5.4G, è ùn ne aghju micca bisognu per nunda più, perchè sò ghjittati. Se fighjate à a larghezza di banda di memoria, carchemu 2.7G chì passa per u busu di memoria è memoria in u processatore, è dopu duie volte hè mandatu à a linea chì si trova in memoria, è tuttu questu hè struitu quandu ogni nova linea hè creata. Ma aghju bisognu di leghje, u hardware leghje, ancu s'ellu tuttu hè sfilatu dopu. È l'aghju da scrive perchè aghju creatu una linea è i cache sò pieni - u cache ùn pò micca accoglie 2.7G. Allora, per ogni byte chì aghju lettu, aghju lettu dui byte più è scrivite dui byte più, è à a fine anu un rapportu 4: 1 - in questu rapportu, perdemu a larghezza di banda di memoria. E poi risulta chì s'ellu facciu String.split() - ùn hè micca l'ultima volta chì facciu questu, ci pò esse un altru 6-7 campi in l'internu. Allora u codice classicu di leghje CSV è poi parsing the strings risultati in una perdita di larghezza di banda di memoria di circa 14: 1 relative à ciò chì vulete veramente avè. Se scaccià queste selezioni, pudete ottene una accelerazione di cinque volte.

È ùn hè micca cusì difficiule. Sè vo circate à u codice da l 'angulu dritta, tuttu diventa abbastanza sèmplice una volta vi rializà u prublema. Ùn avete micca impedisce di assignà a memoria in tuttu: l'unicu prublema hè chì attribuite qualcosa è morse subitu, è in a strada brusgia una risorsa impurtante, chì in questu casu hè a larghezza di banda di memoria. È tuttu questu risultatu in una calata di produtividade. In x86, di solitu avete bisognu di brusgià attivamente i cicli di processore, ma quì avete brusgiatu tutta a memoria assai prima. A suluzione hè di riduce a quantità di scaricamentu. 
L'altra parte di u prublema hè chì s'è vo eseguite u profiler quandu a striscia di memoria si esaurisce, ghjustu quandu succede, di solitu aspettate chì a cache torna perchè hè piena di basura chì avete appena pruduciutu, tutte quelle linee. Dunque, ogni operazione di carica o magazzini diventa lenta, perchè portanu à cache miss - tuttu u cache hè diventatu lento, aspittendu chì a basura lascià. Dunque, u profiler mostrarà solu un rumore aleatoriu caldu sbavatu in tuttu u ciclu - ùn ci sarà micca struzzione calda separata o postu in u codice. Solu u rumore. È se fighjate à i ciculi GC, sò tutti i Young Generation è super veloci - microsecondi o millisecondi massimu. Dopu tuttu, tutta sta memoria mori istantaneamente. Avete attribuitu miliardi di gigabyte, è li taglia, è li taglia, è li taglia di novu. Tuttu chistu succede assai prestu. Risulta chì ci sò ciculi GC economici, u sonu caldu in tuttu u ciculu, ma vulemu ottene una accelerazione 5x. À questu mumentu, qualcosa deve chjude in a vostra testa è sona: "perchè hè questu?!" L'overflow di a striscia di memoria ùn hè micca visualizatu in u debugger classicu; avete bisognu di eseguisce u debugger di u cuntatore di prestazione di hardware è vede da sè stessu è direttamente. Ma questu ùn pò micca esse suspettatu direttamente da questi trè sintomi. U terzu sintumu hè quandu fighjate ciò chì mette in risaltu, dumandate à u profiler, è ellu risponde: "Avete fattu un miliardo di fila, ma u GC hà travagliatu gratuitamente". Appena questu succede, capite chì avete creatu troppu oggetti è brusgiatu tutta a via di memoria. Ci hè un modu per capisce questu, ma ùn hè micca evidenti. 

U prublema hè in a struttura di dati: a struttura nuda sottu à tuttu ciò chì succede, hè troppu grande, hè 2.7G nantu à u discu, cusì fà una copia di sta cosa hè assai indesevule - vulete carricà immediatamente da u buffer di byte di a reta. in i registri, per ùn leghje-scritte à a linea avanti è avanti cinque volte. Sfortunatamente, Java ùn vi dà micca una tale biblioteca cum'è parte di u JDK per difettu. Ma questu hè triviale, nò? Essenzialmente, si tratta di 5-10 linee di codice chì saranu aduprate per implementà u vostru propiu caricatore di stringa buffered, chì ripete u cumpurtamentu di a classe di stringa, mentre esse un involucro intornu à u buffer di byte sottostante. In u risultatu, si trova chì travagliate quasi cum'è cù strings, ma in fattu i puntatori à u buffer si movenu quì, è i bytes crudi ùn sò micca copiati in ogni locu, è cusì i stessi buffers sò riutilizzati una volta è più, è u sistema upirativu hè felice di piglià nantu à sè stessu e cose per quale hè pensatu, cum'è u doppiu buffering nascostu di questi buffer di byte, è ùn site più grinding through un flussu infinitu di dati inutili. Per via, capite chì quandu u travagliu cù GC, hè garantitu chì ogni allocazione di memoria ùn serà micca visibile à u processatore dopu l'ultimu ciculu GC? Dunque, tuttu questu ùn pò micca esse in u cache, è dopu si verifica un miss 100% garantitu. Quandu u travagliu cù un puntatore, in x86, sottrae un registru da a memoria pigghia 1-2 cicli di clock, è appena questu succede, paghete, pagate, pagate, perchè a memoria hè tutta. NOVE cache - è questu hè u costu di l'allocazione di memoria. Valore veru.

In altre parolle, e strutture di dati sò a cosa più difficiuli di cambià. È una volta chì avete capitu chì avete sceltu a struttura di dati sbagliata chì ucciderà u rendiment dopu, ci hè di solitu assai travagliu da fà, ma s'ellu ùn fate micca, e cose peghju. Prima di tuttu, avete bisognu di pensà à e strutture di dati, questu hè impurtante. U costu principale quì cade nantu à e strutture di dati grassu, chì cumincianu à esse usatu in u stilu di "Aghju copiatu a struttura di dati X in a struttura di dati Y perchè mi piace a forma di Y megliu". Ma l'operazione di copia (chì pare economica) in realtà perdi a larghezza di banda di memoria è quì hè intarratu tuttu u tempu di esecuzione persa. Se aghju una stringa giganti di JSON è vogliu trasfurmà in un arbulu DOM strutturatu di POJO o qualcosa, l'operazione di analizà quella stringa è custruisce u POJO, è dopu accede à u POJO di novu dopu, hà da esse un costu innecessariu - hè micca prezzu. Eccettu s'è tù corre intornu à POJOs assai più spessu chè tù corre intornu à una stringa. Offhand, pudete invece pruvà à decifrare a stringa è estrae solu ciò chì avete bisognu da quì, senza turnà in alcun POJO. Sè tuttu ciò chì succede nantu à una strada da quale u massimu rendimentu hè necessariu, senza POJO per voi, avete bisognu di scavà in a linea direttamente.

Perchè creà a vostra propria lingua di prugrammazione

Андрей: Avete dettu chì per capisce u mudellu di costu, avete bisognu di scrive a vostra propria lingua...

Cliff: Micca una lingua, ma un compilatore. Una lingua è un compilatore sò dui cose diffirenti. A diferenza più impurtante hè in a vostra testa. 

Андрей: A propositu, per ciò ch'e aghju saputu, site spirimintatu cù a creazione di e vostre lingue. Perchè?

Cliff: Perchè possu ! Sò semi-ritirata, dunque questu hè u mo hobby. Aghju implementatu e lingue di l'altri tutta a mo vita. Aghju ancu travagliatu assai nantu à u mo stile di codificazione. È ancu perchè vecu prublemi in altre lingue. Vecu chì ci sò modi megliu per fà e cose familiari. È li avissi aduprà. Sò stancu di vede prublemi in mè stessu, in Java, in Python, in ogni altra lingua. Avà scrive in React Native, JavaScript è Elm cum'è un hobby chì ùn hè micca di retirement, ma di travagliu attivu. Scrivu ancu in Python è, assai prubabilmente, continueraghju à travaglià nantu à l'apprendimentu automaticu per i backend Java. Ci sò parechje lingue populari è tutti anu caratteristiche interessanti. Ognunu hè bonu in u so modu è pudete pruvà à unisce tutte queste caratteristiche. Allora, aghju studiatu e cose chì m’interessanu, u cumpurtamentu di a lingua, circandu d’avè una semantica raghjone. È finu à avà sò successu ! À u mumentu, aghju luttatu cù a semantica di memoria, perchè vogliu avè cum'è in C è Java, è uttene un mudellu di memoria forte è semantica di memoria per carichi è magazzini. À u listessu tempu, avete inferenza di tipu automaticu cum'è in Haskell. Eccu, aghju pruvatu à mischjà l'inferenza di tipu Haskell cù u travagliu di memoria in C è Java. Questu hè ciò chì aghju fattu per l'ultimi mesi 2-3, per esempiu.

Андрей: S'è vo custruite una lingua chì piglia megliu aspetti di l'altri lingue, pensate chì qualchissia farà u cuntrariu : pigliate e vostre idee è aduprà ?

Cliff: Questu hè esattamente cumu appare e lingue novi! Perchè Java hè simile à C? Perchè C hà avutu una bona sintassi chì tutti capiscenu è Java hè stata inspirata da questa sintassi, aghjunghjendu a sicurità di u tipu, a verificazione di i limiti di array, GC, è anu migliuratu ancu alcune cose da C. Aghjunghjenu u so propiu. Ma sò stati inspirati assai, nò? Tutti si trovanu nantu à e spalle di i giganti chì sò ghjunti prima di voi - hè cusì chì u prugressu hè fattu.

Андрей: Cum'è l'aghju capitu, a vostra lingua serà sicura di memoria. Avete pensatu à implementà qualcosa cum'è un verificatore di prestitu da Rust? L'avete guardatu, chì ne pensate di ellu ?

Cliff: Ebbè, aghju scrittu C per l'età, cù tuttu questu malloc è liberu, è gestione manualmente a vita. Sapete, 90-95% di u tempu di vita cuntrullata manualmente hà a listessa struttura. È hè assai, assai doloroso per fà manualmente. Mi piacerebbe chì u compilatore vi dicia solu ciò chì succede quì è ciò chì avete ottenutu cù e vostre azzioni. Per certe cose, u verificatore di prestitu faci questu fora di a scatula. È duverebbe visualizà automaticamente l'infurmazioni, capisce tuttu, è ùn mi mancu a carica di presentà stu capitu. Deve fà almenu l'analisi di escape lucale, è solu s'ellu falla, allora ci vole à aghjunghje annotazioni di tipu chì descriverà a vita - è un tali schema hè assai più cumplessu chè un verificatore di prestitu, o ancu qualsiasi verificatore di memoria esistente. L'scelta trà "tuttu hè bè" è "Ùn capiscu nunda" - no, deve esse qualcosa di megliu. 
Allora, cum'è qualchissia chì hà scrittu assai codice in C, pensu chì avè supportu per u cuntrollu automaticu di a vita hè a più impurtante. Sò ancu stancu di quantu Java usa memoria è a lagnanza principale hè u GC. Quandu assignate a memoria in Java, ùn ricuperate micca a memoria chì era lucale à l'ultimu ciclu GC. Questu ùn hè micca u casu in lingue cù una gestione di memoria più precisa. Sè vo chjamate malloc, avete subitu subitu a memoria chì era di solitu solu utilizata. Di solitu fate qualchi cose tempuranee cù memoria è immediatamente torna torna. È torna subitu à a piscina di malloc, è u prossimu ciclu di malloc tira fora di novu. Per quessa, l'usu di a memoria attuale hè ridutta à l'inseme di l'uggetti viventi à un tempu determinatu, più perdite. E s'ellu ùn hè micca in un modu completamente indecente, a maiò parte di a memoria finisci in cache è u processatore, è travaglia rapidamente. Ma esige una mansa di gestione di memoria manuale cù malloc è liberu chjamatu in l'ordine ghjustu, in u locu ghjustu. Rust pò trattà questu bè da sè stessu, è in parechji casi dà un rendimentu ancu megliu, postu chì u cunsumu di memoria hè ristrettu solu à u calculu attuale - in uppusizione à aspittà per u prossimu ciculu GC per liberà a memoria. In u risultatu, avemu un modu assai interessante per migliurà u rendiment. È abbastanza putente - vogliu dì, aghju fattu tali cose quandu trasfurmava dati per fintech, è questu m'hà permessu di ottene una accelerazione di circa cinque volte. Hè un impulsu abbastanza grande, soprattuttu in un mondu induve i prucessori ùn sò micca più veloci è aspettemu sempre per migliurà.

Carriera di ingegnere di performance

Андрей: Mi piacerebbe ancu dumandà intornu à a carriera in generale. Avete risuscitatu à prominenza cù u vostru travagliu JIT à HotSpot è poi trasfirìu à Azul, chì hè ancu una cumpagnia JVM. Ma avemu digià travagliatu più nantu à hardware chè software. E poi si passanu di colpu à Big Data è Machine Learning, è dopu à a rilevazione di fraud. Cumu hè accadutu questu? Quessi sò spazii assai diffirenti di sviluppu.

Cliff: Aghju programatu per un bellu pezzu è aghju sappiutu piglià assai classi diffirenti. È quandu a ghjente dice: "oh, sì quellu chì hà fattu JIT per Java!", hè sempre divertente. Ma prima di questu, aghju travagliatu nantu à un clone di PostScript - a lingua chì Apple hà utilizatu una volta per e so stampanti laser. È prima ch'e aghju fattu una implementazione di a lingua Forth. Pensu chì un tema cumuni per mè hè u sviluppu di strumenti. Tutta a mo vita aghju fattu strumenti cù quale altre persone scrivenu i so prugrammi freschi. Ma era ancu implicatu in u sviluppu di sistemi operativi, cunduttori, debuggers à livellu di u kernel, lingue per u sviluppu di u SO, chì cuminciaru trivial, ma cù u tempu hè diventatu più è più cumplessu. Ma u tema principale hè sempre u sviluppu di l'arnesi. Una grande parte di a mo vita passava trà Azul è Sun, è si trattava di Java. Ma quandu sò ghjuntu in Big Data è Machine Learning, aghju rimessu u mo cappelli di fantasia è aghju dettu: "Oh, avà avemu un prublema micca triviale, è ci sò parechje cose interessanti chì succedenu è e persone chì facenu e cose". Questu hè un grande percorsu di sviluppu per piglià.

Iè, mi piace veramente l'informatica distribuita. U mo primu travagliu era cum'è studiente in C, nantu à un prughjettu di publicità. Questu hè statu distribuitu l'informatica nantu à i chips Zilog Z80 chì cullighjanu dati per l'OCR analogicu, pruduciutu da un analizatore analogicu veru. Era un tema frescu è completamente pazzu. Ma ci sò stati prublemi, una parte ùn era micca ricunnisciuta currettamente, cusì avete da piglià una foto è mustrà à una persona chì puderia digià leghje cù i so ochji è rapportà ciò chì hà dettu, è per quessa, ci era impieghi cù dati, è questi impieghi. avianu a so propria lingua. Ci era un backend chì hà processatu tuttu questu - Z80s chì currenu in parallelu cù i terminali vt100 in esecuzione - unu per persona, è ci era un mudellu di prugrammazione parallela nantu à u Z80. Qualchì pezzu cumuni di memoria spartutu da tutti i Z80 in una cunfigurazione stella; U backplane era ancu spartutu, è a mità di a RAM hè stata sparta in a reta, è una altra mità era privata o andava à qualcosa altru. Un sistema distribuitu parallelu cumplessu significativu cù memoria sparta... semi-spartita. Quandu era questu... Ùn possu mancu ricurdà, in qualchì locu in a mità di l'anni 80. Un bellu pezzu fà. 
Iè, supponemu chì 30 anni hè assai tempu fà. I prublemi ligati à l'informatica distribuita esistenu per un bellu pezzu; a ghjente hè stata longa in guerra cù Beowulf- clusters. Tali clusters s'assumiglia à ... Per esempiu: ci hè Ethernet è u vostru x86 veloce hè cunnessu à questu Ethernet, è avà vulete ottene una falsa memoria spartuta, perchè nimu ùn pudia fà coding computing distribuitu allora, era troppu difficiule è dunque ci hè. era una falsa memoria spartuta cù e pagine di memoria di prutezzione in x86, è s'è vo avete scrittu à sta pagina, allora avemu dettu à l'altri processori chì, s'ellu accede à a listessa memoria spartuta, ci vole à esse caricatu da voi, è cusì qualcosa cum'è un protokollu per sustene. A coherenza di cache apparsu è u software per questu. Cuncepimentu interessante. U veru prublema, sicuru, era qualcosa d'altru. Tuttu chistu hà travagliatu, ma avete subitu prublemi di rendiment, perchè nimu hà capitu i mudelli di rendiment à un livellu abbastanza bonu - chì mudelli d'accessu à a memoria eranu quì, cumu per assicurà chì i nodi ùn anu micca interminablemente ping l'altri, è cusì.

Ciò chì aghju vinutu in H2O hè chì sò i sviluppatori stessi chì sò rispunsevuli di determinà induve u parallelismu hè oculatu è induve ùn hè micca. Aghju ghjuntu cun un mudellu di codificazione chì hà fattu a scrittura di codice d'altu rendiment faciule è simplice. Ma a scrittura di codice lentu hè difficiule, vi parerà male. Avete bisognu à pruvà seriu à scrive codice lento, vi tuccherà à aduprà metudi non-standard. U codice di frenu hè visibile à u primu sguardu. In u risultatu, di solitu scrive u codice chì corre veloce, ma avete da capisce ciò chì deve fà in u casu di memoria spartuta. Tuttu chistu hè ligatu à grande array è u cumpurtamentu ci hè simile à grande array non volatile in parallelu Java. Vogliu dì, imaginate chì dui fili scrivenu à un array parallelu, unu di elli vince, è l'altru, per quessa, perde, è ùn sapete micca quale hè quale. Sì ùn sò micca volatili, allura l'ordine pò esse ciò chì vulete - è questu funziona veramente bè. A ghjente si preoccupa veramente di l'ordine di l'operazioni, mettenu volatile in i posti boni, è aspettanu prublemi di rendiment di memoria in i posti ghjusti. Altrimenti, avarianu simpricimenti scrivite codice in forma di loops da 1 à N, induve N hè qualchi trilioni, in a speranza chì tutti i casi cumplessi diventeranu automaticamente paralleli - è ùn funziona micca quì. Ma in H2O questu ùn hè nè Java nè Scala; pudete cunsiderà "Java minus minus" se vulete. Questu hè un stile di prugrammazione assai chjaru è hè simile à scrive un codice C o Java simplice cù loops è arrays. Ma à u listessu tempu, a memoria pò esse trattata in terabytes. Aghju sempre aduprà H2O. L'aghju utilizatu da u tempu à u tempu in diversi prughjetti - è hè sempre a cosa più veloce, decine di volte più veloce di i so cuncurrenti. Sè vo fate Big Data cù dati colonnari, hè assai difficiule di batte H2O.

Sfide tecniche

Андрей: Chì hè stata a vostra sfida più grande in tutta a vostra carriera ?

Cliff: Discutemu a parte tecnica o micca tecnica di u prublema ? Diciaraghju chì e sfide più grande ùn sò micca tecniche. 
In quantu à e sfide tecniche. I semplicemente scunfittu. Ùn sò mancu sapè quale era u più grande, ma ci n'era parechji interessanti chì anu pigliatu un pocu di tempu, a lotta mentale. Quandu sò andatu à Sun, eru sicuru chì aghju da fà un compilatore veloce, è un gruppu di anziani hà dettu in risposta chì ùn averebbe mai successu. Ma aghju seguitu sta strada, hà scrittu un compilatore finu à l'allocatore di registru, è era abbastanza veloce. Era cusì veloce cum'è C1 mudernu, ma l'allocatore era assai più lento allora, è in retrospettiva era un grande prublema di struttura di dati. Aviu bisognu di scrive un allocatore di registru gràficu è ùn aghju micca capitu u dilema trà l'espressività di u codice è a rapidità, chì esisteva in quella era è era assai impurtante. Risultava chì a struttura di dati di solitu supera a dimensione di cache in x86s di quellu tempu, è per quessa, s'ellu hà inizialmente presumitu chì l'allocatore di registru hà da travaglià 5-10 per centu di u tempu di jitter tutale, allora in realtà hè diventatu per esse. 50 per centu.

Cume u tempu passava, u compilatore hè diventatu più pulitu è ​​​​più efficiente, hà cessatu di generà codice terribili in più casi, è a prestazione hà cuminciatu à s'assumiglia à ciò chì produce un compilatore C. A menu chì, sicuru, scrivite una merda chì ancu C ùn accelera micca. . Se scrivite codice cum'è C, uttenerete prestazioni cum'è C in più casi. E più alluntanate, più spessu avete u codice chì coincideva asintoticamente cù u livellu C, l'allocatore di registru cuminciò à vede qualcosa cumpletu ... indipendentemente da se u vostru codice corre veloce o lento. Aghju cuntinuatu à travaglià nantu à l'allocatore per fà megliu selezzione. Hè diventatu più lento è più lento, ma hà datu un rendimentu megliu è megliu in i casi induve nimu ùn pudia affruntà. Puderaghju immerse in un allocatore di registru, intarrà un mese di travagliu quì, è di colpu tuttu u codice cumminciaria à eseguisce 5% più veloce. Questu hè accadutu una volta è l'altra è l'allocatore di u registru hè diventatu qualcosa di una opera d'arte - tutti l'amavanu o l'odiavanu, è e persone di l'accademia anu dumandatu dumande nantu à u tema "perchè tuttu hè fattu cusì", perchè micca. scansione di linea, è chì hè a diffarenza. A risposta hè sempre a listessa: un allocatore basatu nantu à u culore di u graficu più un travagliu assai attentu cù u codice di buffer hè uguali à un'arma di vittoria, a megliu cumminazione chì nimu pò scunfighja. È questu hè una cosa piuttostu micca ovvia. Tuttu ciò chì u compilatore faci ci sò cose abbastanza studiate, ancu s'ellu sò ancu purtati à u livellu di l'arti. Aghju sempre fattu e cose chì duverebbe turnà u compilatore in una opera d'arti. Ma nimu di questu era qualcosa di straordinariu - fora di l'allocatore di u registru. U truccu hè di esse attentu taglià sottu carica è, s'ellu succede (puderaghju spiegà in più dettagliu se interessatu), questu significa chì pudete inline più aggressivu, senza u risicu di cascà nantu à un kink in u schedariu di rendiment. In quelli ghjorni, ci era una mansa di compilatori à grande scala, appesi cù baubles è fischi, chì avianu allocatori di registru, ma nimu altru puderia fà.

U prublema hè chì si aghjunghjenu metudi chì sò sottumessi à l'inline, aumentendu è cresce l'area di inlining, l'inseme di valori utilizati supera istantaneamente u nùmeru di registri, è avete da taglià. U livellu criticu di solitu vene quandu l'allocatore rinunce, è un bonu candidatu per un spill vale un altru, venderete alcune cose generalmente salvatichi. U valore di l'inlineing quì hè chì perde una parte di l'overhead, overhead per chjamà è salvà, pudete vede i valori in l'internu è ponu più ottimisate. U costu di l'inline hè chì un gran numaru di valori vivi sò furmati, è se u vostru allocatore di registru brusgia più di ciò chì hè necessariu, perde immediatamente. Per quessa, a maiò parte di l'allocatori anu un prublema: quandu l'inlineing attraversà una certa linea, tuttu in u mondu cumencia à esse tagliatu è a produtividade pò esse lavata in u bagnu. Quelli chì implementanu u compilatore aghjunghjenu alcune heuristiche: per esempiu, per piantà l'inlineing, cuminciendu cù una dimensione abbastanza grande, postu chì l'allocazioni arruvinaranu tuttu. Hè cusì chì si forma un kink in u graficu di rendiment - voi inline, inline, a prestazione cresce lentamente - è dopu boom! - cade cum'è un jack rapidu perchè avete troppu filatu. Hè cusì chì tuttu hà travagliatu prima di l'avventu di Java. Java hà bisognu di assai più inlining, cusì aghju avutu à fà u mo allocatore assai più aggressivu in modu chì u nivellu piuttostu cà crashes, è se inline troppu, cumencia à spill, ma dopu u mumentu "non più spilling" vene sempre. Questa hè una osservazione interessante è hè vinuta à mè da nunda, micca ovvia, ma hà pagatu bè. Aghju pigliatu l'inlineing aggressivu è m'hà purtatu in lochi induve Java è C performance travaglianu fiancu à fiancu. Sò veramente vicini - possu scrive codice Java chì hè significativamente più veloce di u codice C è cose cusì, ma in media, in a grande stampa di e cose, sò apprussimatamente paragunabili. Pensu chì parte di stu meritu hè l'allocatore di registru, chì mi permette di inline u più stupidu pussibule. Aghju ghjustu inline tuttu ciò chì vecu. A quistione quì hè se l'allocatore funziona bè, se u risultatu hè un codice di travagliu intelligente. Era una sfida maiò : capisce tuttu questu è fà u funziunamentu.

Un pocu nantu à l'allocazione di registru è multi-core

Владимир: I prublemi cum'è l'allocazione di u registru parenu una sorta di tema eternu, infinitu. Mi dumandu s'ellu ci hè mai statu una idea chì pareva promettente è poi falluta in pratica?

Cliff: Di sicuru ! L'allocazione di u registru hè un spaziu in quale pruvate à truvà qualchi heuristiche per risolve un prublema NP-complete. È ùn pudete mai ottene una suluzione perfetta, nò? Questu hè simplicemente impussibile. Fighjate, a compilazione Ahead of Time - funziona ancu male. A cunversazione quì hè di qualchi casi mediu. Riguardu à u funziunamentu tipicu, cusì pudete andà à misurà qualcosa chì pensate hè un bonu rendimentu tipicu - dopu tuttu, stai travagliendu per migliurà! L'allocazione di u registru hè un tema di tutte e prestazioni. Una volta chì avete u primu prototipu, travaglia è dipinta ciò chì hè necessariu, u travagliu di performance principia. Avete bisognu à amparà à misurà bè. Perchè hè impurtante? Se tenete dati chjaru, pudete guardà diverse spazii è vede: sì, hà aiutatu quì, ma hè quì chì tuttu s'hè rottu! Alcune idee boni venenu, aghjunghjenu euristiche novi è di colpu tuttu cumencia à travaglià un pocu megliu in media. O ùn principia micca. Aviu avutu una mansa di casi induve avemu luttatu per u rendimentu di cinque percentu chì hà differenziatu u nostru sviluppu da l'allocatore precedente. È ogni volta chì pare cusì: in un locu vincite, in un locu perde. Se tenete boni strumenti di analisi di rendiment, pudete truvà l'idee perdenti è capisce perchè fallenu. Forse vale a pena di lascià tuttu cum'è hè, o forse di piglià un accostu più seriu à a fine-tuning, o di esce è di riparà qualcosa d'altru. Hè una mansa di cose ! Aghju fattu stu pirate frescu, ma aghju ancu bisognu di questu, è questu, è questu - è a so cumminazione tutale dà alcune migliure. È i soli pò fallu. Questa hè a natura di u travagliu di rendiment nantu à i prublemi NP-complete.

Владимир: Unu si sente chì e cose cum'è pittura in allocatori sò un prublema chì hè digià statu risoltu. Ebbè, hè decisu per voi, à ghjudicà da ciò chì dite, vale ancu a pena allora ...

Cliff: Ùn hè micca risolta cum'è tali. Hè voi chì deve turnà in "risolta". Ci sò prublemi difficiuli è anu da esse risolti. Una volta questu hè fattu, hè u tempu di travaglià nantu à a produtividade. Avete bisognu di avvicinà stu travagliu in cunseguenza - fate benchmarks, recullate metriche, spiegà e situazioni quandu, quandu avete tornatu à una versione precedente, u vostru vechju pirate hà cuminciatu à travaglià di novu (o vice versa, ferma). È ùn rinuncia micca finu à ottene qualcosa. Cumu l'aghju digià dettu, s'ellu ci sò idee cool chì ùn anu micca travagliatu, ma in u campu di l'assignazione di i registri di l'idee hè apprussimatamente infinitu. Pudete, per esempiu, leghje publicazioni scientifiche. Ancu s'ellu avà sta zona hà cuminciatu à spustà assai più lentamente è hè diventata più chjaru chè in a so ghjuventù. Tuttavia, ci sò innumerevoli persone chì travaglianu in questu campu è tutte e so idee valenu a pena di pruvà, sò tutti aspittendu in l'ale. È ùn pudete micca dì quantu sò boni, salvu chì ùn li pruvate. Cume si integranu bè cù tuttu ciò chì in u vostru allocatore, perchè un allocatore faci assai cose, è alcune idee ùn viaghjanu micca in u vostru allocatore specificu, ma in un altru allocatore facianu facilmente. U modu principalu di vince per l'allocatore hè di tirà e cose lente fora di u percorsu principalu è furzà à sparte longu i cunfini di i camini lenti. Allora se vulete eseguisce un GC, pigliate a strada lenta, deoptimize, lanciate una eccezzioni, tutte e cose - sapete chì queste cose sò relativamente rari. È sò veramente rari, aghju verificatu. Fate un travagliu extra è sguassate assai di e restrizioni nantu à sti camini lenti, ma ùn importa micca veramente perchè sò lenti è raramente viaghjate. Per esempiu, un puntatore nulu - ùn succede mai, nò? Avete bisognu à avè parechje strade per cose diverse, ma ùn deve micca interferiscenu cù u principale. 

Владимир: Chì pensate di i multi-core, quandu ci sò millaie di core à una volta? Hè una cosa utile?

Cliff: U successu di a GPU mostra chì hè abbastanza utile !

Владимир: Sò abbastanza specializati. Chì ci hè di i prucessori di u scopu generale?

Cliff: Ebbè, questu era u mudellu cummerciale di Azul. A risposta hè tornata in una era quandu a ghjente amava veramente un rendimentu prevedibile. Era difficiule di scrive codice parallelu allora. U mudellu di codificazione H2O hè assai scalabile, ma ùn hè micca un mudellu di scopu generale. Forsi un pocu più generale cà quandu si usa una GPU. Parlemu di a cumplessità di sviluppà una tale cosa o di a cumplessità di usà? Per esempiu, Azul m'hà insignatu una lezione interessante, una piuttostu micca ovvia: i cache chjuchi sò normali. 

U più grande sfida in a vita

Владимир: E sfide non tecniche ?

Cliff: U più grande sfida era di ùn esse... gentile è simpaticu à a ghjente. È in u risultatu, mi sò sempre trovu in situazioni estremamente cunflittu. Quelli induve sapia chì e cose andavanu male, ma ùn sapia micca cumu avanzà cù quelli prublemi è ùn pudia micca trattà. Parechje prublemi à longu andà, chì duranu per decennii, sò sviluppati in questu modu. U fattu chì Java hà compilatori C1 è C2 hè una cunsequenza diretta di questu. U fattu chì ùn ci era micca una compilazione multi-livellu in Java per deci anni in una fila hè ancu una cunsequenza diretta. Hè ovvi chì avemu bisognu di un tali sistema, ma ùn hè micca ovvi perchè ùn esiste micca. Aviu avutu prublemi cù un ingegnere... o un gruppu di ingegneri. Una volta, quandu aghju cuminciatu à travaglià à Sun, eru... Va bè, micca solu tandu, in generale aghju sempre a mo opinione nantu à tuttu. È aghju pensatu chì era veru chì pudete solu piglià sta verità di a toia è dilla in capu. Soprattuttu chì aghju avutu scunsamente ghjustu a maiò parte di u tempu. È s'ellu ùn ti piace micca questu approcciu ... soprattuttu s'ellu hè ovviamente sbagliatu è fà sciocchezza ... In generale, pochi persone puderanu tollerà sta forma di cumunicazione. Ancu s'è certi pudianu, cum'è mè. Aghju custruitu tutta a mo vita nantu à i principii meritocratici. S'è tù mi mustrai qualcosa di sbagliatu, mi vulteraghju subitu è ​​dicu : tu dissi una sciocchezza. À u listessu tempu, sicuru, scusate è tuttu ciò chì, aghju nutatu i meriti, s'ellu ci hè, è piglià altre azzioni currette. Per d 'altra banda, aghju scuntu ragiò annantu à un percentualità sorprendentemente grande di u tempu tutale. È ùn funziona micca bè in relazioni cù e persone. Ùn aghju micca pruvatu à esse simpaticu, ma mi facciu a quistione senza chjappà. "Questu ùn funzionerà mai, perchè unu, dui è trè". È eranu cum'è, "Oh!" Ci era altre cunsiquenzi chì eranu prubabilmente megliu ignurà: per esempiu, quelli chì anu purtatu à un divorziu da a mo moglia è deci anni di depressione dopu.

A sfida hè una lotta cù e persone, cù a so percepzione di ciò chì pudete o ùn pò micca fà, ciò chì hè impurtante è ciò chì ùn hè micca. Ci era parechje sfide nantu à u stilu di codificazione. Scrivu sempre assai di codice, è in quelli ghjorni aghju avutu ancu à rallentà perchè aghju fattu troppu travaglii paralleli è facianu male, invece di fucalizza nantu à unu. Fighjendu in daretu, aghju scrittu a mità di u codice per u cumandamentu Java JIT, u cumandamentu C2. U prossimu codificatore più veloce hà scrittu a mità lentu, u prossimu mezu cum'è lentu, è era un decadenza esponenziale. A settima persona in questa fila era assai, assai lenta - chì succede sempre! Aghju toccu assai codice. Aghju guardatu à quale hà scrittu ciò chì, senza eccezzioni, aghju fighjatu à u so codice, rivisu ognuna di elli, è cuntinueghja ancu à scrive più di mè ch'è qualsiasi di elli. Stu approcciu ùn funziona micca bè cù e persone. Certi pirsuni ùn piace micca questu. È quandu ùn ponu micca trattà, cumincianu ogni tipu di lagnanza. Per esempiu, una volta m'hà dettu di piantà di codificà perchè scriveva troppu codice è metteva in periculu a squadra, è tuttu mi sonava cum'è una scherza: omi, se u restu di a squadra sparisce è continuu à scrive codice, tu Perderà solu a mità di squadre. Per d 'altra banda, se continuu à scrive codice è perdi a mità di a squadra, chì sona cum'è una gestione assai mala. Ùn aghju mai pensatu veramente, ùn aghju mai parlatu, ma era sempre in un locu in a mo testa. U pensamentu mi girava in u fondu di a mo mente: "Mi scherzi tutti?" Allora, u prublema più grande era mè è e mo rilazioni cù e persone. Avà mi capiscu assai megliu, eru un capu di squadra per i programatori per un bellu pezzu, è avà dicu direttamente à a ghjente: sapete, sò quellu chì sò, è avete da trattà cun mè - hè bè s'ellu stanu. quì? È quandu anu cuminciatu à trattà cun ella, tuttu hà travagliatu. In fatti, ùn sò nè male nè bè, ùn aghju micca cattivi intenzioni o aspirazioni egoistiche, hè solu a mo essenza, è aghju bisognu di campà cun ellu in qualchì manera.

Андрей: Di pocu tempu, tutti cuminciaru à parlà di l'autocuscenza per l'introverti, è di e cumpetenze soft in generale. Chì pudete dì di questu?

Cliff: Iè, questu era l'intruduzione è a lezzione chì aghju amparatu da u mo divorziu da a mo moglia. Ciò ch'e aghju amparatu da u divorziu era di capiscenu mè stessu. Hè cusì chì aghju cuminciatu à capisce l'altri populi. Capisce cumu funziona sta interazzione. Questu hà purtatu à scuperte unu dopu l'altru. Ci era una cuscenza di quale sò è ciò chì rapprisentanu. Chì facciu: o sò preoccupatu di u compitu, o evitendu u cunflittu, o qualcosa altru - è questu livellu di cuscenza di sè stessu aiuta veramente à mantene u cuntrollu. Dopu questu, tuttu va assai più faciule. Una cosa chì aghju scupertu micca solu in mè stessu, ma ancu in altri programatori hè l'incapacità di verbalizà i pinsamenti quandu site in un statu di stress emotivo. Per esempiu, site à pusà ci codificà, in un statu di flussu, è dopu venenu correndu à voi è cumincianu à gridà in istericità chì qualcosa hè rottu è avà misure estreme seranu pigliate contru à voi. È ùn pudete micca dì una parolla perchè site in un statu di stress emutivu. A cunniscenza acquistata permette di preparà per questu mumentu, sopravvive è passà à un pianu di ritirata, dopu chì pudete fà qualcosa. Allora sì, quandu avete principiatu à capisce cumu tuttu funziona, hè un grande avvenimentu chì cambia a vita. 
Eiu stessu ùn pudia truvà e parolle ghjuste, ma aghju ricurdatu di a sequenza di l'azzioni. U puntu hè chì sta reazione hè quant'è fisica quant'è verbale, è avete bisognu di spaziu. Un tali spaziu, in u sensu Zen. Questu hè esattamente ciò chì ci vole à esse spiegatu, è poi subitu subitu da parte - alluntanate puramente fisicamente. Quandu mi stà in silenziu verbalmente, possu processà a situazione emotivamente. Quandu l'adrenalina ghjunghje à u vostru cervellu, vi cambia in modu di lotta o di volu, ùn pudete più dì nunda, nò - avà sì un idiota, un ingegnere di frusta, incapace di una risposta decente o ancu di piantà l'attaccu, è l'attaccante hè liberu. per attaccà una volta è una volta. Duvete prima diventà sè stessu, ripiglià u cuntrollu, esce da u modu "lotta o volu".

È per questu avemu bisognu di spaziu verbale. Solu spaziu liberu. Se dite qualcosa, pudete dì esattamente ciò chì, è andate è veramente truvà "spaziu" per voi stessu: andate per un caminu in u parcu, chjude in a doccia - ùn importa micca. A cosa principal hè di disconnect temporaneamente da quella situazione. Appena si spegne per almenu uni pochi seconde, u cuntrollu torna, cuminciate à pensà sobriamente. "Va bè, ùn sò micca un idiota, ùn facciu micca cose stupide, sò una persona abbastanza utile". Una volta chì avete pussutu cunvince sè stessu, hè ora di passà à a tappa dopu: capisce ciò chì hè accadutu. Avete statu attaccatu, l'attaccu hè vinutu da induve ùn l'aspittàvate micca, era una imbuscata disonesta è vile. Questu hè male. U prossimu passu hè di capisce perchè l'attaccante avia bisognu di questu. Da veru, perchè ? Forse perchè ellu stessu hè furioso ? Perchè hè pazza ? Per esempiu, perchè s'hè sbucatu stessu è ùn pò micca accettà rispunsabilità? Questu hè u modu per trattà cun cura tutta a situazione. Ma questu hè bisognu di spaziu per manuvra, spaziu verbale. U primu passu hè di rompe u cuntattu verbale. Evite a discussione cù e parolle. Cancella, andate u più prestu pussibule. S'ellu hè una conversazione telefonica, basta raccrochà - questa hè una cumpetenza chì aghju amparatu da a cumunicazione cù a mo ex-moglia. Se a cunversazione ùn va micca bè, basta à dì "addiu" è chjappà. Da l'altra parte di u telefunu: "bla bla bla", rispondi: "iè, ciao!" è appiccicà. Solu finiscinu a conversazione. Cinque minuti dopu, quandu a capacità di pensà sensibule torna à voi, avete rinfriscatu un pocu, diventa pussibule di pensà à tuttu, ciò chì hè accadutu è ciò chì succede dopu. È cuminciate à furmulà una risposta pensativa, piuttostu cà solu reagisce fora di l'emozione. Per mè, l'avanzata in a cuscenza di sè stessu era precisamente u fattu chì in casu di stress emutivu ùn possu micca parlà. Esce da stu statu, pensendu è pianificà cumu risponde è cumpensà i prublemi - questi sò i passi ghjusti in u casu quandu ùn pudete micca parlà. A manera più faciule hè di scappà da a situazione in quale l'estressi emutivu si manifesta è solu cessà di participà à questu stress. Dopu à quessa, diventate capaci di pensà, quandu pudete pensà, diventate capaci di parlà, è cusì.

A strada, in tribunale, l'avvucatu oppostu prova di fà questu - avà hè chjaru perchè. Perchè ellu hà a capacità di suppressione à un statu tali chì ùn pudete mancu pronunzia u vostru nome, per esempiu. In un sensu assai veru, ùn puderete micca parlà. Sè sta succèri à voi, è s'è vo sapete chì vi truverete in un locu induve battaglie verbali sò raging, in un locu cum'è tribunale, allura vi pò vene cù u vostru avvucatu. L'avucatu vi stallà per voi è ferma l'attaccu verbale, è farà in modu cumplettamente legale, è u spaziu Zen persu torna à voi. Per esempiu, aghju avutu à chjamà a mo famiglia un paru di volte, u ghjudice era abbastanza amichevule annantu à questu, ma l'avucatu oppostu gridava è gridava à mè, ùn pudia ancu avè una parolla in u bordu. In questi casi, l'usu di un mediatore funziona megliu per mè. U mediatore ferma tutta sta prissioni chì si versa nantu à voi in un flussu cuntinuu, truvate u spaziu Zen necessariu, è cun ellu torna a capacità di parlà. Questu hè tuttu un campu di cunniscenza in quale ci hè assai da studià, assai da scopre in sè stessu, è tuttu questu si trasforma in decisioni strategiche d'altu livellu chì sò diffirenti per e diverse persone. Certi pirsuni ùn anu micca i prublemi descritti sopra; di solitu, e persone chì sò vende prufessiunali ùn anu micca. Tutti issi pirsuni chì campanu a so vita cù e parolle - cantanti famosi, pueti, capi religiosi è pulitichi, anu sempre qualcosa à dì. Ùn anu micca tali prublemi, ma aghju.

Андрей: Era... imprevisu. Grande, avemu digià parlatu assai è hè ora di finisce sta intervista. Di sicuru, ci scuntremu à a cunferenza è puderemu cuntinuà stu dialogu. Ci si vede à Hydra!

Pudete cuntinuà a vostra conversazione cù Cliff à a cunferenza Hydra 2019, chì si terrà l'11-12 di lugliu 2019 in San Pietroburgo. Ellu vene cun un rapportu "L'esperienza di Memoria Transazionale di Hardware Azul". I biglietti ponu esse acquistati nant'à u situ ufficiali.

Source: www.habr.com

Add a comment