La legge di Astrazioni deficitarie.
Lunedi, November 11, 2002
C'è un pezzo fondamentale di magia nella progettazione di Internet che si basano su ogni singolo giorno. Succede nel protocollo TCP, uno dei blocchi fondamentali di Internet.TCP è un modo per trasmettere i dati che sono affidabili . Con questo voglio dire: se si invia un messaggio attraverso la rete utilizzando il protocollo TCP, che arriverà, e non saranno alterati o danneggiati.
Noi usiamo TCP per molte cose, come il recupero pagine web e l'invio di email. L'affidabilità del protocollo TCP è il motivo per ogni e-mail emozionante da appropriazione indebita africani Oriente arriva nella lettera-perfetto stato. O gioia.
In confronto, c'è un altro metodo di trasmissione dati chiamato IP che è inaffidabile . Nessuno promette che i dati arriveranno, e potrebbe avere incasinato prima che arrivi. Se si invia un mucchio di messaggi con IP, non stupitevi se solo la metà di loro arrivano, e alcuni di questi sono in un ordine diverso rispetto all'ordine in cui sono stati inviati, e alcuni di loro sono stati sostituiti da messaggi alternativi , forse contenente le immagini di oranghi bambino adorabile, o più probabilmente solo un sacco di spazzatura illeggibile che sembra l'oggetto di spam Taiwan.
Ecco la parte magica: TCP si basa su IP. In altre parole, il protocollo TCP è obbligato a trasmettere in qualche modo dati in modo affidabile utilizzando solo uno strumento inaffidabile .
Per illustrare perché questo è magia, considerare quanto segue moralmente equivalente, anche se un po 'ridicolo, lo scenario del mondo reale.
Immaginate che abbiamo avuto modo di invio di attori di Broadway a Hollywood che ha coinvolto mettendoli in auto e li guida attraverso il paese. Alcune di queste vetture incidentate, uccidendo gli attori poveri. A volte gli attori si ubriacavano sulla strada e rasata la testa o ha tatuaggi nasale, diventando così troppo brutta per lavorare a Hollywood, e spesso gli attori arrivati in un ordine diverso da quello che avevano indicato, perché tutti preso strade diverse. Immaginate ora un nuovo servizio chiamato Hollywood Express, che ha emesso gli attori a Hollywood, garantendo che avrebbero (a) arrivare (b) in ordine (c) in perfette condizioni. La parte magica è che Hollywood Express non dispone di alcun metodo di consegna degli attori, oltre al metodo inaffidabile di collocarle in auto e li guida attraverso il paese. Hollywood Express funziona controllando che ogni attore arriva in perfette condizioni e, se non lo fa, richiamando l'home office e chiedendo che gemello dell'attore invece l'invio. Se gli attori arrivano nell'ordine sbagliato Hollywood Check li riorganizza. Se un UFO di grandi dimensioni in via di Area 51 va in crash in autostrada in Nevada, rendendolo impraticabile, tutti gli attori che è andato in quel modo sono deviati via Arizona e Hollywood Express non ha nemmeno dire al registi in California quello che è successo. Per loro, sembra proprio come gli attori stanno arrivando un po 'più lentamente del solito, e non hanno mai nemmeno sentito circa l'incidente UFO.
Che è, approssimativamente, la magia del TCP. E 'ciò che gli informatici amano chiamare un astrazione : una semplificazione di qualcosa di molto più complicato che sta succedendo sotto le coperte. Come si è visto, un sacco di programmazione consiste nella costruzione di astrazioni. Che cos'è una libreria stringa? E 'un modo per fingere che i computer possono manipolare le stringhe con la stessa facilità si possono manipolare i numeri. Che cosa è un file system? E 'un modo per fingere che un disco rigido non è davvero un mucchio di filatura piatti magnetici in grado di memorizzare i bit in certi luoghi, ma piuttosto un sistema gerarchico di cartelle-dentro-cartelle contenenti i singoli file che a loro volta costituite da una o più stringhe di byte.
Torna a TCP. In precedenza per ragioni di semplicità ho raccontato una piccola bugia, e alcuni di voi hanno vapore che esce orecchie da adesso perché questa è fib facendo impazzire. Ho detto che il protocollo TCP garantisce che il messaggio arriverà. Non ha, in realtà. Se il serpente domestico ha masticato attraverso il cavo di rete che porta al computer, e non i pacchetti IP possono ottenere attraverso, quindi TCP non può fare nulla al riguardo e il messaggio non arriva. Se tu fossi brusco con gli amministratori di sistema della vostra azienda e vi puniti collegando un hub è in sovraccarico, solo alcuni dei pacchetti IP otterrà attraverso, e TCP funzionerà, ma tutto sarà molto lento.
Questo è ciò che io chiamo un astrazione che perde . TCP tenta di fornire una completa astrazione di una rete sottostante inaffidabile, ma a volte, le perdite di rete attraverso l'astrazione e si sente le cose che l'astrazione non riesco a proteggere l'utente da. Questo è solo un esempio di quello che ho chiamato la Legge di Astrazioni Leaky:
| Tutti i non-banale astrazioni, in qualche misura, si perde. |
Astrazioni fallire. A volte un po ', a volte molto. Ci sono perdite. Le cose vanno male. Succede dappertutto quando si hanno astrazioni. Ecco alcuni esempi.
- Qualcosa di semplice come l'iterazione su un grande array bidimensionale può avere prestazioni radicalmente diverso se lo si fa in orizzontale piuttosto che verticale, a seconda del "grano del legno" - una direzione può portare a errori di pagina molto più che nella direzione opposta ed errori di pagina sono lenti. Anche i programmatori di montaggio dovrebbero essere autorizzati a pretendere di avere un grande spazio indirizzo piatto, ma la memoria virtuale significa che è davvero solo una astrazione, che le perdite quando c'è un page fault e la memoria certo recupera prendere nanosecondi modo più memoria altre operazioni di recupero.
- Il linguaggio SQL è pensato per astrarre i passi procedurali necessari per interrogare un database, che permette invece di definire semplicemente ciò che si desidera e lasciare che la figura del database i passi procedurali per interrogare esso. Ma in alcuni casi, alcune query SQL sono migliaia di volte più lento di altre query logicamente equivalenti. Un famoso esempio di questo è che alcuni server SQL sono notevolmente più veloci se si specifica ", dove a = b e b = c e a = c" che se si specifica solo ", dove a = b e b = c" anche se il set di risultati è lo stesso. Non dovresti avere a cuore l'procedura, solo le specifiche. Ma a volte le fughe di notizie astrazione e le cause delle prestazioni orribili e si deve uscire l'analizzatore di query piano e studiare ciò che ha fatto male, e capire come rendere il vostro eseguire query più rapidamente.
- Anche se le librerie di rete come NFS e SMB consentono di considerare il file su macchine remote "come se" fossero locali, a volte la connessione diventa molto lento o va giù, e il file si ferma agire come se fosse locale, e come programmatore si deve scrivere il codice per affrontare questo. L'astrazione di "file remoto è lo stesso file locale" fughe . Ecco un esempio concreto per gli amministratori di sistema Unix. Se mettete home directory degli utenti 'su NFS unità montate (una astrazione), e agli utenti di creare file. Avanti per inoltrare tutte le proprie email da qualche altra parte (un'altra astrazione), e il server NFS va giù mentre nuova e-mail è in arrivo, i messaggi non verranno inoltrati in quanto il file. forward non verrà trovato. La perdita nel astrazione effettivamente causato alcuni messaggi per essere caduto sul pavimento.
- Classi C + + stringa si suppone che consentono di far finta che le stringhe sono di prima classe di dati. Essi cercano di astrarre il fatto che le stringhe sono duri e consentono di agire come se fossero così facile come numeri interi. Quasi tutte le classi C + + stringa di sovraccaricare l'operatore + in modo da poter scrivere s + "bar" per concatenare. Ma sapete una cosa? Non importa quanti sforzi facciano, non c'è C + + stringa di classe sulla Terra che vi permettono di digitare "pippo" + "bar" , perché le stringhe letterali in C + + sono sempre s char * 'mai, stringhe. L'astrazione è aperta una falla che la lingua non consente di spina. (Ironicamente, la storia della evoluzione del C + + nel corso del tempo può essere descritto come una storia di cercare di tappare le falle nella astrazione stringa. Perché non si può semplicemente aggiungere una classe nativa stringa al linguaggio stesso mi sfugge in questo momento. )
- E non si può guidare il più velocemente quando piove, anche se la vostra auto è tergicristalli e fari e un tetto e una stufa, che vi proteggerà da preoccuparsi del fatto che piove (che astrarre il tempo), ma Ecco, tu devi preoccuparti di aquaplaning (o aquaplaning in Inghilterra) ea volte la pioggia è così forte non si può vedere molto avanti in modo da andare più lento sotto la pioggia, perché il tempo non potrà mai essere completamente astratto lontano, a causa della legge di astrazioni che perde.
Nell'insegnamento qualcuno sulla programmazione COM, sarebbe bello se potessi semplicemente insegnare loro come usare il wizard di Visual Studio e tutte le funzionalità di generazione del codice, ma se qualcosa va storto, non avranno la più vaga idea di quello che è successo o come eseguire il debug e recuperare da esso. Ho intenzione di insegnare loro tutto IUnknown e CLSID e ProgID e ... oh, l'umanità!
Nell'insegnamento qualcuno su ASP.NET programmazione, sarebbe bello se potessi semplicemente insegnare loro che possono fare doppio clic su cose e poi scrivere il codice che viene eseguito sul server quando l'utente fa clic su queste cose. Infatti ASP.NET astrae la differenza tra la scrittura del codice HTML per gestire cliccando su un collegamento ipertestuale ( <a> ) e il codice per gestire cliccando su un pulsante. Problema: i progettisti ASP.NET necessari per nascondere il fatto che in HTML, non c'è modo di inviare un modulo da un collegamento ipertestuale. Lo fanno generando poche righe di JavaScript e allegando un gestore onclick per il collegamento ipertestuale. Le perdite di astrazione, però. Se l'utente finale ha disattivato JavaScript, l'applicazione ASP.NET non funziona correttamente, e se il programmatore non capisce quello che è stato ASP.NET astrarre via, semplicemente non avrà alcuna idea di cosa è sbagliato.
La legge di astrazioni che perde significa che ogni volta che qualcuno esce con un nuovo codice wizzy generazione strumento che dovrebbe renderci tutti sempre in modo efficiente, si sente un sacco di persone dire "imparare a farlo manualmente, quindi utilizzare lo strumento Wizzy per risparmiare tempo. " Strumenti di generazione di codice che pretendono qualcosa di astratto, come tutte le astrazioni, perdite, e l'unico modo per affrontare le perdite è competente per conoscere come funzionano le astrazioni e ciò che sono astrazione. Così le astrazioni ci salvi l'orario di lavoro, ma non ci salvano tempo di apprendimento.
E tutto questo vuol dire che paradossalmente, anche se abbiamo sempre più in alto strumenti di programmazione a livello di astrazioni sempre meglio, diventando un abile programmatore è sempre più difficile.
Durante il mio primo stage di Microsoft, ho scritto le biblioteche stringa per girare su Macintosh. Un compito tipico: scrivere una versione di strcat che restituisce un puntatore alla fine della stringa nuova. Poche righe di codice C. Tutto quello che facevo era giusto da K & R - un libro sottile sul linguaggio di programmazione C.
Oggi, per lavorare su CityDesk, ho bisogno di sapere di Visual Basic, COM, ATL, C + +, InnoSetup, Internet Explorer interni, espressioni regolari, DOM, HTML, CSS e XML. Tutti gli strumenti di alto livello rispetto al vecchio K & R roba, ma devo ancora conoscere il K & R o roba sto pane tostato.
Dieci anni fa, avremmo potuto immaginare che nuovi paradigmi di programmazione avrebbe reso più semplice la programmazione ormai. Infatti, le astrazioni abbiamo creato nel corso degli anni non ci permettono di affrontare nuovi ordini di complessità nello sviluppo di software che non abbiamo a che fare con dieci o quindici anni fa, come la programmazione GUI e programmazione di rete. E mentre questi grandi strumenti, come moderni OO forme linguaggi basati su, cerchiamo di ottenere un sacco di lavoro incredibilmente in fretta, all'improvviso un giorno abbiamo bisogno di capire un problema in cui l'astrazione trapelato, e ci vogliono 2 settimane. E quando avete bisogno di assumere un programmatore di fare la maggior parte di programmazione VB, non è sufficiente per assumere un programmatore VB, perché avranno completamente bloccati nel catrame ogni volta che le fughe di notizie astrazione VB.