Press "Enter" to skip to content

GOTO 2015 • Move Deliberately and Don’t Break Anything • Brian Goetz


Grazie Crescent
quindi questo discorso dovrebbe essere un buon contrasto
alle chiacchiere di Eric ieri sera perché lo sono
coprendo alcuni degli stessi argomenti da a
direzione leggermente diversa quindi
tutti possono togliere il punto di vista
quello che trovi personalmente avvincente
così quando stavo scrivendo questo discorso uno di
le idee di argomento che stavo dando dei calci era
cercando di illustrare cosa separava cosa
potresti chiamare un software per adulti
ingegneria da bene per mancanza di a
roba da bambino di termine migliore e aiko I
raccolto alcune storie su alcuni eroici
fatti di ingegneria del software come
come un sistema di strati si ricorda a qualcuno
sistemi a strati alcuni di voi a posto
così hanno fatto questi fantastici sistemi
negli anni ’80 erano tolleranti ai guasti
sistemi che erano super ridondanti e
erano progettati per non andare mai giù
sotto qualsiasi condizione tu sappia potrebbero
tollerare più guasti hardware e
tutto questo ma la cosa veramente bella
era che si potrebbe anche aggiornare il
driver di periferica nel sistema operativo
mentre le applicazioni erano ancora in esecuzione
senza perdere connessioni e questo era
uno di quelli fantastici che conosci sovrumani
fatti di ingegneria del software che tu
sapere ci ispirerebbe tutti così io lo sai
II Sapevo che avevo qualche idea per
questo discorso e sono davvero contento di non averlo fatto
scrivere che parlare perché avrebbe
sembrava davvero patetico accanto a quello di Anita
keynote ieri che ci ha dato un
dare un’occhiata a ciò che è veramente adulto
ingegneria sembra così rispetto a te
conoscere le sfide di atterraggio a
rover su Marte o costruzione a
sistema autosufficiente che deve vivere
su Marte per anni senza speranza
rifornire o riparare ciò che tutti noi facciamo suoni
abbastanza facile per me e come software
ingegneri abbiamo anche un altro senso
della storia di alcuni degli altri
discipline ingegneristiche per esempio in
nell’architettura convenzionale abbiamo te
so che noi conosciamo come rendere gli edifici
potrebbe resistere per mille anni
per quasi mille anni ed è tutto
per l’ingegneria cinque anni è un lungo
tempo molti sistemi lo sai
stiamo lavorando voglio dire quante persone
Qui
il sistema su cui stai lavorando
la tua giornata di lavoro principale è stata intorno per
più di dieci anni
quindi sembra circa il 30% quindi la maggior parte di
ciò su cui stiamo lavorando è stato costruito
gli ultimi 5-10 anni e di conseguenza a
molto del focus quindi quello che facciamo è
volto a costruire nuovi sistemi da fare
qualcosa oggi e non necessariamente il
costruire per resistere per mille anni
o anche 10 ora il sistema su cui lavoro è
vecchio rispetto alla maggior parte dei sistemi di offerta
che tu sappia che quest’anno Java ha 20 anni
vecchio e per gli ultimi cinque ho avuto il
privilegio di pilotare l’evoluzione di
il linguaggio Java e oggi sto andando a
condividere alcune riflessioni sulle sfide
di evolvere nella piattaforma matura e a
poche lezioni che ho imparato lungo la strada
e alcuni pensieri su dove stiamo andando
prossimo perché vogliamo garantire che Java
rimane vibrante per i prossimi 20 anni come
bene così si riferisce al titolo di questo discorso
lo slogan Eric ha menzionato la scorsa notte
muoviti veloce e rompi le cose in modo Facebook
Il CEO Mark Zuckerberg ha avanzato questo come il
motto per l’ingegneria di Facebook
la cultura nei primi giorni fondamentalmente
dicendo alla squadra che era di più
importante fare progressi sul miglioramento
l’esperienza dell’utente piuttosto che preoccuparsi
su come preservare ciò che era già lì
e questo potrebbe aver avviato un Facebook ma
è diventato noto come emblematico del
cultura di avvio e stai iniziando a
vederlo sai anche filtrare in aperto
anche i progetti di origine e non lo è
sorprendente che gli sviluppatori sono attratti da
slogan come questo sai rompere
le cose saranno divertenti, giusto
ed è spesso molto più facile da rompere
cose piuttosto che costruirle e le parti
che ti rallenta o spesso ti annoia
parti poco glamour quindi chi non vorrebbe
permesso di ignorare tutte le cose
che ti rallentano dobbiamo essere
consapevole dell’attacco sbagliato logico
perché alcuni progressi comportano la rottura
le cose non significano quella rottura
indica i progressi che alcune persone hanno
un po ‘un po ‘ indietro
ora questa frase non riguarda davvero
rompendo le cose si tratta di costruire
le cose che rompono le cose raramente sono buone
l’idea da sola di fatto si rompe di solito
le cose sono legali e finanziarie
conseguenze e ovviamente l’intento di
dire muoversi veloce e rompere le cose non lo è
dire uscire e commettere atti di vandalismo a destra
o per celebrare la distruzione è a
creare l’opportunità di costruire
qualcosa di meglio senza essere rallentato
giù dalla necessità di preservare lo stato
quo e in altre parole è un modo di
dando alle persone il permesso di valutare cosa
potrebbe essere finito su ciò che è e questo è un
cosa piuttosto buona e dando il permesso
rompere le cose in modo che le cose migliori
potrebbe essere costruito al suo posto non è davvero
esprimendo un tecnologico o sociale
punto di vista sta esprimendo un economico
uno così zugerberg era consapevolmente o no
attraente per il lavoro dell’economista
Joseph Schumpeter che ha coniato la frase
distruzione creativa per descrivere il
fatto inevitabile del capitalismo che quella
i progressi arrivano a scapito di cosa
è venuto prima della crescita di nuove industrie
come se le automobili tornassero inevitabilmente
il DES stampa il declino del vecchio
l’industria è come i cavalli
quindi è da notare che Facebook no
Dì questo più l’anno scorso all’F8
conferenza superba ritirato il vecchio motto
e offerto questo molto meno accattivante
il suo posto e questo stava davvero dicendo
qualcosa che dico che sì che cosa
il progresso è ancora importante ma non a
il costo di destabilizzare l’utente
sperimentare quindi cosa cambia per loro bene
quando sei una start-up senza utenti e
un prodotto minimo vitale l’economia
tutti ti puntano a fare molto
progredire velocemente indipendentemente dal
danno collaterale o accumulo di
debito tecnico perché se non lo fai
alcuni progressi veloci farai scappare
i soldi che ti capita scavata da
la competizione ed è finita quando
sei il leader del mercato con un maturo
prodotto i punti di economia in a
direzione diversa e tu non hai
fino in alto puoi salire e hai un
molto più lontano di quanto tu possa cadere così è
non sorprende che le startup siano di più
preoccupato per i progressi di mentre
le aziende più affermate si preoccupano di più
riguardo alla stabilità e tu sai bene
riassunto di ciò possiamo guardare al
il poeta Bob Dylan che lo ha detto grazioso
chiaramente quando non hai niente di te
non ho niente da perdere, non canterò
per te quindi muovi velocemente e rompi le cose
è una strategia ragionevole quando sei un
partenza fiacca sperando di salire sopra il
folla per avere un po ‘di attenzione ma è a
strategia meno appropriata quando si ha
un miliardo di utenti
e il punto di tutto questo è il
priorità tra progresso e
la conservazione è una mossa di decisione aziendale
digiunare e rompere le cose non è una filosofia
e non è una strategia è una tattica
la sua tattica di business e spero che lo sia
uno supportato da un sensibile rapporto costi-benefici
analisi di ciò che sta per
ulteriormente i tuoi obiettivi di business o no
una delle cose che separa il
adulti dai bambini in questo settore
è la comprensione che la programmazione è
fondamentalmente un’attività economica
la tecnologia è eccitante è divertente e
siamo tutti fortunati che si arriva a farlo per
una vita voglio dire che sono contento che ho
fare quello che faccio per vivere ma
la tecnologia è un mezzo per un fine che non lo è
un fine a se stesso se fosse più economico o
più veloce per costruire Facebook aggiungere di gomma
nastri e nastro adesivo per conduttori poi fuori PHP
allora è quello che avrebbero fatto
e so cosa erano alcuni di voi
pensando che stai pensando che PHP sia di gomma
nastri e nastro adesivo e questo è perfettamente
conversazione valida ma è un argomento
per un discorso diverso sai ma se
la programmazione è un’attività economica noi
dovrebbe essere in grado di misurare gli input
e uscite e quindi gli input sono carini
semplice diritto
hai bisogno di programmatori e hai bisogno di pizza
e le uscite sono un po ‘più difficili da fare
misura ma sai in qualsiasi successo
scenario che speri di averne
codice di lavoro e sei anche legato a
accumuli un debito tecnico che puoi
pensare come l’obbligo di fornire
più tempo per gli sviluppatori e più pizza
il futuro presumendo che tu stia pianificando di
rimanere in affari così in movimento veloce e
rompere le cose è una scelta che voglio
per ottenere più di entrambe queste uscite
più codice di lavoro e anche di più
debito tecnico per un dato ammontare di
pizza e in alcuni casi sai dove
non hai niente da perdere e il tuo
gli investitori sono fiato sul collo
può davvero essere una scelta intelligente ma
ancora una volta questa è una decisione aziendale basata
per le condizioni economiche e per quelle modifiche
nel tempo ed è importante che
non confondiamo questo per una filosofia così
muovendo velocemente e rompendo le cose
stai scegliendo di valutare il time to market
oltre la stabilità e la manutenzione futura
costo e a volte è perfettamente
decisione sensata
quindi per portare a casa questo punto ho scelto
un paio di citazioni qui da un grande
articolo che ho trovato poche settimane fa da
Jocelyn Goldfine ha chiamato la strada giusta per
software di bordo quindi salterò al segreto
non esiste un modo giusto per spedire il software
ma sai che tutto dipende dal
contesto aziendale così fine bene freddo dice in a
professione dove portiamo avanti decenni
spanning guerre sante su compresse e
la capitalizzazione non è sorprendente che
le persone si attaccano al loro sviluppo
e rilasciare abitudini ma se la spedizione è così
molto software mi ha insegnato una cosa
è di essere agnostico diverso
metodologie ottimizzate per diversi
obiettivi e tutti loro hanno svantaggi se
massimizzi per la prevedibilità del programma
perderai l’ingegneria dei protoni
produttività e questo porta a un appello
per gli sviluppatori si prega di smettere di chiedere è questo
processo buono o cattivo e iniziare a chiedere è
questo processo ben si adatta alla mia situazione
ora Goldfine era consapevolmente o no
facendo appello alla filosofia di Charles
Borsa di Saunders a volte indicata come
il padre del pragmatismo che nel 1878
incorniciato ciò che ora è chiamato il pragmatico
Maxim so che è un po ‘prolisso
Lo riassumerò per te
pragmatismo significa giudicare la cosa basata
sui suoi effetti pratici sul mondo
intorno a noi piuttosto che sul loro innato
proprietà come li percepiamo così e
ci piace pensare a noi stessi come
pragmatici come ingegneri quindi è utile
per tornare a quello che è il vero pragmatismo
significa e sai che puoi immaginare
quella borsa è a sua volta attraente per il
opere di un filosofo molto più vecchio di a
galassia molto lontana che avrebbe potuto dire
anche se non l’ha fatto
non c’è niente per cui ci fosse solo un bene
e se il Maestro Yoda avesse detto questo cosa lui
avrebbe significato è quello di ingegneri
che dovrebbero essere pragmatici di cui abbiamo bisogno
essere disposti a guardare oltre il nostro
credenze estetiche e principali su
ciò che è buono e ciò che è cattivo e invece
giudicare le cose sulla base di se
lavorano nel mondo reale e noi
dovrebbe giudicare il bene di qualcosa basato
non sulle sue proprietà intrinseche ma su
a cosa va bene così in quella luce
cosa pensiamo di questa mossa veloce e
spezzare le cose bene come probabilmente
nessuno ti sorprenderà alla fine
sappi – se diciamo sia buono che cattivo
abbiamo torto giusto la risposta è
dipende è giusto per la situazione così
questo mi porta al tema principale del mio
parliamo oggi che riguarda l’ingegneria
più vicino al fondo della pila
e come conosci l’ingegneria
le decisioni che prendi in quel contesto sono
diverso da quello che molti di noi sono usati
e una ragione per cui questo potrebbe essere di più
rilevante per te di quanto potresti inizialmente
penso sia come le nostre carriere come ingegneri
progressi che abbiamo la tendenza a muoversi verso il basso
lo stack non perché facciamo una scelta
per spostare in giù la pila ma perché il
stack sta crescendo sopra di noi c’è di più
si trova lì ora più di 20
anni fa quindi se ti sentivi a tuo agio
un certo strato della pila che potrebbe
essere nel mezzo quando inizia la tua carriera
sarà più vicino a te
sapere come si arriva più tardi nella tua carriera
quindi devi pensarci così tu
so che ho cercato su google per un po ‘di Java
diagramma di stack del software quindi ti ho trovato
so che ho trovato molto qui è quello che ho trovato
internamente questo è il middleware Oracle
pila
la maggior parte di questi sono software basati su Java
servizi che conosci per la costruzione
applicazioni e puoi vederlo
c’è Java lì l’onda molto
in basso nella versione ufficiale
di questo stack non mostra nemmeno Java
perché loro non possono nemmeno vederlo
molto in basso ma tu sai ed ecco un altro
uno questo è lo stack di primavera e
di nuovo sai che quello che vedi è javis
laggiù in basso a destra e di
Certo , non è davvero in basso a destra
sai che hai dei contenitori
e sistemi operativi di virtualizzazione e
hardware ma è la parte più bassa
questo è visibile agli sviluppatori nel
modello di programmazione e quando sei il
piattaforma che tutto dipende
muoversi veloce e rompere le cose non lo è
un così grande approccio perché quaggiù
conosci il termine per rompere le cose
questo libro giusto e con milioni di
gli utenti non ci sono cose del genere
oh possiamo solo possiamo cambiare quello no
si noterà a destra
qui tutti notano tutto ciò che è
è davvero spaventoso
quindi sai quando sei qui
sai che devi piazzare un altissimo
priorità su stabilità e compatibilità
e sai che c’è stata una volta in Javas
storia quando non era il fondo del
stack o anche parte della pila e in
quei giorni ci siamo mossi velocemente e abbiamo rotto
le cose e la quantità di churn e il
linguaggio e poi alla fine progettare te
sapere che portava alla prima versione era
davvero piuttosto incredibile ma successo
viene fornito con un prezzo e una volta che hai
utenti che contano su di te le tue scelte
sono un po ‘più limitati
quindi quando parliamo di non rompere
le cose ovviamente non vogliamo rompere
i nostri utenti codificano bene, ma questo
l’avversione a rompere le cose non finisce
solo con il codice che le persone fanno
conta molto
non vogliamo rompere i nostri utenti
aspettative o la loro fiducia nel
piattaforma o i loro modelli mentali di come
le cose funzionano o il valore del
investimento che hanno fatto nel loro
competenze tecniche e ciascuna di queste forme
della compatibilità delle persone aggiunge ulteriore
vincoli su come potremmo coinvolgere tutti
della piattaforma in modo da sapere nel mio ruolo
come architetto per il linguaggio Java e
anche per le librerie di base il mio compito è farlo
forma la vista degli sviluppatori su cosa sia Java
è il modello di programmazione visibile all’utente
e naturalmente non c’è carenza di
bene chiamiamoli suggerimenti utili
che ottengo dagli sviluppatori nel
la comunità Eric ne ha avuto uno sul palco per ultimo
notte ma c’è una grande disconnessione da
la mia prospettiva tra ciò che pensa la gente
Lo faccio e quello che effettivamente faccio così ho fatto
alcuni grafici per illustrare la differenza
quindi ecco una possibile visione di cosa
lo fa il designer di linguaggi focalizzato sull’industria
dal punto di vista del nostro accademico
colleghi e in quest’ottica il mio lavoro sarebbe
soprattutto per quanto riguarda gli aspetti tecnici
del design del linguaggio creando di più
sistemi di tipo espressivo che aggiungono funzionalità
che ci permetta di esprimere più tipi di
programmare in sicurezza o per realizzare l’intento di
il programma è più chiaro
e okay queste cose fanno parte del mio lavoro
anche se questa visione omette completamente il
lato umano di entrare quando stiamo facendo un
particolare gruppo di funzionalità lo faremo
hanno ovviamente un budget di tempo e un
budget di risorse per farlo ma lo siamo
anche conscio di ciò che ci piace chiamare nostro
budget di complessità una caratteristica complessa
potrebbe permetterti di fare un po ‘di figo
nuove cose ed esprimere qualcosa di interessante
e preziosi nuovi programmi, ma può farlo
fanno anche molti danni sia direttamente
e indirettamente, così direttamente, sai a
caratteristica complessa può causare danni perché
è più facile abusarne e indirettamente
potrebbe causare danni distraendo il
sviluppatore dal compito che sono
davvero cercando di realizzare così mantenendo
è semplice significa che le cose possono realmente
essere usato e usato correttamente dal reale
sviluppatori e anche semplici e non
idee sensate potrebbero essere scartati sulla
base di vincoli culturali perché
sono troppo dirompenti o sono solo
troppo diverso dal mentale esistente
modelli dei nostri sviluppatori, per esempio
fare un esempio da Java 8 in
Scala se hai conflitti tra
membri ereditati da più tratti
i conflitti vengono risolti da
linearizzando i super tipi che dai
priorità a quelli che sono apparsi per primi
nella clausola extends totalmente sensata
modo di fare le cose tranne che non potevamo fare
quello in Java perché gli sviluppatori Java
avere 20 anni di esperienza che racconta
loro che l’ordine in cui il
superclasse che appaiono tipi super
non importa e per tirarlo è uno strattone
fuori da sotto loro e dire oh solo
scherzando per gli ultimi 20 anni è stato
in questo modo ma ora conosci gli anelli di gong
e all’improvviso conosci il tuo
la semantica del programma è congelata, sai
il modo in cui sono persone le persone stanno andando
essere felice di ciò sarebbe stato molto
dirompente
quindi queste considerazioni sono qualcosa
sai che qualcuno viene da un
sfondo del linguaggio di programmazione accademico
potrebbe non pensarci mai ma quando lo sei
coinvolgendo un piano che evolve una piattaforma
usato da milioni di sviluppatori
diventare molto importante quindi questo prossimo grafico
è un po ‘meno caritatevole e
quindi più divertente e questo è quello che io
a volte pensano le persone nella comunità
immagino di farlo basandomi su ciò che dicono
se procedete in senso orario dal
sai che hai il tuo segreto
riunioni dietro le quinte e poi ogni volta
un po ‘ ti colpisci la testa fuori dal
backroom segreto
e fai alcuni commenti odiosi
una mailing list forse si arriva a un
conferenza e si fa promotore
commenti e sai e da a
prospettiva tecnica è principalmente su
rubare funzionalità da altre lingue
e naturalmente l’argomento più importante
è la sintassi
ora è divertente lamentarsi di come
le persone non capiscono cosa fai e
certamente è un po ‘terapeutico ma
è è anche importante ricordare
che queste persone lo stavano facendo per
quindi, in un certo senso, che aspetto ha il successo
non sta correggendo le loro idee sbagliate
su come funziona, ma solo rendendo più
funziona meglio comunque, James Gosling
ha descritto java come una lingua dei colletti blu
e quello che intendeva era uno strumento per
programmatori che lavorano per ottenere il loro lavoro
fatto non è una creazione di torre d’avorio
giusto e potrebbe esserci un sacco di razzi
scienza nel progettarlo o implementarlo
e certamente nello specificarlo ma
Non si dovrebbe avere per essere un razzo
scienziato di usarlo e abbiamo sentito da a
scienziato missilistico ieri e, naturalmente
sai che vogliamo avere un ampio
spettro di utenti giusto e non possiamo
alienare qualcuno di questi segmenti del nostro uh
conosci la nostra base di utenti di cui abbiamo bisogno
avere una vasta gamma di utenti, ma in caso contrario
rischiamo di perdere il posto dov’è
andare mainstream
così, mentre Java in primo luogo oggi può avere un
tomo e logica di business lato server noi
non posso permettermi di alienare l’alto
frequenza commerciale folla perché tu
sapere che potrebbero essere di nicchia oggi ma
alcune di queste preoccupazioni potrebbero essere mainstream
Domani
okay, questa versione del grafico è a
un po ‘più vicino alla realtà dalla mia
prospettiva e ce ne sono alcuni
somiglianze strutturali con il
grafico precedente sai che c’è
sicuramente una fetta per incontri e
interagire con una comunità, ma che cosa è
davvero diverso è l’attenzione tecnica
se guardi alcune lingue sembra
come l’obiettivo è aggiungere tutte le funzionalità
possibile e certamente se ascolti
gli utenti ciò che ottieni sono richieste o
a volte richiede più funzionalità
caratteristiche caratteristiche caratteristiche ma in
la realtà aggiungendo funzionalità linguistiche a
in genere essere la tua ultima risorsa e
perché ogni funzionalità aggiunge qualcosa di negativo
peso alla lingua ogni caratteristica può
interagire con non solo ogni funzione
questo è già lì ma può interagire
con caratteristiche che non esistono ora ma
che stai considerando per il futuro
e quindi dobbiamo scegliere le nostre caratteristiche
molto attentamente perché lo saremo
vivere con loro per un tempo molto lungo
e un perfetto esempio di ciò che è
sul grafico qui è la serializzazione che
è riuscito a interagire con ogni singolo
funzionalità che abbiamo aggiunto da allora e tu sai
per esempio nel processo di aggiunta
espressioni lambda in Java 8
l’interazione con la serializzazione
letteralmente centinaia di ore di analisi
e discussione e ti dico che voglio
ogni uno di quelle ore della mia vita indietro
le fette rimanenti devono soprattutto fare
con le conseguenze della funzionalità
interazione sai un comune
è errata percezione delle caratteristiche del linguaggio
che le parti difficili o l’idea o
l’ implementazione e ovviamente questi
sono importanti ma per la maggior parte noi
considera queste cose come le prime
zero per cento del diritto di lavoro si sa
che c’era bisogno di iniziare ma
non è dove il duro lavoro è il
il duro lavoro viene dal montarli
con le funzionalità esistenti che hai e
analizzando e testandoli per
interazioni con altre caratteristiche e non
solo con le caratteristiche che hai ma con
le funzionalità che potresti avere in
futuro e si conosce il più
aspetto importante di questo è il
analisi di compatibilità sai
analizzando le conseguenze della compatibilità
di tutto e ovviamente c’è
la serializzazione ora è la parte davvero divertente
e la parte riesco a fare solo un semplice
un po ‘di tempo è questa fetta
qui in fondo è quello che vorrebbe
James, hai ragione, è lì che vai
entra nella tua caverna e medita su cosa
è il vero spirito di Java che posso fare
quello per circa tre ore all’anno ma esso
ma è buono ma va bene così andiamo
tornare a questo tema di non rompere
qualsiasi cosa la più grande fetta del
la diapositiva precedente era compatibilità e
la compatibilità arriva in molte forme
e ci preoccupiamo per tutti loro
il più importante di questi è binario
compatibilità e questo è se
chiama i siti che sono incorporati nel tuo
i file di classe continueranno a collegarsi quando
li esegui di nuovo contro
di nuovo contro altri recentemente compilati
i file di classe ricordano tutti i metodi
invocazione X e accesso al campo e Java
sono collegati dinamicamente al runtime
sono collegati per nome, c’è il nome
del metodo il nome della firma
è incorporato nel file di classe e
si connette in fase di esecuzione con il
attuare sai con il metodo che
tu che stai cercando di chiamare e
collegamento dinamico è come quello che un lavoro come
armi segrete, questo è ciò che
gli permette di cadere solo un nuovo vaso in
il tuo percorso di classe e non ti preoccupare
ma in realtà è piuttosto forte
vincolo sai e file di classe che
sono compilati nel 1995 ancora oggi e corrono
noi sappiamo che si aspettano che dovrebbero
corro ancora 20 anni nonostante il collegamento
sta succedendo ogni volta che ci corri
si esegue la fonte del programma
compatibilità un’altra forma di
compatibilità ci preoccupiamo molto
questo è se i clienti o le sottoclassi
continuerà a compilare dopo aver fatto
un cambio di classe e quindi sono cambiato
superclasse vado a ricompilare la mia sottoclasse
continua comunque a compilarlo
la compatibilità della fonte è comportamentale
la compatibilità continua a funzionare
allo stesso modo dopo un cambiamento di
Naturalmente la compatibilità della civiltà
fai apparire il mio argomento preferito
bene istanze che sono state serializzate
su una JVM precedente o forse su una JVM più recente
faranno deserializzare correttamente e poi
c’è una miriade di più sottili
problemi di compatibilità come cambiamenti in
l’impronta in memoria o il
caratteristiche di prestazione e tu sai
c’è questa preoccupazione trasversale
è divertente che sai che attraversa tutto
di queste modalità di compatibilità che è
compilazione separata
quindi a causa del collegamento dinamico sei
sempre avendo a che fare con il fatto che
parte del tuo sistema potrebbe essere stata
ricompilato e parte di esso non è stato
e normalmente sai se ne segui qualcuno
regole ragionevoli per l’evoluzione del codice
questo non sai essere un
problema ma queste cose possono apparire se
tu cambi il tuo codice di compilazione
strategia di generazione o quando il
il codice generato per una classe dipende da
informazioni da altre classi che
si presenta con i metodi bridge che conosci
che la nostra conseguenza dei generici e di te
sapere che è successo più di una volta
un altrimenti dove l’idea ha ottenuto
lasciato cadere perché ce l’abbiamo noi abbiamo un
la compatibilità continua riguarda se
essere una compatibilità binaria o fonte
compatibilità e questo non vuol dire questo
non violeremmo mai nessuno di questi
forme con disponibilità che conosci dopo
tutto ciò che non è possibile correggere un bug senza
violazione della compatibilità comportamentale su
l’altra mano ci sono volte che non lo facciamo
correggi bug per quel motivo e così sai
deve essere una decisione molto attenta
saperlo dopo averlo conosciuto a sufficienza
quantificando la quantità di codice che
potrebbe rompere bene possiamo considerare se
questa è la cosa giusta da fare ma è
non qualcosa che facciamo molto alla leggera
ora un sacco di gente pensa che siamo pazzi a
essere preoccupati per la compatibilità
ma la mia affermazione è che non ce n’è davvero nessuna
altra scelta responsabile quando hai
miliardi di righe di codice là fuori
quasi qualsiasi cambiamento incompatibile sta per succedere
rompere il codice mission-critical di qualcuno
e alcune persone dicono così bene, ma io
penso che ci vuole un certo tipo di
arroganza di dire si si si dovrebbe
rompere il suo codice sarà per il suo bene
giusto ma ancora la gente lo dice in realtà
a noi con una certa frequenza e sono sicuro
pensano di essere piuttosto utili
che arrogante ma questo è solo l’errore
che stanno facendo è che sono solo
concentrandosi su parte dell’immagine e cosa
Vedo che gli sviluppatori tendono a farlo
sopravvalutare l’importanza del codice e
sottovalutare l’importanza della stabilità
programmi ora questo non dovrebbe essere
sorprendendo a chiunque abbia ragione
gli sviluppatori fissano tutto il codice del giorno giusto
quindi per loro è tutto il loro mondo ma
è davvero solo una parte del quadro
è solo la parte della foto che loro
vedere tutto il giorno quindi è un po ‘come
una di quelle illusioni ottiche dove
a seconda di quale parte dell’immagine
guardi vedi una risposta diversa
tutti lo vedono bene male bene
il male va bene
così sai quando gli utenti guardano a
caratteristica della lingua che stanno immaginando tutto
le buone cose che potevano fare con esso
che è grande lo sai che è che è
quello che dovrebbero fare sono
immaginando quale codice potrei scrivere con
quello che non posso scrivere con il
linguaggio che sta oggi e quando noi
guarda una caratteristica linguistica che facciamo
stessa cosa ma dovremmo anche
guarda l’immagine più grande di come no
solo come potrebbe essere usato, ma come potrebbe
essere abusato
come potrebbe interagire con gli altri
la lingua mostra come potrebbe cambiare
lo stile in cui gli sviluppatori programmano
come potrebbe influire sulla migrazione di
codice esistente per utilizzare queste nuove funzionalità
e se causerà cambiamenti sottili
e uno di questi cambiamenti sono nel complesso
buono o cattivo per l’ecosistema così quando noi
quando guardiamo i cambiamenti e come loro
potrebbe influenzare il tuo codice non lo siamo
pensando a come influenzerà il tuo
codice dobbiamo pensare a come
incide ora sul codice di tutti
questo punto probabilmente stai ricevendo un
po ‘a destra depresso sei
probabilmente pensando bene è impossibile
per cambiare qualsiasi cosa
Houck come si può fare alcun progresso se
non puoi cambiare nulla e quindi tu
potrebbe concludere che la strategia ragionevole è
non fare niente bene e questo è un
passaggio garantito alla compatibilità ma
è anche un percorso garantito per
irrilevanza in modo così evolvente
compatibilmente non è impossibile è solo
più difficile ed è come lavorare in modo carino
molto altro qualsiasi ambiente difficile voi
devono affrontare la situazione con il
precauzioni e formazione adeguate e
equipaggiamento di sicurezza in modo da adattarsi
questa è una foto reale della nostra
gli uffici stanno scherzando, quindi come facciamo?
fallo bene se non è accettabile
cambiare il significato dei programmi esistenti
i nostri disegnatori di linguaggi sono il miglior trucco
è quello di espandere la gamma di programmi validi
che puoi esprimere così da assegnare
significato per programmi che prima erano
invalido quindi idealmente quello che vuoi fare
è aggiungere funzionalità in modo che siano astratte
invece di altre funzionalità esistenti
di aggiungere una feature take completamente nuova
una funzione esistente ed estendila a a
più ampia gamma di situazioni la ragione
preferiamo che questo si sviluppi
i modelli mentali esistenti dell’utente su come
le cose funzionano ed è anche meno probabile
creare interazioni con altre funzionalità
ora la parte davvero difficile in questo è
venire con una semantica sensata per
la caratteristica astratta tale che quando tu
limitarlo alle condizioni in cui esso
usato per essere valido si abbinano con il
la semantica esistente è difficile
parte quindi darò un rapido esempio di
questo è come penso sia l’unico codice
e nel parlare così scuse se
non sei programmatori Java, quindi se noi
stavi per iniziare sai che è un bene
un esempio di questo è quando abbiamo aggiunto il valore predefinito
metodi in Java 8, quindi Java 8 aggiunge il valore predefinito
metodi puoi aggiungere un comportamento ai metodi
e si interfaccia è una forma di multiplo
ereditarietà del comportamento non multiplo
eredità dello stato ma multiplo
eredità del comportamento e se lo fossimo
partendo da zero con multipli
comportamento ereditario le regole per
risolvere i conflitti ma quando lo sei
ereditando un comportamento da due diversi
tipi di super probabilmente sarebbe stato
molto diverso da quello che ci siamo inventati
quindi riassumete brevemente in voi sapete Java
a partire da interfacce Java 100 potrebbe
contribuisci solo a digitare informazioni e
membri in modo da avere l’interfaccia I con
membro em e quindi classe C ha un membro
M e poi hai questa classe D quella
estende sia C che io e cosa succede
c’è Wendy che eredita M da entrambi C
e io
il compilatore unisce solo i membri
perché dice che ho un contratto
dichiarazione in questo super-stretto che ho
un’implementazione e quel supertipo che sono
dichiarare che sono la stessa cosa
e tutto va bene così in Java 8 noi
aggiunta la possibilità di aggiungere un comportamento al
interfaccia contrassegnandolo come avente un
implementazione di default che può essere
ereditato in classi che non dichiarano
il metodo ma ora se guardi a te
avere ereditando il comportamento potenzialmente
da due diversi super tipi così è
un conflitto che deve essere risolto e
vogliamo aggiungere un valore predefinito
l’implementazione deve essere un binario e una fonte
cambiamento compatibile quindi non vogliamo D
tutto ad un tratto essere rotto e avere il
il compilatore dice bene che hai un conflitto
ora devi risolverlo e così tu
so cosa abbiamo fatto qui siamo noi
guardato come funziona l’esistente
la semantica che sai comportarsi e trovarla
un modo di definire la semantica di
eredità multipla per essere conosciuto
sii coerente con quello, quindi quello che abbiamo fatto
abbiamo usato uno standard evolutivo
traccia che doveva adeguare le regole a
dare la priorità al vecchio modo in cui quando
risolvendo un conflitto abbiamo tre regole
la regola 1 dice che preferiamo l’implementazione
da una superclasse a quella di un super
interfaccia quindi se c’è un
implementazione nella superclasse super
le vincite di classe non guardiamo nemmeno al
interfacce e questo ci dà assoluto
compatibilità con questo codice esistente
perché questa regola si è come le cose
hai funzionato prima di aggiungere comportamenti
interfacce e poi, come si conosce il
la seconda regola è se due interfacce hanno un
implementazione e uno è una sottoclasse di
l’altro preferiamo la sottoclasse che è
piuttosto ovvio e poi la terza regola
sta bene non c’è la regola 3 e poi la
programmatore deve risolvere il conflitto
sovrascrivendo il metodo e il prelievo
quale implementazione
giusto , questo è ciò che intendevo per te
conoscere la regolazione di una funzione per adattarsi
altre altre caratteristiche rispettano le regole
che siamo arrivati ​​a quello
le interfacce di implementazione sono giuste
valori predefiniti e sono subordinati al
implementazioni e classi probabilmente
non sarebbe esattamente quello che ci è venuto in mente
se stessimo inventando un object-oriented
linguaggio con ereditarietà multipla
comportamento da zero va bene
c’è anche questo perfettamente
modello ragionevole e ragionevole e
c’è più di un modo ragionevole per
progettare un linguaggio di programmazione e abbiamo
usato questo trucco prima che questo sia lo stesso
trucco che abbiamo usato quando abbiamo aggiunto l’ autoboxing
in java 5, quindi abbiamo aggiunto questi nuovi impliciti
digita le conversioni in cui puoi convertire
da un int a un intero e questo è
grande tranne che tutto ad un tratto il
l’insieme dei metodi applicabili ora è più grande
di quello che era e che potrebbe
perturbare le decisioni di selezione del sovraccarico e
non volevamo il codice che veniva compilato
non compilare perché ora i sovraccarichi
sono ambigui quindi per mantenere questo
dall’essere incompatibili abbiamo detto che abbiamo preso
le regole di risoluzione del sovraccarico che abbiamo detto
prendere le vecchie regole che è il primo passo e
il nuovo algoritmo e poi se il primo passo
non viene in mente niente di noi
andare al passaggio due che è prendere in considerazione
conversioni di boxe è un trade-off di
complessità per compatibilità e se tu
non fare questo scambio troppe volte
non si ottiene impantanato in complessità, se si
fallo più e più volte
alla fine le regole che ottengono così
complicato che tu non vuoi
affrontarlo ma se lo fai
giudiziosamente è un trucco abbastanza buono quindi
Chiamo la strategia di abbraccio ed estensione
perché prima devi abbracciare il
semantica esistente prima di poter trovare a
generalizzazione ragionevole che entrambi sta in piedi
da solo e corrisponde all’esistente
semantica quindi è come uno dei trucchi
che abbiamo nella nostra cassetta degli attrezzi
va bene, quindi ho parlato un po ‘
più filosoficamente ora sul
cose che abbiamo imparato prima
esempi di metodi predefiniti questo ha funzionato
abbastanza bene e siamo stati abbastanza felici
con come è uscito
ma l’idea non si è sviluppata completamente
il primo giorno ci sono voluti due o tre
anni dal momento in cui abbiamo cucinato per la prima volta
la pazza idea di cosa succederebbe se potessimo
collegare il comportamento ai metodi di interfaccia
e il momento in cui siamo arrivati ​​a un ragionevole
modello che gli sviluppatori Java non guardano
e dire qual è questo aggeggio alieno
hai inchiodato sul lato del mio
la lingua e la gente dice che in ogni caso, ma
sai che alcune persone non amano imparare
nuove cose e quindi conosci la soluzione
ovviamente come ci si arriva
iterazioni abbiamo attraversato un sacco di
le iterazioni del linguaggio ti progettano
conosci questo e sembra che ognuno
un miglioramento rispetto al precedente ma
probabilmente non è stato fino a quando siamo arrivati ​​a circa
la sesta iterazione in cui l’ abbiamo trovata
a qualcosa che era semplice e pulito
abbastanza da poter stare su una diapositiva
come la diapositiva ho appena mostrato la
il pericolo è perché ogni iterazione è stata
più semplice di quello precedente a quasi
qualsiasi punto avremmo potuto facilmente realizzato
errore di dire oh dobbiamo essere lì
perché è decisamente più semplice di
quello che avevamo ieri ed è il modo
più semplice di quello che abbiamo avuto l’ anno scorso e
avremmo potuto facilmente convincerci
avevamo finito e tu sai la realtà
è necessario molto tempo e talvolta a
molte iterazioni per trovare l’idea giusta
e più di una volta ho dovuto dire il mio
gestione in realtà l’uomo seduto
là ciao George non eravamo là noi siamo
non c’è ancora e ci vorrà più tempo
e per fortuna la risposta è stata sempre
prenditi il ​​tempo per farlo bene perché
quando contempli qualcosa che sei
dovrò sostenere per 20 anni e
vincerà la tua evoluzione
per i prossimi 20 anni che vuoi
essere in grado di prendere il tempo per farlo bene
o essere disposto a non farlo affatto così io
recentemente mi sono imbattuto in questa citazione che io
penso davvero abbia fatto eco alla nostra esperienza qui
questa citazione è di Steve Jobs, dove lui
dice quando inizi a guardare un problema
e sembra davvero semplice e tu hai
tutte queste semplici soluzioni non lo fai
capisco davvero la complessità di esso
e poi sai che si inizia a
capire la complessità e il tuo
le soluzioni che conosci sono davvero
complesso e sai che è quando sei
a metà del processo e
è dove la maggior parte della gente si ferma e il
la soluzione è là dieci forse per cui lavorare
un po ‘ ma la grande persona manterrà
andando e trova la chiave sottostante
principio del problema e venire
con una bella soluzione elegante
funziona e la parte davvero difficile che conosci
è quando hai trovato qualcosa che si sente
come funziona rendendosi conto che potresti
ancora nel mezzo e probabilmente
sono ancora nel mezzo e hanno il
fede per andare avanti che là sai
che potrebbe esserci una risposta migliore in
lì anche se non sanno di cosa si tratta
perché è davvero allettante suggerisce
una vittoria chiara e fermati lì sai
cuz dopo tutto quello che hai pensato a
questo per due anni conosci il problema
è complesso e sì la tua soluzione è
complesso ma naturalmente è complesso è
un problema complesso e sai
esternamente si potrebbe avere a che fare con
forze che ti spingono a spedire quello che hai
capito e tu sai che devi essere capace
prendere il tempo per trovare il semplice
soluzione che è in agguato nel
soluzione complessa ed è incredibile come
Spesso questo accade se vi date
il tempo di farlo ancora più estremo
un esempio di ciò sono i generici stessi
così l’anno scorso a JavaOne James Gosselin
ha raccontato la storia del perché dei generici
non erano inclusi in Java fin dall’inizio
e non è perché non l’ abbiamo fatto
capire il polimorfismo parametrico in
1995 e non è perché l’ abbiamo pensato
è stata una grande idea di avere un tipo statico
sistema che non era abbastanza forte da permettere
hai messo elementi digitati in un contenitore
e non mantenere i loro tipi quando loro
vieni fuori perché non sapevamo come
per farlo bene e se avessimo continuato
comunque saremmo finiti con
qualcosa come modelli o modelli C ++
dalla beta e penso che siamo tutti carini
contento che non siamo riusciti a quelle soluzioni
Java 100 e potrebbe essere necessario 10 anni
per arrivarci ma i generici abbiamo pensato
erano molto più vicini allo spirito di
linguaggio e generici che avremmo
ottenuto nel 95 non sarebbe stato così se
non sai la cosa giusta da fare a
almeno non fare la cosa sbagliata e
a volte ciò significa non fare nulla
e devi stare bene con quello
un altro modo per dire questo è la realtà
si indurisce come il cemento prima di te
qualsiasi cosa ci sia un sacco di percorsi in avanti
una volta che fai qualcosa ce ne sono molti
meno percorsi in avanti e forse solo uno
e questo è vero per le piccole cose
così come il grande in modo da essere sempre pensando
su quali porte si stanno chiudendo in aggiunta
alle porte che stai aprendo
aspetto di questa lezione è che devi essere
scettico sull’inclinazione a puntare
i casi difficili quando sei tentato di farlo
punt in alcuni casi perché è troppo difficile
questo è generalmente un segno a cui non sei
il mezzo ancora
oh scusa, una domanda è cosa fa
punt me e rinuncia dire oh dimentica
che sto solo per sapere che sono solo
andando ignorare che
è un termine del football americano quindi
il motivo per cui questo senso di finire il
il lavoro è così importante nella progettazione della lingua
è quello che potrebbe sembrare un intelligente
compromesso di gestire i casi a
B e C e dimenticati del caso D questo può
sembra un buon compromesso oggi e
domani è solo un altro
irregolarità incomprensibile che rende
i programmatori sono pazzi ed è spesso
allettante per sapere di entrare in quello
perché puoi almeno dire che è così
meglio di quanto non fosse prima prima di un B e
C non ha funzionato affatto ora un lavoro B e C
e non abbiamo ancora risolto D ma tu
sapere che deve essere meglio, ma
sai che l’irregolarità è davvero fastidiosa
sviluppatori e per una buona ragione perché
l’irregolarità genera complessità e
la complessità ti distrae dal
compito di programmazione a portata di mano quindi il tipo di
suggerimenti ingenui che a volte otteniamo
di bene basta fare un’altra lingua
limitazione a cui non puoi farlo quando
succede che sai che potrebbe sembrare un
scorciatoia pratica ma lo sarà sempre
essere domani è quello che in nome di Dio erano
loro pensano argomenti
quindi questo consiglio potrebbe essere valido
quasi come il contrario del precedente
uno che sconsiglia di accettare
irregolarità perché costruendo a
regolarità delle soluzioni regolari troppo dure
l’opposto di ciò che è anche
importante è essere scettici sul
motivazione a fare qualsiasi cosa per ragioni di
la consistenza della consistenza è una buona guida
e ovviamente e ma noi spesso voi
sapere consentire il desiderio di superficiale
coerenza per sostituire il più profondo
analisi del problema e tu sai che
è venuto a questo da te lo sai osservare molti
dei più mal congegnato
suggerimenti che ci vengono sempre iniziano
con per coerenza dovremmo fare punto
punto dot e invariabilmente li conosci
sono idee terribili e sono solo te
sapere che la gente lo sta giustificando
consistenza bene la realtà è quando tu
avere un sistema complesso puoi trovare a
coerente la scusa per qualsiasi cosa giusta
e così sai quando quando
coerenza vedere che senti come il
migliore spiegazione che hai ottenuto una scopa Diggy
e naturalmente ciò non significa
la coerenza è un cattivo obiettivo, è grandiosa
obiettivo giusto non usarlo per giustificare
qualsiasi cosa e tu sai che abbiamo questo fantastico
citazione dal filosofo americano
Ralph Waldo Emerson è uno sciocco
la consistenza è l’hobgoblin di poco
le menti sono spesso citate erroneamente
la gente lascia la parola sciocca così
solo essere consapevoli che alcune consistenze
sono pazzi e si guardano bene da quello
quindi voglio parlare solo un po ‘
su dove stiamo andando in futuro
sai che ne ho parlato un po ‘
alcune delle lezioni che abbiamo imparato durante
tu conosci l’evoluzione di Java otto
e Java, che è stato un grande aggiornamento
probabilmente il più grande aggiornamento di Java
modello di programmazione mai coinvolto
aggiornamenti coordinati al linguaggio il
biblioteca e JVM e tu sai che siamo
vedendo rinnovata eccitazione su Java tu
sapere nella comunità in questi giorni che
è fantastico, quindi abbiamo finito il momento giusto per te
sapere il tempo di riposare sugli allori di
Certo che non va bene così come facciamo a scegliere il
cose su cui abbiamo deciso di lavorare
perché possiamo lavorare solo su alcune cose
non abbiamo una larghezza di banda infinita che abbiamo
un budget limitato una complessità limitata
budget quindi dobbiamo scegliere i nostri obiettivi
accuratamente
e il nostro approccio per la raccolta di obiettivi I
pensare è uno sguardo pragmatico al
punti di dolore che gli sviluppatori e e
i deployers stanno soffrendo dal raccogliere il
il più grande e battere su quello
quindi in Java 8 conosci questi punti deboli
per lo più sono stati specificatamente guidati dalla lingua
migliorare la capacità di astrazione
comportamento usando espressioni di terra che era
ottimo in Java 9 il nostro obiettivo è il dolore
di programmazione nel grande riducendo il
pena di assemblare grandi applicazioni
dai componenti e usando quelli
le tecniche per il modulo sono la piattaforma
stesso e tirarci fuori dalla classe percorso inferno
o barlumi l’inferno, ma i punti di dolore possono anche
venire in modo ambientale così a volte loro
bolla dall’hardware e da allora
vogliamo che Java e JVM continuino a farlo
corri bene sull’obiettivo mobile del moderno
hardware ogni tanto che abbiamo
a guardare il rapporto tra l’Java con la
hardware quindi parliamo di hardware
per un secondo e come è cambiato nel
ultimi 25 anni e il riassunto è molto
la maggior parte di noi non presta attenzione a
questo su base giornaliera che è
ottimo ma l’hardware è davvero cambiato
drammaticamente negli ultimi 20 25 anni in
ai vecchi tempi avevamo sistemi che
erano single course e single socket quindi
la cosa verde rappresenta il tuo nucleo e
la cosa blu rappresenta la memoria principale
non avevano contanti, nessuna istruzione parallela
nessun livello di istruzione parallelismo n
pipelining
quindi in quei giorni un’operazione aritmetica
costa circa la stessa come una memoria recuperare sulla
l’ordine di sapere 1 2 3 4 cicli così
il modello delle prestazioni era davvero semplice
contare le istruzioni si potrebbe semplicemente farlo
staticamente si potrebbe guardare il
discarica assembly di un programma e modello come
prestazione nella tua testa
col tempo i nostri sistemi hanno ottenuto di più
complicato quindi abbiamo aggiunto denaro e noi
aggiunto più strati di denaro e quindi
abbiamo aggiunto più socket e abbiamo aggiunto
più core e account core
cresciuto e come questi sistemi hanno ottenuto di più
sofisticato il costo dell’accesso alla memoria
è diventato meno prevedibile e variava da
conosci un paio di cicli da ottenere
qualcosa che è nella tua cache L1 a
qualche centinaio di cicli se manchi la cache di tutti
la strada verso la memoria principale di solito
trecento oltre trecento cicli
è una stima ragionevole per un pieno
cache miss e allo stesso tempo il
i nuclei sono diventati più complessi con profondità
condutture ed esecuzione superscalare e
possiamo eseguire quattro aritmetiche
operazioni su un singolo ciclo, quindi se a
cache miss ti ha costato trecento cicli
e puoi emettere operazioni di batik
in un ciclo un cache perso è ora
ti costa potenzialmente un migliaio
istruzioni così venticinque anni fa
uno a uno oggi mille a uno ora
è ovvio che, dato a tre
spostamento di ordine di grandezza nel costo
modelliamo qualsiasi compromesso ingegneristico con noi
fatto nel 1995 su come Java si stende
i dati in memoria non possono essere ottimali
per giorni sistemi di oggi a meno che non abbiamo ottenuto
davvero fortunato e abbiamo sofferto
con alcune decisioni davvero cattive per il
negli ultimi 20 anni, quindi si distingue ulteriormente
ragione che periodicamente abbiamo bisogno di te
sapere aggiornare queste cose quindi diamo un’occhiata
al sistema di tipo JVM così hai ottenuto
i tuoi 8 tipi primitivi
hai oggetti che hai matrici e
questo è super flessibile è possibile modellare
tutto ciò che vuoi con questo, ma il
la flessibilità non è esattamente nel giusto
luoghi così primitivi sono più rigidi di
ci piacerebbe sapere se si desidera
indica di conoscere un numero intero a 65 bit
sei sfortunato, giusto per te
devi farlo con oggetti e oggetti
sono davvero flessibili ma a volte di più
flessibile di cui abbiamo bisogno e il grande problema
ogni oggetto ha identità che
esiste per servire la mutabilità e
polimorfismo ma non tutti gli oggetti hanno bisogno
questo anche se tutto l’ oggetto paga per questo
e potresti pensare che la VM lo farebbe
solo essere in grado di capirlo e
ottimizzare intorno a questo e le macchine virtuali hanno ottenuto
davvero bravo a sfogliare il
costo dell’astrazione del codice
ma non sono mai stati veramente bravi
affettare il costo dei dati
astrazione e la ragione per quello è
che la VM può mai veramente capire
se un oggetto avrà bisogno del suo
identità o no perché qualsiasi codice può usare
qualsiasi oggetto come una serratura in qualsiasi momento e così via
la VM deve essere pessimista nel modo
espone dati per illustrare questo
sai, immagina di avere un semplice
tupla come classe come un punto XY e
diciamo che sai che è immutabile
classe e va bene anche non lo è
polimorfico quindi non ha davvero bisogno di un
oggetto sia di identità, ma ottiene
uno comunque così ora diciamo che hai
una serie di quelle cose così l’array
ha un’intestazione di oggetto e ogni elemento di
la matrice è un riferimento a un punto
oggetto che ha il proprio header e te
sapere da un’efficienza di memoria
prospettiva non stiamo andando molto bene
abbiamo due parole di dati e
per ognuno di quelli ne abbiamo due
parole di intestazione dell’oggetto e un puntatore così
è come il 60% di spese generali e tu
sapere perché questi oggetti sono assegnati
sul mucchio che sarà lavoro per il
assegnati al garbage collector e
dopo la raccolta dei rifiuti potrebbero persino
essere mescolato nella memoria giusta
ma il vero costo viene dal
costo di riferimento indiretto di questi puntatori quindi se
stai camminando attraverso un array
eventi hai un’ottima località proprio così
tiri il primo e lo sai
tira i prossimi 7 o 15 nella cache
linea e dal momento in cui sei sul terzo
o quattro se il prefetcher dell’hardware è
preso a calci ed è già tirato il
la prossima puntata e tutto va benissimo
d’altra parte se ne hai una serie
oggetti come questo che potresti perdere
ognuno di questi riferimenti e
cache manca come ho detto prima che possa
essere davvero costoso ora forse è questo
bene forse il tuo set di dati è piccolo forse
conosci i tuoi requisiti di prestazione
sai che sono moderati e non lo è
un problema che in realtà è il caso
conosci il novantanove per cento di te
Conosco le distribuzioni Java, ma se lo sei
fare qualcosa come ad alta frequenza
trading o big data analytics questi
i costi si sommano davvero e tu no
davvero chiedere di questo layout giusto ciò che
avresti davvero preferito avere questo layout
hai una serie di punti XY che avresti
come loro di essere disposti X Y XYX Y
ora di fronte a una situazione
come fanno gli sviluppatori a volte
cose nelle loro mani a volte
a volte non possono proprio
aiutarsi da soli ma gli sviluppatori lo faranno
brutti scherzi come questo dove lo faranno
distruggi saprai una serie di punti XY
in due matrici si sa che uno di X è uno
di Y spera di riconquistare la località
che hanno perso e tu sai che questo codice è
più difficile da scrivere ed è più difficile da leggere
è l’ordine di mantenere e la parte triste
gli sviluppatori spesso fanno cose del genere
per motivi di prestazioni senza effettivi
prova che il loro codice non è già
abbastanza veloce o forse di fatto senza
avere misurazioni o obiettivi di prestazione
affatto ma indipendentemente da se
gli sviluppatori fanno questo hanno un bisogno genuino o
da un ossessivo distruttivo
disturbo compulsivo sai che dobbiamo
incolpare noi stessi per questo in una certa misura
abbiamo messo gli sviluppatori in a
situazione in cui si sentono come se avessero
scegliere tra le loro cose buone
buona astrazione e capsulazione e
buona prestazione e se metti le persone
in quella scelta quindi sai qualche volta
le persone sceglieranno male, quindi questo porta
noi alla funzione su cui stiamo lavorando
è una funzionalità VM e ti ha progettato
sapere perché sai cambiare in
caratteristiche hardware che è valore
digita se riformuliamo questa classe di punti come a
classe di valore quello che stiamo dicendo siamo noi
non importa dell’identità a cui non importa
su tutto il bagaglio che porta con
esso
e rinunciando a questa flessibilità noi
ottenere la capacità di trattarlo come un valore
quindi i valori sono implicitamente immutabili e
finale e traggono la loro uguaglianza
dallo stato piuttosto che dall’identità che
significa che possono essere passati da te che ti apprezzo
può passarli in registri o sul
stack invece che sull’heap e questo
significa che se si dispone di una serie di loro
trovano automaticamente in una matrice
e se sono incorporati nelle classi
vengono automaticamente appiattiti nella loro
classi di chiusura
e così quando li attraversi non lo fai
avere quelle interazioni che hai avuto
l’ esempio precedente quindi la cosa interessante
sui valori è che può avere la maggior parte di
le cose che le classi possono avere
metodi e costruttori e campi e
i loro metodi possono essere privati ​​e loro
può essere generico e tutto questo e
perché non sono polimorfi c’è
nessun costo di spedizione quando invochi i loro
metodi e quindi puoi essenzialmente usare
loro come involucri senza costi che ti danno
astrazione senza costi di runtime, quindi questo
è grande
e così il nostro mantra per i tipi di valore è
i codici come una classe si comportano come un INT
le applicazioni per questo sono ovvie
tuple alxbriche alternative a destra
tipi di dati come STL opzionali o di scelta
cursori di stile e sai che non c’è
il vantaggio di espressività qui non si può
scrivi nuovi programmi che non potresti
scrivi oggi con gli oggetti ma che cosa
significa come ti permette di farlo senza
preoccuparsi del costo e tu lo sai
sicuramente lo sai che sicuramente
preoccupato per i costi anche da programmatori
quando non dovremmo preoccuparci dei costi
perché siamo cablati per preoccuparci
performance è proprio come siamo costruiti così
facendo la cosa giusta anche essere il
cosa veloce togliamo un intero set di
fonti di attrito dallo sviluppo
processo e perché i tipi di valore che conosci
avere accesso all’incapsulamento proprio come
classi regolari sai che possiamo usarli
come ho detto come involucri sicuri senza costi
intorno ai dati sensibili e ottenere questo gratuitamente
pranzo
di manutenibilità di sicurezza e
le prestazioni in modo tale che è davvero cool è
abbiamo lavorato su questo probabilmente per un anno
e mezzo e ci stiamo avvicinando
avere un design che funzioni richiede molto tempo
tempo
abbiamo un prototipo in openjdk se
a qualcuno interessa così bene come va
questo interagisce con i generici ricorda I
ha detto che aggiungi una nuova funzionalità per interagire
con tutto il resto che hai già
così sai quando guardi i farmaci generici
con i primitivi scatola tu abbiamo lo stesso
problema di layout che avevamo con la matrice di
punti prima che abbiamo un inefficiente
layout dei dati troppo indiretto essi
avere località troppo allocazione voi
lo so se abbiamo un elenco di matrici di riquadri
interi per cui sai di avere un oggetto
il ArrayList e un oggetto per il
array e quindi un oggetto per ciascuno
elemento e sai una volta che aggiungi valori
alla lingua che si vede che subito
questa sorta di disagio irregolare che noi
abbracciato in Java cinque che non è possibile
generi Phi su primitivi puoi solo
i generi Phi sono riferimenti che iniziano
cadono a pezzi per un po ‘di tempo ricordano
come Steve Jobs dice che quelle cose funzionano
per un po ‘ poi cadono a pezzi
stiamo colpendo quel punto di Fall Apart quando
c’erano solo otto tempi primitivi
tipi puoi guardare dall’altra parte ma
una volta che aggiungiamo i primitivi definiti dall’utente
davvero deve lavorare con i generici così tu
so che dovremo mordere il proiettile
qui e questo implica che la VM lavori come
così come la lingua e la biblioteca funzionano
supporto generici su primitivi e
valori in modo da poter dire che voglio un
Eventi ArrayList e io in realtà ce l’hanno
supportato da un array di eventi che conosci sotto
il cappuccio così queste due caratteristiche di quel tipo
di lavorare insieme i tipi di valore e
i generici sopra i primitivi fanno parte di
in realtà uno sforzo maggiore per riavviare il
Relazione JVM con la memoria e il
hardware sottostante per cercare di bilanciare
la necessità di astrazione e capsulazione
con la realtà esecutiva del moderno
hardware, ma penso che sia un bel fresco
esempio di essere in grado di insegnare a un vecchio
cani e alcuni nuovi trucchi davvero eccitanti
così il tempo giusto per concludere mi limiterò a vicino
con un po ‘di avvertimento
attento a ciò che chiedi , tutti noi vogliamo il
software abbiamo ragione di avere successo noi
tutti vogliono che sia usato da molte persone
per molti anni ma il successo porta con sé
costi e vincoli che possono essere
davvero frustrante a volte, dall’altro
mano questi vincoli in particolare il
bisogno di mantenere le promesse che hai fatto
gli utenti sia che li abbiamo fatti
implicitamente o esplicitamente ti costringono
passare un sacco di tempo a pensare in anticipo
su se qualcosa è giusto
cosa fare e cosa è possibile
conseguenze e interazioni saranno
e il più delle volte pensa profondamente
su qualcosa in anticipo paga
quindi anche se questo significa che non puoi correre
avanti così velocemente e tu conosci come te
avrebbe potuto altrimenti piacere a così ringraziare
tutti voi per ascoltare godetevi il
conferenza e non rompere nulla su
l’uscita
tu
tu

Please follow and like us: