Wawancara gedhe karo Cliff Click, bapak kompilasi JIT ing Jawa

Wawancara gedhe karo Cliff Click, bapak kompilasi JIT ing JawaCliff Klik - CTO saka Cratus (sensor IoT kanggo proses dandan), pangadeg lan co-pendiri sawetara startups (kalebu Rocket Realtime School, Neurensic lan H2O.ai) karo sawetara sukses metu. Cliff wrote compiler pisanan ing umur 15 (Pascal kanggo TRS Z-80)! Dheweke misuwur amarga karyane ing C2 ing Jawa (Segara Nodes IR). Compiler iki nuduhake donya yen JIT bisa gawé kode kualitas dhuwur, kang dadi salah siji faktor ing emergence saka Jawa minangka salah siji saka platform lunak modern utama. Banjur Cliff mbantu Azul Systems mbangun mainframe 864-inti karo piranti lunak Java murni sing ndhukung GC ngaso ing tumpukan 500-gigabyte ing 10 milliseconds. Umumé, Cliff bisa nggarap kabeh aspek JVM.

 
Habrapost iki minangka wawancara apik karo Cliff. Kita bakal ngomong babagan topik ing ngisor iki:

  • Transisi menyang optimasi tingkat rendah
  • Carane nindakake refactoring gedhe
  • Model biaya
  • Latihan optimasi tingkat rendah
  • Conto praktis perbaikan kinerja
  • Apa nggawe basa pamrograman dhewe
  • Karir Performance Engineer
  • Tantangan Teknis
  • A sethitik babagan ndhaftar alokasi lan multi-inti
  • Tantangan paling gedhe ing urip

Wawancara ditindakake dening:

  • Andrey Satriya saka Amazon Web Services. Ing kariré, dheweke bisa kerja ing proyek sing beda-beda: dheweke nguji database sing disebarake NewSQL ing Yandex, sistem deteksi maya ing Kaspersky Lab, game multiplayer ing Mail.ru lan layanan kanggo ngitung rega ijol-ijolan manca ing Deutsche Bank. Kasengsem nguji sistem backend lan distribusi skala gedhe.
  • Vladimir Sitnikov saka Netcracker. Sepuluh taun kerja ing kinerja lan skalabilitas NetCracker OS, piranti lunak sing digunakake dening operator telekomunikasi kanggo ngotomatisasi proses manajemen peralatan jaringan lan jaringan. Kasengsem ing masalah kinerja Java lan Oracle Database. Penulis luwih saka rolas dandan kinerja ing driver PostgreSQL JDBC resmi.

Transisi menyang optimasi tingkat rendah

Andrei: Sampeyan jeneng gedhe ing donya kompilasi JIT, Jawa, lan kinerja karya ing umum, ta? 

Cliff: Koyok ngono!

Andrei: Ayo dadi miwiti karo sawetara pitakonan umum babagan karya kinerja. Apa sampeyan mikir babagan pilihan antarane optimasi tingkat dhuwur lan tingkat rendah kaya nggarap tingkat CPU?

Cliff: Ya, kene kabeh prasaja. Kode sing paling cepet yaiku sing ora tau mlaku. Mulane, sampeyan kudu tansah miwiti saka tingkat dhuwur, nggarap algoritma. Notasi O sing luwih apik bakal ngalahake notasi O sing luwih elek, kajaba ana sawetara konstanta sing cukup gedhe. Prekara-prekara tingkat rendah dadi pungkasan. Biasane, yen sampeyan wis ngoptimalake tumpukan liyane kanthi cukup lan isih ana sawetara barang sing menarik, iku tingkat sing kurang. Nanging carane miwiti saka tingkat dhuwur? Kepiye carane ngerti yen cukup karya tingkat dhuwur wis rampung? Inggih... mboten. Ora ana resep-resep sing wis siap. Sampeyan kudu ngerti masalah, mutusake apa sing bakal sampeyan lakoni (supaya ora njupuk langkah sing ora perlu ing mangsa ngarep) banjur sampeyan bisa nemokake profiler, sing bisa ngomong sing migunani. Ing sawetara titik, sampeyan dhewe ngerti yen sampeyan wis nyingkirake barang-barang sing ora perlu lan wis wektune kanggo nindakake tuning tingkat rendah. Iki mesthi jenis seni khusus. Ana akeh wong sing nindakake perkara sing ora perlu, nanging obah kanthi cepet nganti ora duwe wektu kuwatir babagan produktivitas. Nanging iki nganti pitakonan muncul bluntly. Biasane 99% ora ana sing peduli karo apa sing dak lakoni, nganti ana sing penting teka ing dalan kritis sing ora ana sing peduli. Lan ing kene kabeh wong wiwit ngganggu sampeyan babagan "kenapa ora bisa digunakake kanthi sampurna wiwit wiwitan." Umumé, tansah ana sing kudu nambah kinerja. Nanging 99% wektu sampeyan ora duwe timbal! Sampeyan mung nyoba nggawe soko lan ing proses sampeyan ngerti apa sing penting. Sampeyan ora bisa ngerti luwih dhisik yen potongan iki kudu sampurna, dadi, nyatane, sampeyan kudu sampurna ing kabeh. Nanging iki ora mungkin lan sampeyan ora nindakake. Mesthi wae akeh sing kudu didandani - lan iku pancen normal.

Carane nindakake refactoring gedhe

Andrei: Kepriye anggone nyambut gawe ing pagelaran? Iki minangka masalah silang. Contone, apa sampeyan kudu ngupayakake masalah sing muncul saka persimpangan saka akeh fungsi sing wis ana?

Cliff: Aku nyoba nyingkiri. Yen aku ngerti kinerja bakal dadi masalah, aku mikir babagan sadurunge miwiti coding, utamane karo struktur data. Nanging asring sampeyan nemokake kabeh iki mengko. Banjur sampeyan kudu nindakake langkah-langkah sing ekstrem lan nindakake apa sing diarani "tulis ulang lan nelukake": sampeyan kudu njupuk potongan sing cukup gedhe. Sawetara kode isih kudu ditulis maneh amarga masalah kinerja utawa liya. Punapa mawon alesan kanggo nulis maneh kode, iku meh tansah luwih apik kanggo nulis ulang Piece luwih gedhe saka Piece cilik. Ing wayahe iki, kabeh wong wiwit gumeter wedi: "Ya Allah, sampeyan ora bisa ndemek kode sing akeh banget!" Nanging nyatane, pendekatan iki meh tansah dianggo luwih apik. Sampeyan kudu langsung njupuk masalah gedhe, tarik bunder gedhe watara lan ngandika: Aku bakal nulis maneh kabeh nang bunder. Wates kasebut luwih cilik tinimbang isi ing njero sing kudu diganti. Lan yen delineasi wates kasebut ngidini sampeyan nindakake pakaryan kanthi sampurna, tangan sampeyan bebas, nindakake apa sing dikarepake. Sawise sampeyan ngerti masalah kasebut, proses nulis ulang luwih gampang, mula cokotan gedhe!
Ing wektu sing padha, nalika sampeyan nulis ulang gedhe lan ngerti yen kinerja bakal dadi masalah, sampeyan bisa langsung kuwatir. Iki biasane dadi prasaja kaya "aja nyalin data, atur data kanthi gampang, gawe cilik." Ing nulis ulang gedhe, ana cara standar kanggo nambah kinerja. Lan padha meh tansah revolve watara data.

Model biaya

Andrei: Ing salah sawijining podcast sampeyan ngomong babagan model biaya ing konteks produktivitas. Apa sampeyan bisa nerangake apa tegese iki?

Cliff: Mesthi wae. Aku lair ing jaman nalika kinerja prosesor penting banget. Lan jaman iki bali maneh - nasib ora tanpa ironi. Aku wiwit urip ing jaman mesin wolung bit; komputer pisananku dianggo nganggo 256 bait. Persis bita. Kabeh cilik banget. Instruksi kudu diitung, lan nalika kita miwiti munggah tumpukan basa pamrograman, basa kasebut saya tambah akeh. Ana Assembler, banjur Basic, banjur C, lan C ngurus akeh rincian, kaya alokasi registrasi lan pilihan instruksi. Nanging kabeh iku cukup cetha ana, lan yen aku nggawe pitunjuk kanggo Kayata saka variabel, aku bakal njaluk mbukak, lan biaya instruksi iki dikenal. Hardware mrodhuksi sawetara siklus mesin, supaya kacepetan eksekusi saka macem-macem iku bisa diwilang mung kanthi nambah munggah kabeh instruksi sing bakal mbukak. Saben mbandhingake / test / cabang / telpon / mbukak / nyimpen bisa ditambahake lan ngandika: sing wektu eksekusi kanggo sampeyan. Nalika nggarap ningkatake kinerja, sampeyan mesthi bakal menehi perhatian marang nomer apa sing cocog karo siklus panas cilik. 
Nanging sanalika sampeyan ngalih menyang Jawa, Python lan padha, sampeyan cepet banget pindhah saka hardware tingkat kurang. Apa biaya nelpon getter ing Jawa? Yen JIT ing HotSpot bener inline, bakal mbukak, nanging yen ora nindakake iki, iku bakal telpon fungsi. Wiwit telpon ana ing daur ulang panas, bakal ngatasi kabeh optimasi liyane ing daur ulang kasebut. Mulane, biaya nyata bakal luwih dhuwur. Lan sampeyan langsung kelangan kemampuan kanggo ndeleng Piece saka kode lan ngerti sing kita kudu nglakokaké ing kacepetan jam prosesor, memori lan cache digunakake. Kabeh iki dadi menarik mung yen sampeyan tenan njaluk menyang kinerja.
Saiki kita nemoni kahanan sing kacepetan prosesor meh ora tambah suwene dasawarsa. Jaman biyen wis bali! Sampeyan ora bisa ngetung kinerja siji-Utas maneh. Nanging yen dumadakan njaluk menyang komputer podo, iku luar biasa angel, everyone katon ing sampeyan kaya James Bond. Akselerasi kaping sepuluh ing kene biasane kedadeyan ing papan sing ana wong sing ngaco. Concurrency mbutuhake akeh karya. Kanggo entuk kacepetan XNUMXx, sampeyan kudu ngerti model biaya. Apa lan pira regane? Lan kanggo nindakake iki, sampeyan kudu ngerti carane basa pas karo hardware ndasari.
Martin Thompson milih tembung sing apik kanggo bloge Simpati Mekanik! Sampeyan kudu ngerti apa hardware sing arep apa, carane persis iku bakal nindakake, lan apa iku apa ing Panggonan pisanan. Nggunakake iki, iku cukup gampang kanggo miwiti ngetang instruksi lan tokoh metu ngendi wektu eksekusi arep. Yen sampeyan ora duwe latihan sing cocog, sampeyan mung nggoleki kucing ireng ing kamar sing peteng. Aku ndeleng wong ngoptimalake kinerja kabeh wektu sing ora ngerti apa neraka sing lagi dilakoni. Padha nandhang sangsara banget lan ora nggawe akeh kemajuan. Lan nalika aku njupuk Piece padha saka kode, slip ing saperangan hacks cilik lan njaluk lima utawa sepuluh-fold speedup, padha kaya: uga, sing ora adil, kita wis ngerti sampeyan luwih apik. nggumunake. Apa aku ngomong bab ... model biaya bab apa jenis kode sampeyan nulis lan carane cepet mlaku ing rata-rata ing gambar amba.

Andrei: Lan carane sampeyan bisa nyimpen volume kuwi ing sirah? Apa iki digayuh kanthi pengalaman luwih akeh, utawa? Saka ngendi pengalaman kaya ngono?

Cliff: Ya, aku ora entuk pengalaman kanthi cara sing paling gampang. Aku diprogram ing Majelis bali ing dina nalika sampeyan bisa ngerti saben instruksi. Iku muni bodho, nanging wiwit banjur Z80 instruction pesawat tansah tetep ing sirah, ing memori. Aku ora ngelingi jeneng wong ing menit ngomong, nanging aku kelingan kode ditulis 40 taun kepungkur. Kocak, kaya sindrom"ilmuwan bodho".

Latihan optimasi tingkat rendah

Andrei: Apa ana cara sing luwih gampang kanggo mlebu?

Cliff: Ya lan ora. Perangkat keras sing kita gunakake kabeh ora owah kabeh sajrone wektu. Saben uwong nggunakake x86, kajaba smartphone Arm. Yen sampeyan ora nindakake sawetara jinis hardcore embedding, sampeyan uga nindakake perkara sing padha. Oke, sabanjure. Instruksi kasebut uga ora owah nganti pirang-pirang abad. Sampeyan kudu pindhah lan nulis soko ing Majelis. Ora akeh, nanging cukup kanggo miwiti ngerti. Sampeyan mesem, nanging aku ngomong kanthi serius. Sampeyan kudu ngerti korespondensi antarane basa lan hardware. Sawisé iku sampeyan kudu pindhah lan nulis sethitik lan nggawe compiler dolanan sethitik kanggo basa dolanan sethitik. Kaya dolanan tegese kudu digawe ing wektu sing cukup. Bisa uga super prasaja, nanging kudu ngasilake instruksi. Tumindak ngasilake instruksi bakal mbantu sampeyan ngerti model biaya kanggo jembatan antarane kode tingkat dhuwur sing ditulis saben wong lan kode mesin sing mlaku ing hardware. Korespondensi iki bakal diobong ing otak nalika kompiler ditulis. Malah kompiler sing paling gampang. Sawisé iku, sampeyan bisa miwiti ndeleng ing Jawa lan kasunyatan sing jurang semantik iku luwih jero, lan iku luwih angel kanggo mbangun kreteg liwat iku. Ing tanah Jawa, luwih angel dimangerteni manawa kreteg kita dadi apik utawa ala, apa sing bakal ambruk lan apa ora. Nanging sampeyan butuh sawetara titik wiwitan ing ngendi sampeyan ndeleng kode lan ngerti: "Ya, getter iki kudu digarisake saben wektu." Lan banjur dadi metu sing kadhangkala mengkono, kajaba kanggo kahanan nalika cara dadi gedhe banget, lan JIT wiwit inlining kabeh. Kinerja papan kasebut bisa diprediksi kanthi cepet. Biasane getters bisa uga, nanging banjur katon ing puteran panas gedhe lan éling sing ana sawetara fungsi telpon ngambang watara ana sing ora ngerti apa sing lagi dilakoni. Iki masalah karo nggunakake nyebar saka getter, alesan ngapa padha ora inlined iku ora cetha apa iku getter. Yen sampeyan duwe basis kode super cilik, sampeyan mung bisa ngelingi lan banjur ngomong: iki getter, lan iki setter a. Ing basis kode gedhe, saben fungsi urip sajarah dhewe, kang, ing umum, ora ngerti sapa. Profiler ngandika yen kita ilang 24% wektu ing sawetara daur ulang lan ngerti apa daur ulang iki, kita kudu katon ing saben fungsi nang. Sampeyan ora bisa ngerti iki tanpa sinau fungsi, lan iki akeh slows mudhun proses pangerten. Mulane aku ora nggunakake getter lan setter, aku wis tekan level anyar!
Where kanggo njaluk model biaya? Inggih, sampeyan bisa maca soko, mesthi ... Nanging aku cara paling apik kanggo tumindak. Nggawe kompiler cilik bakal dadi cara sing paling apik kanggo mangerteni model biaya lan pas karo sirah sampeyan dhewe. Compiler cilik sing cocog kanggo program gelombang mikro minangka tugas kanggo pamula. Maksudku, yen sampeyan wis duwe katrampilan pemrograman, mesthine cukup. Kabeh iki kaya parsing senar sing sampeyan duwe minangka sawetara jinis ekspresi aljabar, ngekstrak instruksi kanggo operasi matematika saka ing urutan sing bener, njupuk nilai sing bener saka register - kabeh iki rampung bebarengan. Lan nalika sampeyan nindakake, iku bakal dicithak ing otak sampeyan. Aku kabeh wong ngerti apa sing ditindakake kompiler. Lan iki bakal menehi pangerten babagan model biaya.

Conto praktis perbaikan kinerja

Andrei: Apa maneh sing kudu digatekake nalika nggarap produktivitas?

Cliff: Struktur data. Ngomong-ngomong, wis suwe aku ora ngajar kelas kasebut ... Sekolah Roket. Iku nyenengake, nanging mbutuhake akeh gaweyan, lan aku uga duwe urip! OK. Dadi, ing salah sawijining kelas sing gedhe lan menarik, "Kados pundi kinerja sampeyan," aku menehi conto marang siswa: rong lan setengah gigabyte data fintech diwaca saka file CSV banjur kudu ngetung jumlah produk sing didol. . Data pasar centhang biasa. Paket UDP diowahi dadi format teks wiwit taun 70-an. Chicago Mercantile Exchange - macem-macem kaya mentega, jagung, kedele, lan liya-liyane. Sampeyan kudu ngetung produk kasebut, jumlah transaksi, volume rata-rata gerakan dana lan barang, lsp. Math dagang sing cukup prasaja: temokake kode produk (sing 1-2 karakter ing tabel hash), entuk jumlah, ditambahake menyang salah sawijining set perdagangan, nambah volume, nambah nilai, lan saperangan liyane. matematika prasaja banget. Implementasi dolanan kasebut gampang banget: kabeh ana ing file, aku maca file kasebut lan pindhah liwat, mbagi cathetan individu menyang strings Jawa, nggoleki barang-barang sing dibutuhake lan ditambahake miturut matematika sing kasebut ing ndhuwur. Lan kerjane ing sawetara kacepetan kurang.

Kanthi pendekatan iki, jelas apa sing kedadeyan, lan komputasi paralel ora bakal mbantu, ta? Pranyata peningkatan kinerja kaping lima bisa digayuh kanthi milih struktur data sing bener. Lan iki surprises malah programer experienced! Ing kasus tartamtu, trik kasebut yaiku sampeyan ora kudu nggawe alokasi memori ing daur ulang panas. Ya, iki ora kabeh bebener, nanging umume - sampeyan ora kudu nyorot "sapisan ing X" nalika X cukup gedhe. Nalika X iku loro lan setengah gigabyte, sampeyan ora kudu nyedhiakke apa-apa "sapisan saben huruf", utawa "sapisan saben baris", utawa "sapisan saben lapangan", apa kaya. Iki ngendi wektu ngginakaken. Carane iki malah bisa? Bayangna aku nelpon String.split() utawa BufferedReader.readLine(). Readline ndadekake senar saka pesawat saka bita sing teka liwat jaringan, sapisan kanggo saben baris, kanggo saben atusan yuta garis. Aku njupuk baris iki, parse lan uncalan adoh. Lha kok dibuwang - ya wis diproses, ya wis. Dadi, kanggo saben bait sing diwaca saka 2.7G iki, rong karakter bakal ditulis ing baris, yaiku, wis 5.4G, lan aku ora butuh apa-apa maneh, mula dibuwang. Yen katon ing bandwidth memori, kita mbukak 2.7G sing dadi liwat memori lan bis memori ing prosesor, lan banjur kaping pindho minangka akeh dikirim menyang baris dumunung ing memori, lan kabeh iki frayed nalika saben baris anyar digawe. Nanging aku kudu maca, hardware maca, sanajan kabeh wis frayed mengko. Lan aku kudu nulis amarga aku nggawe garis lan cache kebak - cache ora bisa nampung 2.7G. Dadi, kanggo saben bait sing diwaca, aku maca rong bita maneh lan nulis rong bait maneh, lan pungkasane duwe rasio 4: 1 - ing rasio iki kita mbuang bandwidth memori. Lan banjur dadi metu yen aku String.split() – iki ora pungkasan wektu aku iki, bisa uga ana liyane 6-7 kothak nang. Dadi kode klasik kanggo maca CSV banjur ngurai senar kasebut ngasilake sampah bandwidth memori kira-kira 14: 1 relatif marang apa sing sampeyan pengin duwe. Yen sampeyan mbuwang pilihan kasebut, sampeyan bisa entuk kacepetan kaping lima.

Lan ora angel banget. Yen sampeyan ndeleng kode saka sudut sing tepat, kabeh bakal dadi prasaja yen sampeyan ngerti masalah kasebut. Sampeyan kudu ora mungkasi allocating memori kabeh: mung masalah sing nyedhiakke soko lan langsung mati, lan ing sadawane dalan iku Burns sumber penting, kang ing kasus iki bandwidth memori. Lan kabeh iki nyebabake penurunan produktivitas. Ing x86 sampeyan kudu aktif ngobong siklus prosesor, nanging ing kene sampeyan ngobong kabeh memori luwih dhisik. Solusi kanggo ngurangi jumlah discharge. 
Sisih liyane saka masalah iku yen sampeyan mbukak profiler nalika belang memori entek, tengen yen mengkono, sampeyan biasane ngenteni cache bali amarga kebak sampah sing mung diprodhuksi, kabeh baris sing. Mulane, saben mbukak utawa nyimpen operasi dadi alon, amarga padha mimpin kanggo cache kantun - kabeh cache wis dadi alon, nunggu uwuh kanggo ninggalake. Mulane, profiler mung bakal nuduhake swara acak anget smeared saindhenging kabeh daur ulang - ora bakal ana instruksi panas kapisah utawa panggonan ing kode. Mung rame. Lan yen katon ing siklus GC, padha kabeh Young Generation lan super cepet - microseconds utawa milliseconds maksimum. Sawise kabeh, kabeh memori iki mati langsung. Sampeyan nyedhiakke milyar gigabyte, lan Cut mau, lan Cut mau, lan Cut maneh. Kabeh iki kedadeyan kanthi cepet. Pranyata metu sing ana siklus GC mirah, swara anget sadawane kabeh siklus, nanging kita pengin njaluk speedup 5x. Ing wayahe, ana sing kudu nutup ing sirah lan muni: "kenapa iki?!" Overflow Strip memori ora ditampilake ing debugger klasik; sampeyan kudu mbukak debugger counter kinerja hardware lan ndeleng dhewe lan langsung. Nanging iki ora bisa langsung curiga saka telung gejala kasebut. Gejala katelu yaiku nalika ndeleng apa sing sampeyan sorot, takon profiler, lan dheweke mangsuli: "Sampeyan nggawe milyaran baris, nanging GC makarya kanthi gratis." Sanalika kedadeyan kasebut, sampeyan bakal ngerti manawa sampeyan wis nggawe akeh obyek lan ngobong kabeh jalur memori. Ana cara kanggo ngerteni iki, nanging ora jelas. 

Masalah ing struktur data: struktur gundhul ndasari kabeh sing kedaden, iku gedhe banget, iku 2.7G ing disk, supaya nggawe salinan bab iki banget undesirable - sampeyan pengin langsung mbukak saka buffer byte jaringan. menyang register, supaya ora maca-nulis menyang baris bali lan kasebut kaping lima. Sayange, Jawa ora menehi perpustakaan kuwi minangka bagéan saka JDK minangka standar. Nanging iki ora pati penting, ta? Ateges, iki 5-10 baris kode sing bakal digunakake kanggo ngleksanakake loader senar buffered dhewe, kang mbaleni prilaku kelas senar, nalika dadi pambungkus sak buffer byte ndasari. Akibaté, iku dadi metu sing digunakake meh kaya karo strings, nanging nyatane penunjuk kanggo buffer obah ana, lan bita mentahan ora disalin ngendi wae, lan kanthi mangkono buffer padha digunakake maneh lan maneh, lan sistem operasi seneng njupuk ing dhewe iku dirancang kanggo, kaya didhelikake pindho buffering iki buffer byte, lan sampeyan ora maneh mecah liwat stream telas data rasah. Miturut cara, sampeyan ngerti yen nalika nggarap GC, dijamin saben alokasi memori ora bakal katon ing prosesor sawise siklus GC pungkasan? Mulane, kabeh iki ora bisa ing cache, lan banjur 100% dijamin miss. Nalika nggarap pointer, ing x86, nyuda registrasi saka memori njupuk 1-2 siklus jam, lan sanalika kedadeyan kasebut, sampeyan mbayar, mbayar, mbayar, amarga memori wis aktif. NINE caches - lan iki biaya alokasi memori. Nilai nyata.

Ing tembung liya, struktur data minangka perkara sing paling angel diganti. Lan yen sampeyan ngerti yen sampeyan wis milih struktur data sing salah sing bakal mateni kinerja mengko, biasane ana akeh karya sing kudu ditindakake, nanging yen ora, kahanan bakal saya elek. Kaping pisanan, sampeyan kudu mikir babagan struktur data, iki penting. Biaya utama ing kene ana ing struktur data lemak, sing wiwit digunakake kanthi gaya "Aku nyalin struktur data X menyang struktur data Y amarga aku luwih seneng wangun Y." Nanging operasi salinan (sing katon murah) bener-bener mbuang bandwidth memori lan ing kana kabeh wektu eksekusi sing boros dikubur. Yen aku duwe senar raksasa JSON lan aku pengin ngowahi dadi wit DOM POJOs utawa apa wae, operasi parsing string kasebut lan mbangun POJO, banjur ngakses POJO maneh mengko, bakal nyebabake biaya sing ora perlu - iku ora murah. Kajaba yen sampeyan mbukak watara POJOs kathah luwih kerep tinimbang sampeyan mbukak watara senar. Offhand, sampeyan bisa malah nyoba kanggo decrypt senar lan extract mung apa sing perlu saka ing kono, tanpa ngowahi menyang POJO sembarang. Yen kabeh iki kelakon ing dalan saka kang kinerja maksimum dibutuhake, ora POJOs kanggo sampeyan, sampeyan kudu piye wae dig menyang baris langsung.

Apa nggawe basa pamrograman dhewe

Andrei: Sampeyan ngomong yen kanggo mangerteni model biaya, sampeyan kudu nulis basa cilik dhewe ...

Cliff: Ora basa, nanging compiler. Basa lan kompiler iku rong perkara sing beda. Bentenane sing paling penting ana ing sirahmu. 

Andrei: Oalah, sak ngertiku, kowe lagi nyoba nggawe basamu dhewe. Kanggo apa?

Cliff: Amarga aku bisa! Aku wis setengah pensiun, dadi iki hobiku. Aku wis ngetrapake basa wong liya sajrone uripku. Aku uga makarya akeh ing gaya coding sandi. Lan uga amarga aku ndeleng masalah ing basa liya. Aku weruh yen ana cara sing luwih apik kanggo nindakake perkara sing akrab. Lan aku bakal nggunakake. Aku mung kesel ndeleng masalah ing awakku dhewe, ing Jawa, ing Python, ing basa liyane. Aku saiki nulis ing React Native, JavaScript lan Elm minangka hobi sing ora babagan pensiun, nanging babagan kerja aktif. Aku uga nulis ing Python lan, paling kamungkinan, bakal terus bisa ing machine learning kanggo backends Jawa. Ana akeh basa populer lan kabeh duwe fitur sing menarik. Saben uwong apik kanthi cara dhewe lan sampeyan bisa nyoba nggabungake kabeh fitur kasebut. Dadi, aku sinau bab-bab sing narik kawigatenku, prilaku basa, nyoba nggawe semantik sing wajar. Lan nganti saiki aku sukses! Ing wayahe aku berjuang karo semantik memori, amarga aku pengin duwe kaya ing C lan Jawa, lan njaluk model memori kuwat lan semantik memori kanggo kathah lan nyimpen. Ing wektu sing padha, duwe inferensi jinis otomatis kaya ing Haskell. Ing kene, aku nyoba nyampur inferensi jinis kaya Haskell karo karya memori ing C lan Jawa. Iki sing wis daklakoni sajrone 2-3 wulan kepungkur, contone.

Andrei: Yen sampeyan mbangun basa sing njupuk aspek sing luwih apik saka basa liya, apa sampeyan mikir yen ana sing bakal nindakake sebaliknya: njupuk gagasan lan gunakake?

Cliff: Iki persis carane basa anyar katon! Kenapa Jawa padha karo C? Amarga C wis sintaksis apik sing everyone mangertos lan Jawa iki inspirasi dening sintaksis iki, nambah safety jinis, mriksa wates Uploaded, GC, lan padha uga apik sawetara bab saka C. Padha ditambahake dhewe. Nanging dheweke cukup inspirasi, ta? Saben uwong ngadeg ing pundhak para raksasa sing teka sadurunge sampeyan - kaya ngono kemajuan.

Andrei: Aku ngerti, basa sampeyan bakal memori aman. Apa sampeyan wis mikir babagan ngetrapake kaya pemeriksa utang saka Rust? Apa sampeyan ndeleng dheweke, apa sampeyan mikir babagan dheweke?

Cliff: Inggih, Aku wis nulis C kanggo umur, karo kabeh iki malloc lan free, lan manual ngatur umur. Sampeyan ngerti, 90-95% wektu urip sing dikontrol kanthi manual duwe struktur sing padha. Lan banget, banget nglarani kanggo nindakake kanthi manual. Aku pengin kompiler mung ngandhani apa sing kedadeyan ing kana lan apa sing sampeyan lakoni karo tumindak sampeyan. Kanggo sawetara perkara, pemeriksa utang nindakake iki metu saka kothak. Lan kudu kanthi otomatis nampilake informasi, ngerti kabeh, lan ora malah beban kula karo presenting pemahaman iki. Sampeyan kudu nindakake paling ora analisa uwal lokal, lan mung yen gagal, mula kudu nambah anotasi jinis sing bakal njlèntrèhaké umur - lan skema kasebut luwih rumit tinimbang pemeriksa utang, utawa pameriksa memori sing wis ana. Pilihan antarane "kabeh apik" lan "Aku ora ngerti apa-apa" - ora, mesthi ana sing luwih apik. 
Dadi, minangka wong sing wis nulis akeh kode ing C, aku mikir yen duwe dhukungan kanggo kontrol umur otomatis minangka sing paling penting. Aku uga bosen karo pinten Jawa nggunakake memori lan complaint utama GC. Nalika sampeyan nyedhiakke memori ing Jawa, sampeyan ora bakal njaluk maneh memori sing ana lokal ing siklus GC pungkasan. Iki ora kedadeyan ing basa kanthi manajemen memori sing luwih tepat. Yen sampeyan nelpon malloc, sampeyan langsung entuk memori sing biasane mung digunakake. Biasane sampeyan nindakake sawetara perkara sementara kanthi memori lan langsung bali maneh. Lan langsung bali menyang blumbang malloc, lan siklus malloc sabanjuré narik metu maneh. Mulane, panggunaan memori sing nyata dikurangi dadi sakumpulan obyek urip ing wektu tartamtu, ditambah bocor. Lan yen kabeh ora bocor ing cara rampung ora sopan, paling saka memori rampung ing caches lan prosesor, lan kerjane cepet. Nanging mbutuhake akeh Manajemen memori manual karo malloc lan free disebut ing urutan tengen, ing Panggonan tengen. Rust bisa nangani iki mlaku dhewe, lan ing akeh kasus menehi kinerja malah luwih, wiwit konsumsi memori narrowed mudhun kanggo mung pitungan saiki - minangka gantos kanggo nunggu siklus GC sabanjuré kanggo mbebasake memori. Akibaté, kita entuk cara sing menarik kanggo nambah kinerja. Lan cukup kuat - Maksudku, aku nindakake perkara kasebut nalika ngolah data kanggo fintech, lan iki ngidini aku entuk kacepetan kira-kira kaping lima. Iki minangka dorongan sing cukup gedhe, utamane ing jagad sing prosesor ora saya cepet lan kita isih ngenteni dandan.

Karir Performance Engineer

Andrei: Aku uga pengin takon babagan karir ing umum. Sampeyan dadi misuwur amarga kerja JIT ing HotSpot banjur pindhah menyang Azul, sing uga perusahaan JVM. Nanging kita wis kerja luwih akeh babagan hardware tinimbang piranti lunak. Banjur padha dumadakan pindhah menyang Big Data lan Machine Learning, lan banjur kanggo deteksi penipuan. Kepiye kedadeyan kasebut? Iki minangka wilayah pembangunan sing beda banget.

Cliff: Aku wis program cukup dangu lan wis ngatur kanggo njupuk akeh kelas beda. Lan yen wong ngomong: "oh, sampeyan sing nindakake JIT kanggo Jawa!", mesthi lucu. Nanging sadurunge, aku nggarap tiron saka PostScript - basa sing tau digunakake Apple kanggo printer laser. Lan sadurunge aku nindakake implementasine saka basa Keempat. Aku mikir tema umum kanggo kula yaiku pangembangan alat. Kabeh uripku aku wis nggawe alat sing digunakake kanggo nulis program sing apik kanggo wong liya. Nanging aku uga melu ngembangake sistem operasi, driver, debugger tingkat kernel, basa kanggo pangembangan OS, sing diwiwiti ora pati penting, nanging saya suwe saya suwe saya suwe. Nanging topik utama isih pangembangan alat. Sebagéyan gedhé uripku liwat antara Azul lan Sun, lan bab Jawa. Nanging nalika aku mlebu Big Data lan Machine Learning, aku nyelehake topi sing apik lan kandha, "Oh, saiki kita duwe masalah sing ora pati penting, lan ana akeh perkara sing menarik lan ana wong sing nindakake perkara." Iki minangka dalan pangembangan sing apik sing kudu ditindakake.

Ya, aku seneng banget karo komputasi sing disebarake. Pegaweyanku sing sepisanan yaiku dadi mahasiswa ing C, ing proyek iklan. Iki disebarake komputasi ing Zilog Z80 chip sing diklumpukake data kanggo OCR analog, diprodhuksi dening analyzer analog nyata. Iku topik kelangan lan rampung edan. Nanging ana masalah, sawetara bagean ora diakoni kanthi bener, mula sampeyan kudu njupuk gambar lan nuduhake menyang wong sing wis bisa maca kanthi mripate lan nglaporake apa sing dikandhakake, mula ana proyek kanthi data, lan proyek kasebut. duwe basa dhewe. Ana backend sing diproses kabeh iki - Z80s mlaku ing podo karo karo terminal vt100 mlaku - siji saben wong, lan ana model program podo ing Z80. Sawetara Piece umum saka memori dienggo bareng dening kabeh Z80s ing konfigurasi star; Backplane uga dienggo bareng, lan setengah saka RAM dienggo bareng ing jaringan, lan setengah liyane ana pribadi utawa menyang liyane. Sistem distribusi paralel sing artine kompleks kanthi memori sing dienggo bareng ... semi-share. Nalika iki ... Aku malah ora bisa ngelingi, nang endi wae ing agêng-80s. Cukup suwe. 
Ya, ayo nganggep yen taun 30 wis suwe banget. Masalah sing ana hubungane karo komputasi terdistribusi wis suwe banget; wong wis suwe perang karo Beowulf- kluster. Klompok kasebut katon kaya ... Contone: ana Ethernet lan x86 cepet sampeyan disambungake menyang Ethernet iki, lan saiki sampeyan pengin njaluk memori bareng palsu, amarga ora ana sing bisa nindakake coding komputasi sing disebarake, mula angel banget lan mulane ana. ana memori sambungan palsu karo kaca memori pangayoman ing x86, lan yen sampeyan wrote kaca iki, banjur kita marang prosesor liyane yen padha ngakses memori sambungan padha, iku kudu dimuat saka sampeyan, lan kanthi mangkono kaya protokol kanggo ndhukung. koherensi cache katon lan piranti lunak kanggo iki. Konsep sing menarik. Masalah nyata, mesthi, ana liyane. Kabeh iki makarya, nanging sampeyan cepet entuk masalah kinerja, amarga ora ana siji mangertos model kinerja ing tingkat cukup apik - apa pola akses memori ana, carane kanggo mesthekake yen kelenjar ora endlessly ping saben liyane, etc.

Apa aku teka munggah karo ing H2O iku pangembang dhewe sing tanggung jawab kanggo nemtokake ngendi paralelisme didhelikake lan ngendi ora. Aku teka karo model coding sing nggawe nulis kode kinerja dhuwur gampang lan prasaja. Nanging nulis kode alon-alon angel, bakal katon ala. Sampeyan kudu serius nyoba nulis kode alon, sampeyan kudu nggunakake cara non-standar. Kode rem katon sepisanan. Akibaté, sampeyan biasane nulis kode sing mlaku cepet, nanging sampeyan kudu ngerti apa apa ing cilik saka memori sambungan. Kabeh iki disambungake menyang array gedhe lan prilaku ana padha karo array gedhe non-molah malih ing Jawa podo. Maksudku, mbayangno sing loro Utas nulis menyang Uploaded podo, siji menang, lan liyane, patut, ilang, lan sampeyan ora ngerti kang siji. Yen ora molah malih, pesenan bisa dadi apa wae sing dikarepake - lan iki bisa digunakake kanthi apik. Wong pancene Care babagan urutan operasi, padha sijine molah malih ing panggonan tengen, lan padha nyana masalah kinerja-related memori ing panggonan tengen. Yen ora, dheweke mung bakal nulis kode ing wangun puteran saka 1 nganti N, ing ngendi N sawetara triliun, kanthi pangarep-arep yen kabeh kasus rumit kanthi otomatis dadi paralel - lan ora bisa digunakake. Nanging ing H2O iki dudu Jawa utawa Scala; sampeyan bisa nganggep "Jawa minus minus" yen sampeyan pengin. Iki minangka gaya pemrograman sing cetha banget lan padha karo nulis kode C utawa Java sing prasaja kanthi puteran lan susunan. Nanging ing wektu sing padha, memori bisa diproses ing terabyte. Aku isih nggunakake H2O. Aku nggunakake saka wektu kanggo wektu ing macem-macem proyek - lan iku isih paling cepet, Welasan kaping luwih cepet saka saingan. Yen sampeyan nindakake Big Data kanthi data kolom, angel banget kanggo ngalahake H2O.

Tantangan Teknis

Andrei: Apa sing dadi tantangan paling gedhe sajrone karirmu?

Cliff: Apa kita ngrembug babagan teknis utawa non-teknis saka masalah kasebut? Aku bakal ujar manawa tantangan paling gedhe dudu tantangan teknis. 
Minangka kanggo tantangan teknis. Aku mung ngalahake dheweke. Aku malah ora ngerti apa sing paling gedhe, nanging ana sawetara sing menarik banget sing butuh wektu, perjuangan mental. Nalika aku lunga menyang Sun, Aku manawa aku bakal nggawe compiler cepet, lan Bunch saka senior ngandika nanggepi sing aku ora bakal sukses. Nanging aku tindakake path iki, wrote compiler mudhun kanggo allocator register, lan iku cukup cepet. Iku minangka cepet C1 modern, nanging allocator luwih alon maneh, lan ing mburi iku masalah struktur data gedhe. Aku needed kanggo nulis alokasi registrasi grafis lan aku ora ngerti dilema antarane kode expressiveness lan kacepetan, kang ana ing jaman lan penting banget. Ternyata struktur data biasane ngluwihi ukuran cache ing x86s wektu iku, lan mulane, yen aku pisanan nganggep yen alokasi register bakal bisa 5-10 persen saka total wektu jitter, banjur nyatane dadi. 50 persen.

Wektu terus maju, kompiler dadi luwih resik lan luwih efisien, mandheg ngasilake kode elek ing kasus liyane, lan kinerja saya wiwit meh padha karo kompiler C. Kajaba, mesthi, sampeyan nulis sawetara omong kosong sing malah C ora nyepetake. . Yen sampeyan nulis kode kaya C, sampeyan bakal entuk kinerja kaya C ing kasus liyane. Lan luwih sampeyan tindak, luwih kerep sampeyan entuk kode sing asymptotically bertepatan karo tingkat C, allocator register wiwit katon kaya soko lengkap ... preduli saka apa kode mlaku cepet utawa alon. Aku terus nggarap allocator kanggo nggawe pilihan sing luwih apik. Dheweke dadi luwih alon lan luwih alon, nanging dheweke menehi kinerja sing luwih apik lan luwih apik ing kasus sing ora ana wong liya sing bisa ngatasi. Aku bisa nyilem menyang allocator register, ngubur sasi karya ana, lan dumadakan kabeh kode bakal miwiti nglakokaké 5% luwih cepet. Iki kedadeyan kaping pirang-pirang lan alokasi registrasi dadi karya seni - kabeh wong seneng utawa sengit, lan wong-wong saka akademi takon babagan topik "kenapa kabeh wis rampung kanthi cara iki", kenapa ora. baris scan, lan apa bedane. Jawaban isih padha: allocator adhedhasar pewarnaan graph plus karya banget ati-ati karo kode buffer padha karo gegaman kamenangan , kombinasi paling apik sing ora ana siji bisa ngalahake. Lan iki minangka perkara sing ora jelas. Kabeh liyane sing ditindakake dening kompilator ana sing cukup ditliti, sanajan uga wis digawa menyang tingkat seni. Aku tansah nindakake samubarang sing mesthine ngowahi kompiler dadi karya seni. Nanging ora ana sing luar biasa - kajaba alokasi register. Trik iku kudu ngati-ati ngethok ing mbukak lan, yen mengkono (Aku bisa nerangake ing liyane rinci yen kasengsem), iki tegese sampeyan bisa inline luwih agresif, tanpa risiko tiba liwat kink ing jadwal kinerja. Ing dina iku, ana Bunch saka compiler ukuran lengkap, Hung karo baubles lan whistles, sing ndhaftar allocators, nanging ora ana wong liya bisa nindakake.

Masalahe yaiku yen sampeyan nambahake metode sing tundhuk inlining, nambah lan nambah area inlining, sakumpulan nilai sing digunakake kanthi cepet ngluwihi jumlah registrasi, lan sampeyan kudu ngethok. Tingkat kritis biasane rawuh nalika allocator nyerah, lan siji calon apik kanggo kuthah worth liyane, sampeyan bakal ngedol sawetara iku umume alam bébas. Nilai inlining ing kene yaiku sampeyan bakal kelangan bagean saka overhead, overhead kanggo nelpon lan nyimpen, sampeyan bisa ndeleng nilai ing njero lan bisa ngoptimalake. Biaya inlining yaiku jumlah nilai urip sing akeh dibentuk, lan yen alokasi registrasi sampeyan diobong luwih saka sing dibutuhake, sampeyan bakal ilang. Mulane, paling alokasi duwe masalah: nalika inlining nglintasi garis tartamtu, kabeh ing donya wiwit Cut mudhun lan produktivitas bisa flushed mudhun jamban. Sing ngleksanakake compiler nambah sawetara heuristics: contone, kanggo mungkasi inlining, miwiti karo sawetara ukuran cukup gedhe, amarga alokasi bakal ngrusak kabeh. Mangkene carane kink ing grafik kinerja dibentuk - sampeyan inline, inline, kinerja alon-alon tuwuh - banjur boom! – tiba mudhun kaya Jack Swift amarga sampeyan diantrekake kakehan. Mekaten kados pundi saderengipun tekan Jawi. Jawa mbutuhake inlining luwih akeh, dadi aku kudu nggawe allocator luwih agresif supaya tingkat metu tinimbang kacilakan, lan yen sampeyan inline kakehan, wiwit kuthah, nanging banjur "ora luwih spilling" wayahe isih teka. Iki minangka pengamatan sing menarik lan mung teka saka ngendi wae, ora ketok, nanging mbayar kanthi apik. Aku njupuk munggah inlining agresif lan njupuk kula kanggo panggonan ngendi Jawa lan C kinerja bebarengan. Dheweke pancen cedhak - aku bisa nulis kode Jawa sing luwih cepet tinimbang kode C lan liya-liyane, nanging rata-rata, ing gambar gedhe, meh padha. Aku bagean saka manfaat iki alokasi ndhaftar, sing ngidini kula kanggo inline minangka stupidly sabisa. Aku mung inline kabeh sing dakdeleng. Pitakonan ing kene yaiku apa allocator bisa dianggo kanthi apik, apa asil kode kasebut kanthi cerdas. Iki minangka tantangan gedhe: ngerti kabeh iki lan bisa ditindakake.

A sethitik babagan ndhaftar alokasi lan multi-inti

Vladimir: Masalah kaya alokasi registrasi katon kaya topik sing langgeng lan tanpa wates. Aku wonder apa wis tau ana idea sing ketoke janjeni lan banjur gagal ing laku?

Cliff: Mesthi! Alokasi register minangka area sing sampeyan nyoba nemokake sawetara heuristik kanggo ngatasi masalah NP-lengkap. Lan sampeyan ora bisa entuk solusi sing sampurna, ta? Iki mung mokal. Deleng, kompilasi Ahead of Time - uga ora bisa digunakake. Obrolan ing kene babagan sawetara kasus rata-rata. Babagan kinerja khas, supaya sampeyan bisa ngukur apa sing dianggep minangka kinerja khas - sawise kabeh, sampeyan lagi ngupayakake kanggo nambah! Alokasi Register minangka topik babagan kinerja. Sawise sampeyan duwe prototipe pisanan, kerjane lan cat apa sing dibutuhake, karya kinerja diwiwiti. Sampeyan kudu sinau kanggo ngukur kanthi apik. Apa sebabe penting? Yen sampeyan duwe data sing jelas, sampeyan bisa ndeleng macem-macem wilayah lan ndeleng: ya, iki mbantu, nanging ing kana kabeh rusak! Sawetara gagasan apik teka munggah, sampeyan nambah heuristik anyar lan dumadakan kabeh wiwit digunakake sethitik luwih apik ing rata-rata. Utawa ora diwiwiti. Aku duwe pirang-pirang kasus nalika kita berjuang kanggo kinerja limang persen sing mbedakake pangembangan kita saka alokasi sadurunge. Lan saben-saben katon kaya iki: nang endi wae sampeyan menang, nang endi wae sampeyan ilang. Yen sampeyan duwe alat analisis kinerja sing apik, sampeyan bisa nemokake ide sing ilang lan ngerti sebabe gagal. Mungkin luwih becik ninggalake kabeh sing ana, utawa bisa uga njupuk pendekatan sing luwih serius kanggo nyetel, utawa metu lan ndandani liyane. Iku kabeh Bunch saka iku! Aku digawe hack kelangan iki, nanging aku uga kudu iki, lan iki, lan iki - lan kombinasi total menehi sawetara dandan. Lan penyendiri bisa gagal. Iki minangka sifat kerja kinerja ing masalah NP-lengkap.

Vladimir: Salah sijine ngrasa yen perkara kaya lukisan ing alokasi minangka masalah sing wis dirampungake. Inggih, iku wis mutusaké kanggo sampeyan, kang menehi kritik saka apa sing sampeyan ngandika, supaya iku malah worth iku banjur ...

Cliff: Ora dirampungake kaya ngono. Sampeyan sing kudu ngowahi dadi "ditanggulangi". Ana masalah sing angel lan kudu dirampungake. Yen wis rampung, wektune kanggo ngupayakake produktivitas. Sampeyan kudu nyedhaki karya iki kanthi cocog - nindakake benchmark, ngumpulake metrik, nerangake kahanan nalika, nalika sampeyan bali menyang versi sadurunge, hack lawas sampeyan wiwit digunakake maneh (utawa kosok balene, mandheg). Lan aja nyerah nganti sampeyan entuk apa wae. Kaya sing wis dakkandhakake, yen ana gagasan keren sing ora bisa ditindakake, nanging ing bidang alokasi daftar gagasan kira-kira ora ana telas. Sampeyan bisa, contone, maca publikasi ilmiah. Senajan saiki wilayah iki wis wiwit pindhah luwih alon lan wis dadi luwih cetha saka ing enom. Nanging, ana akeh wong sing kerja ing lapangan iki lan kabeh ide sing kudu dicoba, kabeh padha nunggu ing swiwi. Lan sampeyan ora bisa ngomong carane apik yen sampeyan ora nyoba. Carane uga padha nggabungake karo kabeh liyane ing allocator Panjenengan, amarga allocator nindakake akèh iku, lan sawetara gagasan ora bakal bisa ing allocator tartamtu, nanging ing allocator liyane bakal gampang. Cara utama kanggo menang kanggo allocator punika narik barang alon njaba path utama lan meksa kanggo pamisah bebarengan wates dalan alon. Dadi yen sampeyan pengin mbukak GC, njupuk dalan alon, deoptimize, uncalan pangecualian, kabeh iku - sampeyan ngerti iki relatif langka. Lan padha arang banget, aku mriksa. Sampeyan nindakake karya ekstra lan mbusak akeh watesan ing dalan sing alon iki, nanging ora masalah amarga alon lan arang banget lelungan. Contone, pointer null - ora tau kedadeyan, ta? Sampeyan kudu duwe sawetara dalan kanggo macem-macem perkara, nanging kudu ora ngganggu sing utama. 

Vladimir: Apa sampeyan mikir babagan multi-inti, nalika ana ewu intine bebarengan? Apa iki migunani?

Cliff: Sukses GPU nuduhake yen iku cukup migunani!

Vladimir: Padha cukup specialized. Apa babagan prosesor tujuan umum?

Cliff: Wah, kuwi model bisnise Azul. Jawaban kasebut bali ing jaman nalika wong seneng banget karo kinerja sing bisa diramal. Nalika iku angel nulis kode paralel. Model kode H2O bisa diukur, nanging dudu model tujuan umum. Mungkin luwih umum tinimbang nalika nggunakake GPU. Apa kita ngomong babagan kerumitan ngembangake barang kasebut utawa kerumitan nggunakake? Contone, Azul ngajari aku pelajaran sing menarik, sing ora jelas: cache cilik iku normal. 

Tantangan paling gedhe ing urip

Vladimir: Kepiye babagan tantangan non-teknis?

Cliff: Tantangan paling gedhe yaiku ora dadi ... apikan lan becik marang wong. Lan minangka asil, aku terus-terusan nemoni kahanan konflik. Wong-wong sing aku ngerti yen ana masalah, nanging ora ngerti carane nerusake masalah kasebut lan ora bisa ngatasi. Akeh masalah jangka panjang, nganti pirang-pirang dekade, muncul kanthi cara iki. Kasunyatan bilih Jawa nduweni kompiler C1 lan C2 minangka akibat langsung saka iki. Kasunyatan manawa ora ana kompilasi multi-tingkat ing Jawa sajrone sepuluh taun berturut-turut uga ana akibat langsung. Cetha yen kita butuh sistem kasebut, nanging ora jelas kenapa ora ana. Aku duwe masalah karo siji insinyur ... utawa klompok insinyur. Biyen, nalika aku wiwit kerja ing Sun, aku ... Oke, ora mung banjur, aku umume tansah duwe pendapat dhewe ing kabeh. Lan aku panginten iku bener sing mung bisa njupuk bebener iki saka Panjenengan lan marang sirah ing. Utamane amarga aku kaget banget. Lan yen sampeyan ora seneng pendekatan iki ... utamané yen sampeyan temenan salah lan nindakake omong kosong ... Umumé, sawetara wong bisa ngidinke wangun komunikasi iki. Senajan sawetara bisa, kaya aku. Aku wis mbangun kabeh uripku ing prinsip meritokrasi. Yen sampeyan nuduhake aku salah, aku bakal langsung mbalik lan ujar: sampeyan ngomong omong kosong. Semanten ugi, kula nyuwun pangapunten lan sedoyo kalepatan, menawi wonten lepat nyuwun pangapunten. Ing tangan liyane, Aku shockingly tengen babagan persentasi shockingly gedhe saka total wektu. Lan iku ora bisa banget uga ing sesambetan karo wong. Aku ora nyoba dadi apik, nanging aku takon pitakonan bluntly. "Iki ora bakal bisa, amarga siji, loro lan telu." Lan padha kaya, "Oh!" Ana konsekuensi liyane sing mbokmenawa luwih apik kanggo digatekake: contone, sing nyebabake pegatan karo bojoku lan depresi sepuluh taun sawise iku.

Tantangan minangka perjuangan karo wong, kanthi persepsi babagan apa sing sampeyan bisa utawa ora bisa, apa sing penting lan apa sing ora. Ana akeh tantangan babagan gaya coding. Aku isih nulis akeh kode, lan ing dina iku aku malah kudu alon mudhun amarga aku nindakake kakehan tugas podo lan nindakake mau ora apik, tinimbang fokus ing siji. Nggolek maneh, aku nulis setengah kode kanggo printah Java JIT, printah C2. Coder paling cepet sabanjure nulis setengah alon, setengah sabanjure minangka alon, lan ana penurunan eksponensial. Wong kapitu ing baris iki banget, alon banget - sing mesthi kedadeyan! Aku kena akeh kode. Aku ndeleng sapa sing nulis apa, tanpa istiméwa, aku ndeleng kode kasebut, mriksa saben wong, lan isih terus nulis luwih akeh tinimbang wong-wong mau. Pendekatan iki ora cocog karo wong. Sawetara wong ora seneng iki. Lan nalika dheweke ora bisa ngatasi, kabeh keluhan diwiwiti. Contone, aku tau didhawuhi mungkasi coding amarga aku nulis kode sing akeh banget lan mbebayani tim, lan kabeh kaya guyon kanggo aku: wong lanang, yen tim liyane ilang lan aku terus nulis kode, sampeyan mung bakal kalah setengah tim. Ing tangan liyane, yen aku terus nulis kode lan sampeyan ilang setengah tim, sing muni kaya manajemen ala banget. Aku ora tau mikir babagan iki, ora tau ngomong babagan iki, nanging isih ana ing sirahku. Pikiran iki muter ing mburi pikiranku: "Apa kowe kabeh guyon aku?" Dadi, masalah paling gedhe yaiku aku lan hubunganku karo wong. Saiki aku luwih ngerti dhewe, aku dadi pimpinan tim kanggo programer kanggo wektu sing suwe, lan saiki aku langsung ngandhani wong-wong: sampeyan ngerti, aku iki, lan sampeyan kudu ngatasi aku - apa yen aku ngadeg kene? Lan nalika padha miwiti kanggo menehi hasil karo, kabeh bisa. Nyatane, aku ora ala lan ora apik, aku ora duwe niyat ala utawa egois, mung hakekatku, lan aku kudu urip kanthi cara apa wae.

Andrei: Mung bubar everyone miwiti ngomong bab poto-kesadaran kanggo introverts, lan soft skills ing umum. Apa sampeyan bisa ngomong babagan iki?

Cliff: Ya kuwi wawasan lan piwulang sing daksinaoni saka pegatanku karo bojoku. Apa aku sinau saka divorce punika pangerten aku. Iki carane aku wiwit ngerti wong liya. Ngerti carane interaksi iki bisa. Iki nyebabake panemuan siji-sijine. Ana kesadaran babagan sapa aku lan apa sing diwakili. Apa sing aku lakoni: aku sibuk karo tugas, utawa aku ngindhari konflik, utawa liya-liyane - lan tingkat kesadaran diri iki pancen mbantu aku bisa ngontrol. Sawise iki kabeh dadi luwih gampang. Siji bab sing aku nemokake ora mung ing awakku dhewe, nanging uga ing programer liyane yaiku ora bisa ngucapake pikiran nalika sampeyan lagi ngalami stres emosional. Contone, sampeyan lagi lungguh ana coding, ing negara aliran, lan banjur padha teka mlaku menyang sampeyan lan wiwit njerit histeris ana sing rusak lan saiki langkah-langkah ekstrim bakal dijupuk marang sampeyan. Lan sampeyan ora bisa ngomong apa-apa amarga sampeyan lagi ngalami stres emosional. Kawruh sing dipikolehi ngidini sampeyan nyiapake wektu iki, urip lan pindhah menyang rencana mundur, sawise sampeyan bisa nindakake apa wae. Dadi ya, yen sampeyan wiwit ngerti kepiye cara kerjane, iki minangka acara sing ngowahi urip. 
Aku dhewe ora bisa nemokake tembung sing bener, nanging aku kelingan urutane tumindak. Intine yaiku reaksi iki minangka fisik kaya lisan, lan sampeyan butuh papan. papan kuwi, ing pangertèn Zen. Iki persis sing kudu dijlentrehake, lan banjur langsung nyingkir - mung kanthi fisik. Nalika aku tetep meneng kanthi lisan, aku bisa ngolah kahanan kanthi emosional. Nalika adrenalin tekan otak sampeyan, ngalih sampeyan menyang mode gelut utawa penerbangan, sampeyan ora bisa ngomong apa-apa maneh, ora - saiki sampeyan bodho, insinyur pecut, ora bisa nanggepi respon sing apik utawa malah mungkasi serangan, lan penyerang bebas. kanggo nyerang maneh lan maneh. Sampeyan kudu dadi dhewe maneh, entuk kontrol maneh, metu saka mode "perang utawa penerbangan".

Lan kanggo iki kita butuh ruang lisan. Mung papan kosong. Yen sampeyan ngomong apa-apa, sampeyan bisa ngomong kanthi bener, banjur pindhah lan nemokake "spasi" kanggo awake dhewe: mlaku-mlaku ing taman, ngunci ing kamar mandi - ora masalah. Ingkang utama yaiku kanggo sementara medhot saka kahanan kasebut. Sanalika sampeyan ngalih mati kanggo ing paling sawetara detik, kontrol bali, sampeyan wiwiti mikir soberly. "Oke, aku dudu wong bodho, aku ora nindakake perkara sing bodho, aku wong sing migunani." Sawise sampeyan bisa ngyakinake dhewe, wektune kanggo nerusake menyang tahap sabanjure: ngerteni apa sing kedadeyan. Sampeyan diserang, serangan teka saka ngendi sampeyan ora nyana, iku ora jujur, ambush jahat. Iki ala. Langkah sabanjure yaiku ngerti sebabe penyerang mbutuhake iki. Tenan, kok? Mungkin amarga dheweke dhewe ngamuk? Napa dheweke nesu? Contone, amarga dheweke ngaco dhewe lan ora bisa nampa tanggung jawab? Iki minangka cara kanggo nangani kabeh kahanan kanthi ati-ati. Nanging iki mbutuhake ruang kanggo maneuver, ruang lisan. Langkah pisanan yaiku ngilangi kontak lisan. Aja diskusi nganggo tembung. Batal, lumaku sakcepete. Yen obrolan telpon, mung mateni telpon - iki minangka skill sing aku sinau saka komunikasi karo mantan bojoku. Yen obrolan ora apik, mung ngomong "pamit" lan nutup telpon. Saka sisih liya telpon: "blah blah blah", sampeyan mangsuli: "ya, bye!" lan nyumerepi. Sampeyan mung mungkasi obrolan. Limang menit mengko, nalika kemampuan kanggo mikir sensibly bali kanggo sampeyan, sampeyan wis digawe adhem mudhun sethitik, iku bisa kanggo mikir bab kabeh, apa kedaden lan apa sing bakal kelakon sabanjuré. Lan miwiti ngrumusake respon sing wicaksana, tinimbang mung nanggepi emosi. Kanggo kula, terobosan kesadaran diri yaiku kasunyatan manawa yen ana stres emosional, aku ora bisa ngomong. Metu saka negara iki, mikir lan ngrancang carane nanggapi lan menehi ganti rugi kanggo masalah - iki minangka langkah sing bener yen sampeyan ora bisa ngomong. Cara paling gampang yaiku mlayu saka kahanan ing ngendi stres emosional katon lan mung mandheg melu stres iki. Sawise sampeyan bisa mikir, nalika sampeyan bisa mikir, sampeyan bisa ngomong, lan liya-liyane.

Miturut cara, ing pengadilan, pengacara lawan nyoba kanggo nindakake iki kanggo sampeyan - saiki wis cetha kok. Amarga dheweke duwe kemampuan kanggo nyuda sampeyan menyang kahanan kaya ngono, umpamane, sampeyan ora bisa ngucapake jeneng sampeyan. Ing pangertèn sing nyata, sampeyan ora bakal bisa ngomong. Yen mengkono kanggo sampeyan, lan yen sampeyan ngerti sampeyan bakal nemokake dhewe ing panggonan ngendi perang lisan raging, ing panggonan kaya pengadilan, sampeyan bisa teka karo pengacara. Pengacara bakal ngadeg kanggo sampeyan lan mungkasi serangan lisan, lan bakal nindakake kanthi cara sing sah, lan papan Zen sing ilang bakal bali menyang sampeyan. Contone, aku kudu nelpon kulawarga kaping pirang-pirang, hakim cukup loropaken babagan iki, nanging pengacara lawan njerit lan bengok-bengok, aku malah ora bisa njaluk tembung ing edgewise. Ing kasus iki, nggunakake mediator paling apik kanggo kula. Mediator mandheg kabeh meksa iki sing pour ing sampeyan ing stream terus, sampeyan nemokake papan Zen perlu, lan karo kemampuan kanggo ngandika bali. Iki minangka lapangan kawruh sing akeh sing kudu disinaoni, akeh sing bisa ditemokake ing awake dhewe, lan kabeh iki dadi keputusan strategis tingkat dhuwur sing beda kanggo wong sing beda-beda. Sawetara wong ora duwe masalah sing diterangake ing ndhuwur; biasane, wong sing dodolan profesional ora duwe. Kabeh wong sing nggawe urip kanthi tembung - penyanyi terkenal, pujangga, pemimpin agama lan politikus, mesthi ana sing kudu diomongake. Dheweke ora duwe masalah kaya ngono, nanging aku.

Andrei: Iku... ora dikarepke. Apik, kita wis ngomong akeh lan wektune kanggo mungkasi wawancara iki. Kita mesthi bakal ketemu ing konferensi lan bakal bisa nerusake dialog iki. Sampai jumpa di Hydra!

Sampeyan bisa nerusake obrolan karo Cliff ing konferensi Hydra 2019, sing bakal dianakake ing 11-12 Juli 2019 ing St. Dheweke bakal teka karo laporan "Pengalaman Memori Transaksional Azul Hardware". Tiket bisa dituku ing situs web resmi.

Source: www.habr.com

Add a comment